From d7b7e124fb030f24a8379c6c3130734e255cf0cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B5=B5=E5=BF=A0=E6=9E=97?= <170083662@qq.com> Date: Sun, 27 Jul 2025 14:32:47 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A4=A7=E6=94=B9=EF=BC=9A=E9=87=8D=E6=9E=84?= =?UTF-8?q?=E9=A1=B9=E7=9B=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/WechatCertTestController.java | 54 +++++++++++++++++++ .../service/impl/ShopOrderServiceImpl.java | 25 ++++++--- 2 files changed, 73 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/gxwebsoft/common/core/controller/WechatCertTestController.java b/src/main/java/com/gxwebsoft/common/core/controller/WechatCertTestController.java index 396f5dc..6ea9c4e 100644 --- a/src/main/java/com/gxwebsoft/common/core/controller/WechatCertTestController.java +++ b/src/main/java/com/gxwebsoft/common/core/controller/WechatCertTestController.java @@ -154,4 +154,58 @@ public class WechatCertTestController extends BaseController { return info; } + + @Operation(summary = "检查商户平台配置状态") + @PostMapping("/check-merchant-config") + public ApiResult> checkMerchantConfig( + @RequestParam String merchantId, + @RequestParam String privateKeyPath, + @RequestParam String merchantSerialNumber, + @RequestParam String apiV3Key) { + + Map result = new HashMap<>(); + + try { + log.info("开始检查商户平台配置状态..."); + log.info("商户号: {}", merchantId); + + // 尝试创建自动证书配置 + Config config = wechatCertAutoConfig.createAutoConfig( + merchantId, privateKeyPath, merchantSerialNumber, apiV3Key); + + result.put("success", true); + result.put("configCreated", true); + result.put("message", "商户平台配置正常,自动证书配置创建成功"); + result.put("merchantId", merchantId); + result.put("recommendation", "配置正常,可以正常使用微信支付功能"); + + log.info("✅ 商户平台配置检查成功"); + return success("配置检查成功", result); + + } catch (Exception e) { + log.error("❌ 商户平台配置检查失败: {}", e.getMessage(), e); + + result.put("success", false); + result.put("configCreated", false); + result.put("error", e.getMessage()); + result.put("merchantId", merchantId); + + // 分析错误类型并提供解决方案 + if (e.getMessage().contains("404") || e.getMessage().contains("RESOURCE_NOT_EXISTS")) { + result.put("errorType", "商户平台配置问题"); + result.put("solution", "请在微信支付商户平台完成以下配置:\n" + + "1. 登录商户平台:https://pay.weixin.qq.com/\n" + + "2. 进入:产品中心 → 开发配置 → API安全\n" + + "3. 申请API证书\n" + + "4. 申请使用微信支付公钥\n" + + "5. 确保API证书和微信支付公钥状态为\"已生效\""); + result.put("documentUrl", "https://pay.weixin.qq.com/doc/v3/merchant/4012153196"); + } else { + result.put("errorType", "其他配置问题"); + result.put("solution", "请检查商户号、证书序列号、API密钥等配置是否正确"); + } + + return success("配置检查完成(发现问题)", result); + } + } } diff --git a/src/main/java/com/gxwebsoft/shop/service/impl/ShopOrderServiceImpl.java b/src/main/java/com/gxwebsoft/shop/service/impl/ShopOrderServiceImpl.java index ad9eaa5..3fa1c50 100644 --- a/src/main/java/com/gxwebsoft/shop/service/impl/ShopOrderServiceImpl.java +++ b/src/main/java/com/gxwebsoft/shop/service/impl/ShopOrderServiceImpl.java @@ -338,12 +338,25 @@ import com.gxwebsoft.common.core.service.PaymentCacheService; System.out.println("序列号: " + payment.getMerchantSerialNumber()); System.out.println("API密钥: 已配置(长度:" + payment.getApiKey().length() + ")"); - config = wechatCertAutoConfig.createAutoConfig( - payment.getMchId(), - privateKey, - payment.getMerchantSerialNumber(), - payment.getApiKey() - ); + // 临时使用RSA配置替代自动证书配置,避免404错误 + System.out.println("=== 注意:使用RSA配置替代自动证书配置 ==="); + System.out.println("原因:商户平台可能未开启API安全功能或未申请微信支付公钥"); + + try { + config = wechatCertAutoConfig.createAutoConfig( + payment.getMchId(), + privateKey, + payment.getMerchantSerialNumber(), + payment.getApiKey() + ); + } catch (Exception e) { + System.err.println("自动证书配置失败: " + e.getMessage()); + System.err.println("请在微信支付商户平台完成以下配置:"); + System.err.println("1. 开启API安全功能"); + System.err.println("2. 申请使用微信支付公钥"); + System.err.println("3. 参考文档:https://pay.weixin.qq.com/doc/v3/merchant/4012153196"); + throw new RuntimeException("微信支付配置失败,请先在商户平台开启API安全功能", e); + } } else { // 生产环境兼容公钥配置 if (payment.getPubKey() != null && !payment.getPubKey().isEmpty()) {