微信小程序云開發(fā)實現(xiàn)微信支付功能業(yè)務邏輯可靠
今天打了幾把永劫無間后,咱們來聊一聊用云開發(fā)來開發(fā)微信小程序時,如何實現(xiàn)微信支付,并且保證業(yè)務邏輯可靠。
注冊微信支付商戶號

點擊“成為商家”,按照操作提示去申請商戶號即可(需要營業(yè)執(zhí)照,個體戶或公司都行。沒有可以辦一個)
小程序關聯(lián)商戶號

注冊完成,登錄進去,點擊產(chǎn)品中心。再點擊AppID賬號管理,關聯(lián)微信小程序的AppID,同意即可。
在微信開發(fā)者工具綁定商戶號,點擊云開發(fā),進入云開發(fā)控制臺,點擊設置,點擊其他設置,添加商戶號,如下圖操作即可

前期工作準備結(jié)束后,開始進入擼代碼環(huán)節(jié)了
業(yè)務邏輯

這個是官方文檔的一張微信支付的業(yè)務邏輯示意圖。我以前看的時候還是挺懵的,不知所云。后來真正實踐過才明白它的意思。
舉個栗子可能更好明白,我們在開發(fā)跑腿小程序的時候呢,需要發(fā)布跑腿功能,發(fā)布時需要進行微信支付。
先看看我畫的圖,發(fā)布跑腿的一個業(yè)務邏輯

代碼實現(xiàn)
pay云函數(shù):
主要是用于獲取回包,回包里面有wx.requestPayment 發(fā)起微信支付所需要的參數(shù)。
const cloud = require('wx-server-sdk')
cloud.init({
env: '' //填入你的云開發(fā)環(huán)境ID
})
exports.main = async (event, context) => {
const res = await cloud.cloudPay.unifiedOrder({
"body": event.body,
"outTradeNo" : event.outTradeNo, //不能重復,否則報錯
"spbillCreateIp" : "127.0.0.1", //就是這個值,不要改
"subMchId" : "", //你的商戶號,
"totalFee" : event.totalFee*100, //單位為分
"envId": "", //填入你的云開發(fā)環(huán)境ID
"functionName": "pay_success", //支付成功的回調(diào)云函數(shù)
"nonceStr":event.nonceStr,//隨便弄的32位字符串,建議自己生成
"tradeType":"JSAPI" //默認是JSAPI
})
return res
}
微信小程序前端代碼調(diào)用pay云函數(shù),并調(diào)用wx.requestPayment發(fā)起微信支付
//使用微信支付
pay:function(id){
let that = this;
wx.showLoading({
title: '正在支付',
})
wx.cloud.callFunction({
name: 'pay', //云函數(shù)的名稱
data:{
body:'支付跑腿費',
outTradeNo:id, //用記錄號來做訂單號,因為記錄號也是唯一的。
totalFee:that.data.price,
nonceStr:'5K8264ILTKCH16CQ2502SI8ZNMTM67VS'
},
success: res => {
console.log(res)
const payment = res.result.payment
wx.hideLoading();
wx.requestPayment({
...payment, //...這三點是 ES6的展開運算符,用于對變量、數(shù)組、字符串、對象等都可以進行解構賦值。
success (res) {
//這里success回調(diào)函數(shù)只有用戶點擊了“完成”或者返回鍵才會被觸發(fā)
//所以不要在這里寫改變訂單為已支付的業(yè)務邏輯
//萬一用戶支付完成,但不點擊"完成"或者返回鍵,那會造成數(shù)據(jù)不一致性的問題
console.log('支付成功', res)
wx.showToast({
title: '下單成功',
icon: 'success',
duration: 2000
})
},
fail (err) {
console.error('支付失敗', err) //支付失敗之后的處理函數(shù),寫在這后面
//為了節(jié)省數(shù)據(jù)庫的空間,支付失敗的訂單可以刪除
db.collection('publish').doc(id).remove()
},
})
},
fail(ere){
//為了節(jié)省數(shù)據(jù)庫的空間,支付失敗的訂單可以刪除
db.collection('publish').doc(id).remove()
},
})
},
這樣就可以實現(xiàn)微信支付啦

特別注意,不要在wx.requestPayment接口的success回調(diào)函數(shù)里面寫支付成功后的業(yè)務處理。切記!??!因為這里success回調(diào)函數(shù)只有用戶點擊了“完成”或者返回鍵才會被觸發(fā)。萬一用戶支付完成,但不點擊"完成"或者返回鍵,那會造成支付成功,但沒去處理數(shù)據(jù),導致數(shù)據(jù)不一致性的問題。
應該交給pay_success云函數(shù)來處理支付成功后的業(yè)務邏輯。
pay_success云函數(shù):
const cloud = require('wx-server-sdk')
cloud.init({
env:'' //填入你的云開發(fā)環(huán)境ID
})
const db = cloud.database()
// 云函數(shù)入口函數(shù)
exports.main = async (event, context) => {
const orderId = event.outTradeNo
const returnCode = event.returnCode
if(returnCode == 'SUCCESS'){
//更新云數(shù)據(jù)庫的訂單狀態(tài),改為已支付的狀態(tài)即可
db.collection('publish').where({
_id:orderId,
}).update({
data:{
pay_status:true, //改為已支付狀態(tài)
}
})
const res = {errcode:0,errmsg:'支付成功'}//需要返回的字段,不返回該字段則一直回調(diào)
return res
}
}改變狀態(tài)之后,我們在接單大廳里去查詢獲取待接單信息的時候,要去獲取已支付的待接單的訂單,也就是pay_status:true狀態(tài)的訂單即可。保證了數(shù)據(jù)的一致性。
其實云開發(fā)實現(xiàn)微信支付也沒有那么難。只不過業(yè)務邏輯需要更加嚴謹一點。以前自己太辣雞,寫的業(yè)務邏輯漏洞百出,慚愧...
到此這篇關于微信小程序云開發(fā)實現(xiàn)微信支付功能業(yè)務邏輯可靠的文章就介紹到這了,更多相關小程序云開發(fā)實現(xiàn)微信支付內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
JavaScript時間操作之年月日星期級聯(lián)操作
這篇文章主要介紹了JavaScript時間操作之級聯(lián)日期選擇操作,涉及到年、月、日、星期,感興趣的小伙伴們可以參考一下2016-01-01

