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 {
// 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';