Android接入微信支付只能调起一次
接入微信支付
项目里需要接入支付宝及微信支付,鹅厂sdk的质量嘛,大家都懂的。果不其然在接入微信支付的过程中遇到了一些问题,下面简单记录一下。
接入微信支付的流程
首先需要明确的一点,支付宝和微信支付绝大部分的业务逻辑是在服务器端完成的,在app端需要完成的工作其实很少。
微信支付的流程参考官方文档:
https://pay.weixin.qq.com/wiki/doc/api/app/app_sl.php?chapter=8_5
此处需要特别注意的是注册应用时填入的签名,必须是app的Release签名文件的32位md5字符串,将其中的冒号去掉并且将大写字母全部替换成小写。
具体到app的工作,在添加依赖后需要做的是:
1、获取微信支付的7个必备的参数,然后使用appid进行注册;
2、使用这7个参数调用微信支付的api,拉起微信支付界面;
3、在用户完成支付操作(不管有没有支付)后获取对应的结果,作出相应的提示;
关于微信支付的错误码
请务必记住上面这个-1,我们遇到的这个问题就在这个-1上面。
遇到的问题
1、参考官方文档接入微信支付后,在app中只能成功拉起微信支付一次;第一次不管支付有没有成功,第二次都再也无法拉起微信支付的界面,支付结果返回-1;除非将微信的数据清空,再次登录才可以再成功拉起微信支付一次。
2、支付完成后,获取不到结果;
解决的办法
先说第二个问题
微信支付给出的官方demo我没跑起来,里面的代码不知道是哪年写的,导入AS后一堆资源的错误。耐着性子一个个解决之后,发现请求支付数据的url拿不到任何数据,等于忙活了半天忙了个寂寞。
但是恶心的是,微信支付成功后的回调界面必须参考这个demo中写的,手动添加包和界面,即.wxapi.WXPayEntryActivity。
AndroidManifest中注册的代码如下:
<activity
android:name=".wxapi.WXPayEntryActivity"
android:exported="true"
android:launchMode="singleTop"/>
这个界面没啥好说的了,照猫画虎就成,最后可以在onResp(BaseResp resp)方法中获取到支付的结果。
回过头来说说第一个问题
前面我们说了,app端的业务逻辑其实很简单,代码量也很少。
出现微信支付界面只能拉起一次的问题,首先检查下app代码和从服务器获取到的几个参数是不是对的,有没有拼写错误或者参数缺失;
以上问题确认后,再去微信平台上检查填写的包名和签名是不是跟app的保持完全一致,尤其是md5字符串。
我遇到的这个问题,就是将md5发给小伙伴后,他在将原始的md5字符串中的冒号去掉并且大写改小写的时候,不小心漏掉了两位数。一个低级的错误,白白浪费了大量的时间,我跟服务器的同事排查了N次代码。
吐槽一下
不得不说,鹅厂的sdk真是让人无语,对比一下某宝的平台差距还是很大的。真心希望鹅厂能走点心,让苦逼的程序猿们多留几根头发吧!