From b23d2f171d1c02f684a0c2bcd5e7acf9567c649f Mon Sep 17 00:00:00 2001 From: Billy <641833868@qq.com> Date: Mon, 27 Oct 2025 19:14:10 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BA=8C=E6=AC=A1=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../shopro/library/ccblife/CcbPaymentService.php | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/addons/shopro/library/ccblife/CcbPaymentService.php b/addons/shopro/library/ccblife/CcbPaymentService.php index 5314719..026de27 100644 --- a/addons/shopro/library/ccblife/CcbPaymentService.php +++ b/addons/shopro/library/ccblife/CcbPaymentService.php @@ -275,14 +275,12 @@ class CcbPaymentService } // 6. 生成ENCPUB(商户公钥密文,不参与MAC校验) - $encpub = $this->encryptPublicKeyLast30(); - + $encryptedMessage = $this->encryptPublicKeyLast30(); + // 第二次BASE64编码 + $encryptedMessage = base64_encode($encryptedMessage); + // 移除BASE64中的换行符 + $encpub = str_replace(["\r", "\n", "\r\n"], '', $encryptedMessage); // 7. 组装最终支付串(传给建行收银台的URL参数) - // ⚠️ 重要修复:最终支付串不进行URL编码,与MAC签名字符串保持一致! - // 原因:escape编码的字段(PROINFO、REGINFO)如果再URL编码,会导致MAC验证失败 - // 例如:%u6F2B 会被编码成 %25u6F2B,与签名时的 %u6F2B 不一致 - // 格式:参与MAC的参数 + 不参与MAC的参数 + MAC + PLATFORMID + ENCPUB - // 7.1 构建参与MAC的参数部分(不URL编码,与签名字符串保持一致) $finalParts = []; foreach ($macParams as $key => $value) { @@ -297,11 +295,10 @@ class CcbPaymentService $finalParts[] = $key . '=' . $value; } } - // 7.3 添加MAC、PLATFORMID、ENCPUB $finalParts[] = 'MAC=' . $mac; $finalParts[] = 'PLATFORMID=' . $this->config['service_id']; - $finalParts[] = 'ENCPUB=' . $encpub; // ✅ ENCPUB是BASE64,不需要额外编码 + $finalParts[] = 'ENCPUB=' . $encpub; // 7.4 拼接最终支付串 $finalPaymentString = implode('&', $finalParts);