crypto_to_fiat 订单。VelaFi 按报价汇率兑换加密货币,并通过本地支付通道(例如 SPEI、Pix、CVU、Bre-B)发送法币;USD 和 EUR 则通过 Circle Payment Network (CPN) 发送。
完整的字段说明请参阅出金指南和创建出金订单。
工作原理
开始之前
- API 访问权限。 一个 API 密钥、已加入白名单的服务器 IP,以及用于
X-BH-TOKEN请求头的业务令牌。参见认证。 - 一个已验证的商户,拥有出金币种和渠道的已激活账户。收款人必须使用该账户的支付方式(
paymentId)。参见激活商户账户。 - 已注册
ORDER_WEBHOOK。 您的端点必须返回 HTTP2xx和响应体{"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 订单。
- 为商户和币种激活 CPN 账户,并将
trench设为Circle Payment Network。参见激活企业商户账户。 - 在 CPN 支付方式上登记收款人,例如 USD 使用
120Wire (CPN) 或127FEDWIRE (CPN),EUR 使用124SEPA (CPN)。CPN 模板要求提供收款人地址、useCase和reasonForPayment代码。参见获取支付方式模板中的 CPN 模板。 - 将
fiat设为USD或EUR,并使用 CPN 收款人的userPaymentId创建crypto_to_fiat订单,方法与上文完全相同。
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端点会验证签名,返回 HTTP2xx和{"callbackStatus":"SUCCESS"},并基于orderId+orderStatus去重。 -
70和72(包括60之后的72)会在您这边释放或冲正该笔出金,且只有在原订单达到最终状态后才创建替代出金。 - 停留在
40或50的订单会被标记,并携带orderId升级处理。 - 对于 USD 和 EUR,CPN 账户已激活,且 CPN 收款人包含所需的合规字段。