微信終于發(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ā)控制臺看出來:

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

如果此步驟沒有配置,則調(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,歡迎收藏。
