# 工作流实现微信支付退款场景

开发者可使用云开发工作流+云函数能力,快速对接微信支付退款相关的接口。

# 流程概览

本文档中我们将会实现下图中的步骤,实现简单的微信支付退款流程:

# 第 1 步:部署退款工作流模板,完成初始配置,并发布工作流

打开云开发控制台-「云函数」- 新建 - 工作流,选择工作流「使用微信支付申请退款」模板,并安装模板。

# 第 2 步:完成「申请退款」工作流的配置

模板部署完成后,进入工作流编辑器内完成配置。

首先我们选择触发节点,在配置栏内,找到触发工作流的 URL 配置(这个 URL 将会在后续的云函数内使用到)。

在“申请退款”节点内,完成 API 的配置。

PS:首次使用的用户如果没有可用的微信支付 API 实例,可以新建凭证+API 实例。

支付通知回调的配置,可以配置成另一个工作流,或者已有 HTTP 服务的 URL:

# 第 3 步:完成「通知回调」工作流的配置

如果在第 2 步中,把通知回调配置为了另一条工作流,那么我们同样需要完成「通知回调」工作流的配置工作。

例如,我们可以使用自定义代码的节点,在支付回调中,修改云数据库内的订单状态:

const cloudbase = require("@cloudbase/node-sdk");

cloud.init({
  env: "<环境ID>",
});

const db = cloud.database();

// 示例:向 orders 集合中插入一条记录
const result = await db.collection("orders").add(wxpayTrigger.output.resource);

# 第 4 步:完成客户端与云函数代码

工作流配置完成后,接下来我们通过云函数来调用工作流,完成全套场景。

首先是云函数的示例代码,我们通过 HTTP 请求,调用「支付下单」工作流,当前云函数中使用了 axios依赖库,可以使用npm完成依赖库的本地上传或云端安装:

const axios = require("axios");
const cloud = require("wx-server-sdk");

// 工作流的触发 URL,在第 1 步中获取
const FLOW_URL = "https://xxxx.ap-shanghai.tcbautomation.cn/Automation/.....";

exports.main = async (event, context) => {
  const res = await axios.post(FLOW_URL, {
    description: "云开发工作流-微信支付测试",
    out_trade_no: "xxxxxxxxxxxxx", // 业务订单号,自定义指定
    amount: {
      total: 1, // 订单金额,单位为分
    },
    payer: {
      // 用户在小程序中的 OpenID,云函数中可直接获取
      openid: cloud.getWXContext().OPENID,
    },
  });

  const { timeStamp, packageVal, paySign, nonceStr } = res.data;

  return {
    timeStamp,
    packageVal,
    paySign,
    nonceStr,
  };
};

可见,全程只有约 50 行代码,即可完成生成预付单、完成付款、接收微信支付回调三大块逻辑,非常方便快捷。