最佳實踐丨使用雲函式+雲呼叫,四步搞定微信支付
阿新 • • 發佈:2021-07-08
概述
微信支付是雲開發原生支援的微信生態能力之一,開發者只需要簡單呼叫相應的函式即可完成整套支付流程,安全又高效。部分優勢包括:
- 無需關心證書、簽名,支付流程簡化;
- 基於微信私有協議和私有鏈路,更加安全、高效;
- 免運維,高可用性;
- 按需擴容,彈性伸縮,按量計費,成本縮減;
- 支援通過雲函式接受支付回撥,無需自建回撥服務。
流程對比:傳統流程 vs 雲開發
程式碼示例
第 1 步:小程式呼叫雲函式
C 端使用者發起支付流程後,小程式端呼叫雲函式(此處假設雲函式名為 makeOrder
):
// 小程式程式碼 wx.cloud.callFunction({ name: "makeOrder", data: { /* 開發者自定義引數 */ } });
第 2 步:雲函式生成訂單,返回訂單資訊
雲函式 makeOrder 收到呼叫之後,使用微信服務端 SDK 提供的 API,無需證書和簽名,可直接生成訂單。
生成訂單之後,利用 CloudPay.unifiedOrder() 統一下單介面,將訂單資訊返回給小程式。
CloudPay.unifiedOrder() 介面文件:
// 雲函式 makeOrder 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: "小秋TIT店-超市", outTradeNo: "1217752501201407033233368018", spbillCreateIp: "127.0.0.1", subMchId: "1900009231", totalFee: 1, envId: "test-f0b102", functionName: "payCallback" // 支付回撥的函式名 }); return res; };
第 3 步:小程式端發起支付
小程式端收到雲函式返回的訂單資訊後,發起支付:
// 小程式程式碼 wx.cloud.callFunction({ name: "makeOrder", data: { /* 開發者自定義引數 */ }, success: (res) => { // 取得雲函式返回的訂單資訊 const payment = res.result.payment; // 調起微信客戶端支付 wx.requestPayment({ ...payment, success(res) { /* 成功回撥 */ }, fail(res) { /* 失敗回撥 */ } }); } });
第 4 步:使用雲函式接收支付回撥,完成支付流程
使用者完成付款之後,微信後臺將會呼叫指定的雲函式(此處假設名為 payCallback),傳入的引數中會帶有訂單資訊。
開發者可以在此雲函式中,實現自己的發貨、完成訂單的邏輯。
// 雲函式 payCallback
exports.main = async (event, context) => {
const {
return_code, // 狀態碼
appid, // 小程式 AppID
mch_id, // 微信支付的商戶號
device_info, // 微信支付分配的終端裝置號
openid, // 使用者在商戶appid下的唯一標識
trade_type, // 交易型別:JSAPI、NATIVE、APP
bank_type // 銀行型別
// ......
// 更多引數請參考:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_7&index=8
} = event;
/*
開發者自己的邏輯
*/
// 向微信後臺返回成功,否則微信後臺將會重複呼叫此函式
return { errcode: 0 };
};
相關文件:
雲函式文件:
https://docs.cloudbase.net/cloud-function/introduce.html
雲呼叫文件:
https://developers.weixin.qq.com/miniprogram/dev/wxcloud/guide/openapi/openapi.html
wx-server-sdk 文件:
https://developers.weixin.qq.com/miniprogram/dev/wxcloud/reference-sdk-api/Cloud.html
CloudPay.unifiedOrder() 介面文件: