1. 程式人生 > 其它 >最佳實踐丨使用雲函式+雲呼叫,四步搞定微信支付

最佳實踐丨使用雲函式+雲呼叫,四步搞定微信支付

概述

微信支付是雲開發原生支援的微信生態能力之一,開發者只需要簡單呼叫相應的函式即可完成整套支付流程,安全又高效。部分優勢包括:

  • 無需關心證書、簽名,支付流程簡化;
  • 基於微信私有協議和私有鏈路,更加安全、高效;
  • 免運維,高可用性;
  • 按需擴容,彈性伸縮,按量計費,成本縮減;
  • 支援通過雲函式接受支付回撥,無需自建回撥服務。

流程對比:傳統流程 vs 雲開發

程式碼示例

第 1 步:小程式呼叫雲函式

C 端使用者發起支付流程後,小程式端呼叫雲函式(此處假設雲函式名為 makeOrder):

// 小程式程式碼
wx.cloud.callFunction({
  name: "makeOrder",
  data: {
    /* 開發者自定義引數 */
  }
});

第 2 步:雲函式生成訂單,返回訂單資訊

雲函式 makeOrder 收到呼叫之後,使用微信服務端 SDK 提供的 API,無需證書和簽名,可直接生成訂單。

生成訂單之後,利用 CloudPay.unifiedOrder() 統一下單介面,將訂單資訊返回給小程式。

CloudPay.unifiedOrder() 介面文件:

https://developers.weixin.qq.com/miniprogram/dev/wxcloud/reference-sdk-api/open/pay/CloudPay.unifiedOrder.html

// 雲函式 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() 介面文件:

https://developers.weixin.qq.com/miniprogram/dev/wxcloud/reference-sdk-api/open/pay/CloudPay.unifiedOrder.html