193 lines
5.7 KiB
Markdown
193 lines
5.7 KiB
Markdown
# 微信支付证书问题修复总结
|
||
|
||
## 问题描述
|
||
|
||
**错误信息**:`创建支付订单失败:创建支付订单失败:Cannot invoke "java.security.cert.X509Certificate.getSerialNumber()" because "certificate" is null`
|
||
|
||
**错误代码**:1
|
||
|
||
## 问题分析
|
||
|
||
这个错误发生在微信支付SDK使用 `RSAAutoCertificateConfig` 自动证书配置时,SDK尝试自动下载微信支付平台证书但失败,导致证书对象为null,进而在调用 `getSerialNumber()` 方法时抛出空指针异常。
|
||
|
||
## 已实施的修复方案
|
||
|
||
### 1. 增强错误处理和自动回退机制
|
||
|
||
**文件**:`src/main/java/com/gxwebsoft/shop/service/impl/ShopOrderServiceImpl.java`
|
||
|
||
**修复内容**:
|
||
- 在开发环境和生产环境都增加了详细的错误诊断
|
||
- 实现了自动回退机制:当 `RSAAutoCertificateConfig` 失败时,自动回退到 `RSAConfig` 或 `RSAPublicKeyConfig`
|
||
- 增加了特定的证书错误检测和处理逻辑
|
||
- 提供了详细的错误信息和修复建议
|
||
|
||
### 2. 创建证书诊断工具
|
||
|
||
**文件**:`src/main/java/com/gxwebsoft/common/core/utils/WechatPayCertificateDiagnostic.java`
|
||
|
||
**功能**:
|
||
- 全面诊断微信支付证书配置
|
||
- 检查基本配置(商户号、应用ID、APIv3密钥、证书序列号)
|
||
- 验证证书文件存在性和有效性
|
||
- 检查证书内容和序列号匹配
|
||
- 生成详细的诊断报告和修复建议
|
||
|
||
### 3. 创建证书修复工具
|
||
|
||
**文件**:`src/main/java/com/gxwebsoft/common/core/utils/WechatPayCertificateFixer.java`
|
||
|
||
**功能**:
|
||
- 自动检测和修复常见的证书配置问题
|
||
- 验证证书文件路径和内容
|
||
- 检查序列号匹配性
|
||
- 提供自动修复建议
|
||
|
||
### 4. 创建诊断API接口
|
||
|
||
**文件**:`src/main/java/com/gxwebsoft/common/core/controller/WechatPayDiagnosticController.java`
|
||
|
||
**提供的API**:
|
||
- `GET /system/wechat-pay-diagnostic/diagnose/{tenantId}` - 诊断特定租户的证书配置
|
||
- `GET /system/wechat-pay-diagnostic/solutions` - 获取证书问题解决方案
|
||
- `POST /system/wechat-pay-diagnostic/test/{tenantId}` - 测试证书配置
|
||
- `GET /system/wechat-pay-diagnostic/environment` - 获取环境信息
|
||
- `GET /system/wechat-pay-diagnostic/guide` - 获取证书配置指南
|
||
|
||
### 5. 集成诊断功能
|
||
|
||
在支付服务中集成了证书诊断功能,每次创建支付订单时都会运行诊断,提供详细的配置信息和错误分析。
|
||
|
||
## 使用方法
|
||
|
||
### 1. 自动诊断
|
||
|
||
系统在创建支付订单时会自动运行诊断,查看控制台输出:
|
||
|
||
```
|
||
=== 微信支付证书诊断报告 ===
|
||
租户ID: 10550
|
||
商户号: 1723321338
|
||
应用ID: wx1234567890abcdef
|
||
商户证书序列号: 2B933F7C35014A1C363642623E4A62364B34C4EB
|
||
APIv3密钥: 已配置(32位)
|
||
证书文件路径: dev/wechat/10550/apiclient_key.pem
|
||
证书文件存在: 是
|
||
配置验证结果: 通过
|
||
```
|
||
|
||
### 2. 手动诊断
|
||
|
||
使用诊断API进行手动检查:
|
||
|
||
```bash
|
||
# 诊断特定租户
|
||
curl -X GET "http://localhost:9200/system/wechat-pay-diagnostic/diagnose/10550" \
|
||
-H "Authorization: Bearer YOUR_TOKEN"
|
||
|
||
# 获取解决方案
|
||
curl -X GET "http://localhost:9200/system/wechat-pay-diagnostic/solutions"
|
||
|
||
# 测试证书配置
|
||
curl -X POST "http://localhost:9200/system/wechat-pay-diagnostic/test/10550" \
|
||
-H "Authorization: Bearer YOUR_TOKEN"
|
||
```
|
||
|
||
### 3. 查看配置指南
|
||
|
||
访问 `GET /system/wechat-pay-diagnostic/guide` 获取完整的证书配置指南。
|
||
|
||
## 常见问题解决
|
||
|
||
### 1. 商户平台配置
|
||
|
||
确保在微信商户平台完成以下配置:
|
||
1. 开启API安全功能
|
||
2. 申请使用微信支付公钥
|
||
3. 下载商户证书文件
|
||
4. 设置32位APIv3密钥
|
||
|
||
### 2. 证书文件配置
|
||
|
||
**开发环境**:
|
||
```
|
||
src/main/resources/dev/wechat/{tenantId}/
|
||
├── apiclient_key.pem # 必需:商户私钥
|
||
└── apiclient_cert.pem # 可选:商户证书
|
||
```
|
||
|
||
**生产环境**:
|
||
- 将证书文件上传到服务器指定目录
|
||
- 在数据库中配置正确的文件路径
|
||
|
||
### 3. 数据库配置
|
||
|
||
在 `payment` 表中确保以下字段正确配置:
|
||
- `mch_id`: 商户号
|
||
- `app_id`: 应用ID
|
||
- `merchant_serial_number`: 商户证书序列号
|
||
- `api_key`: APIv3密钥(32位)
|
||
|
||
## 技术特性
|
||
|
||
### 1. 自动回退机制
|
||
|
||
当自动证书配置失败时,系统会自动尝试以下回退方案:
|
||
1. `RSAAutoCertificateConfig` (首选)
|
||
2. `RSAPublicKeyConfig` (如果有公钥配置)
|
||
3. `RSAConfig` (如果有商户证书文件)
|
||
|
||
### 2. 详细错误诊断
|
||
|
||
系统会检测特定的错误类型并提供针对性的解决方案:
|
||
- X509Certificate相关错误
|
||
- 404错误(API安全未开启)
|
||
- 证书序列号错误
|
||
- APIv3密钥错误
|
||
- 网络连接问题
|
||
|
||
### 3. 环境适配
|
||
|
||
支持开发环境和生产环境的不同配置方式:
|
||
- 开发环境:从classpath加载证书
|
||
- 生产环境:从文件系统或Docker挂载卷加载证书
|
||
|
||
## 监控和维护
|
||
|
||
### 1. 日志监控
|
||
|
||
关注以下日志信息:
|
||
- 证书诊断报告
|
||
- 自动回退日志
|
||
- 错误详情和建议
|
||
|
||
### 2. 定期检查
|
||
|
||
建议定期执行以下检查:
|
||
- 证书有效期
|
||
- 配置完整性
|
||
- 网络连接状态
|
||
|
||
### 3. 更新维护
|
||
|
||
- 定期更新微信支付SDK版本
|
||
- 监控微信支付平台公告
|
||
- 及时更新过期证书
|
||
|
||
## 相关文档
|
||
|
||
- [微信支付证书问题修复指南](./WECHAT_PAY_CERTIFICATE_FIX.md)
|
||
- [微信支付官方文档](https://pay.weixin.qq.com/doc/v3/merchant/4012153196)
|
||
- [API安全配置指南](https://pay.weixin.qq.com/doc/v3/merchant/4012153196)
|
||
|
||
## 总结
|
||
|
||
通过实施以上修复方案,系统现在具备了:
|
||
1. **自动错误检测和诊断**
|
||
2. **智能回退机制**
|
||
3. **详细的错误信息和修复建议**
|
||
4. **完整的诊断和修复工具**
|
||
5. **API接口支持**
|
||
|
||
这些改进大大提高了微信支付证书问题的可诊断性和可修复性,减少了因证书配置问题导致的支付失败。
|