编程 微信支付平台证书每 5 年要换一次:切到公钥模式后,回调有 7 天新旧签名混合期

2026-09-21 21:04:15

微信支付平台证书每 5 年要换一次:切到公钥模式后,回调有 7 天新旧签名混合期

微信支付 APIv3 支持两种签名验签模式:平台证书、微信支付公钥。平台证书有效期 5 年,每 5 年商户要主动换一次;为避免更换不及时或更换中的系统风险,可以把平台证书模式切换为公钥模式,公钥模式不需要再定期更换。

  • 官方指引:
  • 常见问题:

切换前的几个约束

  • 【平台证书切换公钥】与【灰度更换新平台证书】不能同时进行。若正在灰度更换新证书,必须先在 API安全-平台证书 里停止(谨慎操作),才能继续公钥切换流程。
  • 切换按商户号维度进行,多商户号要逐个完成。
  • 申请公钥后默认不开启公钥切换,要在【商户平台】→【账户中心】→【API安全】→【微信支付公钥】→【管理公钥】点开启公钥切换才可用。每个商户号只有一个微信支付公钥。
  • 公钥下载:超级管理员或安全联系人在同一页面下载 pem 文件,可查到公钥 ID。

回调侧:7 天灰度,必须看 Wechatpay-Serial

回调使用公钥的比例由微信支付控制、自动灰度,商户不能操作:

时间公钥签名比例
第 1 天0.1%
第 2 天1%
第 3 天5%
第 4 天10%
第 5 天20%
第 6 天50%
第 7 天100%

灰度期间按比例用公钥签名,其余用平台证书签名。因此回调侧必须根据请求头 Wechatpay-Serial 判断本次是公钥还是平台证书签名,用对应的密钥验签。这是整个迁移最容易漏的一步。

应答侧:比例由商户自己控制

请求里带 Wechatpay-Serial 头(值为微信支付公钥 ID,带 PUB_KEY_ID_ 前缀)就按公钥签名返回;不带则仍用平台证书签名:

curl -X GET https://api.mch.weixin.qq.com/v3/xxx \
-H "Authorization: WECHATPAY2-SHA256-RSA2048 ..." \
-H "Wechatpay-Serial: PUB_KEY_ID_00000000000000000000000000000000"

应答进度条的计算方式:近 7 天用公钥调接口次数 / 近 7 天 v3 总调用次数,数据每小时更新;全量切换后还要等 7 天才会到 100%。

wechatpay-java 侧要改什么

用 wechatpay-java 的话,RSACombinedNotificationConfig 会自动调平台证书下载接口。回调比例到 100% 后要改成 RSAPublicKeyNotificationConfig,否则自动下载平台证书的流量会让应答场景到不了 100%。用公钥初始化的写法:

Config config = new RSAPublicKeyConfig.Builder()
.merchantId(...)
.privateKeyFromPath(...)
.publicKeyFromPath(...)
.publicKeyId(...)
.merchantSerialNumber(...)
.apiV3Key(...)
.build();

需要 wechatpay-java v0.2.17 及以上。

常见报错

  • RESOURCE_NOT_EXISTS/“无可用的平台证书,请在商户平台-API安全申请使用微信支付公钥”:没有可用平台证书,按指引接公钥。
  • NOT_ENOUGH/“平台证书已过期失效”:平台证书过期,联系技术支持。
  • 验签失败 Cannot found the serial(...)...your's ...:验签用了与本次接口要求不匹配的证书,灰度期要按响应头 Wechatpay-Serial 指定的序列号取证书。
  • HTTP header 缺少微信支付平台证书序列号(Wechatpay-Serial):上传敏感信息字段时必须在请求头声明加密所用证书序列号。
  • 在请求头传了公钥 ID 但应答仍用平台证书:多半是没在商户平台开启公钥切换。

时间规划与收尾

算好平台证书过期时间与 7 天灰度,别出现证书过期但公钥灰度没完成的窗口。

回调与应答比例都到 100% 后,在商户平台点“确认切换”,再作废平台证书,流程不可回退。

复制全文 生成海报 微信支付 APIv3 签名验签 接口对接

推荐文章

程序员茄子在线接单