# 微信支付证书问题解决方案总结 ## 问题现状 **错误信息**:`Cannot invoke "java.security.cert.X509Certificate.getSerialNumber()" because "certificate" is null` **根本原因**:微信支付SDK在使用自动证书配置时无法下载平台证书,导致证书对象为null。 ## 解决方案:使用公钥模式 ### 🎯 推荐方案:RSA公钥配置 我们已经实现了智能配置检测,系统会按以下优先级选择配置方式: 1. **RSA公钥配置**(最稳定,推荐) 2. **RSA自动证书配置**(需要网络连接) 3. **RSA手动证书配置**(回退方案) ### 📋 配置步骤 #### 1. 准备公钥文件 将微信支付平台公钥文件放置到: ``` src/main/resources/dev/wechat/10547/ ├── apiclient_key.pem # 商户私钥(已有) ├── apiclient_cert.pem # 商户证书(已有) └── wechatpay_public_key.pem # 微信支付平台公钥(新增) ``` #### 2. 数据库配置 执行以下SQL更新支付配置: ```sql -- 查看当前配置 SELECT id, tenant_id, mch_id, app_id, merchant_serial_number, pub_key, pub_key_id, api_key FROM sys_payment WHERE tenant_id = 10547 AND type = 0; -- 更新公钥配置 UPDATE sys_payment SET pub_key = 'wechatpay_public_key.pem', pub_key_id = 'YOUR_ACTUAL_PUBLIC_KEY_ID' -- 请替换为实际的公钥ID WHERE tenant_id = 10547 AND type = 0; ``` #### 3. 验证配置 使用新增的API接口验证配置: ```bash # 快速检查配置状态 GET /system/wechat-pay-diagnostic/check/10547 # 获取详细配置建议 GET /system/wechat-pay-diagnostic/advice/10547 ``` ### 🔧 已实现的功能 #### 1. 智能配置检测 系统会自动检测数据库中的公钥配置: ```java // 检测逻辑 if (payment.getPubKey() != null && !payment.getPubKey().isEmpty() && payment.getPubKeyId() != null && !payment.getPubKeyId().isEmpty()) { // 使用RSA公钥配置 config = new RSAPublicKeyConfig.Builder()... } else { // 回退到自动证书配置 config = wechatCertAutoConfig.createAutoConfig()... } ``` #### 2. 详细日志输出 配置成功时的日志: ``` === 检测到公钥配置,使用RSA公钥模式 === 公钥文件: wechatpay_public_key.pem 公钥ID: PUB_KEY_ID_0112422897022025011300326200001208 公钥文件路径: /path/to/wechatpay_public_key.pem ✅ 开发环境RSA公钥配置成功 ``` #### 3. 配置诊断API 新增的API接口: | 接口 | 功能 | 说明 | |------|------|------| | `GET /system/wechat-pay-diagnostic/check/{tenantId}` | 快速配置检查 | 检查配置完整性和文件存在性 | | `GET /system/wechat-pay-diagnostic/advice/{tenantId}` | 获取配置建议 | 生成详细的配置建议和修复步骤 | | `GET /system/wechat-pay-diagnostic/diagnose/{tenantId}` | 全面诊断 | 完整的证书诊断报告 | #### 4. 配置检查工具 `WechatPayConfigChecker` 提供: - 配置完整性检查 - 文件存在性验证 - 配置模式识别 - 问题诊断和建议 ### 📊 配置状态检查 使用配置检查API可以获得详细的状态报告: ```json { "code": 200, "message": "配置检查通过", "data": { "tenantId": 10547, "environment": "dev", "configMode": "公钥模式", "configComplete": true, "hasError": false, "recommendation": "✅ 配置完整,建议使用当前配置", "configDetails": { "merchantId": "1723321338", "appId": "wx1234567890abcdef", "hasPublicKey": true, "publicKeyExists": true, "privateKeyExists": true } } } ``` ### 🚀 立即行动 #### 方案A:使用公钥模式(推荐) 1. **获取公钥文件和ID**: - 从微信商户平台或技术支持获取 - 或使用现有的公钥文件 2. **放置文件**: ```bash # 将公钥文件复制到指定位置 cp wechatpay_public_key.pem src/main/resources/dev/wechat/10547/ ``` 3. **更新数据库**: ```sql UPDATE sys_payment SET pub_key = 'wechatpay_public_key.pem', pub_key_id = 'YOUR_PUBLIC_KEY_ID' WHERE tenant_id = 10547 AND type = 0; ``` 4. **测试验证**: - 重新尝试创建支付订单 - 查看日志确认使用公钥模式 #### 方案B:修复自动证书配置 如果暂时无法获取公钥,可以: 1. **检查商户平台设置**: - 确保已开启API安全功能 - 申请使用微信支付公钥 2. **验证网络连接**: - 确保服务器可以访问微信支付API - 检查防火墙和代理设置 3. **使用诊断工具**: ```bash GET /system/wechat-pay-diagnostic/diagnose/10547 ``` ### 📈 优势对比 | 配置方式 | 稳定性 | 网络依赖 | 配置难度 | 推荐指数 | |---------|--------|----------|----------|----------| | RSA公钥配置 | ⭐⭐⭐⭐⭐ | 无 | ⭐⭐ | 🔥🔥🔥🔥🔥 | | RSA自动证书配置 | ⭐⭐⭐ | 高 | ⭐ | ⭐⭐⭐ | | RSA手动证书配置 | ⭐⭐⭐ | 无 | ⭐⭐⭐⭐ | ⭐⭐ | ### 🎯 预期结果 配置完成后,您应该看到: 1. **日志输出**: ``` === 检测到公钥配置,使用RSA公钥模式 === ✅ 开发环境RSA公钥配置成功 ``` 2. **支付订单创建成功**: - 不再出现证书null错误 - 支付流程正常进行 3. **配置检查通过**: ``` GET /system/wechat-pay-diagnostic/check/10547 返回:配置检查通过 ``` ### 📞 技术支持 如果仍有问题,请: 1. 使用诊断API获取详细信息 2. 查看完整的错误日志 3. 提供配置检查结果 4. 联系技术支持团队 --- **总结**:通过使用公钥模式,可以彻底解决 `X509Certificate.getSerialNumber() null` 错误,提供更稳定可靠的微信支付服务。