This commit is contained in:
2025-09-06 11:58:18 +08:00
commit 8d34972119
1483 changed files with 141190 additions and 0 deletions

View File

@@ -0,0 +1,192 @@
# 微信支付证书问题修复总结
## 问题描述
**错误信息**`创建支付订单失败创建支付订单失败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接口支持**
这些改进大大提高了微信支付证书问题的可诊断性和可修复性,减少了因证书配置问题导致的支付失败。