1. 前言
在Java 中的微信支付(1):API V3 版本签名详解一文中胖哥讲解了微信支付 V3 版本 API 的签名,当我方(你自己的服务器)请求微信支付服务器时需要根据我方的API 证书对参数进行加签,微信服务器会根据我方签名验签以确定请求来自我方服务器。那么同样的道理我方的服务器也要对微信支付服务器的响应进行鉴别来确定响应真的来自微信支付服务器,这就是验签。验签使用的是【微信支付平台证书公钥】,不是商户 API 证书。使用商户 API 证书是验证不过的。今天就来分享一下如何获得微信平台公钥和动态刷新微信平台公钥。
微信平台证书是微信支付平台自己的证书,我们是管不了的,而且是有效期的。
微信服务器会定期更换,所以也要求我方定期获取公钥。而且我们只能通过调用接口<code>/v3/certificates</code>来获得,此接口也需要进行签名(可参考上一篇文章)。你可以获取证书后静态放到服务器上,手动更新静态证书;也可以动态获取一劳永逸。本文采取一劳永逸的办法。
平台证书接口文档:https://wechatpay-api.gitbook.io/wechatpay-api-v3/jie-kou-wen-dang/ping-tai-zheng-shu
为了保证安全性,微信支付在回调通知和平台证书下载接口中,对关键信息进行了<code>AES-256-GCM</code>加密。也就是说我们拿到响应的信息是被加密的,需要解密后才能获得真正的微信平台证书公钥。响应体大致是这样的,具体根据你调用平台证书接口,应该大差不差是下面这个结构:
你可以使用各种 JSON 类库取得下面方法的参数进行解密以获取证书,同时这里需要用到<code>APIv3密钥</code>,通用的解密方式为:
回调的请求体也是此方法进行解密。
然后就能拿到微信平台证书公钥。然后你可以定义个 Map,以证书的序列号为 KEY,以证书为 Value 来动态刷新,关键伪代码:
动态刷新的策略就很好写了:
虽然验签你不做可以拿到其它接口的响应结果,但是从资金安全的角度来说这是十分必要的。同时因为微信平台证书不收我方控制,采取动态刷新也会更加方便,不必再担心过期的问题。本文我们通过调用接口拿到密文并解密获得证书。下一篇我们将通过获得的证书进行签名验证来确保我们的响应是微信服务器发过来的,请关注下方公众号:码农小胖哥 及时获得相关的更新。

往期推荐
MIT黑科技:通过手机记录的咳嗽数据检测是否感染新冠病毒
为什么我使用了索引,查询还是慢?
10个你可能不曾用过却很有用的 LINUX 命令
分享一个Java开发都用得到的密码摘要算法包
程序员编码时都戴耳机?到底在听什么?
Spring Data 发布更改版本管理方案之后的第一个版本:2020.0.0
﹀
深度内容
推荐加入
最近热门内容回顾 #技术人系列