跳转到主要内容
本指南介绍如何向第三方(例如供应商、卖家或您的某位用户)支付法币,并以稳定币为该笔出金注资。您将 USDT 或 USDC 充值到商户的 VelaFi 钱包,将收款人的银行账户登记为收款人,并为每笔出金创建一个 crypto_to_fiat 订单。VelaFi 按报价汇率兑换加密货币,并通过本地支付通道(例如 SPEI、Pix、CVU、Bre-B)发送法币;USD 和 EUR 则通过 Circle Payment Network (CPN) 发送。 完整的字段说明请参阅出金指南和创建出金订单。

工作原理

开始之前

  • API 访问权限。 一个 API 密钥、已加入白名单的服务器 IP,以及用于 X-BH-TOKEN 请求头的业务令牌。参见认证。
  • 一个已验证的商户,拥有出金币种和渠道的已激活账户。收款人必须使用该账户的支付方式(paymentId)。参见激活商户账户。
  • 已注册 ORDER_WEBHOOK。 您的端点必须返回 HTTP 2xx 和响应体 {"callbackStatus":"SUCCESS"},否则推送视为失败。参见 Webhook 和推送与重试。

构建流程

1

为商户的加密货币钱包注资

获取商户在您要发送的代币和网络上的充值地址:
将加密货币发送到 address(如果 needAddressTag 为 true,还需附上 addressExt),金额至少为 minQuantity。支持的代币和网络组合参见获取加密货币充值地址。加密货币充值到账没有 Webhook。请通过获取加密货币充值记录确认入账(status 2 表示成功),并通过获取加密资产余额中的 free 查看可用金额。
2

登记收款人

通过 GET /v2/payments/templates?paymentId={paymentId} 获取出金方式的字段模板,然后通过 POST /v2/payments 提交填写好的字段。请使用与订单相同的 merchantId。
Response
保存 data.id,它就是订单所用的 userPaymentId。只有 status 为 1(有效)的收款人才能接收出金。2 表示仍在验证中。3 表示验证失败:请读取 failReason;如果该账户已存在,请使用 sameAccountNumberId,而不要新建记录。收款人只需登记一次即可重复使用。参见管理收款人。
3

可选:通过报价锁定汇率

调用获取加密货币/法币报价,将 from 设为加密货币、to 设为法币,并设置 createQuoteId=true。price 表示每 1 单位加密货币对应的法币数量。
quoteId 在生产环境中的有效期为 10 秒(沙盒环境中为 300 秒),只能使用一次,并且与签发时的 country、加密货币和法币绑定。如果不传 quoteId,订单将按创建时的价格定价。
4

创建出金订单

使用收款人的 userPaymentId 调用 POST /v2/order/crypto_to_fiat。请使用收款人的 country 和 fiat。传入 fiatAmount 可固定收款人收到的金额,传入 cryptoAmount 可固定您支出的金额。如果同时传入两者,以 fiatAmount 为准。务必传入唯一的 clientId。
Response
订单如何注资。 加密货币来自商户钱包中该 crypto 的余额。VelaFi 在创建订单时扣除该金额,订单进入 40(如需审核或材料,则先进入 10、11 或 31)。如果余额不足,请求将因余额不足错误被拒绝,且不会创建订单。后付款模式。 如果 VelaFi 已为您的账户开通后付款出金(可能因法币币种而异),资金不足的订单也会被接受,并在 32(等待加密货币充值)状态等待。此时订单详情会返回 orderExpireTimestamp,即以 Unix 秒表示的截止时间。请在截止时间前向钱包充值足够的加密货币。VelaFi 每分钟检查一次余额,按从旧到新的顺序将余额用于等待中的订单,并将已覆盖的订单移至 40。如果先到达截止时间,订单将被取消(70)。参见为订单注资。如果请求超时,请在重试前先通过 clientId 查询订单。参见幂等性与重试。
5

跟踪出金直至完成

等待 ORDER_WEBHOOK 事件(orderType 为 SELL),或轮询 GET /v2/order/detail?orderType=crypto_to_fiat&clientId={clientId}。当支付通道返回中央银行参考号时,traceNumber 会包含该笔出金的参考号。如果收款人要求提供付款凭证,可将其提供给收款人。

