5.7 KiB
微信支付证书问题修复总结
问题描述
错误信息:创建支付订单失败:创建支付订单失败: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进行手动检查:
# 诊断特定租户
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. 商户平台配置
确保在微信商户平台完成以下配置:
- 开启API安全功能
- 申请使用微信支付公钥
- 下载商户证书文件
- 设置32位APIv3密钥
2. 证书文件配置
开发环境:
src/main/resources/dev/wechat/{tenantId}/
├── apiclient_key.pem # 必需:商户私钥
└── apiclient_cert.pem # 可选:商户证书
生产环境:
- 将证书文件上传到服务器指定目录
- 在数据库中配置正确的文件路径
3. 数据库配置
在 payment
表中确保以下字段正确配置:
mch_id
: 商户号app_id
: 应用IDmerchant_serial_number
: 商户证书序列号api_key
: APIv3密钥(32位)
技术特性
1. 自动回退机制
当自动证书配置失败时,系统会自动尝试以下回退方案:
RSAAutoCertificateConfig
(首选)RSAPublicKeyConfig
(如果有公钥配置)RSAConfig
(如果有商户证书文件)
2. 详细错误诊断
系统会检测特定的错误类型并提供针对性的解决方案:
- X509Certificate相关错误
- 404错误(API安全未开启)
- 证书序列号错误
- APIv3密钥错误
- 网络连接问题
3. 环境适配
支持开发环境和生产环境的不同配置方式:
- 开发环境:从classpath加载证书
- 生产环境:从文件系统或Docker挂载卷加载证书
监控和维护
1. 日志监控
关注以下日志信息:
- 证书诊断报告
- 自动回退日志
- 错误详情和建议
2. 定期检查
建议定期执行以下检查:
- 证书有效期
- 配置完整性
- 网络连接状态
3. 更新维护
- 定期更新微信支付SDK版本
- 监控微信支付平台公告
- 及时更新过期证书
相关文档
总结
通过实施以上修复方案,系统现在具备了:
- 自动错误检测和诊断
- 智能回退机制
- 详细的错误信息和修复建议
- 完整的诊断和修复工具
- API接口支持
这些改进大大提高了微信支付证书问题的可诊断性和可修复性,减少了因证书配置问题导致的支付失败。