从去年11月进公司到现在,算下来总共对接过三次微信小程序支付接口。
现就前端而言,总结一下开发微信小程序支付功能的流程。
1.调用预支付接口( openid
、 userid
这两个必传,以及一些业务参数在这个时候也传到后台),得到交易码out_trade_no
和预支付码prepay_id
;
2.发送预支付码换回微信支付请求的系列参数:
timeStamp: res.timeStamp,
nonceStr: res.nonceStr,
package: res.package,
signType: 'MD5',
paySign: res.sign,
3.调用微信支付接口
wx.requestPayment({
timeStamp: res.timeStamp,
nonceStr: res.nonceStr,
package: res.package,
signType: 'MD5',
paySign: res.sign,
success: function (paymentRes) {
console.log(paymentRes)
if (paymentRes.errMsg == "requestPayment:ok") { // 调用支付成功
console.log("支付成功!")
obj.applyAdviser();//业务函数,插入支付记录到数据库
}
},
fail: function (paymentRes) {
if (paymentRes.errMsg == "requestPayment:fail cancel") {
appcom.showMsgFun(obj, "您取消了支付");
console.log("您取消了支付")
}
}
})
4.在success
回调函数里执行业务函数
完整代码如下,部分参数根据自己业务调整
var openid = wx.getStorageSync('openid');
var userid = wx.getStorageSync('userInfo').uid;
// 调用支付接口发起预支付
appcom.reqFun(this, '', 'prepay', { //第1步:调用预支付接口,获取预支付码和交易码
amount: this.data.amount,
openid: openid, //微信openid
userid: userid,//用户id
type: 1,
relation_id: this.data.lawyerId
}, function (res, obj) {
if (res.out_trade_no == 'error' || res.prepay_id == 'error') {
console.log("res.out_trade_no或prepay_id参数错误");
appcom.showMsgFun(obj, "支付功能暂时无法使用");
setTimeout(function () {//跳转界面
appcom.goLink('../index/index');
}, 2000);
return;
}
var prepayId = res.prepay_id;
var outTradeNo = res.out_trade_no;
appcom.reqFun(obj, '', 'gensig', {//第2步:发送预支付码,换回时间戳、签名等
prepay_id: prepayId,//预支付码
}, function (res, obj) {
console.log(res)
wx.requestPayment({//第3步:调用微信官方提供的支付接口
timeStamp: res.timeStamp,
nonceStr: res.nonceStr,
package: res.package,
signType: 'MD5',
paySign: res.sign,
success: function (paymentRes) {
console.log(paymentRes)
if (paymentRes.errMsg == "requestPayment:ok") { // 调用支付成功
console.log("支付成功!")
obj.applyAdviser();////第4步:业务函数,插入支付记录到数据库
}
},
fail: function (paymentRes) {
if (paymentRes.errMsg == "requestPayment:fail cancel") {
appcom.showMsgFun(obj, "您取消了支付");
console.log("您取消了支付")
}
}
})
}, '', 'GET', '')
}, '', 'GET', '')
注:
扩展:未完成订单
当用户取消支付的时候,其实订单已经生成,此时将交易码保存,下一次传给后台继续此订单的支付。