基于新版云開發(fā)的微信支付

微信終于發(fā)布了基于云開發(fā)的微信支付,相比于原來的支付方式,新版的云開發(fā)版支付支持云函數(shù)形式的回調(diào)。網(wǎng)上查資料后發(fā)現(xiàn)基本沒有詳細的文章,我就吃一次螃蟹吧。
在幾天的努力下,終于調(diào)試成功,目前小程序已上線,需要看效果的識別下面的小程序碼。
開發(fā)過微信支付的同學都知道,文檔坑,代碼坑層出不窮,寫此文章的目的就是把我遇到的坑給后來人提個醒(客觀來說比以前的微信支付好調(diào)的多)。
廢話不多說,正文開始:
1 申請微信商戶號,關聯(lián)小程序碼。
此步驟沒有什么難度,有一個坑是我申請商戶號的時候因為沒有申請下來新的小程序,所以提供的是一個舊的appid。當我新的小程序認證成功后在微信公眾平臺關聯(lián)商戶號后,調(diào)用統(tǒng)一下單接口一直報錯:“商戶傳入的appid參數(shù)不正確,請聯(lián)系商戶處理”。在log中發(fā)現(xiàn),統(tǒng)一下單接口返回的appid是我測試小程序的appid,也就是說新的小程序和商戶沒幫成功,這個也可以通過云開發(fā)控制臺看出來:


屏幕快照 2020-05-30 上午12.11.45.png

但是郁悶的是改不了。沒辦法,只能重新申請一個商戶號。。。
2 商戶號和微信公眾平臺關聯(lián)。
這步?jīng)]什么坑,只要授權了就可以。
說明:一個小程序可以綁定多個商戶號(同一主體,不同主體沒試過),只要開發(fā)的時候?qū)憣托小?br> 3 在云開發(fā)控制臺進行微信支付配置
如下圖配置即可,如果運氣好,不會出現(xiàn)我說的第一個坑。


屏幕快照 2020-05-30 上午12.15.55.png

如果此步驟沒有配置,則調(diào)用統(tǒng)一下單接口后,會提示:受理關系不存在。這點需要注意,我在這里卡了一下。
4 寫js端代碼,作用:整理支付數(shù)據(jù),調(diào)用支付云函數(shù)
formSubmit: function (e) {
     
    wx.showLoading({
      title: '加載中。。。',
    })
    let that = this;
    var uuid = util.uuid(16, 16)//調(diào)用自己的uuid函數(shù)
    var body = "換成自己的訂單支付內(nèi)容"
    
    wx.cloud.callFunction({
      name: "pay",
      data: {
        body: body,
        orderid: "" + uuid,
        money: 1,//支付金額
        nonceStr:util.uuid(32, 32)//調(diào)用自己的uuid函數(shù)
      },
      success(res) {
        wx.hideLoading({
          complete: (res) => {},
        })
        console.log("提交成功", res.result)
        //創(chuàng)建自己的未支付訂單
         。。。

        that.pay(res.result)
      },
      fail(res) {
        wx.hideLoading({
          complete: (res) => {},
        })
        console.log("提交失敗", res)
      }
    })
  }
//實現(xiàn)小程序支付
  pay(payData) {
    var that = this;
    const payment = payData.payment//這里注意,上一個函數(shù)的result中直接整合了這里要用的參數(shù),直接展開即可使用
    wx.requestPayment({
      ...payment, //。。。是展開變量的語法 
      success(res) {
        console.log('pay success', res)
        //跳轉(zhuǎn)到支付成功頁面
      },
      fail(res) {
        console.error('pay fail', res)
        //跳轉(zhuǎn)到支付失敗頁面
      }
    })
  }

5 云函數(shù)

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" : event.body,
    "outTradeNo" : event.orderid,
    "spbillCreateIp" : "127.0.0.1",
    "subMchId" : "*******",//這里要注意:雖然key是子商戶id,實際上就是普通商戶id
    "totalFee" : parseInt(event.money),//第二個坑:注意必須是數(shù)字,如果不是數(shù)字,則會報錯unifiedOrder:fail wx api error: -202
    "envId": "****-20**h",//這里是回調(diào)函數(shù)所屬的的云環(huán)境id
    "functionName": "payCallBack",//這個是回調(diào)函數(shù)名
    "nonceStr":event.nonceStr,//第三個坑:官方文檔中相關云函數(shù)代碼沒有nonceStr和tradeType,測試的時候會報nonceStr不存在的錯,翻看文檔才發(fā)現(xiàn)這個是必填項,直接粘過來以后還需要加上這兩個參數(shù)
    "tradeType":"JSAPI"
  })
  return res
}

6 回調(diào)函數(shù)
之前網(wǎng)上的云開發(fā)微信支付都是沒有回調(diào)的,很不方便。

// 云函數(shù)入口文件
const cloud = require('wx-server-sdk')

cloud.init({
 // API 調(diào)用都保持和云函數(shù)當前所在環(huán)境一致
 env: cloud.DYNAMIC_CURRENT_ENV
})

const db = cloud.database()
const _ = db.command;

// 云函數(shù)入口函數(shù)
exports.main = async (event, context) => {

。。。//自己的回調(diào)邏輯

 return { "errcode": 0 }//第四個坑:注意,一定要返回這個對象,否則回調(diào)回一直觸發(fā)。尤其是自己的邏輯復雜的時候一定要保證所有case的返回都帶上這個對象。
}

至此,微信支付開發(fā)完畢。

我在開發(fā)中遇到的更多的坑都已經(jīng)記錄在easyDemo小程序中,希望我的demo能給你easy。我還會持續(xù)更新easyDemo,歡迎收藏。


easyDemo.jpg
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容