小程序开发-服务端
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.1 KiB

微信支付公钥模式配置指南

概述

如果您的后台系统使用了微信支付公钥模式,系统现在支持自动检测并优先使用公钥配置。这种模式比自动证书配置更稳定,不依赖网络下载平台证书。

配置步骤

1. 获取公钥文件

从微信商户平台下载或获取以下文件:

  • 微信支付平台公钥文件(通常以 .pem 结尾)
  • 公钥ID(一个字符串标识符)

2. 放置公钥文件

将公钥文件放置到对应租户的证书目录:

src/main/resources/dev/wechat/{tenantId}/
├── apiclient_key.pem          # 商户私钥(必需)
├── apiclient_cert.pem         # 商户证书(可选)
└── wechatpay_public_key.pem   # 微信支付平台公钥(新增)

例如,租户ID为10547的目录结构:

src/main/resources/dev/wechat/10547/
├── apiclient_key.pem
├── apiclient_cert.pem
└── wechatpay_public_key.pem

3. 数据库配置

sys_payment 表中配置公钥相关字段:

UPDATE sys_payment SET 
  pub_key = 'wechatpay_public_key.pem',
  pub_key_id = 'YOUR_PUBLIC_KEY_ID'
WHERE tenant_id = 10547 AND type = 0;

字段说明

  • pub_key: 公钥文件名
  • pub_key_id: 微信支付平台提供的公钥ID

4. 验证配置

运行测试来验证配置是否正确:

# 运行公钥配置测试
mvn test -Dtest=WechatPayPublicKeyTest#testPublicKeyConfiguration

配置优先级

系统会按以下优先级选择配置方式:

  1. RSA公钥配置(最高优先级)

    • 条件:数据库中配置了 pub_keypub_key_id
    • 优势:稳定、不依赖网络、配置简单
  2. RSA自动证书配置

    • 条件:公钥配置不可用时
    • 优势:自动管理平台证书
    • 劣势:依赖网络连接和商户平台API安全设置
  3. RSA手动证书配置(回退方案)

    • 条件:自动配置失败时
    • 需要:商户证书文件

示例配置

开发环境示例

目录结构

src/main/resources/dev/wechat/10547/
├── apiclient_key.pem
├── apiclient_cert.pem
└── wechatpay_public_key.pem

数据库配置

-- 查看当前配置
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 = 'PUB_KEY_ID_0112422897022025011300326200001208'
WHERE tenant_id = 10547 AND type = 0;

生产环境示例

证书文件路径

/www/wwwroot/file.ws/file/wechat/10547/
├── apiclient_key.pem
├── apiclient_cert.pem
└── wechatpay_public_key.pem

数据库配置

UPDATE sys_payment SET 
  apiclient_key = '/wechat/10547/apiclient_key.pem',
  apiclient_cert = '/wechat/10547/apiclient_cert.pem',
  pub_key = '/wechat/10547/wechatpay_public_key.pem',
  pub_key_id = 'PUB_KEY_ID_0112422897022025011300326200001208'
WHERE tenant_id = 10547 AND type = 0;

日志输出

配置成功后,您会在日志中看到:

=== 检测到公钥配置,使用RSA公钥模式 ===
公钥文件: wechatpay_public_key.pem
公钥ID: PUB_KEY_ID_0112422897022025011300326200001208
公钥文件路径: /path/to/wechatpay_public_key.pem
✅ 开发环境RSA公钥配置成功

如果没有公钥配置,系统会尝试自动证书配置:

=== 尝试创建自动证书配置 ===
商户号: 1723321338
私钥路径: /path/to/apiclient_key.pem
序列号: 2B933F7C35014A1C363642623E4A62364B34C4EB
API密钥长度: 32

故障排除

1. 公钥文件不存在

错误信息

❌ 公钥文件不存在: dev/wechat/10547/wechatpay_public_key.pem

解决方案

  • 检查文件路径是否正确
  • 确认文件已放置在正确位置
  • 验证文件名与数据库配置一致

2. 公钥ID错误

错误信息

❌ RSA公钥配置失败: Invalid public key ID

解决方案

  • 检查公钥ID是否正确
  • 确认公钥ID与公钥文件匹配
  • 联系微信支付技术支持获取正确的公钥ID

3. 数据库配置缺失

现象:系统跳过公钥配置,直接尝试自动证书配置

解决方案

-- 检查当前配置
SELECT pub_key, pub_key_id FROM sys_payment WHERE tenant_id = 10547 AND type = 0;

-- 如果字段为空,进行配置
UPDATE sys_payment SET 
  pub_key = 'wechatpay_public_key.pem',
  pub_key_id = 'YOUR_PUBLIC_KEY_ID'
WHERE tenant_id = 10547 AND type = 0;

优势对比

配置方式 稳定性 网络依赖 配置复杂度 推荐度
RSA公钥配置
RSA自动证书配置
RSA手动证书配置

总结

使用公钥模式可以有效避免 X509Certificate.getSerialNumber() null 错误,因为它不依赖自动下载平台证书。建议优先使用此配置方式。

如果您已经有公钥文件和公钥ID,按照本指南配置后,系统会自动使用更稳定的公钥模式。