签名验证

商户可以按照下述步骤验证应答或者回调的签名。

如果验证商户的请求签名正确,微信支付会在应答的HTTP头部中包括应答签名。我们建议商户验证应答签名。

同样的,微信支付会在回调的HTTP头部中包括回调报文的签名。商户必须验证回调的签名,以确保回调是由微信支付发送。

获取平台证书

微信支付API v3使用微信支付的平台私钥(不是商户私钥)进行应答签名。相应的,商户的技术人员应使用微信支付平台证书中的公钥验签。目前平台证书只提供API进行下载,请参考获取平台证书列表

检查平台证书序列号

微信支付的平台证书序列号位于HTTP头Wechatpay-Serial。验证签名前,请商户先检查序列号是否跟商户当前所持有的微信支付平台证书的序列号一致。如果不一致,请重新获取证书。否则,签名的私钥和证书不匹配,将无法成功验证签名。

构造验签名串

首先,商户先从应答中获取以下信息。

  • HTTP头Wechatpay-Timestamp中的应答时间戳。

  • HTTP头Wechatpay-Nonce中的应答随机串

  • 应答主体(response Body)

然后,请按照以下规则构造应答的验签名串。签名串共有三行,行尾以\n结束,包括最后一行。\n为换行符(ASCII编码值为0x0A)。若应答报文主体为空(如HTTP状态码为204 No Content),最后一行仅为一个\n换行符。

应答时间戳\n
应答随机串\n
应答报文主体\n

如某个应答的HTTP报文为(省略了ciphertext的具体内容):

则验签名串为

获取应答签名

微信支付的应答签名通过HTTP头Wechatpay-Signature传递。(注意,示例因为排版可能存在换行,实际数据应在一行)

Wechatpay-Signature的字段值使用Base64进行解码,得到应答签名。

验证签名

很多编程语言的签名验证函数支持对验签名串和签名进行签名验证。强烈建议商户调用该类函数,使用微信支付平台公钥对验签名串和签名进行SHA256 with RSA签名验证。

下面展示使用命令行演示如何进行验签。假设我们已经获取了平台证书并保存为1900009191_wxp_cert.pem

首先,从微信支付平台证书导出微信支付平台公钥

Java支持使用证书初始化签名对象,详见initVerify(Certificate),并不需要先导出公钥。

然后,把签名base64解码后保存为文件signature.txt

最后,验证签名

最后更新于

这有帮助吗?