11
This commit is contained in:
144
docs/FINAL_FIX_SUMMARY.md
Normal file
144
docs/FINAL_FIX_SUMMARY.md
Normal file
@@ -0,0 +1,144 @@
|
||||
# 微信支付公钥路径修复总结
|
||||
|
||||
## 问题描述
|
||||
|
||||
**错误信息**:`公钥文件不存在: /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` 错误
|
||||
|
||||
请重新测试支付订单创建功能!
|
||||
Reference in New Issue
Block a user