Skip to Content

Airwallex 支付

Zion 通过 Airwallex Drop-in 支持多币种单次支付、周期支付和退款。开始前,请先阅读支付功能概述,准备订单表并了解支付结果的处理方式。

开始前

登录 Airwallex 的测试环境 或生产环境 。在 Settings → Developers → API Keys 创建 API 密钥并保存 Client ID。API 密钥只在创建时显示;遗失后需要重新生成。

在 Airwallex 控制台创建 API 密钥

在 Airwallex 控制台查看 Client ID 和 API 密钥

如果账户使用法定实体或关联支付账户,还需要在 Settings → Entities 获取 Legal entity ID 和 Linked payment account ID。

在 Airwallex 控制台查看 Legal entity ID

在 Airwallex 控制台查看 Linked payment account ID

如需周期支付,在 Airwallex 控制台的 Billing → Products 创建产品和 Recurring Price,并复制 Price ID。

支付配置

配置支付配置

打开 行为 → 支付,点击 新建,填写配置名称,支付渠道 选择 Airwallex,然后点击 创建并开始配置。如果这是项目中第一个支付配置,需要先绑定订单表。

在配置面板的 支付结果处理 中复制 通知地址,下一步会用到。

创建 Airwallex Webhook

在 Airwallex 控制台打开 Settings → Webhooks,创建 Webhook:

在 Airwallex 控制台创建 Webhook

  • API version:固定填写 2025-11-11。
  • Account:选择 Linked payment account ID 对应的账户;未使用关联支付账户时选择当前收款账户。
  • Notification URL:填写支付配置中显示的 通知地址。
  • Events:勾选以下事件。
payment_intent.succeeded payment_intent.cancelled invoice.finalized subscription.in_trial subscription.active subscription.unpaid subscription.cancelled subscription.modified refund.accepted refund.failed

在 Airwallex 控制台配置 Webhook 版本、账户和事件

创建后复制 Webhook secret。

在 Airwallex 控制台复制 Webhook secret

填写商户信息

配置项必填填写方式说明
环境是选择测试环境选择 DEMO,生产环境选择 PROD
Client ID是文本Airwallex 账户的 Client ID
API key是SecretAirwallex API 密钥
Webhook secret是Secret上一步创建的 Webhook 密钥
Legal entity ID否文本使用法定实体时填写
Linked payment account ID否文本使用关联支付账户时填写

环境 必须与 Client ID、API key 和 Webhook 所在的 Airwallex 环境一致。测试环境和生产环境可以分别建一个支付配置。

选择支付产品和客户端

在 支付产品 中勾选 Drop-in,并在 客户端管理 中勾选 Web 应用的客户端。

配置支付结果处理

在 支付结果处理 中为 支付完成时、退款成功时、订阅状态变更时 和 订阅续费时 各绑定一个行为流,具体步骤见下文的配置支付结果行为流。

配置权限

打开 权限管理,按角色勾选允许通过这个配置发起的支付类型:

支付类型默认建议
单次支付所有角色已开启为需要付款的角色保留,例如已登录用户
订阅支付所有角色已开启为需要订阅的角色保留,用于发起和取消周期支付
退款未开启为付款用户所在的角色开启;Airwallex 退款只能由付款账户本人发起

也可以在 设置 → 权限 → 支付 中统一查看和修改。

配置支付结果行为流

Airwallex 有四种支付事件:支付完成时、退款成功时、订阅状态变更时 和 订阅续费时。只使用单次支付时,只需配置前两个。Zion 收到 Airwallex 的通知后,先更新对应的支付记录,再运行对应的行为流。你需要在行为流中完成更新订单、发放或回收权益等业务。

支付完成时

用户付款成功后,支付记录变为 SUCCESSFUL,Zion 运行此行为流。支付失败或用户取消支付时不会运行。

添加入参

为行为流添加入参 payment_id(长整数),在支付配置中绑定 支付回调 → 支付 → id。

查询支付记录

添加 「数据库 - 获取数据」节点,查询支付表,条件为 id 等于 payment_id。

判断支付金额是否准确

由于实际支付的金额和订单记录中的金额可能不一致,需要判断金额准确后再做后续处理。

⚠️

这一步非常重要。如果跳过,攻击者可以篡改支付金额,用远低于订单价格的金额完成支付,给你造成直接的经济损失。

