最近在研究调起微信支付,遇到了利用微信JSAPI提供中的wx.chooseWXPay()的方法,发现部分手机调不起支付,一直没有响应,但是部分苹果手机却调起成功了。
本菜鸟查询了整个发起支付的流程,都没有找到问题的原因,统一下单没有任何报错,证明提供给这个方法的参数是没有错误的。那么问题就是出现在这个方法,首先查看的是wx.config是不是报错了,不debug这个参数改成true,弹出的结果也是config:ok,这证明配置也没有问题,在没有解决方法的头绪的时候,只能百度,发现上面没有跟我遇到一样问题的,只有说调不起的原因是因为参数有错,但是我这个问题是在于有部分手机是可以调起,而且统一下单也没有报错,证明是没有问题。
于是只能回去从最原始的地方找解决方案,就是看微信开发文档,emmmm,发现上面提供的实例是旧版本的调用方法,对应的新版本的方法也只是介绍了怎么调用,并没有具体的实例,于是这个问题还是没有办法解决。只好用微信提供的检验JSAPI方法去测试,发现会报缺少APPID,但是这个wx.chooseWXPay()方法的参数并不需要用到APPID,再次陷入了困境,只能在网上继续浏览搜索,看看别人是怎么调用的,结果还真的发现一个有用的方法wx.ready()。
wx.ready()是在wx.config执行完后,才会执行里面的内容,于是我尝试把x.chooseWXPay()放进wx.ready()里面,发现真的可以修复这个bug了,所有手机都可以成功调起支付,问题解决了。
个人猜测:由于部分手机加载速度问题,导致wx.chooseWXPay()的执行比wx.config()要快多了,导致config都还没配置好,wx.chooseWXPay()就会没有反应。这跟手机性能有关,所以才会出现部分手机调起了。利用wx.ready()就可以判断config是否执行完了,执行完才会调用里面的内容,可以保证一定能够调起支付。
附上对应代码:
wx.ready(function(config){ wx.chooseWXPay({ timestamp: config.timeStamp, // 支付签名时间戳,注意微信jssdk中的所有使用timestamp字段均为小写。但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符 nonceStr: config.nonceStr, // 支付签名随机串,不长于 32 位 package: config.package, // 统一支付接口返回的prepay_id参数值,提交格式如:prepay_id=\*\*\*) signType: config.signType, // 签名方式,默认为'SHA1',使用新版支付需传入'MD5' paySign: config.sign, // 支付签名 success: function (res) { // 支付成功后的回调函数 } }); // config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后,config是一个客户端的异步操作,所以如果需要在页面加载时就调用相关接口,则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口,则可以直接调用,不需要放在ready函数中。 });