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