You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用PHP验证Razorpay支付签名失败,求解决方法

排查Razorpay支付签名验证失败的常见方案

我帮你梳理下几个大概率导致签名验证失败的原因,你可以逐一排查:

  • 核对参数的准确性与格式
    Razorpay的签名是基于order_id + "|" + payment_id的字符串,用商户密钥做HMAC SHA256加密生成的。首先要确认你传入的三个参数没有额外空格、换行符或大小写错误,尤其是razorpay_order_idrazorpay_payment_id必须和Razorpay返回的完全一致,不能有任何篡改。

  • 确认使用正确的商户密钥
    必须使用Razorpay后台的商户Secret Key,绝对不能用Key ID!很多人会不小心混淆这两个密钥,导致验证失败,一定要去后台核对清楚Secret Key的完整内容。

  • 手动生成签名做对比调试
    可以先绕开SDK手动生成签名,和Razorpay返回的签名对比,定位问题:

    // 替换成你的实际参数和密钥
    $expectedSignature = hash_hmac('sha256', $razorpay_order_id . "|" . $razorpay_payment_id, $your_secret_key);
    
    // 安全对比两个签名
    if (hash_equals($expectedSignature, $razorpay_signature)) {
        echo "手动验证通过";
    } else {
        echo "手动验证失败,签名不匹配";
        // 打印两个签名看差异
        echo "预期签名: " . $expectedSignature . "<br>";
        echo "收到的签名: " . $razorpay_signature;
    }
    

    如果手动验证也失败,说明参数或密钥肯定有问题;如果手动验证成功,那大概率是SDK的问题。

  • 检查SDK版本与初始化逻辑
    确保你用的是最新版Razorpay PHP SDK,旧版本可能存在签名验证的bug。另外初始化$api对象时,要确认传入了正确的Key ID和Secret Key:

    $api = new Razorpay\Api\Api($key_id, $secret_key);
    

    这里的$secret_key必须是你的商户Secret Key,不能填错。

  • 确认参数来源未被篡改
    确保三个参数是直接从Razorpay的回调请求中获取的,没有经过服务器的转义、编码或其他修改。比如POST请求直接用$_POST['razorpay_signature']取值,不要做额外处理。


内容的提问来源于stack exchange,提问作者Developer Stack

火山引擎 最新活动