小程序开发-服务端
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.
 
 

4.0 KiB

微信支付公钥路径修复总结

问题描述

错误信息公钥文件不存在: /20250114/0f65a8517c284acb90aa83dd0c23e8f6.pem

根本原因:开发环境的路径拼接逻辑不正确

修复方案

🔧 已修复的逻辑

开发环境

  • 固定使用文件名:wechatpay_public_key.pem
  • 路径格式:dev/wechat/{tenantId}/wechatpay_public_key.pem
  • 实际路径:/Users/gxwebsoft/JAVA/cms-java-code/src/main/resources/dev/wechat/10547/wechatpay_public_key.pem

生产环境

  • 直接使用数据库中 pubKey 字段存储的完整路径
  • 不进行任何路径拼接

📋 代码逻辑

// 开发环境
if ("dev".equals(active)) {
    // 固定使用 wechatpay_public_key.pem
    String tenantCertPath = "dev/wechat/" + order.getTenantId();
    String pubKeyPath = tenantCertPath + "/wechatpay_public_key.pem";
    
    if (certificateLoader.certificateExists(pubKeyPath)) {
        String pubKeyFile = certificateLoader.loadCertificatePath(pubKeyPath);
        // 使用 RSAPublicKeyConfig
    }
}

// 生产环境
else {
    if (payment.getPubKey() != null && !payment.getPubKey().isEmpty()) {
        // 直接使用数据库中的路径
        String pubKeyFile = certificateLoader.loadCertificatePath(payment.getPubKey());
        // 使用 RSAPublicKeyConfig
    }
}

🎯 预期日志输出

开发环境成功

=== 检测到公钥配置,使用RSA公钥模式 ===
公钥文件: 20250114/0f65a8517c284acb90aa83dd0c23e8f6.pem
公钥ID: YOUR_PUBLIC_KEY_ID
开发环境公钥文件路径: dev/wechat/10547/wechatpay_public_key.pem
✅ 开发环境公钥文件加载成功: /Users/gxwebsoft/JAVA/cms-java-code/src/main/resources/dev/wechat/10547/wechatpay_public_key.pem
✅ 开发环境RSA公钥配置成功

生产环境成功

=== 生产环境检测到公钥配置,使用RSA公钥模式 ===
公钥文件路径: /path/to/production/public_key.pem
公钥ID: YOUR_PUBLIC_KEY_ID
✅ 生产环境公钥文件加载成功: /actual/file/path
✅ 生产环境RSA公钥配置成功

📁 文件结构要求

开发环境

src/main/resources/dev/wechat/10547/
├── apiclient_key.pem          # 商户私钥
├── apiclient_cert.pem         # 商户证书
└── wechatpay_public_key.pem   # 微信支付平台公钥(固定文件名)

生产环境

  • 文件可以放在任何位置
  • 数据库中的 pubKey 字段存储完整的相对路径
  • 例如:/wechat/10547/public_key.pem

🚀 测试步骤

  1. 确认文件存在

    ls -la /Users/gxwebsoft/JAVA/cms-java-code/src/main/resources/dev/wechat/10547/wechatpay_public_key.pem
    
  2. 确认数据库配置

    SELECT tenant_id, pub_key, pub_key_id 
    FROM sys_payment 
    WHERE tenant_id = 10547 AND type = 0;
    
  3. 重新测试支付订单创建

🔍 故障排除

如果仍然报错

  1. 检查文件是否存在

    ls -la /Users/gxwebsoft/JAVA/cms-java-code/src/main/resources/dev/wechat/10547/
    
  2. 检查文件权限

    chmod 644 /Users/gxwebsoft/JAVA/cms-java-code/src/main/resources/dev/wechat/10547/wechatpay_public_key.pem
    
  3. 查看详细日志

    • 关注 "开发环境公钥文件路径" 的输出
    • 确认路径是否正确
  4. 如果公钥ID不正确

    UPDATE sys_payment SET 
      pub_key_id = 'CORRECT_PUBLIC_KEY_ID'
    WHERE tenant_id = 10547 AND type = 0;
    

📊 配置优先级

  1. RSA公钥配置(最高优先级)

    • 开发环境:固定使用 wechatpay_public_key.pem
    • 生产环境:使用数据库路径
  2. RSA自动证书配置

    • 当没有公钥配置时使用
  3. RSA手动证书配置

    • 作为最后的回退方案

修复完成

现在系统应该能够:

  1. 在开发环境正确找到 wechatpay_public_key.pem 文件
  2. 在生产环境使用数据库中配置的路径
  3. 成功创建RSA公钥配置
  4. 避免 X509Certificate.getSerialNumber() null 错误

请重新测试支付订单创建功能!