美文网首页AndroidAndroid开发
Android 微信支付详解与坑

Android 微信支付详解与坑

作者: Stunner_W | 来源:发表于2016-11-17 10:51 被阅读1826次

    前段时间公司项目要添加微信支付的功能,然后就简单看了下微信支付的官方文档 :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 、包名  和 应用签名的。  这三个必须保持一致才能够成功调起微信。

    还有其他的一些小问题的话查查资料都会解决的,上面给出的两个文章的链接也可以参考看看,还是很有价值的。问题不大,但是细心才行。

    相关文章

      网友评论

      • JSGhoul:发现后台两次签名用的nonceStr随机字符串不一致。这个需要特别注意的就是后台两次签名验证的时候的参数要保持一致------------楼主你确定这个一定要一样吗?因为我们的二次签名是在客户端,而服务器并没有返回noncestr这个字段,是我们自己生成的。总之一直掉不起支付
        Stunner_W:@DarkGhoul 二次签名是不建议放在客户端进行的,这样太不安全了,以前做的支付很多都是在客户端进行二次签名,但是现在支付宝和微信更新SDK以后都是建议签名在后端服务器进行的,尽量不要放在客户端来做。我们客户端做的就是拿到相应的参数去调起微信支付就可以了。二次签名是在后台进行的时候就要保持参数一致。如果真的是做成签名在客户端的,我建议你好好看一下官方的文档,个人没有做过这种形式的,所以不太好给你建议。如果是在自己的后台进行的签名验证,那么我们客户端做的就很少了,只用几行代码就能成功拉起微信支付了,而且安全性是很高的。
      • longsh:您好,我现在也是ios能支付,Android死活不能,就是清除缓存后第一次可以支付。
        Stunner_W:@longsh 所以要保持一致才行,一个都不能错,而且要注意大小写。微信支付这一块的问题就是要细心才行。祝你成功!
        longsh: @Stunner_W 我这个微信登入和分享都有问题。但是看了下包名和签名跟微信网站后台的都一样。注册的时候可能是其他包名。但是后面可能改了包名
        Stunner_W:@longsh 请检查一下你的应用中appid,应用签名还有包名是否跟你们申请微信支付的时候提交的都一样,这三个在安卓测试微信支付的时候微信那边都要检验的,有一个不一样就会导致失败的!请务必好好检查一下调用微信支付的方法中那些参数的大小写这些问题。上面有两个文章的链接都有详细的说明,好好看一下,做完以后你会发现并不是很难。:smile:

      本文标题:Android 微信支付详解与坑

      本文链接:https://www.haomeiwen.com/subject/therpttx.html