最近做的项目涉及到微信支付以及消息推送,官方文档中说的就不在这一一说明了。https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/subscribe-message.html
这是官方文档,这里只记录一些官方文档中说的不够明确的地方。
1.基础库版本,这个很重要,官方文档中调起客户端小程序订阅消息界面wx.requestSubscribeMessage(Object object)方法强调基础库 2.8.2 开始支持,起初没有注意到这里,但是开发完后怎么都调不起询问弹框。最后发现是这个基础库的问题。基础库是在小程序公众平台中配置,https://mp.weixin.qq.com/wxamp/home/guide?lang=zh_CN&token=1309348437登陆后。
在这里设置最低版本库,设置好后按照官方文档就可以进行下一步了
2wx.requestSubscribeMessage(Object object)方法中有这句话,
开始的时候我理解有误。我以为我做的这个微信支付后,在支付回调中调用消息推送他会主动弹出询问框。其实并不是。必须要通过点击事件唤起询问框,经过无数次尝试最后这块的处理逻辑是点击支付按钮的时候调用wx.requestSubscribeMessage(Object object),再去调用支付统一下单接口,代码如下
wx.requestSubscribeMessage({
tmplIds: this.data.msgList,
success(res) {
let result = res[_this.data.msgList[0]]
if (result == 'accept') {
console.log("授权成功")
sendFlag = '1'
let urlpay = app.globalData.URL + '/wechat/xcxPay'
app.wxRequest(urlpay,
'POST', formData, 'form', (res) => {
if (res.resCode == 'SUCCESS') {
// console.log(this.data)
console.log("统一下单" + res.resCode)
wx.requestPayment(
{
'appId': res.appid,
'timeStamp': res.timeStamp,
'nonceStr': res.nonceStr,
'package': res.package,
'signType': 'MD5',
'paySign': res.paySign,
'success': function (res) {
console.log("支付成功,开始推送消息")
wx.navigateTo({
url: '/pages/onlinePolicy/paySuccess/paySuccess'
})
},
'fail': function (res) {
return null
},
'complete': function (res) { }
})
} else {
if (res.resCode == 'FAIL') {
wx.showToast({
title: '该订单已支付,请勿重复提交',
icon: 'none',
duration: 2000
})
}
}
}, (err) => {
console.log(err.errMsg)
})
} else {
console.log("授权失败")
sendFlag = '0'
let urlpay = app.globalData.URL + '/wechat/xcxPay'
app.wxRequest(urlpay,
'POST', formData, 'form', (res) => {
if (res.resCode == 'SUCCESS') {
// console.log(this.data)
console.log("统一下单" + res.resCode)
wx.requestPayment(
{
'appId': res.appid,
'timeStamp': res.timeStamp,
'nonceStr': res.nonceStr,
'package': res.package,
'signType': 'MD5',
'paySign': res.paySign,
'success': function (res) {
console.log("支付成功,开始推送消息")
wx.navigateTo({
url: '/pages/onlinePolicy/paySuccess/paySuccess'
})
},
'fail': function (res) {
return null
},
'complete': function (res) { }
})
} else {
if (res.resCode == 'FAIL') {
wx.showToast({
title: '该订单已支付,请勿重复提交',
icon: 'none',
duration: 2000
})
}
}
}, (err) => {
console.log(err.errMsg)
})
}
},
介于本人不是做前端开发的。代码写的有点不规范。在这个wx.requestSubscribeMessage方法中。发现一个问题。我想把支付部分封装成一个方法。分别在授权成功和授权失败中调用,但是一直报错,也没找到原因,就简单粗暴的复制粘贴支付功能到授权和未授权的判断中,有大佬可以教教我这个小白为什么不能在这个方法中调用其他方法。即使定义this后用this.调用也不行
3.微信支付回调属于微信官方调用我们的方法。支付相关的开发在之前的博客中有简单说明。这里就不多说了,说一下支付回调中调用模板推送subscribeMessage.send时没有考虑周到的地方,在回调中我有一些业务处理。包括调用webservice部分。这就涉及到耗时的问题。微信支付回调会以指定频率来调用我们的接口,如果回调中业务耗时太长,会导致第一次回调还没有给微信返回报文,第二次回调就进来了,这样会导致模板推送会发送至少两次,会多次调用自己的业务逻辑,我们也无法控制微信支付回调的频率。后来也是用了一个简单粗暴的方法来解决的,通过业务中某个字段作为flag来限制一下,就不会出现发送多次模板的情况。
4.模板推送只能真机测试,而微信支付回调中调用测试也不是很方便。用开发工具扫码支付然后通过花生壳内网穿透来测回调貌似也行不通。最后部署到服务器中进行测试