通过 Circle Payment Network 进行 USD 和 EUR 出金

CPN 承载 USD 和 EUR 出金。它仅支持出金:您无法在 CPN 上收款或创建 fiat_to_crypto 订单。
  1. 为商户和币种激活 CPN 账户,并将 trench 设为 Circle Payment Network。参见激活企业商户账户。
  2. 在 CPN 支付方式上登记收款人,例如 USD 使用 120 Wire (CPN) 或 127 FEDWIRE (CPN),EUR 使用 124 SEPA (CPN)。CPN 模板要求提供收款人地址、useCase 和 reasonForPayment 代码。参见获取支付方式模板中的 CPN 模板。
  3. 将 fiat 设为 USD 或 EUR,并使用 CPN 收款人的 userPaymentId 创建 crypto_to_fiat 订单,方法与上文完全相同。
与任何出金一样,CPN 订单也可能进入风控审核(11)。此时请通过上传订单文件上传所要求的材料。订单随后进入 12 并等待决定。

需要处理的 Webhook

ORDER_WEBHOOK 仅针对通过 API 创建的订单发送。它不会发送 71(取消中)或 73(退款中),审核或风控审核中被拒绝的订单以 70 发送。事件可能重复到达、乱序到达,且中间状态可能被跳过。请基于 orderId + orderStatus 去重,并在事件与您持有的状态不符时通过 GET /v2/order/detail 读取订单。

处理失败

failReason 经常为空,因为许多支付通道不返回原因。请将空的 failReason 视为“未知”,而不是成功。为避免重复付款,只有在原订单达到最终状态(70 或 72)后才创建替代出金。

对账

  • 每笔出金: 通过 orderId 或 clientId 调用获取订单是唯一可信来源:orderStatus、cryptoAmount(从钱包扣除)、fiatAmount(支付给收款人)、fiatFee、orderPrice、orderFeeDetail、traceNumber、failCode 和 failReason。
  • 每日总额: 使用 orderType=crypto_to_fiat 和时间范围调用获取订单列表。该接口也会列出非通过 API 创建的订单。
  • 钱包: 通过获取加密货币充值记录查看充值,通过获取加密资产余额查看 free 和 locked。
请运行定时任务,重新读取您这边所有仍未完成的出金,并标记停留在 40 或 50 超过您正常出金时长的订单。连续三次推送失败后,Webhook 可能会丢失。

在沙盒环境中测试

  • 使用 https://api-test.velafi.com。沙盒环境中不会发送 Webhook,因此请轮询 GET /v2/order/detail。
  • 使用加密货币充值模拟器向商户钱包添加测试 USDT 或 USDC。参见沙盒环境测试工具。
  • 部分支付方式 ID 在沙盒环境中有所不同,例如 CBU/CVU (Momentum) 为 18 而不是 63。参见支付方式。
  • 模拟器只能生成成功的充值。您无法模拟被退回的出金,因此请使用录制的负载测试 70 和 72 的处理逻辑。

上线检查清单

  • 在创建订单前已为钱包注资,或已开通后付款出金,且您的系统会在 orderExpireTimestamp 之前为处于 32 的订单注资。
  • 收款人只登记一次,按 userPaymentId 保存,且仅在 status 为 1 时使用。
  • 每个创建请求都传入唯一的 clientId,超时时先通过 clientId 查询再决定是否重试。
  • ORDER_WEBHOOK 端点会验证签名,返回 HTTP 2xx 和 {"callbackStatus":"SUCCESS"},并基于 orderId + orderStatus 去重。
  • 70 和 72(包括 60 之后的 72)会在您这边释放或冲正该笔出金,且只有在原订单达到最终状态后才创建替代出金。
  • 停留在 40 或 50 的订单会被标记,并携带 orderId 升级处理。
  • 对于 USD 和 EUR,CPN 账户已激活,且 CPN 收款人包含所需的合规字段。
请参阅完整的上线检查清单。