今天正好做了下微信支付,毕竟之前做过好几个网银的还有支付宝的支付,也给app内微信支付做过接口,想着调用个JS发起支付是小菜一碟吧,不想还是花了差不多一天才搞定……
生成签名什么的就不用说,虽说微信文档语焉不详,但毕竟都说到了,参数大小写和顺序什么的,后台的支付目录设置什么的都不是个事儿,所以我还是颇有自信的。不料点击支付的时候,总是弹出“fail_invalid signature”,我反复检查了N遍,判断并无问题(说实话我一直深信自己代码无问题,没办法,用飘柔就是这么自信:),最后用官方的签名检查工具,也是OK的。但是fail_invalid signature宛如魔咒一般出现,折腾的我毫无办法。
我这个微信H5页面是个Angular的SPA应用,一开始用微信的wx.ready回调函数,成功了才angular.bootstrap()启动Angular的功能,之前的所有页面都工作的很好,我自然也不会想到这个上面会有什么问题,事实也说明了确实没问题,而是微信自己的问题……
我最后无奈,吃完了晚饭在家里调试,最后做了一个极简的页面,只有一个按钮点击了调用支付,内容简单的就是下面这个样子
wx.config({"debug":true,"appId":"wx****","nonceStr":"****","timestamp":****,"url":"****","signature":"****","jsApiList":["chooseWXPay"]}); function pay() { WeixinJSBridge.invoke('getBrandWCPayRequest', {"appId":"****","timeStamp":"****","nonceStr":"****","package":"prepay_id=****","signType":"MD5","paySign":"****"}, function(res) { switch(res.err_msg) { case 'get_brand_wcpay_request:cancel': alert('用户取消支付!'); break; case 'get_brand_wcpay_request:fail': alert('支付失败!('+res.err_desc+')'); break; case 'get_brand_wcpay_request:ok': alert('支付成功!'); break; default: alert(JSON.stringify(res)); break; } } ); }
还是不行,你是要我去撞墙么??
最后鬼使神差,我直接把微信初始化的语句注释掉了,就是wx.config()的那句,然后…… 就行了??!!支付不需要申请权限的么?
翻阅文档,并没有任何一个地方提到WeixinJSBridge.invoke和wx.config不能同时使用,事实上看微信的文档,总有一种wx.config是支付的前提的感觉,当然确实支付的调用方式发生了变化,以前是wx.chooseWXPay现在是invoke,但是,但是……已经变化到了水火不容的地步了么?
太晚了,无力深究睡了。这是第二天趁怨气还在写下的文字,至于到底为什么,恐怕只有微信内部人士才明白了吧。
更新:
现在使用BeeCloud,真是好东西了,少了不少烦心事情。
本人今天在看您的《用Python和Pygame写游戏-从入门到精通》时正好看到这篇,顿时深有同感,微信和微信支付里面大大小小的坑接连不断,害人不浅啊。。。
你好,用angularjs 集成微信jsapi支付时,你那边有没有遇到这个中问题:
在单纯的 index.aspx可以支付,但是,如果在angularjs导航到 index.aspx#/pay后,就无法调出支付对话框,无论是用WeixinJSBridge.invoke还是wx.chooseWXPay
是的,微信对hashChange好像支持的不尽如人意,要么每次变化都重新注册,不过我最后是另外做了一个单独的页面完成支付的,少了很多烦心的问题。
微信浏览器在iOS和android用的不同方式实现,各种问题还不一样。支付对angularjs这种单页面应用支持也不完善。有兴趣可以看看博文,https://vme360.com/tech/single_page_app_meets_weixin_pay
赞赞赞,今天开始在学习你的pygame,向大神学习!
一直返回get_brand_wcpay_request:fail,日了狗了。