API安全机制简介
更新时间:2023.09.13以下所述针对V3版本API
# 安全机制
微信支付使用商户的消息签名验证商户的身份。如果一个请求不包含签名或者签名验证失败,微信支付将返回身份验证错误。它背后的技术是:数字签名技术。
数字签名(亦称公钥数字签名)是一种独特的数字串,只能由信息发送者生成,且无法被他人伪造。它有效地证明了发送者发送信息的真实性。数字签名类似于纸上的普通物理签名,但采用了公钥加密技术来实现,用于验证数字信息的真实性。数字签名系统通常包含两种互补操作:一种用于生成签名,另一种用于验证签名。
# 商户请求微信支付
每个商户都拥有自己的商户API证书私钥,在发送请求时,商户需要使用这个私钥对消息进行签名。 当微信支付侧收到请求后,会使用对应的商户API证书公钥对签名进行验证(即验签)。只有当验签成功后,微信支付才会确认消息发送者的身份是真实的。
如果有敏感字段需要上送,则用微信支付的平台证书公钥对字段进行加密。微信支付收到后,会使用平台证书私钥解密。
示意图如下:
顺序为:
- 商户构造原始请求。
- 商户使用平台证书公钥对请求中的敏感字段进行加密,得到新的请求包体,注意是对敏感字段加密,而非整个原始请求,详情见:敏感数据加密。
- 商户使用商户API私钥对请求包体计算签名,详情见:生成签名。
- 商户将请求包体和签名上送到微信支付。
- 微信支付使用商户API证书公钥对请求包体进行验签。
- 微信支付使用平台私钥对请求中的敏感字段进行解密,得到原始请求,随后开始处理业务。
# 微信支付应答商户
微信支付给商户应答时,机制和商户请求微信支付类似,只是签名的私钥换成了微信支付平台私钥,加密的公钥换成了商户API证书公钥。
示意图如下:
顺序为:
- 微信支付构造原始应答。
- 微信支付使用商户API证书公钥对应答中的敏感字段进行加密,得到新的应答包体。
- 微信支付使用平台私钥对应答包体计算签名。
- 微信支付将应答包体和签名返回给商户。
商户收到应答后,应使用微信支付平台证书公钥进行验签,以校验应答者的身份真实性。详情见:验证签名。
如果应答中包含敏感字段,应使用商户API证书私钥进行解密。详情见:敏感数据加密
# 微信支付回调商户
微信支付回调商户时,与前述略有不同,主要体现在加密和签名的源串不同。
示意图如下:
其顺序为:
- 微信支付构造原始请求
- 微信支付使用APIv3密钥对原始请求进行加密,得到新的请求包体(注意:APIv3密钥是一个对称密钥,由商户在商户平台设置)
- 微信支付使用平台证书私钥对原始请求计算签名
- 微信支付将请求包体和签名上送到商户
- 商户使用APIv3密钥对请求包体进行解密,得到原始请求
- 商户使用平台证书公钥对原始请求进行验签,验签通过后开始处理业务
详细的解密方法见:回调解密
文档是否有帮助