hello,大家好呀,好久没整理笔记了,今天抽时间整理了一下最近在研究的技术。
梦梦最近在做微信支付的模块,由于做的是服务商模块的,商户进件功能需要使用微信平台的公钥对敏感信息加密,而且传送的http头部需要把微信平台证书序列号携带在“Wechatpay-Serial”信息,官网上是这样标注的:
所以,就需要下载微信平台证书,使用平台公钥对敏感信息加密,这样把商户信息上送到微信支付平台时,微信平台使用自己的公钥对我们上送的加密数据进行解密。同时,微信给我们下行的数据使用我们自己的公钥进行加密,我们接收到微信下行的加密数据,用自己的私钥进行解密。
先解释两个概念:平台证书和商户证书。
商户证书:是商户自己申请的,包含公司名称、商户号、公钥信息等内容,生成商户证书的时候,同时也会生成商户私钥文件apiclient_key.pem,妥善保存好,不要上传到gitlab上,或者写在客户端代码上。
平台证书:是由微信支付负责申请的,包含微信支付平台标识、公钥信息等内容,可以用证书平台中 的公钥进行验签,或者对上送的文件进行加密等等。
话不多说,下面梦梦结合官网文档写一下获取微信平台的两种方式,一切还是以官方文档为主,如果梦梦有的部分说的不太妥当的,可以在下面评论部分指出来。
第一种:通过工具下载平台证书
1,打开官方文档:https://github.com/wechatpay-apiv3/CertificateDownloader
注意:建议大家还是先看一遍官方文档上的说明,文档说的也是比较详细的,然后再来看梦梦写的。
2,下载CertificateDownloader.jar工具:既然是通过工具下载,肯定要先把工具下载下来,这个工具也就是CertificateDownloader.jar 一个jar包。点击蓝色字体“release”跳转到一个新的窗口,如下图。选择一个版本下载即可,梦梦选择的是1.0版本的,如果需要的也可以下载1.1版本的。
3,打开cmd窗口。把刚刚下载好的jar包放到一个没有中文的目录里,然后在jar的目录的上行路径框里输入cmd打开命令窗口。
4,执行命令:把官网上的命令复制下来,把里面的参数换成自己的即可。然后在cmd窗口上执行这段命令即可。
注:官网上有参数的说明,即:-k 商户自己的APIv3密钥 -m 商户号 -f 商户私钥保存位置 -s 证书序列号 -o 微信平台证书存放的位置
5,执行结束之后,看到命令窗口下面截图红色字样的部分就已经是下载完成了,就可以自己上面自己设置的存储路径上查找即可。平台证书是以“wechantpay_证书序列号”命令的。
第一种方式下载起来比较方便,不用写代码,但是由于微信平台证书是不断的再更新的,如果每次都通过工具去下载的话,会很麻烦,也不够友好,所以还是建议大家使用下面这种方式,也就是通过API的方式获取平台证书,第一种方式适合首次下载平台证书的时候使用。
第二种:通过API下载证书
1,打开官方文档(获取平台证书):https://pay.weixin.qq.com/wiki/doc/apiv3_partner/wechatpay/wechatpay5_1.shtml
2,获取签名认证信息。打开获取平台证书的官方文档之后,可以看到获取平台证书的接口没有query或者path的参数,只需要在请求的头部设置一些信息即可,也就是上面图片的三部分。Accept是枚举参数,在v3中直接写application/json即可,User-Agent 用户代理,随便打开浏览器一个网页,F12粘贴复制一个即可。主要就是第一个参数Authorization的获取,需要生成签名,然后获取认证信息。生成签名官方文档也有给说明,下面有demo,梦梦就不举例子了。
3,生成签名。打开官方文档:https://pay.weixin.qq.com/wiki/doc/apiv3_partner/wechatpay/wechatpay4_0.shtml
上面这张图是从官方文档上截取的,可以看到参数Authorization的value值由两部组成的,认证类型和签名信息,并且二者中间用空格隔开。
由上图可以看出,签名信息由五部分组成的,前四项比较好获取,最后一项签名值的获取可能需要麻烦一点点,通过看官方文档上面的阐述(梦梦没有截图,自己看官方文档即可),可以看出签名值是使用商户私钥对签名串进行一个签名算法(SHA256 with RSA签名)之后再进行Base64编码之后获取的,所以要理解一些专有名词吧。
4,复制文档demo获取平台证书。官方文档最后有demo,如下图,代码一共是三个方法,最后一个是生成签名串的,中间的方法是使用商户私钥对签名串进行SHA256 with RSA签名,再Base64之后的结果,即签名值,第一个方法是获取签名信息的,即Authorization 的value值的。梦梦已经测试过了,可以准确的获取到平台证书的,只不过此时获取的平台证书是加密之后的,需要解密。
5,解密平台证书的密文。官方文档:https://pay.weixin.qq.com/wiki/doc/apiv3_partner/wechatpay/wechatpay4_2.shtml
解密平台证书的demo在官方文档上也有,直接copy就可以使用的。只是传参的时候需要注意一下,官方给的方法入参是byte[] ,所以要注意把我们获取到的信息转换一下。如果还是不太明白的小可爱们,可以参考一下下面的转化方式。
爱学习的小伙伴呢,可以两种方式都尝试一下,然后对比一下两次拿到的平台证书内容是否一致,如果一致,说明方式是对的,如果不一致的话,那就要好好找bug了。
好了,上边这些便是获取微信平台证书的大概知识点了,有可能还是不太全面,有问题或有意见的的小伙伴们,可以在评论下方留下你的足迹,我们一起来讨论、纠正。