添加 条件分支,用以下条件判断金额是否准确:

  • 支付记录/总金额 等于 支付记录/order/{金额字段}。
  • 支付记录/币种 等于 支付记录/order/{币种字段}。

Airwallex 的 总金额 以主货币单位保存,例如 10 美元保存为 10。

更新订单并发放权益

在条件成立的分支中:

  1. 添加 数据库 节点修改订单表,把订单状态改为已支付。
  2. 按业务需要发放权益,例如为对应的账户开通会员、增加积分,或发送通知。

配置完成后,行为流的结构如下:

退款成功时

退款有了结果后,退款记录变为 REFUNDED(退款成功)或 FAILED(退款失败),Zion 运行此行为流。退款成功和退款失败都会进入这个行为流,需要分别处理。

添加入参

添加入参 refund_id(长整数),在输入配置中绑定 支付回调 → 退款 → id。

查询退款记录和订单

添加 「数据库 - 获取数据」节点,查询退款表,条件为 id 等于 refund_id。

按退款结果分别处理

添加 条件分支:

  • 退款记录/状态 等于 REFUNDED:退款成功。在这个分支中再添加 条件分支,判断是全额退款还是部分退款:
    • 退款记录/金额 等于 退款记录/支付/总金额:全额退款,修改订单状态,并回收全部已发放的权益。
    • 其他情况:部分退款,按业务需要修改订单状态,并回收对应部分的权益。
  • 退款记录/状态 等于 FAILED:退款失败。按业务需要通知管理员或用户,订单保持原状态。

配置完成后,行为流的结构如下:

订阅状态变更时

订阅的状态或 周期结束时取消 发生变化时,Zion 更新周期性支付记录并运行此行为流,例如订阅生效、扣款逾期或订阅取消。只改变计费周期的通知不会运行。

添加入参

添加入参 recurring_payment_id(长整数),在输入配置中绑定 支付回调 → 周期性支付 → id。如需区分状态是从哪个状态变化而来,可以再添加一个文本入参,绑定 支付回调 → 变更前状态。

查询周期性支付记录

添加 「数据库 - 获取数据」节点,查询周期性支付表,条件为 id 等于 recurring_payment_id。

Airwallex 的订阅状态按下表保存到周期性支付记录:

Airwallex 状态保存的状态
PENDINGINCOMPLETE
IN_TRIALTRIALING
ACTIVEACTIVE
UNPAIDPAST_DUE
CANCELLEDCANCELED

按订阅状态分别处理

添加 条件分支:

  • 状态为 ACTIVE:为订阅账户开通或恢复订阅权益。
  • 状态为 PAST_DUE 或 UNPAID:扣款未成功,按业务需要暂停权益或提醒用户。
  • 状态为 CANCELED 或 INCOMPLETE_EXPIRED:订阅已终止,收回订阅权益。

在各分支中添加 数据库 节点更新数据时,可以用周期性支付记录中的字段作为过滤条件:

  • 更新账户:条件为账户表的 id 等于 周期性支付记录/帐户id。
  • 更新订单:条件为订单表的 id 等于 周期性支付记录/第一笔订单id。

用户取消订阅后,周期结束时取消 会先变为 true,此时订阅仍在当前周期内有效,可以按需提醒用户;周期结束后状态才会变为 CANCELED。

配置完成后,行为流的结构如下:

订阅续费时

订阅产生新一期账单时,Zion 为这一期创建支付记录并运行此行为流。这一期的支付记录还没有关联订单,此行为流的唯一任务是创建订单并返回订单 id。

⚠️

这个行为流必须使用 同步执行,并把新订单的 id 作为出参返回。否则编辑器会提示错误,本期支付记录也无法关联订单。

设置执行方式和出参

把行为流设为 同步执行,并添加一个长整数类型的出参,用来返回新订单的 id。

添加入参

添加入参 payment_id(长整数),在输入配置中绑定 支付回调 → 支付 → id。

查询支付和订单记录

  • 添加 「数据库 - 获取数据」节点,查询支付表,条件为 id 等于 payment_id。
  • 添加 「数据库 - 获取数据」节点,查询订单表,条件为 id 等于 支付记录/周期性支付/第一笔订单id,获取首期订单记录。

创建本期订单

