Files
mp-java/docs/SOLUTION_SUMMARY.md

217 lines
5.6 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.

# 微信支付证书问题解决方案总结
## 问题现状
**错误信息**`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` 错误,提供更稳定可靠的微信支付服务。