跳转到主要内容
本指南介绍如何通过 fiat_to_crypto 订单将本地货币(例如 MXN、ARS、COP 或 BRL)兑换为稳定币。您可以选择每笔订单的付款方式:使用商户待处理资金 (Pending Fund) 余额中已持有的法币支付,或由付款人针对该笔订单发起银行转账支付。订单完成后,加密货币会入账到商户的 VelaFi 钱包。之后您可以继续持有、提现,或让其自动发送到外部地址。 完整的字段说明请参阅入金指南和创建入金订单。

选择注资模式

如果您的业务能够持有本地货币余额,请使用预先注资模式。订单在创建的同时即完成付款,因此不会因未付款而过期,而且您在确定交易前就能知道资金是否到位。按单付款依赖于付款人在时限结束前汇出准确金额,许多按单付款订单最终因未付款而过期。

工作原理

开始之前

  • API 访问权限。 一个 API 密钥、已加入白名单的服务器 IP,以及用于 X-BH-TOKEN 请求头的业务令牌。参见认证。
  • 一个已验证的商户。 订单的 merchantId 必须是您账户下已通过验证的商户。参见商户。
  • 一个已激活的币种账户。 商户需要拥有该法币的已激活账户。参见激活商户账户。
  • 已注册 Webhook。 注册 ORDER_WEBHOOK;如果预先注资,还需注册 FUNDING_WEBHOOK;如果需要提现,还需注册 CRYPTO_WITHDRAW_WEBHOOK。参见 Webhook。您的端点必须返回 HTTP 2xx 和响应体 {"callbackStatus":"SUCCESS"},否则推送视为失败。参见推送与重试。

构建流程

1

仅限预先注资:为待处理资金余额注资

通过获取待入账资金账户(GET /v2/merchant/addfunds)获取商户币种账户的充值信息,并将法币汇至该账户。每笔入账的充值都会触发一条 type 为 DEPOSIT、status 为 2 的 FUNDING_WEBHOOK 事件。在创建大额订单前,请通过获取商户账户列表(balance)检查当前余额。如果您已经将付款收取到商户的币种账户,这些充值就构成了该余额。参见使用虚拟账户收取本地付款。
2

可选:通过报价锁定汇率

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

创建订单

调用 POST /v2/order/fiat_to_crypto。务必传入唯一的 clientId(最多 40 个字符),以便安全重试并在之后查找订单。
将 paymentId 设为 70(VelaFi Pending Fund)。
VelaFi 在创建订单时会检查商户该币种的余额。如果余额不足以覆盖订单金额,请求将因余额不足错误被拒绝,且不会创建订单。如果余额足够,订单创建后会立即从余额中支付并进入 60(已完成),除非它需要先经过审核或提交材料(10、11 或 31)。该笔扣款会以 BUY_CRYPTO 记录的形式出现在资金记录中。
Response
如果请求超时,请在重试前先通过 clientId 查询订单。参见幂等性与重试。
4

仅限按单付款:展示付款指引

使用 orderType=fiat_to_crypto 调用获取订单,向付款人展示 paymentInfo 的内容(例如 SPEI 的 CLABE)以及准确的 fiatAmount。付款人的转账入账后,VelaFi 会将其用于同一币种账户上的未完成订单。金额与某笔订单金额完全相等的充值会优先用于该订单。否则,充值会用于最早的未完成订单。带有 depositAlias 的订单只能由该虚拟账户收到的充值支付。没有 depositAlias 的订单可以由该币种账户上的任何充值支付,包括已在待处理资金余额中的法币。
只有在全额可用时订单才会被支付。付款不足不会使订单完成。请要求付款人汇出准确金额,并为每个付款人分配一个虚拟账户(depositAlias),以免一个付款人的转账被用于支付另一个付款人的订单。
5

跟踪订单直至完成

等待 ORDER_WEBHOOK 事件,或轮询 GET /v2/order/detail?orderType=fiat_to_crypto&clientId={clientId}。orderStatus 为 60 时订单完成,为 70、80 或 81 时订单失败。轮询时,审核中被拒绝的订单显示为 80,风控审核中被拒绝的订单显示为 81;Webhook 则将两者都以 70 发送。参见订单状态。此时加密货币(cryptoAmount)已在商户钱包中。可通过获取加密资产余额查询。
6

