收藏
回答

【已解决】微信支付云开发,pay_cb 中异步调用服务更新数据库的问题

// 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' }
    }
}


最后一次编辑于  2021-11-24
回答关注问题邀请回答
收藏

1 个回答

  • 老张
    老张
    2021-11-24

    你确定await request()这种写法是支持的吗?建议改用request-promise

    2021-11-24
    有用 3
    回复 1
    • 小人物
      小人物
      2021-11-24
      成功了,谢谢指点!
      2021-11-24
      回复
登录 后发表内容