小程序开发-服务端
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

5.6 KiB

微信支付证书问题解决方案总结

问题现状

错误信息Cannot invoke "java.security.cert.X509Certificate.getSerialNumber()" because "certificate" is null

根本原因:微信支付SDK在使用自动证书配置时无法下载平台证书,导致证书对象为null。

解决方案:使用公钥模式

🎯 推荐方案:RSA公钥配置

我们已经实现了智能配置检测,系统会按以下优先级选择配置方式:

  1. RSA公钥配置(最稳定,推荐)
  2. RSA自动证书配置(需要网络连接)
  3. RSA手动证书配置(回退方案)

📋 配置步骤

1. 准备公钥文件

将微信支付平台公钥文件放置到:

src/main/resources/dev/wechat/10547/
├── apiclient_key.pem          # 商户私钥(已有)
├── apiclient_cert.pem         # 商户证书(已有)
└── wechatpay_public_key.pem   # 微信支付平台公钥(新增)

2. 数据库配置

执行以下SQL更新支付配置:

-- 查看当前配置
SELECT id, tenant_id, mch_id, app_id, merchant_serial_number, 
       pub_key, pub_key_id, api_key
FROM sys_payment 
WHERE tenant_id = 10547 AND type = 0;

-- 更新公钥配置
UPDATE sys_payment SET 
  pub_key = 'wechatpay_public_key.pem',
  pub_key_id = 'YOUR_ACTUAL_PUBLIC_KEY_ID'  -- 请替换为实际的公钥ID
WHERE tenant_id = 10547 AND type = 0;

3. 验证配置

使用新增的API接口验证配置:

# 快速检查配置状态
GET /system/wechat-pay-diagnostic/check/10547

# 获取详细配置建议
GET /system/wechat-pay-diagnostic/advice/10547

🔧 已实现的功能

1. 智能配置检测

系统会自动检测数据库中的公钥配置:

// 检测逻辑
if (payment.getPubKey() != null && !payment.getPubKey().isEmpty() && 
    payment.getPubKeyId() != null && !payment.getPubKeyId().isEmpty()) {
    // 使用RSA公钥配置
    config = new RSAPublicKeyConfig.Builder()...
} else {
    // 回退到自动证书配置
    config = wechatCertAutoConfig.createAutoConfig()...
}

2. 详细日志输出

配置成功时的日志:

=== 检测到公钥配置,使用RSA公钥模式 ===
公钥文件: wechatpay_public_key.pem
公钥ID: PUB_KEY_ID_0112422897022025011300326200001208
公钥文件路径: /path/to/wechatpay_public_key.pem
✅ 开发环境RSA公钥配置成功

3. 配置诊断API

新增的API接口:

接口 功能 说明
GET /system/wechat-pay-diagnostic/check/{tenantId} 快速配置检查 检查配置完整性和文件存在性
GET /system/wechat-pay-diagnostic/advice/{tenantId} 获取配置建议 生成详细的配置建议和修复步骤
GET /system/wechat-pay-diagnostic/diagnose/{tenantId} 全面诊断 完整的证书诊断报告

4. 配置检查工具

WechatPayConfigChecker 提供:

  • 配置完整性检查
  • 文件存在性验证
  • 配置模式识别
  • 问题诊断和建议

📊 配置状态检查

使用配置检查API可以获得详细的状态报告:

{
  "code": 200,
  "message": "配置检查通过",
  "data": {
    "tenantId": 10547,
    "environment": "dev",
    "configMode": "公钥模式",
    "configComplete": true,
    "hasError": false,
    "recommendation": "✅ 配置完整,建议使用当前配置",
    "configDetails": {
      "merchantId": "1723321338",
      "appId": "wx1234567890abcdef",
      "hasPublicKey": true,
      "publicKeyExists": true,
      "privateKeyExists": true
    }
  }
}

🚀 立即行动

方案A:使用公钥模式(推荐)

  1. 获取公钥文件和ID

    • 从微信商户平台或技术支持获取
    • 或使用现有的公钥文件
  2. 放置文件

    # 将公钥文件复制到指定位置
    cp wechatpay_public_key.pem src/main/resources/dev/wechat/10547/
    
  3. 更新数据库

    UPDATE sys_payment SET 
      pub_key = 'wechatpay_public_key.pem',
      pub_key_id = 'YOUR_PUBLIC_KEY_ID'
    WHERE tenant_id = 10547 AND type = 0;
    
  4. 测试验证

    • 重新尝试创建支付订单
    • 查看日志确认使用公钥模式

方案B:修复自动证书配置

如果暂时无法获取公钥,可以:

  1. 检查商户平台设置

    • 确保已开启API安全功能
    • 申请使用微信支付公钥
  2. 验证网络连接

    • 确保服务器可以访问微信支付API
    • 检查防火墙和代理设置
  3. 使用诊断工具

    GET /system/wechat-pay-diagnostic/diagnose/10547
    

📈 优势对比

配置方式 稳定性 网络依赖 配置难度 推荐指数
RSA公钥配置 🔥🔥🔥🔥🔥
RSA自动证书配置
RSA手动证书配置

🎯 预期结果

配置完成后,您应该看到:

  1. 日志输出

    === 检测到公钥配置,使用RSA公钥模式 ===
    ✅ 开发环境RSA公钥配置成功
    
  2. 支付订单创建成功

    • 不再出现证书null错误
    • 支付流程正常进行
  3. 配置检查通过

    GET /system/wechat-pay-diagnostic/check/10547
    返回:配置检查通过
    

📞 技术支持

如果仍有问题,请:

  1. 使用诊断API获取详细信息
  2. 查看完整的错误日志
  3. 提供配置检查结果
  4. 联系技术支持团队

总结:通过使用公钥模式,可以彻底解决 X509Certificate.getSerialNumber() null 错误,提供更稳定可靠的微信支付服务。