前段时间公司项目要添加微信支付的功能,然后就简单看了下微信支付的官方文档 :https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_1 APP端的开发步骤并不难,就简单的4步。但是真正做起来的时候,却是小问题一堆,下面详细说一下自己在这个过程中遇到的问题和难点:
下载微信官方给的Android SDK demo https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_4 在自己的项目中导入相应的jar包,然后按照官方文档给出的开发步骤,再加上官方demo里面的例子,把微信支付集成到自己的项目中很快很方便。这个过程中自己也看了几篇别人写的不错的博客:Android快速实现微信支付(真的!很快!);Android微信支付彻底扫坑 ,里面的一些重点和坑都讲得很清楚了,以及一些容易出现的失误都基本上列举出来了。
公司项目是做电影售票的,旗下有好多影城,由于客户端的子appid 和 我们总的appid,还有商户id和旗下影城的子商户id的关联设置还没有申请好,但是自助取票机的关联设置已经弄好,而且都已经上线使用了微信支付功能,所以我们客户端和homgpage在做微信支付的时候,用的appid是自助取票机的appid。一开始我都按照文档和demo在自己的项目中都设置好了,然后开始测试,由于调用微信支付的几个关键参数现在都是后台返回给我们的(处于安全考虑嘛,做后台的同志工作量有点大),所以我们客户端需要做的事情就很简单,调用接口获取参数,然后拿这些参数去调用微信客户端发起支付。由于我们自己的影城较多,子商户id较多,一开始都写好了但是调不起来微信,然后我们就分析问题,也问了微信支付的技术人员,然后换appid,设置关联appid等都不行,后台传参数那边也考虑过是不是签名的问题,晚上加班折腾了几个小时,发现后台两次签名用的nonceStr随机字符串不一致。这个需要特别注意的就是后台两次签名验证的时候的参数要保持一致。这点要特别注意。
然后就是IOS的同事成功拉起了微信支付,但是我android的怎么都掉不起来微信,中间查了各种资料,也试过了各种方法,网上有说的清除微信客户端的缓存就可以了,但是这个操作并不能解决问题,清除微信客户端的缓存只是在app第一次调用的时候还没来得及验证相关参数,所以app就能调起微信了。而且这种操作成功率也很低,也不能真正解决问题。后来给微信的官方技术人员发了两次邮件,也清楚的描述了自己的问题:当发起支付时调不出微信支付界面,直接响应WXPayEntryActivity中的onResp回调,并且errCode始终返回-1。如果微信未登录,则会调起登陆界面,登陆完成后还是调不起来,errCode依然返回-1。他们给出的答案一直就是五条:
1,你签名中的key,也就是你的API密钥key,这个参数要你们自己到商户平台设置的,设置的规则是32位数字与字母大小写的组合的随机数,不能设置成签名串和参数appsecret,你们有正确设置吗???
2,需要用签名发布程序,直接调试就返回那个错误
3,注意你后台签名的时候传的参数顺序不对的话,也会报这个错误,要按照文档要求的顺序
4, 从预支付订单返回的数据 ,没有重新签名,也会引起这个问题。
5,清微信缓存后试试。
我检查了自己的项目这些都不是问题,困惑了我很久,眼看IOS的同事已经把相关功能做的差不多,然后实在是着急的不行了就直接给微信的技术人员电话联系了,后来才发现问题的所在:因为现在的项目用的appid不是在公众平台注册应用的appid,而是我们这边的自助取票机应用的appid,从而导致的安卓客户端拉不起来微信支付。微信官方技术人员给出的解释是这样的:IOS本身有安全处理机制 ,所以他们那边没有限制IOS的应用调用微信,但是安卓的由于开源的原因 ,安卓应用每次调用微信支付的时候都会校验 appid 、包名 和 应用签名的。 这三个必须保持一致才能够成功调起微信。
还有其他的一些小问题的话查查资料都会解决的,上面给出的两个文章的链接也可以参考看看,还是很有价值的。问题不大,但是细心才行。
网友评论