2016新版支付宝APP支付的坑

半年前做了支付宝APP支付的接口的封装,没想到,才几个月,支付宝对接口整体做了一次更新,然而还是用老套路去开发的我,一路蒙逼,最后只好重新看了一遍文档,下面列举一下新旧版本或者本身就存在的坑。希望大家引以为戒!

参数的变化

新版本参数将业务参数封装到了biz_content,这是新增的一个参数,这个简单,不太容易入坑,只要逐一比对即可。建议将参数放到HashMap中,用JSON字符串输出就行,如:

1
2
3
4
5
6
7
8
Map<String, String> params = new HashMap<String, String>();
params.put("app_id", "");
...
Map<String, String> bizMap = new HashMap<String, String>();
bizMap.put("seller_id", "");
...
params.put("biz_content", JSON.toJSONString(bizMap));
return params;

签名内容改变

这里开始就有点神经了,不得不吐槽,前后都不一致。首先,老版本加密的条件中,要把sign_type剔除再进行加密,现在的加密要把这个参数也进行加密,然而在最后进行通知验签的时候,这个字段又必须得剔除,对于支付宝公司的朋友,我只能呵呵了。大家自行脑补……o(∩_∩)o

最终结果url编码

以前这个环节仅仅只要对key进行排序输出,现在多了对value进行url编码(即encode),不要仅对某几个参数进行encode,我就是这样进坑的,建议对之前的map进行排序输出的时候逐一编码,或者先全部编码再生成排序后的字符串。

通知验签

这里跟以前没什么变化,所以才会出sign_type的幺蛾子,这里估计沿用老的接口,然后一个奇葩的事情出现了,恭喜你,程序都对,就是验签失败,最后你会发现,支付宝RSA公钥变了,是的,TMD公钥变了哈哈,当然刚开发的朋友不会有这个坑。

上面就是我碰到的比较典型的坑,最后还是希望大家开发的时候逐一比对文档吧,毕竟用人家的东西,得按人家的心思来。