# 平台证书更新指引

## 平滑切换

我们提供以下的机制，帮助商户在平台证书更新时实现平滑切换：

1. 下载新平台证书。我们将在旧证书过期前10天生成新证书。商户可使用[平台证书下载API](https://wechatpay-api.gitbook.io/wechatpay-api-v3/jie-kou-wen-dang/ping-tai-zheng-shu)下载新平台证书，并在旧证书过期前5-10天部署新证书。
2. 兼容使用新旧平台证书。旧证书过期前5天至过期当天，新证书开始逐步放量用于应答和回调的签名。商户需根据证书序列号，使用对应版本的平台证书。（我们在所有API应答和回调的HTTP头部Wechatpay-Serial，声明了此次签名所对应的平台证书的序列号。）

## 最佳实践

由于旧证书过期前的5天内，微信支付会同时使用新旧证书，因此为实现新老证书的平滑切换，商户系统需支持多平台证书。

### 方式1

商户需从平台证书下载API获取证书，并将它们部署到生产环境中。线上服务根据报文头部的证书序列号Wechatpay-Serial找到对应的平台证书，再使用其中的公钥进行签名验证。商户需在旧证书过期前5-10天，完成新证书的部署。我们建议：

1. 将获取并部署的过程自动化，并设置定时（如每日）任务。这样可以大大降低证书更新时人为因素带给商户系统的风险。
2. 使用中控服务统一获取和安全存储证书，其他业务逻辑服务使用的证书均来自于该中控服务，或者直接使用中控服务进行签名验证。

### 方式2

商户也可以选择“惰性加载”的方式实现平滑切换。当业务逻辑服务上没有证书序列号所对应的证书时，调用API获取对应的平台证书，再进行签名验证或敏感信息加密。为了提高效率，商户可以在短时间内进行适当的缓存。

实现方式，可参考微信支付API v3的Java库[wechatpay-apache-httpclient](https://github.com/wechatpay-apiv3/wechatpay-apache-httpclient)

注意：系统中已有的微信支付平台证书在到达有效期后，商户系统应主动将其作废，避免安全风险。微信支付不会使用过期的证书。

## 应急处理指引

如果商户发现证书即将过期或已经过期，但系统还不支持证书的平滑更换，请参考下列处理方式。

1. 使用微信支付[wechatpay-apache-httpclient](https://github.com/wechatpay-apiv3/wechatpay-apache-httpclient)的商户。请确认已升级到v0.1.5，并主动设置使用AutoUpdateCertificatewsVerifier。请参考[自动更新证书功能](https://github.com/wechatpay-apiv3/wechatpay-apache-httpclient#%E8%87%AA%E5%8A%A8%E6%9B%B4%E6%96%B0%E8%AF%81%E4%B9%A6%E5%8A%9F%E8%83%BD%E5%8F%AF%E9%80%89)。
2. 若系统已经支持多平台证书，请关注平台证书的有效期。在旧证书过期前5-10天，使用微信支付提供的[证书下载工具](https://github.com/wechatpay-apiv3/CertificateDownloader)获取新证书，并部署至生产环境。
3. 若系统只支持一份平台证书，请使用联系微信支付的技术支持同事。我们将协助你完成证书的切换。
