CodeIgniter中Razorpay回调会话异常:支付后未跳转至成功页
Razorpay支付成功后会话丢失,无法跳转至成功页问题排查与解决
问题现象
- 家长完成Razorpay费用支付后,Razorpay端显示支付成功,但应用未跳转至成功页,反而回到初始支付页
- 网络日志显示回调URL返回303状态码,重定向到登录页,且响应带有
set-cookie头,说明会话被重置或新建
已执行排查动作
- 确认
config.php中的会话配置参数无误 - 在
Razorpay.php的回调方法中添加日志追踪,发现回调过程中会话未被正确维持,甚至被重置
解决建议
1. 放弃依赖前端会话识别回调用户
Razorpay的回调是服务器对服务器的请求,不会携带用户浏览器的Cookie,所以不能靠会话Cookie识别用户。发起支付时,把用户唯一标识(比如用户ID)放到Razorpay订单的自定义字段里:
// 创建Razorpay订单时传入当前用户ID $orderParams = [ 'amount' => $paymentAmount * 100, // Razorpay要求金额以最小单位计算 'currency' => 'INR', 'notes' => [ 'user_id' => $_SESSION['user_id'] // 存储发起支付的用户ID ] ]; $order = $razorpay->order->create($orderParams);
回调时从Razorpay返回的参数里提取notes.user_id,直接用这个ID关联用户,不要依赖会话。
2. 检查回调代码是否主动重置会话
排查Razorpay.php的回调方法,看看有没有session_destroy()、session_regenerate_id(true)这类会销毁或重置会话的代码。如果有,要么移除,要么调整触发条件,不要在回调流程里执行。
3. 优化会话Cookie的安全配置
如果应用是HTTPS环境,检查config.php里的会话参数:
- 将
session.cookie_samesite设为None,同时开启session.cookie_secure = true,避免浏览器拦截跨域Cookie - 确认
session.cookie_domain设置正确,覆盖应用的主域名(仅当回调请求是同域名下的接口时有效,跨域回调还是建议用自定义用户ID)
4. 先验证回调合法性再处理逻辑
回调请求必须先验证Razorpay的签名,防止恶意请求干扰会话:
$signature = $_SERVER['HTTP_X_RAZORPAY_SIGNATURE'] ?? ''; $payload = file_get_contents('php://input'); // 验证签名 $isValid = $razorpay->utility->verifyPaymentSignature($payload, $signature); if (!$isValid) { http_response_code(403); exit('Invalid callback request'); } // 验证通过后再处理支付结果 $paymentData = json_decode($payload, true); $userId = $paymentData['notes']['user_id']; // ...更新数据库中的支付状态等逻辑
5. 调整前端跳转逻辑
回调处理完成后,不要直接依赖会话做服务器端重定向,而是返回一个带跳转地址的响应给前端,让用户浏览器主动跳转:
// 回调处理完成后,返回JSON响应 $orderId = $paymentData['order_id']; echo json_encode([ 'status' => 'success', 'redirectUrl' => "/payment-success?order=$orderId" ]); exit;
然后在前端的Razorpay支付成功回调里,请求后端接口获取跳转地址再跳转:
const razorpayOptions = { key: 'YOUR_RAZORPAY_KEY', amount: totalAmount * 100, order_id: razorpayOrderId, handler: function(response) { // 调用后端接口验证支付并获取跳转地址 fetch(`/verify-payment?paymentId=${response.razorpay_payment_id}`) .then(res => res.json()) .then(data => { if (data.status === 'success') { window.location.href = data.redirectUrl; } }); } }; const rzpInstance = new Razorpay(razorpayOptions); rzpInstance.open();
内容的提问来源于stack exchange,提问作者aparana mishra
相关产品推荐
相关产品推荐

