Files
java-10561/docs/PRODUCTION_PATH_FIX.md
2025-09-06 11:58:18 +08:00

137 lines
4.2 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 生产环境公钥路径修复
## 问题描述
**错误信息**`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公钥配置避免证书相关错误。