Airwallex 支付
Zion 通过 Airwallex Drop-in 支持多币种单次支付、周期支付和退款。开始前,请先阅读支付功能概述,准备订单表并了解支付结果的处理方式。
开始前
登录 Airwallex 的测试环境 或生产环境 。在 Settings → Developers → API Keys 创建 API 密钥并保存 Client ID。API 密钥只在创建时显示;遗失后需要重新生成。


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


如需周期支付,在 Airwallex 控制台的 Billing → Products 创建产品和 Recurring Price,并复制 Price ID。
支付配置
配置支付配置
打开 行为 → 支付,点击 新建,填写配置名称,支付渠道 选择 Airwallex,然后点击 创建并开始配置。如果这是项目中第一个支付配置,需要先绑定订单表。
在配置面板的 支付结果处理 中复制 通知地址,下一步会用到。
创建 Airwallex Webhook
在 Airwallex 控制台打开 Settings → Webhooks,创建 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
创建后复制 Webhook secret。

填写商户信息
| 配置项 | 必填 | 填写方式 | 说明 |
|---|---|---|---|
| 环境 | 是 | 选择 | 测试环境选择 DEMO,生产环境选择 PROD |
| Client ID | 是 | 文本 | Airwallex 账户的 Client ID |
| API key | 是 | Secret | Airwallex 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。
更新订单并发放权益
在条件成立的分支中:
- 添加 数据库 节点修改订单表,把订单状态改为已支付。
- 按业务需要发放权益,例如为对应的账户开通会员、增加积分,或发送通知。
配置完成后,行为流的结构如下:
退款成功时
退款有了结果后,退款记录变为 REFUNDED(退款成功)或 FAILED(退款失败),Zion 运行此行为流。退款成功和退款失败都会进入这个行为流,需要分别处理。
添加入参
添加入参 refund_id(长整数),在输入配置中绑定 支付回调 → 退款 → id。
查询退款记录和订单
添加 「数据库 - 获取数据」节点,查询退款表,条件为 id 等于 refund_id。
按退款结果分别处理
添加 条件分支:
退款记录/状态等于REFUNDED:退款成功。在这个分支中再添加 条件分支,判断是全额退款还是部分退款:退款记录/金额等于退款记录/支付/总金额:全额退款,修改订单状态,并回收全部已发放的权益。- 其他情况:部分退款,按业务需要修改订单状态,并回收对应部分的权益。
退款记录/状态等于FAILED:退款失败。按业务需要通知管理员或用户,订单保持原状态。
配置完成后,行为流的结构如下:
订阅状态变更时
订阅的状态或 周期结束时取消 发生变化时,Zion 更新周期性支付记录并运行此行为流,例如订阅生效、扣款逾期或订阅取消。只改变计费周期的通知不会运行。
添加入参
添加入参 recurring_payment_id(长整数),在输入配置中绑定 支付回调 → 周期性支付 → id。如需区分状态是从哪个状态变化而来,可以再添加一个文本入参,绑定 支付回调 → 变更前状态。
查询周期性支付记录
添加 「数据库 - 获取数据」节点,查询周期性支付表,条件为 id 等于 recurring_payment_id。
Airwallex 的订阅状态按下表保存到周期性支付记录:
| Airwallex 状态 | 保存的状态 |
|---|---|
PENDING | INCOMPLETE |
IN_TRIAL | TRIALING |
ACTIVE | ACTIVE |
UNPAID | PAST_DUE |
CANCELLED | CANCELED |
按订阅状态分别处理
添加 条件分支:
- 状态为
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,此时触发 订阅状态变更时。
常见问题
- Webhook 校验失败:检查 Notification URL、Webhook secret、API version 和所选账户是否与支付配置一致。
- 支付状态没有更新:确认所需事件已经勾选、环境 与凭证一致,并且支付配置已经发布。
- 支付被取消却没有进入行为流:支付取消不会触发事件,支付记录状态为
CANCELLED。 - 订阅授权完成但权益未启用:以周期性支付记录的
ACTIVE状态为准,不要只使用前端成功分支。 - 续费产生支付记录但没有订单:检查 订阅续费时 的行为流是否为同步执行,并返回了订单 id。
- 退款提示支付记录不属于当前用户:Airwallex 退款只能由付款账户本人发起。