# 生产环境公钥路径修复 ## 问题描述 **错误信息**:`Docker挂载卷中找不到证书文件:/www/wwwroot/file.ws/20250114/0f65a8517c284acb90aa83dd0c23e8f6.pem` **正确路径**:`/www/wwwroot/file.ws/file/20250114/0f65a8517c284acb90aa83dd0c23e8f6.pem` **问题原因**:生产环境的公钥路径缺少 `/file` 目录前缀 ## 修复方案 ### 🔧 方案B:代码逻辑修正(已实施) 在生产环境的公钥处理代码中添加路径修正逻辑: ```java // 生产环境处理公钥路径 - 添加 /file 前缀 String pubKeyPath = payment.getPubKey(); // 如果路径不是以 /file 开头,需要添加 /file 前缀 if (!pubKeyPath.startsWith("/file/") && !pubKeyPath.startsWith("file/")) { pubKeyPath = "file/" + pubKeyPath; System.out.println("生产环境公钥路径修正: " + payment.getPubKey() + " -> " + pubKeyPath); } else { System.out.println("生产环境公钥路径: " + pubKeyPath); } String pubKeyFile = certificateLoader.loadCertificatePath(pubKeyPath); ``` ### 📋 修复逻辑 1. **开发环境**: - 固定使用 `wechatpay_public_key.pem` - 路径:`dev/wechat/{tenantId}/wechatpay_public_key.pem` 2. **生产环境**: - 检查数据库中的 `pubKey` 路径 - 如果不以 `file/` 开头,自动添加 `file/` 前缀 - 最终路径:`file/{原始路径}` ### 🎯 预期效果 **修正前的路径**: ``` 数据库配置: 20250114/0f65a8517c284acb90aa83dd0c23e8f6.pem 实际查找: /www/wwwroot/file.ws/20250114/0f65a8517c284acb90aa83dd0c23e8f6.pem 结果: ❌ 文件不存在 ``` **修正后的路径**: ``` 数据库配置: 20250114/0f65a8517c284acb90aa83dd0c23e8f6.pem 路径修正: file/20250114/0f65a8517c284acb90aa83dd0c23e8f6.pem 实际查找: /www/wwwroot/file.ws/file/20250114/0f65a8517c284acb90aa83dd0c23e8f6.pem 结果: ✅ 文件找到 ``` ### 📊 日志输出 **成功的日志**: ``` === 生产环境检测到公钥配置,使用RSA公钥模式 === 公钥文件路径: 20250114/0f65a8517c284acb90aa83dd0c23e8f6.pem 公钥ID: YOUR_PUBLIC_KEY_ID 生产环境公钥路径修正: 20250114/0f65a8517c284acb90aa83dd0c23e8f6.pem -> file/20250114/0f65a8517c284acb90aa83dd0c23e8f6.pem ✅ 生产环境公钥文件加载成功: /www/wwwroot/file.ws/file/20250114/0f65a8517c284acb90aa83dd0c23e8f6.pem ✅ 生产环境RSA公钥配置成功 ``` **如果路径已经正确**: ``` === 生产环境检测到公钥配置,使用RSA公钥模式 === 公钥文件路径: file/20250114/0f65a8517c284acb90aa83dd0c23e8f6.pem 公钥ID: YOUR_PUBLIC_KEY_ID 生产环境公钥路径: file/20250114/0f65a8517c284acb90aa83dd0c23e8f6.pem ✅ 生产环境公钥文件加载成功: /www/wwwroot/file.ws/file/20250114/0f65a8517c284acb90aa83dd0c23e8f6.pem ✅ 生产环境RSA公钥配置成功 ``` ### 🔍 兼容性 这个修复方案具有很好的兼容性: 1. **向后兼容**: - 如果数据库中已经配置了正确的路径(以 `file/` 开头),不会进行修正 - 如果数据库中是旧的路径格式,会自动添加 `file/` 前缀 2. **多种路径格式支持**: - `20250114/xxx.pem` → `file/20250114/xxx.pem` - `file/20250114/xxx.pem` → `file/20250114/xxx.pem`(不变) - `/file/20250114/xxx.pem` → `/file/20250114/xxx.pem`(不变) ### 🚀 测试验证 现在可以重新测试支付订单创建: 1. **确认数据库配置**: ```sql SELECT tenant_id, pub_key, pub_key_id FROM sys_payment WHERE tenant_id = 10547 AND type = 0; ``` 2. **重新创建支付订单** 3. **查看日志输出**: - 关注 "生产环境公钥路径修正" 的输出 - 确认最终路径是否正确 ### 📁 文件结构 **生产环境文件结构**: ``` /www/wwwroot/file.ws/file/ ├── 20250114/ │ └── 0f65a8517c284acb90aa83dd0c23e8f6.pem ├── wechat/ │ └── 10547/ │ ├── apiclient_key.pem │ ├── apiclient_cert.pem │ └── public_key.pem └── ... ``` ### 🎉 修复完成 通过这个修复: 1. ✅ 解决了生产环境公钥路径缺少 `/file` 前缀的问题 2. ✅ 保持了向后兼容性 3. ✅ 支持多种路径格式 4. ✅ 提供了详细的日志输出用于调试 现在生产环境应该能够正确找到公钥文件,成功使用RSA公钥配置,避免证书相关错误。