微信支付的又一个坑

By | 2015/10/20

今天正好做了下微信支付,毕竟之前做过好几个网银的还有支付宝的支付,也给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,真是好东西了,少了不少烦心事情。

6 thoughts on “微信支付的又一个坑

  1. huajie

    本人今天在看您的《用Python和Pygame写游戏-从入门到精通》时正好看到这篇,顿时深有同感,微信和微信支付里面大大小小的坑接连不断,害人不浅啊。。。

    Reply
  2. hgj

    你好,用angularjs 集成微信jsapi支付时,你那边有没有遇到这个中问题:
    在单纯的 index.aspx可以支付,但是,如果在angularjs导航到 index.aspx#/pay后,就无法调出支付对话框,无论是用WeixinJSBridge.invoke还是wx.chooseWXPay

    Reply
    1. xishui Post author

      是的,微信对hashChange好像支持的不尽如人意,要么每次变化都重新注册,不过我最后是另外做了一个单独的页面完成支付的,少了很多烦心的问题。

      Reply
    2. kane

      微信浏览器在iOS和android用的不同方式实现,各种问题还不一样。支付对angularjs这种单页面应用支持也不完善。有兴趣可以看看博文,https://vme360.com/tech/single_page_app_meets_weixin_pay

      Reply
  3. Issac Chan

    赞赞赞,今天开始在学习你的pygame,向大神学习!

    Reply
  4. Happy

    一直返回get_brand_wcpay_request:fail,日了狗了。

    Reply

发表评论

您的电子邮箱地址不会被公开。