# 微信支付公钥路径修复总结 ## 问题描述 **错误信息**:`公钥文件不存在: /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` 字段存储的完整路径 - 不进行任何路径拼接 ### 📋 代码逻辑 ```java // 开发环境 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. **确认文件存在**: ```bash ls -la /Users/gxwebsoft/JAVA/cms-java-code/src/main/resources/dev/wechat/10547/wechatpay_public_key.pem ``` 2. **确认数据库配置**: ```sql SELECT tenant_id, pub_key, pub_key_id FROM sys_payment WHERE tenant_id = 10547 AND type = 0; ``` 3. **重新测试支付订单创建** ### 🔍 故障排除 **如果仍然报错**: 1. **检查文件是否存在**: ```bash ls -la /Users/gxwebsoft/JAVA/cms-java-code/src/main/resources/dev/wechat/10547/ ``` 2. **检查文件权限**: ```bash chmod 644 /Users/gxwebsoft/JAVA/cms-java-code/src/main/resources/dev/wechat/10547/wechatpay_public_key.pem ``` 3. **查看详细日志**: - 关注 "开发环境公钥文件路径" 的输出 - 确认路径是否正确 4. **如果公钥ID不正确**: ```sql 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` 错误 请重新测试支付订单创建功能!