不得不说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文档不全问题
这个是我最想吐槽的,我也最想骂人的,好好的一个框架,全被垃圾文档毁了,草草了事,根本不说清楚!!
作为全文最关键的orderInfo是什么不说清楚,只说是一个Object类型,那里面有哪些参数字段却不说,连个Demo都没有。好,他不说,我来告诉大家,里面的内容是:
{
"package": "Sign=WXPay",
"appid": "wx4d2de5d20b******",
"sign": "D88F5CED787F9B23D5DC096686******",
"partnerid": "1580******",
"prepayid": "wx161342170282803551eaca411198******",
"noncestr": "1592286137063",
"timestamp": "1592286137",
}
字段全部是小写!!不说驼峰!!而且直接传一个object进去就好了,注意appid不要写成小程序的appid了!!
三、报错信息太简单,错误原因全靠蒙
说真的,真的是太强了!!
短短一行报错,寄予了程序猿一把辛酸泪!!{"errMsg":"requestPayment:fail errors"}
这个谜语让我猜了好几天,才终于猜出来,写成了今天的这篇博客。如果被人给我这行报错,鬼知道是什么原因导致的,uniapp群里问了好多人,都找不到解决办法,官方更是没人理。
四、参考我上一篇uniapp的博客,支付也需要整合SDK
https://nativesupport.dcloud.net.cn/UniMPDocs/UseModule/android/payment
具体细节文档里都有,我不再赘述了
有一点需要说明,把Payment-Qihoo给删了,不然支付会报:
java.lang.ClassNotFoundException: io.dcloud.feature.payment.qihoopay.QihooPay
五、由于文档信息不全,导致服务端给错信息
服务端采用了com.github.binarywang.wxpay的微信SDK整合微信支付
https://github.com/Wechat-Group/WxJava
不得不说这个微信支付SDK是真的好用,节省了很多调试时间,非常棒!!
但是也留下了一个坑:
APP支付的支付结果全是驼峰式命名,就这样原封不动的给了前端,以至于报了一个很神奇的错:
签名验证通过了,但是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中的内容!