小程序开发-服务端
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

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 失败时,自动回退到 RSAConfigRSAPublicKeyConfig
  • 增加了特定的证书错误检测和处理逻辑
  • 提供了详细的错误信息和修复建议

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. 商户平台配置

确保在微信商户平台完成以下配置:

  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版本
  • 监控微信支付平台公告
  • 及时更新过期证书

相关文档

总结

通过实施以上修复方案,系统现在具备了:

  1. 自动错误检测和诊断
  2. 智能回退机制
  3. 详细的错误信息和修复建议
  4. 完整的诊断和修复工具
  5. API接口支持

这些改进大大提高了微信支付证书问题的可诊断性和可修复性,减少了因证书配置问题导致的支付失败。