PHP集成Paytm支付网关发起交易时遇系统错误求助
排查Paytm支付网关返回「System error」的实用方案
嘿,我之前也碰到过Paytm支付网关返回这种系统错误的情况,结合你的代码和返回信息,给你几个靠谱的排查方向:
1. 补上缺失的核心请求部分
你代码里有两个明显的疏漏,大概率是触发错误的关键:
- 你定义了
X-Redirect-Url请求头,但没把它加入到Curl的HTTPHEADER配置里!Paytm的初始化接口必须要这个重定向地址; - 完全没设置
paytmParams["body"]部分!Paytm的initiateTransaction接口要求body里必须包含交易核心参数(比如mid、orderId、txnAmount这些),缺少body的话肯定会报错。
修改后的代码片段:
// 先补全body参数,根据实际业务调整金额、用户信息等 $paytmParams["body"] = array( "mid" => $mid, "orderId" => $transactionId, "txnAmount" => array( "value" => "10.00", // 实际交易金额 "currency" => "INR" ), "userInfo" => array( "custId" => "YOUR_CUSTOMER_ID" // 可选但建议传递 ) ); $paytmParams["head"] = array( "signature" => $encFile ); $post_data = json_encode($paytmParams, JSON_UNESCAPED_SLASHES); // 正确设置请求头,把X-Redirect-Url加入进去 $headers = array( "Content-Type: application/json", 'X-Redirect-Url: http://localhost/TEWebSite/web/site/paymentresponse' ); $ch = curl_init($url); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); // 这里用完整的headers数组
2. 校验签名生成的准确性
- 确认生成签名时用的
$arrInputs包含了所有必填参数(包括body里的所有字段),而且参数键名完全符合Paytm文档要求(大小写、拼写不能错,比如txnAmount不能写成txnamount); - 注意生成签名用的是商户密钥(Merchant Key),不是商户ID(mid),很多人会搞混这两个,一定要对应测试环境的密钥;
- 检查URL里的
mid和orderId,要和body里的完全一致,不能有空格或特殊字符。
3. 捕获Curl本身的错误
有时候系统错误可能是Curl请求本身出了问题(比如SSL证书验证失败、网络超时),可以加一段错误捕获代码排查:
$response = curl_exec($ch); if(curl_errno($ch)){ echo 'Curl请求出错: ' . curl_error($ch); exit; } curl_close($ch);
如果是SSL证书问题,测试环境可以临时加curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);(生产环境不建议这么做,最好配置正确的CA证书)。
4. 检查订单ID和环境一致性
- 确认
$transactionId是唯一的,Paytm不允许重复的订单ID发起交易,哪怕是测试订单也不行; - 你用的是测试环境URL(
securegw-stage.paytm.in),要确保对应的mid和密钥都是Paytm提供的测试环境参数,不要混用生产环境的信息。
如果以上都排查过还是没解决,可以试试用Paytm官方的测试工具,把相同的参数放进去测试,这样能区分是代码问题还是支付方的配置问题。
内容的提问来源于stack exchange,提问作者Sonu
相关产品推荐
相关产品推荐