可选:将加密货币从钱包转出

您有两种方式:
  • 按订单自动提现。 如果 VelaFi 已为您的账户开通入金自动提现,请在创建请求中添加 network 和 address。订单完成后,VelaFi 会将 cryptoAmount 提现到该地址,并在提现成功时发送 ON_RAMP_WITHDRAW_WEBHOOK。在生产环境中,network 必须为 POL 或 SPL20。这两个字段需同时传入或同时省略。未开通该功能的账户会被拒绝,并返回 “You are currently not a user of the onRamp automatic withdrawal service.”。参见入金提现事件。
  • 自行提现。 将目标地址添加到您的提现白名单,然后使用您自己的唯一 clientId 调用创建加密货币提现(POST /v2/assets/withdraw)。通过获取提现额度查询有效的 chainType 值和最低金额。
两种提现在达到最终状态时都会触发 CRYPTO_WITHDRAW_WEBHOOK。对于自动提现,其 clientId 为入金订单的 orderId。

需要处理的 Webhook

事件可能重复到达、乱序到达,且中间状态可能被跳过。请进行去重,并在事件与您持有的状态不符时通过 GET /v2/order/detail 读取订单。参见推送与重试。

处理失败

付款时限

按单付款订单只会在 40 状态等待有限的时间。VelaFi 为您的账户设定该时限。订单详情中不会返回该时限,因此请向您的 VelaFi 联系人询问具体数值,并根据 createTime 向付款人展示截止时间。时限结束仍未收到全额付款时,订单将被取消,并在订单详情和 ORDER_WEBHOOK 中报告为 orderStatus 70。已取消的订单无法重新打开。 如果付款人在订单取消后付款,该转账仍会入账到商户的待处理资金余额(您会收到一条 FUNDING_WEBHOOK DEPOSIT),但不会用于已取消的订单。您可以为该金额创建新订单(随后由余额支付),或通过提取待处理资金将资金支付出去。

对账

  • 订单: 通过 orderId 或 clientId 调用获取订单,是每笔订单的唯一可信来源:orderStatus、fiatAmount、fiatFee、cryptoAmount、orderPrice、failCode 和 failReason。使用带时间范围的获取订单列表统计每日总额。该接口也会列出非通过 API 创建的订单。
  • 法币余额: 获取资金记录显示每笔 DEPOSIT 和 BUY_CRYPTO,两种注资模式均适用。获取法币流水提供带变动后余额的逐笔账目。
  • 加密货币转出: 通过 clientId 查询获取加密货币提现记录,直到 status 为 6(成功)、7(失败)或 9(已取消)。
请运行定时任务,重新读取您这边所有仍未完成的订单。连续三次推送失败后,Webhook 可能会丢失。

在沙盒环境中测试

  • 使用 https://api-test.velafi.com。沙盒环境中不会发送 Webhook,因此请轮询 GET /v2/order/detail。
  • 使用法币充值模拟器为测试商户的余额注资,或支付按单付款订单(depositAlias 可指定虚拟账户)。参见沙盒环境测试工具。
  • 在沙盒环境中,quoteId 的有效期为 300 秒,自动提现的 network 可接受 POL 或 TSPL20。
  • 模拟器只能生成成功的充值,无法模拟被退回的付款。如需测试过期路径,请创建一笔按单付款订单且不付款。

上线检查清单

  • 每个创建请求都传入唯一的 clientId,超时时先通过 clientId 查询再决定是否重试。
  • 预先注资流程会检查余额,并在遇到余额不足拒绝时不会循环重试同一请求。
  • 按单付款流程会展示 paymentInfo、准确金额和截止时间,并在 70 后创建新订单。
  • 如果您在同一币种账户上为多个付款人运行按单付款,每个付款人都有一个虚拟账户(depositAlias)。
  • ORDER_WEBHOOK 端点会验证签名,返回 HTTP 2xx 和 {"callbackStatus":"SUCCESS"},并基于 orderId + orderStatus 去重。
  • 有定时任务根据 API 对未完成订单、资金记录和提现进行对账。
  • 提现目标地址已加入白名单,或已开通自动提现并使用 network 和 address 完成测试。
请参阅完整的上线检查清单。