From c30a43a733238688fcaf53ded2e8190ab85710f3 Mon Sep 17 00:00:00 2001 From: Billy <641833868@qq.com> Date: Mon, 27 Oct 2025 22:18:08 +0800 Subject: [PATCH] =?UTF-8?q?=E5=9B=9E=E8=B0=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- addons/shopro/controller/Ccbpayment.php | 34 +++++++++++++++---------- 1 file changed, 21 insertions(+), 13 deletions(-) diff --git a/addons/shopro/controller/Ccbpayment.php b/addons/shopro/controller/Ccbpayment.php index dc14f0d..fa7985e 100644 --- a/addons/shopro/controller/Ccbpayment.php +++ b/addons/shopro/controller/Ccbpayment.php @@ -393,20 +393,28 @@ class Ccbpayment extends Common try { // 1. 获取原始请求数据 $rawData = file_get_contents('php://input'); - Log::info('[建行支付通知] 收到异步通知: ' . $rawData); + Log::info('[建行支付通知] 收到异步通知 原始数据: ' . $rawData); - // 2. 解析POST参数 + // 2. 尝试多种方式获取参数(建行可能使用GET或POST) $params = $this->request->post(); - // 3. 如果POST为空,尝试解析原始数据 - if (empty($params) && $rawData) { - parse_str($rawData, $params); + // 3. 如果POST为空,尝试GET参数 + if (empty($params)) { + $params = $this->request->get(); + Log::info('[建行支付通知] POST为空,尝试GET参数'); } - // 4. 记录参数 - Log::info('[建行支付通知] 解析参数: ' . json_encode($params, JSON_UNESCAPED_UNICODE)); + // 4. 如果GET也为空,尝试解析原始数据 + if (empty($params) && $rawData) { + parse_str($rawData, $params); + Log::info('[建行支付通知] GET为空,尝试解析原始数据'); + } - // 5. 验证必需参数 + // 5. 记录最终解析的参数 + Log::info('[建行支付通知] 解析参数: ' . json_encode($params, JSON_UNESCAPED_UNICODE)); + Log::info('[建行支付通知] 请求方法: ' . $this->request->method()); + + // 6. 验证必需参数 if (empty($params['ORDERID'])) { Log::error('[建行支付通知] 缺少ORDERID参数'); exit('FAIL'); @@ -422,7 +430,7 @@ class Ccbpayment extends Common exit('FAIL'); } - // 6. ✅ 验证签名(使用建行公钥验签) + // 7. ✅ 验证签名(使用建行公钥验签) try { $signature = $params['SIGN']; $verifyParams = $params; // 复制参数用于验签 @@ -453,16 +461,16 @@ class Ccbpayment extends Common exit('FAIL'); } - // 7. 检查支付状态 + // 8. 检查支付状态 if ($params['SUCCESS'] !== 'Y') { Log::warning('[建行支付通知] 支付未成功 ORDERID:' . $params['ORDERID'] . ' SUCCESS:' . $params['SUCCESS']); exit('SUCCESS'); // ⚠️ 仍然返回SUCCESS,表示通知已接收 } - // 8. 调用支付服务处理通知(返回订单ID) + // 9. 调用支付服务处理通知(返回订单ID) $result = $this->paymentService->handleNotify($params); - // 9. ✅ 处理成功后更新订单状态到建行(步骤13:调用订单更新接口更新订单状态) + // 10. ✅ 处理成功后更新订单状态到建行(步骤13:调用订单更新接口更新订单状态) if ($result['status'] === 'success' && !empty($result['order_id'])) { // ⚠️ 只有新支付才更新,已支付的订单跳过更新 if ($result['already_paid'] === false) { @@ -485,7 +493,7 @@ class Ccbpayment extends Common } } - // 10. 返回处理结果 + // 11. 返回处理结果 // ⚠️ 重要: 必须使用exit直接退出,防止ThinkPHP框架追加额外内容 // 建行要求返回纯文本 'SUCCESS' 或 'FAIL',任何额外字符都会导致建行认为通知失败 $response = ($result['status'] === 'success') ? 'SUCCESS' : 'FAIL';