微信小程序云開發(fā)實(shí)現(xiàn)微信支付功能業(yè)務(wù)邏輯可靠
今天打了幾把永劫無間后,咱們來聊一聊用云開發(fā)來開發(fā)微信小程序時(shí),如何實(shí)現(xiàn)微信支付,并且保證業(yè)務(wù)邏輯可靠。
注冊(cè)微信支付商戶號(hào)
點(diǎn)擊“成為商家”,按照操作提示去申請(qǐng)商戶號(hào)即可(需要營業(yè)執(zhí)照,個(gè)體戶或公司都行。沒有可以辦一個(gè))
小程序關(guān)聯(lián)商戶號(hào)
注冊(cè)完成,登錄進(jìn)去,點(diǎn)擊產(chǎn)品中心。再點(diǎn)擊AppID賬號(hào)管理,關(guān)聯(lián)微信小程序的AppID,同意即可。
在微信開發(fā)者工具綁定商戶號(hào),點(diǎn)擊云開發(fā),進(jìn)入云開發(fā)控制臺(tái),點(diǎn)擊設(shè)置,點(diǎn)擊其他設(shè)置,添加商戶號(hào),如下圖操作即可
前期工作準(zhǔn)備結(jié)束后,開始進(jìn)入擼代碼環(huán)節(jié)了
業(yè)務(wù)邏輯
這個(gè)是官方文檔的一張微信支付的業(yè)務(wù)邏輯示意圖。我以前看的時(shí)候還是挺懵的,不知所云。后來真正實(shí)踐過才明白它的意思。
舉個(gè)栗子可能更好明白,我們?cè)陂_發(fā)跑腿小程序的時(shí)候呢,需要發(fā)布跑腿功能,發(fā)布時(shí)需要進(jìn)行微信支付。
先看看我畫的圖,發(fā)布跑腿的一個(gè)業(yè)務(wù)邏輯
代碼實(shí)現(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, //不能重復(fù),否則報(bào)錯(cuò) "spbillCreateIp" : "127.0.0.1", //就是這個(gè)值,不要改 "subMchId" : "", //你的商戶號(hào), "totalFee" : event.totalFee*100, //單位為分 "envId": "", //填入你的云開發(fā)環(huán)境ID "functionName": "pay_success", //支付成功的回調(diào)云函數(shù) "nonceStr":event.nonceStr,//隨便弄的32位字符串,建議自己生成 "tradeType":"JSAPI" //默認(rèn)是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:'支付跑腿費(fèi)', outTradeNo:id, //用記錄號(hào)來做訂單號(hào),因?yàn)橛涗浱?hào)也是唯一的。 totalFee:that.data.price, nonceStr:'5K8264ILTKCH16CQ2502SI8ZNMTM67VS' }, success: res => { console.log(res) const payment = res.result.payment wx.hideLoading(); wx.requestPayment({ ...payment, //...這三點(diǎn)是 ES6的展開運(yùn)算符,用于對(duì)變量、數(shù)組、字符串、對(duì)象等都可以進(jìn)行解構(gòu)賦值。 success (res) { //這里success回調(diào)函數(shù)只有用戶點(diǎn)擊了“完成”或者返回鍵才會(huì)被觸發(fā) //所以不要在這里寫改變訂單為已支付的業(yè)務(wù)邏輯 //萬一用戶支付完成,但不點(diǎn)擊"完成"或者返回鍵,那會(huì)造成數(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() }, }) },
這樣就可以實(shí)現(xiàn)微信支付啦
特別注意,不要在wx.requestPayment接口的success回調(diào)函數(shù)里面寫支付成功后的業(yè)務(wù)處理。切記?。?!因?yàn)檫@里success回調(diào)函數(shù)只有用戶點(diǎn)擊了“完成”或者返回鍵才會(huì)被觸發(fā)。萬一用戶支付完成,但不點(diǎn)擊"完成"或者返回鍵,那會(huì)造成支付成功,但沒去處理數(shù)據(jù),導(dǎo)致數(shù)據(jù)不一致性的問題。
應(yīng)該交給pay_success云函數(shù)來處理支付成功后的業(yè)務(wù)邏輯。
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)之后,我們?cè)诮訂未髲d里去查詢獲取待接單信息的時(shí)候,要去獲取已支付的待接單的訂單,也就是pay_status:true狀態(tài)的訂單即可。保證了數(shù)據(jù)的一致性。
其實(shí)云開發(fā)實(shí)現(xiàn)微信支付也沒有那么難。只不過業(yè)務(wù)邏輯需要更加嚴(yán)謹(jǐn)一點(diǎn)。以前自己太辣雞,寫的業(yè)務(wù)邏輯漏洞百出,慚愧...
到此這篇關(guān)于微信小程序云開發(fā)實(shí)現(xiàn)微信支付功能業(yè)務(wù)邏輯可靠的文章就介紹到這了,更多相關(guān)小程序云開發(fā)實(shí)現(xiàn)微信支付內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
javascript中call,apply,bind的區(qū)別詳解
這篇文章主要介紹了javascript中call,apply,bind的區(qū)別詳解,幫助大家更好的理解和使用JavaScript,感興趣的朋友可以了解下2020-12-12屏蔽網(wǎng)頁右鍵復(fù)制和ctrl+c復(fù)制的js代碼
解決的方法就是直接把網(wǎng)頁保存下來然后刪掉下面這段js代碼,然后就可以正常用右鍵菜單,也可以通過設(shè)置瀏覽器的安全級(jí)別到最高級(jí)別來解決問題2013-01-01JavaScript設(shè)計(jì)模式--簡單工廠模式實(shí)例分析【XHR工廠案例】
這篇文章主要介紹了JavaScript設(shè)計(jì)模式--簡單工廠模式,結(jié)合實(shí)例形式分析了JavaScript設(shè)計(jì)模式中簡單工廠模式原理與XHR工廠應(yīng)用案例,需要的朋友可以參考下2020-05-05談?wù)凧avaScript自定義回調(diào)函數(shù)
使用Jquery的時(shí)候發(fā)現(xiàn)它里面的很多方法都提供回調(diào)函數(shù),接下來通過本篇文章給大家介紹js自定義回調(diào)函數(shù),需要的朋友參考下2015-10-10layui關(guān)閉層級(jí)、簡單監(jiān)聽的實(shí)例
今天小編就為大家分享一篇layui關(guān)閉層級(jí)、簡單監(jiān)聽的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-09-09微信小程序三級(jí)聯(lián)動(dòng)選擇器使用方法
這篇文章主要為大家詳細(xì)介紹了微信小程序三級(jí)聯(lián)動(dòng)選擇器使用方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-02-02js實(shí)現(xiàn)精確到秒的倒計(jì)時(shí)效果
這篇文章主要為大家詳細(xì)介紹了js實(shí)現(xiàn)精確到秒的倒計(jì)時(shí)效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-05-05選擇指定數(shù)量后checkbox不可選(變灰)javascript代碼
選擇指定數(shù)量后checkbox不可選(變灰)javascript代碼2009-06-06