【原创】Uniapp整合Android端微信支付踩坑

不得不说uniapp整合微信支付是真的坑,一来微信支付就非常的坑,二来uniapp也是个大坑,坑上加坑,简直坑死人,边敲边骂街。说回正题uniapp中整合Android端微信支付主要有这几大坑:

1、小程序微信支付的appid和APP端的appid不是同一个,需要分开初始化

2、uniapp文档不全,我根本不知道orderInfo里面的object具体内容是什么

3、uniapp报错太潦草,为什么报错全靠猜

4、Android基座项目需要整合支付方面的SDK

5、由于2号坑引发的变量名大小写问题,导致的支付报错

6、请不要使用uniapp自己的HBuilder APP去调试微信APP支付,因为包名不一样

 

一、appid问题

由于appid什么的都是公司负责人申请的,因此具体细节我也不清楚,我只知道最早的时候公司负责人只给我一个微信小程序的appid,导致APP支付根本无法支付成功。我和上级反馈后才拿到了第二个用于微信APP支付的appid,我才知道原来同一个项目,小程序的appid和APP的appid是不能使用同一个的。

 

二、uniapp文档不全问题

这个是我最想吐槽的,我也最想骂人的,好好的一个框架,全被垃圾文档毁了,草草了事,根本不说清楚!!

【原创】Uniapp整合Android端微信支付踩坑

【原创】Uniapp整合Android端微信支付踩坑

作为全文最关键的orderInfo是什么不说清楚,只说是一个Object类型,那里面有哪些参数字段却不说,连个Demo都没有。好,他不说,我来告诉大家,里面的内容是:

{
    "package": "Sign=WXPay",
    "appid": "wx4d2de5d20b******",
    "sign": "D88F5CED787F9B23D5DC096686******",
    "partnerid": "1580******",
    "prepayid": "wx161342170282803551eaca411198******",
    "noncestr": "1592286137063",
    "timestamp": "1592286137",
}

字段全部是小写!!不说驼峰!!而且直接传一个object进去就好了,注意appid不要写成小程序的appid了!!

三、报错信息太简单,错误原因全靠蒙

说真的,真的是太强了!!
【原创】Uniapp整合Android端微信支付踩坑

短短一行报错,寄予了程序猿一把辛酸泪!!{"errMsg":"requestPayment:fail errors"}

这个谜语让我猜了好几天,才终于猜出来,写成了今天的这篇博客。如果被人给我这行报错,鬼知道是什么原因导致的,uniapp群里问了好多人,都找不到解决办法,官方更是没人理。

 

四、参考我上一篇uniapp的博客,支付也需要整合SDK

https://nativesupport.dcloud.net.cn/UniMPDocs/UseModule/android/payment

具体细节文档里都有,我不再赘述了

【原创】Uniapp整合Android端微信支付踩坑

有一点需要说明,把Payment-Qihoo给删了,不然支付会报:

java.lang.ClassNotFoundException: io.dcloud.feature.payment.qihoopay.QihooPay

 

五、由于文档信息不全,导致服务端给错信息

服务端采用了com.github.binarywang.wxpay的微信SDK整合微信支付

https://github.com/Wechat-Group/WxJava

不得不说这个微信支付SDK是真的好用,节省了很多调试时间,非常棒!!

但是也留下了一个坑:

【原创】Uniapp整合Android端微信支付踩坑

APP支付的支付结果全是驼峰式命名,就这样原封不动的给了前端,以至于报了一个很神奇的错:【原创】Uniapp整合Android端微信支付踩坑

签名验证通过了,但是appId没用!简直感觉岂有此理啊!!

结果问题就出在orderInfo的大小写上面,这居然全是小写!!

 

六、不要使用HBuilder自带的APP去调试微信支付

因为微信APP支付的appid和Android APP的包名是绑定的,因此无论怎么使用HBuilder去调试微信支付都是不可能成功的!!

 

最后上核心代码:

服务端:

        WxPayService wxPayService = WxPayConfiguration.getAppPayService();
        WxPayUnifiedOrderRequest orderRequest = new WxPayUnifiedOrderRequest();

        orderRequest.setTradeType("APP");
        orderRequest.setBody(body);
        orderRequest.setOutTradeNo(orderId);
        orderRequest.setTotalFee(totalFee);
        orderRequest.setSpbillCreateIp(spbillCreateIp);
        orderRequest.setNotifyUrl(apiUrl + "/api/wechat/notify");
        orderRequest.setAttach(attach);

        WxPayAppOrderResult appOrderResult = wxPayService.createOrder(orderRequest);

注意:spbillCreateIp必须是公网微信能够访问的,进行微信支付服务的服务器IP,填别的还会报错!!(不能填127.0.0.1)

 

Uniapp端:

                uni.requestPayment({
                    provider: 'wxpay',
                    signType: "MD5",
                    orderInfo: option,
                    success: function(res) {
                        console.log('success:' + JSON.stringify(res));
                        resolve(success)
                    },
                    fail: function(err) {
                        console.log('fail:' + JSON.stringify(err));
                        reject(error)
                    }
                })

其中的option就是上文第二点内的object中的内容!