使用PHP验证Razorpay支付签名失败,求解决方法
排查Razorpay支付签名验证失败的常见方案
我帮你梳理下几个大概率导致签名验证失败的原因,你可以逐一排查:
核对参数的准确性与格式
Razorpay的签名是基于order_id + "|" + payment_id的字符串,用商户密钥做HMAC SHA256加密生成的。首先要确认你传入的三个参数没有额外空格、换行符或大小写错误,尤其是razorpay_order_id和razorpay_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




