// payCb 云函数入口文件
const request = require('request');
const cloud = require('wx-server-sdk')
cloud.init({
env: cloud.DYNAMIC_CURRENT_ENV
})
exports.main = async (event, context) => {
// 查看参数
console.log('--- in payCb event ---', event)
const { returnCode, resultCode } = event || {}
if (returnCode === 'SUCCESS' && resultCode === 'SUCCESS') {
console.log('SUCCESS')
// 更新数据库状态
await request({
url: 'http://xxxservice.xxx.com/handlers/wechatpaycallback.ashx', // 我们自己的服务
method: 'POST',
data: {
...event,
},
success: (res) => {
if (res && parseInt(res.statusCode) === 200) {
return { errcode: 0, errmsg: 'SUCCESS' }
} else {
return { errcode: 1, errmsg: 'FAIL' }
}
},
fail: (res) => {
return { errcode: 1, errmsg: 'FAIL' }
},
})
} else {
console.log('FAIL', 'returnCode = ', returnCode, 'resultCode = ', resultCode)
return { errcode: 1, errmsg: 'FAIL' }
}
}
代码如上。
描述:在 pay_cb 中判断 returnCode 和 resultCode 均为 'SUCCESS' 后,调用我们自己的服务更新数据库。
预期:在 success 回调中 return { errcode: 0 },微信结束 pay_cb 的回调。
问题:pay_cb 总是会重复回调 15 次左右。即使是这样,我们也没办法保证我们自己服务能够成功更新数据库。
调试:使用 console.log 打印信息后查看日志,使用云函数本地调试打断点后手动触发,发现不会执行到 success 和 fail 回调中。
其他尝试(死马当活马医):
添加 complete 回调,也不会进入;
改 await request({/*...*/}) 为 return await request({/*...*/}),得到的是 request 对象本身
请问:在微信支付云开发的pay_cb中,怎样做到当且仅当自己的异步函数调用成功才停止pay_cb的回调,以确保数据库更新成功。
或者说 pay_cb 的最佳实践是什么?必须将结果存在微信的云数据库里吗(看网上的pay_cb代码示例都使用了 await db.collection('cloudPay').doc(event.outTradeNo).set({data:event}) 这种代码)?
编辑:经 @老张 指点,问题已解决,感谢 @老张。下面是最终代码,希望可以给碰到同样问题的同学启发。
// pay_cb
// 推荐的 request-promise 已弃用,改用了 request-promise-native
// 详见官方文档 https://github.com/request/request-promise-native
// 以及 request-promise 的弃用说明 https://www.npmjs.com/package/request-promise
const request = require('request-promise-native')
const cloud = require('wx-server-sdk')
cloud.init({
env: cloud.DYNAMIC_CURRENT_ENV
})
exports.main = async (event, context) => {
const { returnCode, resultCode } = event || {}
if (returnCode === 'SUCCESS' && resultCode === 'SUCCESS') {
// 更新数据库状态
const result = await request({
uri: 'http://ktvservice.geyuntech.com/handlers/wechatpaycallback.ashx',
method: 'POST',
body: {
...event,
},
json : true,
}).then((res) => {
return { errcode: 0, errmsg: 'SUCCESS' }
}).catch((error) => {
return { errcode: 1, errmsg: 'FAIL' }
})
return result
} else {
return { errcode: 1, errmsg: 'FAIL' }
}
}
你确定await request()这种写法是支持的吗?建议改用request-promise