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

193 lines
5.7 KiB
Markdown
Raw 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`
**错误代码**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接口支持**
这些改进大大提高了微信支付证书问题的可诊断性和可修复性,减少了因证书配置问题导致的支付失败。