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
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
🚀 测试步骤
-
确认文件存在:
ls -la /Users/gxwebsoft/JAVA/cms-java-code/src/main/resources/dev/wechat/10547/wechatpay_public_key.pem
-
确认数据库配置:
SELECT tenant_id, pub_key, pub_key_id FROM sys_payment WHERE tenant_id = 10547 AND type = 0;
-
重新测试支付订单创建
🔍 故障排除
如果仍然报错:
-
检查文件是否存在:
ls -la /Users/gxwebsoft/JAVA/cms-java-code/src/main/resources/dev/wechat/10547/
-
检查文件权限:
chmod 644 /Users/gxwebsoft/JAVA/cms-java-code/src/main/resources/dev/wechat/10547/wechatpay_public_key.pem
-
查看详细日志:
- 关注 "开发环境公钥文件路径" 的输出
- 确认路径是否正确
-
如果公钥ID不正确:
UPDATE sys_payment SET pub_key_id = 'CORRECT_PUBLIC_KEY_ID' WHERE tenant_id = 10547 AND type = 0;
📊 配置优先级
-
RSA公钥配置(最高优先级)
- 开发环境:固定使用
wechatpay_public_key.pem
- 生产环境:使用数据库路径
- 开发环境:固定使用
-
RSA自动证书配置
- 当没有公钥配置时使用
-
RSA手动证书配置
- 作为最后的回退方案
✅ 修复完成
现在系统应该能够:
- 在开发环境正确找到
wechatpay_public_key.pem
文件 - 在生产环境使用数据库中配置的路径
- 成功创建RSA公钥配置
- 避免
X509Certificate.getSerialNumber() null
错误
请重新测试支付订单创建功能!