当前位置: 首页 > 后端技术 > Node.js

微信小程序云开发如何实现微信支付,业务逻辑又怎样才算可靠

时间:2023-04-03 12:39:33 Node.js

微信小程序云端开发如何实现微信支付,业务逻辑靠谱吗?确保业务逻辑可靠。@TOC注册一个微信支付商户号,点击“成为商户”,按照操作提示申请商户号(需要营业执照,个体户或者公司都可以。如果没有,你可以申请一个)。注册小程序关联商户账号后,登录,点击产品中心。然后点击AppID账号管理,关联微信小程序的AppID,同意即可。在微信开发者工具中绑定商户账号,点击云开发,进入云开发控制台,点击设置,点击其他设置,添加商户账号,如下图操作。这是官方文档中微信支付的业务逻辑示意图。之前看的时候还挺懵的,不知道说什么好。真正实践过后,我才明白它的含义。举个例子可能更好理解,我们在开发跑腿小程序的时候,需要发布跑腿功能,发布的时候需要进行微信支付。先看下我画的图,发布一个跑腿的业务逻辑代码,实现支付云功能:主要用于获取返回包,里面包含了wx.requestPayment发起微信支付所需的参数.constcloud=require('wx-server-sdk')cloud.init({env:''//填写你的云开发环境ID})exports.main=async(event,context)=>{constres=awaitcloud.cloudPay.unifiedOrder({"body":event.body,"outTradeNo":event.outTradeNo,//不能重复,否则会报错"spbillCreateIp":"127.0.0.1",//这是value,不要改"subMchId":"",//你的商户ID,"totalFee":event.totalFee*100,//单位是分"envId":"",//填写你的云开发环境ID"functionName":"pay_success",//支付成功回调云函数"nonceStr":event.nonceStr,//32位字符串,建议生成"tradeType":"JSAPI"//默认为JSAPI})returnres}微信小程序前端代码调用支付云函数,调用wx.requestPayment发起微信支付//使用微信支付pay:function(id){letthat=this;wx.showLoading({title:'paying',})wx.cloud.callFunction({name:'pay',//云函数名称data:{body:'Payerrandfee',outTradeNo:id,//使用记录号作为订单号,因为记录号是还是唯一的totalFee:that.data.price,nonceStr:'5K8264ILTKCH16CQ2502SI8ZNMTM67VS'},success:res=>{console.log(res)constpayment=res.result.paymentwx.hideLoading();wx.requestPayment({...payment,//...这三点是ES6的扩展运算符,可以用来对变量、数组、字符串、对象等进行解构赋值success(res){//这里的成功回调函数只有在用户点击“完成”或者返回键时才会被触发//所以这里不要写修改订单为已付款的业务逻辑//以防用户的支付完成,但未点击“完成”或返回按钮,会造成数据不一致。console.log('支付成功',res)wx.showToast({title:'订购成功',icon:'成功',duration:2000})},fail(err){console.error('支付失败',err)//支付失败后的处理函数,写在这里//为了节省数据库的空间,支付失败的顺序可以删除db.collection('publish').doc(id).remove()},})},fail(ere){//为了节省数据库空间,可以删除支付失败的订单db.collection('publish').doc(id).remove()},})},这样就可以实现微信支付了。特别注意,支付成功后的业务处理不要写在wx.requestPayment接口的成功回调函数中。记住!!!因为这里的成功回调函数只有在用户点击“完成”或者返回键时才会被触发。如果用户完成支付但没有点击“完成”或返回按钮,则支付成功,但不会对数据进行处理,造成数据不一致。支付成功后应该交给pay_success云函数来处理业务逻辑。pay_success云函数:constcloud=require('wx-server-sdk')cloud.init({env:''//填写你的云开发环境ID})constdb=cloud.database()//云函数入口functionexports.main=async(event,context)=>{constorderId=event.outTradeNoconstreturnCode=event.returnCodeif(returnCode=='SUCCESS'){//更新云数据库的订单状态为paiddb。collection('publish').where({_id:orderId,}).update({data:{pay_status:true,//更改为付费状态}})constres={errcode:0,errmsg:'支付成功'}//需要返回的字段,如果不返回这个字段,会一直回调returnres}}改变状态后,我们在接单大厅查询获取挂单信息时,需要获取已经收到的订单信息待付款订单的订单,即pay_status:true状态的订单。保证数据一致性。就是这样。其实通过云开发实现微信支付并没有那么难。只是业务逻辑需要更加严谨。我以前太辣了,写的业务逻辑漏洞百出。惭愧……我还要继续学习。欢迎关注微信公众号:小秃头和尚