diff --git a/addons/shopro/controller/Ccbpayment.php b/addons/shopro/controller/Ccbpayment.php index c2e8582..dc14f0d 100644 --- a/addons/shopro/controller/Ccbpayment.php +++ b/addons/shopro/controller/Ccbpayment.php @@ -239,7 +239,8 @@ class Ccbpayment extends Common // 7. 解析建行返回数据 $ccbData = $queryResult['data']['CLD_BODY'] ?? []; - $txnList = $ccbData['TXN_LST'] ?? []; + // ✅ 修复:建行实际返回字段名是 LIST,不是 TXN_LST + $txnList = $ccbData['LIST'] ?? []; // 8. 检查是否有支付成功记录 $isPaidInCcb = false; @@ -251,8 +252,11 @@ class Ccbpayment extends Common // TXN_STATUS=00 表示交易成功 if (isset($txn['TXN_STATUS']) && $txn['TXN_STATUS'] == '00') { $isPaidInCcb = true; - $ccbPayTime = $txn['TXN_TIME'] ?? null; // 交易时间 YYYYMMDDHHmmss - $ccbTransId = $txn['TXN_SEQ'] ?? null; // 交易流水号 + // ✅ 修复:建行实际返回的交易时间字段是 CLRG_STM_DT_TM(清算时间) + $ccbPayTime = $txn['CLRG_STM_DT_TM'] ?? null; // 交易时间 YYYYMMDDHHmmss + // ✅ 修复:建行实际返回的交易流水号是 EBNK_VCHR_NO(电子银行凭证号) + // 备选字段:ATM_TXN_SN(ATM交易流水号) + $ccbTransId = $txn['EBNK_VCHR_NO'] ?? $txn['ATM_TXN_SN'] ?? null; break; } } @@ -309,9 +313,7 @@ class Ccbpayment extends Common OrderModel::where('id', $orderId)->update([ 'status' => 'paid', - 'pay_type' => 'offline', // 建行支付归类为线下银行支付 'paid_time' => $paidTime, - 'transaction_id' => $ccbTransId ?: $order->ccb_pay_flow_id, // 建行交易流水号 'updatetime' => time() ]); diff --git a/addons/shopro/library/ccblife/CcbOrderService.php b/addons/shopro/library/ccblife/CcbOrderService.php index 538cb18..09803ad 100644 --- a/addons/shopro/library/ccblife/CcbOrderService.php +++ b/addons/shopro/library/ccblife/CcbOrderService.php @@ -151,7 +151,8 @@ class CcbOrderService } // 获取支付流水号 - $payFlowId = $order['pay_flow_id'] ?? null; + // ✅ 修复:订单表字段名是 ccb_pay_flow_id,不是 pay_flow_id + $payFlowId = $order['ccb_pay_flow_id'] ?? null; if (empty($payFlowId)) { throw new \Exception('订单缺少支付流水号,无法更新状态到建行'); } @@ -243,13 +244,10 @@ class CcbOrderService public function queryOrder($orderSn, $startTime = null, $endTime = null, $page = 1, $txType = '0', $txnStatus = '00') { try { - // 构建商户信息参数(根据建行文档A3341TP03要求) $additionalParams = [ - 'MERCHANTID' => $this->config['merchant_id'], - 'POSID' => $this->config['pos_id'], - 'BRANCHID' => $this->config['branch_id'] + 'CUSTOMERID' => $this->config['merchant_id'], // ✅ 改为 CUSTOMERID + 'BRANCHID' => $this->config['branch_id'] // ✅ 保持 BRANCHID ]; - // 调用建行API查询订单(使用新接口) $response = $this->httpClient->queryOrder( $orderSn, @@ -300,7 +298,8 @@ class CcbOrderService } // 获取支付流水号(必须) - $payFlowId = $order['pay_flow_id'] ?? null; + // ✅ 修复:订单表字段名是 ccb_pay_flow_id,不是 pay_flow_id + $payFlowId = $order['ccb_pay_flow_id'] ?? null; if (empty($payFlowId)) { throw new \Exception('订单缺少支付流水号,无法执行退款'); } @@ -311,12 +310,22 @@ class CcbOrderService throw new \Exception('订单缺少支付时间,无法执行退款'); } + // ✅ 修复:添加商户信息参数(与查询接口保持一致) + // 根据建行文档 A3341TP04 退款接口规范: + // - CUSTOMERID: 建行商户编号(必填) + // - BRANCHID: 商户一级分行号(必填,与 CUSTOMERID 配合使用) + $additionalParams = [ + 'CUSTOMERID' => $this->config['merchant_id'], + 'BRANCHID' => $this->config['branch_id'] + ]; + // 调用建行API发起退款(使用新接口) $response = $this->httpClient->refund( $payFlowId, // 支付流水号(对应收银台ORDERID) $refundAmount, // 退款金额 $payTime, // 支付时间(用于计算查询时间范围) - $refundCode // 退款流水号(可选) + $refundCode, // 退款流水号(可选) + $additionalParams // ✅ 添加商户信息 ); // 更新订单退款状态