小程序云开发支付通知问题
背景情况
年前帮一个朋友做了个餐厅点餐的小程序,类似美团外卖。因为朋友预算有限并且纯属帮忙,所以就吭哧吭哧帮他用小程序云开发实现了一套。基本能满足他店内和店外的点餐收款需求。
问题描述
系统运行也比较稳定,但时不时会出现一种诡异的情况就是用户点餐并支付完毕之后,付款信息已经收到但是订单信息却没有出来。我后台看数据库发现是订单生成了但支付状态没有改变。更诡异的是当我手动改变支付状态之后几个小时后这条支付状态会被重新改变将我手动修改的数据覆盖,所有的信息都对,就只有支付时间和订单时间相差太久。数据信息如下:
问题解决
刚开始以为是因为什么东西阻塞造成的,还使用了async和await来阻止异步。但问题依然没有解决!我还以为是腾讯数据库有问题(难道帮他们找到个bug😀)。最后不得已提了一个工单让腾讯的工作人员帮忙解决(工单地址),但结果还是让我模棱两可。不过倒是提醒了我云支付有个回调通知函数
// 云函数代码
const cloud = require('wx-server-sdk')
cloud.init({
env: cloud.DYNAMIC_CURRENT_ENV
})
exports.main = async (event, context) => {
const res = await cloud.cloudPay.unifiedOrder({
"body" : "小秋TIT店-超市",
"outTradeNo" : "1217752501201407033233368018",
"spbillCreateIp" : "127.0.0.1",
"subMchId" : "1900009231",
"totalFee" : 1,
"envId": "test-f0b102",
"functionName": "pay_cb"
})
return res
}
// 小程序代码
wx.cloud.callFunction({
name: '函数名',
data: {
// ...
},
success: res => {
const payment = res.result.payment
wx.requestPayment({
...payment,
success (res) {
console.log('pay success', res)
},
fail (err) {
console.error('pay fail', err)
}
})
},
fail: console.error,
})
当订单支付之后,调用支付回调pay_cb去更改订单状态即可。这样就能及时更新订单状态,改完之后问题就没有再出现。
问题所在
后面又找了各种资料才发现问题应该是这样的:用户支付成功之后未点成功界面里的“完成”按钮,小程序端的支付回调就不会立即执行success函数。但是后面过几个小时也会执行,所以才会造成订单时间和支付时间的巨大偏差。而我又只是用小程序端回调去更改订单状态的,所以才会造成支付完成收到了付款信息但是订单没有出来的问题。其实这些状态更改在服务器端更改比较稳定。
这里此种问题的处理方式小程序支付用户不点击“完成”的处理方案
希望我踩过的这个坑能给遇到同样问题的同学解惑😁