You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 08:34:56