微信小程序云开发的基本流程:https://blog.youkuaiyun.com/i826056899/article/details/144770162
其中微信小程序使用云开发进行回调时我们使用了如下的方法:
// 云函数代码
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" : "请传入终端 ip 地址,支持 ipv6", // 终端 IP
"subMchId" : "1900009231", // 商户号
"totalFee" : 1, // 总金额
"envId": "test-f0b102", // 云函数环境名称
"functionName": "pay_cb" // 支付结果通知回调云函数名
})
return res
}
在上面的 调用过程中,我们传递了支付结果通知回调云函数pay_cb。本篇我们分析为什么需要这个云函数,以及如何使用这个云函数。
1. 为什么需要这个参数
// 小程序代码
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 success时,并不意味着一定支付成功。这里的success只是客户端正确完成了支付完成这个过程,并不意味着实际收到了支付。比如由于网络原因,客户端这里已经完成了支付操作,但是由于信息没有发送到服务端,此时本地依然会打印pay success,但是实际付款并没有成功。
解决方法就是使用这里的functionName参数。因为这里的回调函数只有服务端收到支付后才会回调。
2. 如何使用
支付回调函数的作用
支付回调函数主要用于接收微信支付结果通知,商户服务器需要在收到通知后进行相应的处理,比如更新订单状态等。
支付回调函数的参数
支付回调函数通常会接收到以下参数:
transactionId
:微信支付订单号outTradeNo
:商户订单号totalFee
:订单总金额resultCode
:支付结果代码,如SUCCESS
表示支付成功timeEnd
:支付完成时间
支付回调函数的示例
以下是一个简单的支付回调函数示例:
function pay_cb(params) {
const { transactionId, outTradeNo, totalFee, resultCode, timeEnd } = params;
if (resultCode === 'SUCCESS') {
// 支付成功,更新订单状态等操作
console.log('支付成功', transactionId, outTradeNo, totalFee, timeEnd);
// 更新订单状态为已支付
updateOrderStatus(outTradeNo, 'paid');
} else {
// 支付失败,处理失败情况
console.log('支付失败', resultCode);
// 更新订单状态为支付失败
updateOrderStatus(outTradeNo, 'failed');
}
}
function updateOrderStatus(orderId, status) {
// 这里实现更新订单状态的逻辑,比如调用数据库接口等
console.log(`更新订单 ${orderId} 状态为 ${status}`);
}
3. 传递自定义参数
以上流程通常可以完成支付流程。但是有时候又会带来更多的麻烦,一个典型的应用场景是我们希望支付成功后修改数据库的内容,比如自动记录总的收款,或者记录某个用户的总支出。
但是由于这是个回调函数,默认传递过来的参数可能不包含一些信息比如数据库中用户id,一个更好的解决方法是使用其中的attach字段,传递自定义参数。
只不过attach只能传递字符串,不过也足够了,我们可以把我们想要的信息使用逗号拼合,在回调函数中再分割即可。