This commit is contained in:
Billy 2025-10-27 22:18:08 +08:00
parent d0243bde66
commit c30a43a733

View File

@ -393,20 +393,28 @@ class Ccbpayment extends Common
try { try {
// 1. 获取原始请求数据 // 1. 获取原始请求数据
$rawData = file_get_contents('php://input'); $rawData = file_get_contents('php://input');
Log::info('[建行支付通知] 收到异步通知: ' . $rawData); Log::info('[建行支付通知] 收到异步通知 原始数据: ' . $rawData);
// 2. 解析POST参数 // 2. 尝试多种方式获取参数建行可能使用GET或POST
$params = $this->request->post(); $params = $this->request->post();
// 3. 如果POST为空尝试解析原始数据 // 3. 如果POST为空尝试GET参数
if (empty($params) && $rawData) { if (empty($params)) {
parse_str($rawData, $params); $params = $this->request->get();
Log::info('[建行支付通知] POST为空尝试GET参数');
} }
// 4. 记录参数 // 4. 如果GET也为空尝试解析原始数据
Log::info('[建行支付通知] 解析参数: ' . json_encode($params, JSON_UNESCAPED_UNICODE)); 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'])) { if (empty($params['ORDERID'])) {
Log::error('[建行支付通知] 缺少ORDERID参数'); Log::error('[建行支付通知] 缺少ORDERID参数');
exit('FAIL'); exit('FAIL');
@ -422,7 +430,7 @@ class Ccbpayment extends Common
exit('FAIL'); exit('FAIL');
} }
// 6. ✅ 验证签名(使用建行公钥验签) // 7. ✅ 验证签名(使用建行公钥验签)
try { try {
$signature = $params['SIGN']; $signature = $params['SIGN'];
$verifyParams = $params; // 复制参数用于验签 $verifyParams = $params; // 复制参数用于验签
@ -453,16 +461,16 @@ class Ccbpayment extends Common
exit('FAIL'); exit('FAIL');
} }
// 7. 检查支付状态 // 8. 检查支付状态
if ($params['SUCCESS'] !== 'Y') { if ($params['SUCCESS'] !== 'Y') {
Log::warning('[建行支付通知] 支付未成功 ORDERID:' . $params['ORDERID'] . ' SUCCESS:' . $params['SUCCESS']); Log::warning('[建行支付通知] 支付未成功 ORDERID:' . $params['ORDERID'] . ' SUCCESS:' . $params['SUCCESS']);
exit('SUCCESS'); // ⚠️ 仍然返回SUCCESS表示通知已接收 exit('SUCCESS'); // ⚠️ 仍然返回SUCCESS表示通知已接收
} }
// 8. 调用支付服务处理通知(返回订单ID) // 9. 调用支付服务处理通知(返回订单ID)
$result = $this->paymentService->handleNotify($params); $result = $this->paymentService->handleNotify($params);
// 9. ✅ 处理成功后更新订单状态到建行(步骤13:调用订单更新接口更新订单状态) // 10. ✅ 处理成功后更新订单状态到建行(步骤13:调用订单更新接口更新订单状态)
if ($result['status'] === 'success' && !empty($result['order_id'])) { if ($result['status'] === 'success' && !empty($result['order_id'])) {
// ⚠️ 只有新支付才更新,已支付的订单跳过更新 // ⚠️ 只有新支付才更新,已支付的订单跳过更新
if ($result['already_paid'] === false) { if ($result['already_paid'] === false) {
@ -485,7 +493,7 @@ class Ccbpayment extends Common
} }
} }
// 10. 返回处理结果 // 11. 返回处理结果
// ⚠️ 重要: 必须使用exit直接退出,防止ThinkPHP框架追加额外内容 // ⚠️ 重要: 必须使用exit直接退出,防止ThinkPHP框架追加额外内容
// 建行要求返回纯文本 'SUCCESS' 或 'FAIL',任何额外字符都会导致建行认为通知失败 // 建行要求返回纯文本 'SUCCESS' 或 'FAIL',任何额外字符都会导致建行认为通知失败
$response = ($result['status'] === 'success') ? 'SUCCESS' : 'FAIL'; $response = ($result['status'] === 'success') ? 'SUCCESS' : 'FAIL';