银行支付回调URL无响应及HTTP 500错误排查求助
排查与解决回调页面500错误及无输出问题
咱们一步步来定位问题,首先你的callback.php出现500错误和无输出,核心原因大概率是PHP代码的语法或逻辑错误,先从最明显的问题入手:
1. 修复回调代码的数组/对象访问错误
你在回调代码里用了json_decode(file_get_contents('php://input'), true),第二个参数true会让json_decode返回关联数组,而不是PHP对象。但你后面却用了对象的访问方式$obj->{'partnerTxnUid'},这会直接触发致命错误,导致服务器返回500。
修改后的回调代码(添加错误调试和正确的数组访问):
<?php // 开启错误显示,方便调试(上线后可以关闭) ini_set('display_errors', 1); ini_set('display_startup_errors', 1); error_reporting(E_ALL); // 获取原始POST数据 $rawInput = file_get_contents('php://input'); // 解码JSON数据为关联数组 $obj = json_decode($rawInput, true); // 检查JSON解码是否成功 if (json_last_error() !== JSON_ERROR_NONE) { print "JSON解码错误: " . json_last_error_msg(); exit; } // 用数组方式访问字段,同时判断字段是否存在避免报错 if (isset($obj['partnerTxnUid'])) { print "partnerTxnUid: " . $obj['partnerTxnUid'] . "<br>"; } if (isset($obj['partnerId'])) { print "partnerId: " . $obj['partnerId']; } ?>
2. 处理直接访问(GET请求)的情况
当你用Chrome直接访问callback.php时,是发送GET请求,php://input没有任何数据,json_decode会返回null,之前的代码直接访问null->xxx就会报错。上面的修改已经添加了JSON解码检查,即使是GET请求,也会输出“JSON解码错误”而不是直接500。
3. 优化你的POST测试代码
手动拼接JSON字符串容易出现语法错误,建议用json_encode生成POST数据,同时添加CURL错误检查:
<?php session_start(); $accesstoken = $_SESSION['accesstoken'] ; $mtime = date("Y-m-d H:i:s"); $certFile = "/etc/apache2/ssl/theamui/amui_com.crt"; $keyFile = "/etc/apache2/ssl/theamui/amui.com.key"; // 用数组定义POST数据,再转成JSON $postData = [ "partnerTxnUid" => "RGH0 $mtime", "partnerId" => "CRP0000364", "partnerSecret" => "76W46SLUu0TStR2QFlm3wl4AyWVNajkU3aHNpRcfwZ27JyfDiz6I6TWstVNVqWuE", "requestDt" => "2021-12-28T20:12:28+07:00", "merchantId" => "KB000000518469", "qrType" => "3", "txnAmount" => 100.50, "txnCurrencyCode" => "THB", "reference1" => "INV001", "reference2" => "ref2", "reference3" => "ref3", "reference4" => "ref4", "metadata" => "ถุงผ้า 80.50,ดินสอ 20.00" ]; $ch = curl_init(); curl_setopt($ch, CURLOPT_SSLCERT, $certFile); curl_setopt($ch, CURLOPT_SSLKEY, $keyFile); curl_setopt($ch, CURLOPT_URL, 'https://theamui.com/payb/callback.php'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($postData)); $headers = array(); $headers[] = "Content-Type: application/json"; $headers[] = "Authorization: Bearer $accesstoken"; curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); $response = curl_exec($ch); // 添加CURL错误检查 if (curl_errno($ch)) { echo 'CURL错误: ' . curl_error($ch); } curl_close($ch); print $response; $qrcodeinfo=json_decode($response)->{'qrCode'}; $_SESSION['qrcodeinfo'] = $qrcodeinfo; ?>
4. 查看服务器错误日志
如果修改后还是有问题,直接查看Apache的错误日志(通常路径是/var/log/apache2/error.log),里面会记录详细的错误信息,比如哪一行代码出错、错误类型是什么,这是排查500错误最有效的方法。
按照上面的步骤修改后,应该就能解决500错误并看到回调页面的输出了。
内容的提问来源于stack exchange,提问作者Teera
相关产品推荐
相关产品推荐

