前言:之前没做过支付这方面的东西,加上微信支付开发文档许多细节的点和返回的数据都写的不是很清楚(这也是很多开发者吐槽的坑点),所以最近在做一个APP上进行微信原生支付的项目时遇到不少问题,下列就是我遇到的几个坑。
1. 签名问题:
1.1 在统一下单接口,有两个地方需要进行签名,首先请求微信下单接口(https://api.mch.weixin.qq.com/pay/unifiedorder)时,需要签名,签名规则就是将所有要发送的数据都进行签名运算(签名算法详见:https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=4_3),这个一般问题不大,关键是请求接口成功后,微信会给返回一个签名字段sign,而客户端(安卓或ios)在APP端调起支付的时候也要传一个sign,我当时就是直接用微信返回的sign返回给了客户端,结果客户端就死活调不起微信客户端(返回-1),结果后来才发现不能直接使用微信返回的sign,而需要把客户端调起支付的参数列表再重新进行一次签名,重新签名的sign才可以进行使用。那我就不懂了,微信返回的sign有什么用处,还误导我,不知道有没有同样被误导的。
1.2 支付结果通知接口,就是微信异步回调的接口,异步回调时要进行验签,验签的方法文档也没说明,但其实也很简单,就是把参数重新进行一次签名,比对一下微信返回的sign,跟你自己签名的是否一致。关键是哪些字段要参与签名,我之前理解的是,微信返回的sign应该是我发起支付的时候生成的签名,那参与签名的字段应该是我在统一下单接口参与签名的字段,但其实应该是将微信异步回调返回的字段(除sign字段本身)进行再次签名,然后和微信返回的sign进行对比。
1.3 签名错误的问题:这个问题也是困扰了很久,后来在网上多番查找,发现一个很好用但也很坑的方法,就是重新设置一下密钥,密钥设置后15分钟后生效,重新设置后就可以了,不知道具体是啥问题,不过还好这个商户号只在一个项目中使用了,要是多个项目使用了一个商户号,那重置一个密钥,别的项目也要进行改动,坑啊。。。
2.支付回调问题:文档里只说url必须是能直接访问的url,不能携带参数,但没有说这个url是get路由还是post路由,导致我写了一个get路由,然后就始终接收不到微信的异步回调,最后才发现其实应该是post的路由。。。。
3.欢迎留言一起填坑......