最近项目组手机APP对接微信支付的功能,前期网站已经接入,以为这个对接是轻而易举的事情。
但是项目卡在了手机端拉起支付的环节,签名怎么也验证不通过。
于是乎百度,一查存在很多反映签名不过的文章,帖子。
因为签名是RSA加密,因此错一个字符都不行,一个字符不同生成的秘钥有天壤之别。
倒腾了几天,*载下**过N多demo,到今天终于搞定。
主要的原因还是对加密原理、加密证书不理解,另外微信官方的例子,确实也没有做到开箱即用,API,SDK齐全了,还差个copy来就能跑的例子吗。
微信官方的后台例子,用的gradle一直*载下**不下来包。
时间就消耗在了*载下**,编译各种例子,包括第三方的例子,甚至怀疑到了APP端,连手机上的微信都删除重装了(有的帖子说微信缓存问题)。最终绕了一大圈,还是回到了微信官方的例子。
也是最终搜到这篇文章后,才解决问题。
https://developers.weixin.qq.com/community/develop/article/doc/000ce8d3ee8b70d868ed6185b5b013
其中最坑的就是:

验签工具最后还得再加一个回车!

从官方的文档说明哪能看出来?

这里到是能看出来,必须有回车。
写死一些数据,按上面帖子的方法,在验签工具中生成签名,发给手机端开发,验证通过后,后台再开始开发。
后台开发也遇到一个问题,关于秘钥。
一直以为pem文件中,begin,end中那一段就是秘钥,甚至把这些支付直接拷贝出来,用RSA
加密算法加密就行。
后来一直验签不通过,回到微信官方例子的时候,纳闷为啥会有PrivateKey这个类,直接一个秘钥String不好吗?
分析了一下sign过程,原来秘钥begin,end中间那段不直接是秘钥,是base64编码后的格式。
顺便查询了一下pem文件的格式,了解了怎么读取pem中的私钥。
最终还是这段代码解决了问题:

从这里也可以看到4个回车换行。
把微信github中*载下**的demo,这部分移植到自己的工程中,解决各种jar包pom引用,编译后,剩下的工作就是代码生成的签名跟验签工具“一毛一样!”就可以了。
还是经验不足啊!踩坑也是程序员经验增长必经之路。