- 前言
牢记一句话:公钥加密,私钥解密;私钥加签,公钥验签。
微信支付V3版本前两篇分别讲了如何对请求做签名和如何获取并刷新微信平台公钥,本篇将继续展开如何对微信支付响应结果的验签。
- 为什么要对响应验签
微信支付会在回调的HTTP头部中包括回调报文的签名。商户必须验证响应的签名,保证响应确实来自微信支付服务器,避免中间人攻击。而验证响应签名除了需要微信平台的公钥外还需要从请求头的其它参数。
假设以下就是微信支付服务器的响应:
1 | http复制代码HTTP/1.1 200 OK |
检查平台证书序列号
微信支付响应的时候会携带一个微信平台证书序列号,从响应头中的Wechatpay-Serial
字段中获取值,用来提示我们要使用该序列号的证书来进行验签,如果不存在就需要我们刷新证书,而上一文我们将平台证书序列号和证书以键值对存在HashMap
中,我们只需要检查是否存在即可,不存在就刷新。
构造验签名串
从响应结果中获取对应下面方法的三个参数就可以构造出验签名串。
1 | java复制代码/** |
验证签名
待验证的签名从响应头中的Wechatpay-Signature
字段中获取,我们使用微信支付平台公钥对验签名串和签名进行SHA256 with RSA签名验证。
1 | java复制代码 // 构造验签名串 |
完整的验签代码
1 | java复制代码/** |
CERTIFICATE_MAP
平台证书容器可参考上一篇文章。
- 总结
验签通过就说明我们请求的响应来自微信服务器就可以针对结果进行对应的逻辑处理了,微信支付API无论是V2还是V3都包含了使用Api证书对请求进行加签,对响应结果进行验签的流程,十分考验对密码摘要算法的使用,其它就是组织参数调用Http请求。如果你能够掌握这一能力就会在面试中和工作中占到优势。好了今天分享就到这里,多多关注: 码农小胖哥 获取更多实用的编程干货。
本文转载自: 掘金