11
This commit is contained in:
216
docs/SOLUTION_SUMMARY.md
Normal file
216
docs/SOLUTION_SUMMARY.md
Normal file
@@ -0,0 +1,216 @@
|
||||
# 微信支付证书问题解决方案总结
|
||||
|
||||
## 问题现状
|
||||
|
||||
**错误信息**:`Cannot invoke "java.security.cert.X509Certificate.getSerialNumber()" because "certificate" is null`
|
||||
|
||||
**根本原因**:微信支付SDK在使用自动证书配置时无法下载平台证书,导致证书对象为null。
|
||||
|
||||
## 解决方案:使用公钥模式
|
||||
|
||||
### 🎯 推荐方案:RSA公钥配置
|
||||
|
||||
我们已经实现了智能配置检测,系统会按以下优先级选择配置方式:
|
||||
|
||||
1. **RSA公钥配置**(最稳定,推荐)
|
||||
2. **RSA自动证书配置**(需要网络连接)
|
||||
3. **RSA手动证书配置**(回退方案)
|
||||
|
||||
### 📋 配置步骤
|
||||
|
||||
#### 1. 准备公钥文件
|
||||
|
||||
将微信支付平台公钥文件放置到:
|
||||
```
|
||||
src/main/resources/dev/wechat/10547/
|
||||
├── apiclient_key.pem # 商户私钥(已有)
|
||||
├── apiclient_cert.pem # 商户证书(已有)
|
||||
└── wechatpay_public_key.pem # 微信支付平台公钥(新增)
|
||||
```
|
||||
|
||||
#### 2. 数据库配置
|
||||
|
||||
执行以下SQL更新支付配置:
|
||||
|
||||
```sql
|
||||
-- 查看当前配置
|
||||
SELECT id, tenant_id, mch_id, app_id, merchant_serial_number,
|
||||
pub_key, pub_key_id, api_key
|
||||
FROM sys_payment
|
||||
WHERE tenant_id = 10547 AND type = 0;
|
||||
|
||||
-- 更新公钥配置
|
||||
UPDATE sys_payment SET
|
||||
pub_key = 'wechatpay_public_key.pem',
|
||||
pub_key_id = 'YOUR_ACTUAL_PUBLIC_KEY_ID' -- 请替换为实际的公钥ID
|
||||
WHERE tenant_id = 10547 AND type = 0;
|
||||
```
|
||||
|
||||
#### 3. 验证配置
|
||||
|
||||
使用新增的API接口验证配置:
|
||||
|
||||
```bash
|
||||
# 快速检查配置状态
|
||||
GET /system/wechat-pay-diagnostic/check/10547
|
||||
|
||||
# 获取详细配置建议
|
||||
GET /system/wechat-pay-diagnostic/advice/10547
|
||||
```
|
||||
|
||||
### 🔧 已实现的功能
|
||||
|
||||
#### 1. 智能配置检测
|
||||
|
||||
系统会自动检测数据库中的公钥配置:
|
||||
|
||||
```java
|
||||
// 检测逻辑
|
||||
if (payment.getPubKey() != null && !payment.getPubKey().isEmpty() &&
|
||||
payment.getPubKeyId() != null && !payment.getPubKeyId().isEmpty()) {
|
||||
// 使用RSA公钥配置
|
||||
config = new RSAPublicKeyConfig.Builder()...
|
||||
} else {
|
||||
// 回退到自动证书配置
|
||||
config = wechatCertAutoConfig.createAutoConfig()...
|
||||
}
|
||||
```
|
||||
|
||||
#### 2. 详细日志输出
|
||||
|
||||
配置成功时的日志:
|
||||
```
|
||||
=== 检测到公钥配置,使用RSA公钥模式 ===
|
||||
公钥文件: wechatpay_public_key.pem
|
||||
公钥ID: PUB_KEY_ID_0112422897022025011300326200001208
|
||||
公钥文件路径: /path/to/wechatpay_public_key.pem
|
||||
✅ 开发环境RSA公钥配置成功
|
||||
```
|
||||
|
||||
#### 3. 配置诊断API
|
||||
|
||||
新增的API接口:
|
||||
|
||||
| 接口 | 功能 | 说明 |
|
||||
|------|------|------|
|
||||
| `GET /system/wechat-pay-diagnostic/check/{tenantId}` | 快速配置检查 | 检查配置完整性和文件存在性 |
|
||||
| `GET /system/wechat-pay-diagnostic/advice/{tenantId}` | 获取配置建议 | 生成详细的配置建议和修复步骤 |
|
||||
| `GET /system/wechat-pay-diagnostic/diagnose/{tenantId}` | 全面诊断 | 完整的证书诊断报告 |
|
||||
|
||||
#### 4. 配置检查工具
|
||||
|
||||
`WechatPayConfigChecker` 提供:
|
||||
- 配置完整性检查
|
||||
- 文件存在性验证
|
||||
- 配置模式识别
|
||||
- 问题诊断和建议
|
||||
|
||||
### 📊 配置状态检查
|
||||
|
||||
使用配置检查API可以获得详细的状态报告:
|
||||
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"message": "配置检查通过",
|
||||
"data": {
|
||||
"tenantId": 10547,
|
||||
"environment": "dev",
|
||||
"configMode": "公钥模式",
|
||||
"configComplete": true,
|
||||
"hasError": false,
|
||||
"recommendation": "✅ 配置完整,建议使用当前配置",
|
||||
"configDetails": {
|
||||
"merchantId": "1723321338",
|
||||
"appId": "wx1234567890abcdef",
|
||||
"hasPublicKey": true,
|
||||
"publicKeyExists": true,
|
||||
"privateKeyExists": true
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 🚀 立即行动
|
||||
|
||||
#### 方案A:使用公钥模式(推荐)
|
||||
|
||||
1. **获取公钥文件和ID**:
|
||||
- 从微信商户平台或技术支持获取
|
||||
- 或使用现有的公钥文件
|
||||
|
||||
2. **放置文件**:
|
||||
```bash
|
||||
# 将公钥文件复制到指定位置
|
||||
cp wechatpay_public_key.pem src/main/resources/dev/wechat/10547/
|
||||
```
|
||||
|
||||
3. **更新数据库**:
|
||||
```sql
|
||||
UPDATE sys_payment SET
|
||||
pub_key = 'wechatpay_public_key.pem',
|
||||
pub_key_id = 'YOUR_PUBLIC_KEY_ID'
|
||||
WHERE tenant_id = 10547 AND type = 0;
|
||||
```
|
||||
|
||||
4. **测试验证**:
|
||||
- 重新尝试创建支付订单
|
||||
- 查看日志确认使用公钥模式
|
||||
|
||||
#### 方案B:修复自动证书配置
|
||||
|
||||
如果暂时无法获取公钥,可以:
|
||||
|
||||
1. **检查商户平台设置**:
|
||||
- 确保已开启API安全功能
|
||||
- 申请使用微信支付公钥
|
||||
|
||||
2. **验证网络连接**:
|
||||
- 确保服务器可以访问微信支付API
|
||||
- 检查防火墙和代理设置
|
||||
|
||||
3. **使用诊断工具**:
|
||||
```bash
|
||||
GET /system/wechat-pay-diagnostic/diagnose/10547
|
||||
```
|
||||
|
||||
### 📈 优势对比
|
||||
|
||||
| 配置方式 | 稳定性 | 网络依赖 | 配置难度 | 推荐指数 |
|
||||
|---------|--------|----------|----------|----------|
|
||||
| RSA公钥配置 | ⭐⭐⭐⭐⭐ | 无 | ⭐⭐ | 🔥🔥🔥🔥🔥 |
|
||||
| RSA自动证书配置 | ⭐⭐⭐ | 高 | ⭐ | ⭐⭐⭐ |
|
||||
| RSA手动证书配置 | ⭐⭐⭐ | 无 | ⭐⭐⭐⭐ | ⭐⭐ |
|
||||
|
||||
### 🎯 预期结果
|
||||
|
||||
配置完成后,您应该看到:
|
||||
|
||||
1. **日志输出**:
|
||||
```
|
||||
=== 检测到公钥配置,使用RSA公钥模式 ===
|
||||
✅ 开发环境RSA公钥配置成功
|
||||
```
|
||||
|
||||
2. **支付订单创建成功**:
|
||||
- 不再出现证书null错误
|
||||
- 支付流程正常进行
|
||||
|
||||
3. **配置检查通过**:
|
||||
```
|
||||
GET /system/wechat-pay-diagnostic/check/10547
|
||||
返回:配置检查通过
|
||||
```
|
||||
|
||||
### 📞 技术支持
|
||||
|
||||
如果仍有问题,请:
|
||||
|
||||
1. 使用诊断API获取详细信息
|
||||
2. 查看完整的错误日志
|
||||
3. 提供配置检查结果
|
||||
4. 联系技术支持团队
|
||||
|
||||
---
|
||||
|
||||
**总结**:通过使用公钥模式,可以彻底解决 `X509Certificate.getSerialNumber() null` 错误,提供更稳定可靠的微信支付服务。
|
||||
Reference in New Issue
Block a user