添加 数据库 节点在订单表中新增一条订单,金额、账户和商品等字段使用上一步获取到的订单记录填写,订单状态设为待支付。

返回订单 id

把新订单的 id 赋给出参。Zion 会把它写回本期支付记录。

配置完成后,行为流的结构如下:

这里只创建订单,不要发放权益。本期扣款成功后会触发 支付完成时,在那里按金额校验结果更新订单和发放本期权益。

配置前端支付行为

单次支付

添加创建订单行为

调用支付行为前,先在已绑定的订单表中创建订单。订单金额、商品和用户等业务数据应保存在订单表中。

添加支付行为

在按钮或其他组件的触发器中添加 支付,支付类型 选择 单次支付,支付配置 选择前面创建的Airwallex配置,支付产品 选择 Drop-in。

参数类型必填说明
订单表 id长整数是已绑定订单表中的订单记录 id
货币文本是Airwallex 支持的币种代码,如 USD、HKD
金额小数是使用主货币单位,必须大于 0;例如 10 美元填写 10

建议用户点击后立即禁用支付按钮,直到支付行为返回或收银台关闭,避免重复拉起收银台。

支付行为的 成功时 表示前端调用已成功返回,最终支付状态仍以 支付完成时 为准。出于安全考虑,成功时 不能配置修改数据的行为。

处理支付完成

支付成功后,Zion 把支付记录更新为 SUCCESSFUL,并运行 支付完成时 绑定的行为流,在其中更新订单和发放权益。配置方法见支付完成时。

显示最终结果

前端查询订单表或支付表显示最终状态。需要及时刷新时,可以采用订阅查询的方法。

退款

开放退款权限

Airwallex 退款只能由付款账户本人发起,其他账户发起退款会失败。在支付配置的 权限管理 中为付款用户所在的角色勾选 退款,并在业务上控制何时显示退款入口,例如只在订单满足退款条件时显示。

添加退款行为

添加 支付 行为,支付类型 选择 退款。

参数类型必填说明
支付表 id长整数是需要退款的支付记录 id,不是订单 id
退款金额小数是使用原支付币种的主货币单位;超过剩余可退金额时,按剩余可退金额退款

可以用订单 id 作为过滤条件查询对应的支付记录,再绑定其 id。只有 SUCCESSFUL 或 PARTIALLY_REFUNDED 的支付记录可以退款。

处理退款结果

发起退款后,退款记录状态为 REFUNDING。Airwallex 发送 refund.accepted 或 refund.failed 后,Zion 把退款记录更新为 REFUNDED 或 FAILED,并运行 退款成功时 绑定的行为流。配置方法见退款成功时。

周期支付

发起订阅

添加 支付 行为,支付类型 选择 周期支付,类型 选择 发起,支付配置 选择前面创建的 Airwallex 配置,支付产品 选择 Drop-in。

参数类型必填说明
订单表 id长整数是首期订阅对应的订单记录 id
Price ID文本是Airwallex Recurring Price 的 id

用户在收银台绑定支付方式后,Zion 创建自动扣款的订阅,以及状态为 INCOMPLETE 的周期性支付记录和关联首期订单的支付记录。前端分支只表示订阅授权交互结果,订阅是否生效以周期性支付记录的状态为准。

取消订阅

添加 支付 行为,支付类型 选择 周期支付,类型 选择 取消,并绑定需要取消的 周期支付表 id。只有订阅账户本人可以取消订阅。

取消后订阅会在当前周期结束时终止:周期性支付记录的 周期结束时取消 立即变为 true,状态在周期结束时变为 CANCELED,此时触发 订阅状态变更时。

常见问题

  1. Webhook 校验失败:检查 Notification URL、Webhook secret、API version 和所选账户是否与支付配置一致。
  2. 支付状态没有更新:确认所需事件已经勾选、环境 与凭证一致,并且支付配置已经发布。
  3. 支付被取消却没有进入行为流:支付取消不会触发事件,支付记录状态为 CANCELLED。
  4. 订阅授权完成但权益未启用:以周期性支付记录的 ACTIVE 状态为准,不要只使用前端成功分支。
  5. 续费产生支付记录但没有订单:检查 订阅续费时 的行为流是否为同步执行,并返回了订单 id。
  6. 退款提示支付记录不属于当前用户:Airwallex 退款只能由付款账户本人发起。
Last updated on