(三)微信小程序云开发之微信支付全解

前言

项目基本开发完成,之后逐步会出一些之前评论或者私信的大家问的问题,最近比较忙,稍安勿躁,下面开始正题。

【微信支付】无论是云开发还是常规开发支付都是避不开的一个功能,面试小程序相关的岗位的时候也很喜欢问支付相关的流程。

一、准备工作

首先要注册小程序(好像是个废话,没小程序看这个干啥)而且需要企业主体,个人主体不能玩支付,然后需要注册一个商户号,最后将商户号和小程序绑定到一起,网上都有教程,这里就不重复说了,搜一下都出来了。

需要注意的是,前面如果都完成了,还需要在开发者工具中--其他设置--微信支付配置中授权

如果都完成了,下面我们开始吧~

二、捋捋流程

怼代码之前看一下微信开发文档中的CloudPay.unifiedOrder()点这里 ,这是云开发的,如果是常规开发就别看了,诶,常规开发看这个干啥......

稍等我画个流程图马上回来......

大致流程就是这样,比较抽象,下面看代码

三、怼代码

(1)订单信息存库我就不给大家看了,每个项目所需的数据不一样,没啥借鉴的,直接看统一下单

let params = {
    "body": "随便写点啥都行",
    "outTradeNo": ORDER,    //订单号
    "spbillCreateIp": event.ip || "127.0.0.1",
    "totalFee": data.payment * 100,    //我用的元为单位,微信支付要求分
    "attach": '【' + data.product_name + '】商品支付',    //按你的需求写
    "nonceStr": ORDER     //这要求是个随机字符串,我订单号就能保证不重复,就直接用的(懒)
}

const res = await cloud.cloudPay.unifiedOrder({
    ...params,
    "subMchId": "商户号",
    "tradeType": 'JSAPI',
    "envId": "环境ID,可写可不写,我写了",
    "functionName": "payment"    //支付成功后执行的云函数名字,云函数必须要用这个名字
})

if (res.errCode === 0 && res.errMsg === "cloudPay.unifiedOrder:ok") {
    return SendData(res.payment)    //返回小程序端支付的参数
} else {
    return SendData(res.returnMsg, 200, false)    //报个错
}

这是阉割版的代码demo,但是足以运行起来,其他的根据各位需求自己写就好

(2)之后是小程序端代码,拿到res.payment之后直接调requestPayment,就很简单直接塞进去就行,data就是上边返回的res.payment一点没改。

wx.requestPayment({
    ...data,
    success() {
        //你需要的代码         
    },
    fail() {
        //你需要的代码          
})

 (3)创建另一个云函数,名字就是统一下单时候再functionName中填写的名字,这个云函数主要用户等待腾讯服务器返回支付结果,只要返回成功就改变订单状态

const db = cloud.database()

// 云函数入口函数
exports.main = async (event, context) => {
  if (event['returnCode'] === 'SUCCESS' && event['resultCode'] === 'SUCCESS') {
    try {
      let {
        data
      } = await db.collection('order_shop_list')
        .where({
          order_number: event.outTradeNo
        })
        .get()
      if (data[0].status === 1) {
        let updated = await db.collection('order_shop_list')
          .where({
            order_number: event.outTradeNo
          })
          .update({
            data: {
              status: 2,
              payment: event.totalFee / 100,
              payment_time: new Date(),
            }
          })
        const _ = db.command
        let product = await db.collection('transaction_product_list')
          .doc(data[0].product_id)
          .update({
            data: {
              sales: _.inc(data[0].product_number),
              stock: _.inc(-data[0].product_number)
            }
          })
      }
    } catch (e) {
      console.error(e)
    }
  }
}

(4)当returnCode和resultCode返回为SUCCESS时就支付成功了,returnCode是请求的状态码并不是支付的成功标识,resultCode才是支付成功,之前没注意,订单状态就一直变来变去的。

敲黑板【邦邦邦】,划重点了啊

从用户支付后微信服务器会一直请求这个等待反馈的云函数,无论是云开发还是普通开发都会遇到,所以需要自己处理这些多余的请求。

我之前没处理,销量和下单数量一直对不上,才发现这个问题,买了一单,销量-6,-8,-12,-14我都方了

我不知道其他人怎么做的。我想的办法就是只要成功就改变订单状态,只要腾讯服务器请求先判断订单状态是不是未支付,如果是就改,不是就不改,销量也不动

点赞!收藏!评论!

散会!

要有打赏更好,嘿嘿 

  • 4
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值