前言在微信开发过程中公众号,因为之前没有接触过微信相关的开发,所以跌坑爬坑,不过也让我了解了微信public和微信官方文档熟悉度大大提高。爬坑之路一:单页SPA和后端路由的问题已经分别总结过:https://segmentfault.com/a/11...爬坑二:Android大概率会微信支付转账失败(引入微信的js-sdk包失败)在微信官方文档中:https://pay.weixin.qq.com/wik...有这样一个DEMO:functiononBridgeReady(){WeixinJSBridge.invoke('getBrandWCPayRequest',{"appId":"wx2421b1c4370ec43b",//公众号name,商家传入"timeStamp":"1395712654",//时间戳,从1970年开始的秒数"nonceStr":"e61463f8efa94090b1f366cccfbbb444",//随机字符串"package":"prepay_id=u802345jgfjsdfgsdg888","signType":"MD5",//微信签名方法:"paySign":"70EA570631E4BB79628FBCA90534C63FF7FADD89"//微信签名},function(res){if(res.err_msg=="get_brand_wcpay_request:ok"){//使用上述方法判断前端返回,微信团队郑重提醒://res.err_msg会在用户支付成功后返回ok,但是不保证绝对可靠。}});}if(typeofWeixinJSBridge=="undefined"){if(document.addEventListener){document.addEventListener('WeixinJSBridgeReady',onBridgeReady,false);}elseif(document.attachEvent){document.attachEvent('WeixinJSBridgeReady',onBridgeReady);document.attachEvent('onWeixinJSBridgeReady',onBridgeReady);}}else{onBridgeReady();}后端同事授权成功后,在事件页面引入这段代码,开心一下,构建提交测试好了,苹果没问题,安卓好像没问题,但是鹅安卓有时候调不了支付,一开始以为是微信版本等原因,但是调成功的概率太TM低了,调1次需要10次,没错一定是代码的原因。更改。解决方法:打开微信开发者工具,登录,最后发现if(typeofWeixinJSBridge=="undefined")1.ios可以调出微信浏览器的js-sdk2。大多数机器人去未定义我实际上不知道我为什么去这里。个人感觉是微信Android内置浏览器版本和这个WeixinJSBridge方法的问题。(希望有人解答)既然js-sdk调不了,那我们手动引入配置//所以有时候偷懒比较麻烦,吸取教训if(typeofWeixinJSBridge=="undefined"){console.log(微信JSBridge);if(document.addEventListener){document.addEventListener('WeixinJSBridgeReady',onBridgeReady,false);}elseif(document.attachEvent){document.attachEvent('WeixinJSBridgeReady',onBridgeReady);document.attachEvent('onWeixinJSBridgeReady',onBridgeReady);}}else{onBridgeReady();}vue导入微信js-sdk包npmi-Sweixin-js-sdkimportmoduleimportwxfrom'weixin-js-sdk'待导入页面配置(参考微信官方文档:https://mp.weixin.qq.com/wiki...):wx.config({debug:true,//开启debug模式,所有API调用的返回值都会在客户端告警,如果要查看传入的参数,可以在PC端打开,参数信息会通过log打印出来,只会在PC端打印。appId:'',//必填,公众号的唯一标识timestamp:,//必填,生成签名的时间戳nonceStr:'',//必填,生成签名的随机字符串signature:'',//必填,签名jsApiList:[]//必填,需要使用的JS接口列表。比如我要调用支付接口就是[chooseWXPay]});这里的timestamp是小写的,s是小写的,数据类型是int类型。接下来,既然配置成功了,那就继续看官方文档吧。官方文档是这么说的。有一个现成的方法。config验证成功后,将接口放入其中,确保执行。wx.ready(function(){//config信息校验通过后,会执行ready方法,所有的接口调用都必须在config接口获取到结果后,config是client的异步操作,所以如果需要在页面加载时调用相关接口,必须在ready函数中调用相关接口,保证正确执行。对于用户触发时调用的接口,可以直接调用,不需要把它放在ready函数中。});ready中导入的参数(注意数据类型,配合好后端同事--)wx.chooseWXPay({timestamp:0,//支付签名时间戳,注意微信jssdk中使用的时间戳字段全部小写。但是最新版支付后台生成签名使用的timeStamp字段名需要大写。S字符nonceStr:'',//支付签名随机字符串,不超过32位package:'',//统一支付接口返回的prepay_id参数值,提交格式如:prepay_id=\*\*\*)signType:'',//签名方式,默认为'SHA1',使用新版支付传入'MD5'paySign:'',//支付签名成功:function(res){//支付成功后的回调函数}});附上我的demo在ready中使用Vuedata中的数据,一不小心掉进了这个指向的坑,如果不加bind,wx.chooseWXPay里面的参数是拿不到后台请求的数据的。这里的this并没有指向VueComponent。自然是获取不到我请求后赋值给this.wx_config数组对象的数据。getConfig(){wx.config({debug:this.wx_config.debug,//开启debug模式,所有API调用的返回值都会在客户端告警,查看传入的参数,可以打开在PC端,会通过log打印参数信息,而且只会在PC端打印。appId:this.wx_config.appId,//required,公众号的唯一标识timestamp:this.wx_config.timestamp,//required,生成签名的时间戳nonceStr:this.wx_config.nonceStr,//required,Randomstringtogeneratesignaturesignature:this.wx_config.signature,//required,signaturejsApiList:this.wx_config.jsApiList//required,要使用的JS接口列表});//微信支付wx.ready(function(){//console.log(this.jsApiCall());wx.chooseWXPay({timestamp:this.wechat_code.timestamp,nonceStr:this.wechat_code.nonceStr,package:this.wechat_code.package,signType:this.wechat_code.signType,paySign:this.wechat_code.paySign,success:function(){//回调函数alert("支付成功");window.location.href="/hd/becomevip";},cancel:function(){alert("支付失败");}});}.bind(this));}、总结:踩坑总是在所难免的,总结一下,不要因为怕麻烦就做对了嘛~
