signature 请求头中。您的服务器必须在处理事件之前验证此签名。
签名验证的工作原理
1
提取签名请求头
从传入的 HTTP 请求中读取
signature 请求头。该值是原始请求体的 RSA-SHA256 签名,编码为十六进制字符串。2
加载您的公钥
获取创建 Webhook 端点时返回的
publicKey。列出 Webhook 的响应中也会为每个 Webhook 包含该公钥。这是一个 X.509 格式、Base64 编码的 RSA 公钥。3
计算并验证签名
使用 RSA-SHA256,基于原始请求体字节和公钥验证签名。验证前请先将十六进制签名解码为字节。
4
响应 VelaFi
如果验证通过,返回
{"callbackStatus": "SUCCESS"};否则返回 {"callbackStatus": "FAIL"}。VelaFi 根据此响应决定是否重试推送。签名验证代码
- Java
- Python
- JavaScript
Webhook 事件类型
VelaFi 支持以下事件类型。每种事件类型都需要单独注册一个 Webhook 端点。如果该事件类型已存在一个活跃的 Webhook,创建 Webhook 的请求将被拒绝。Webhook 归属于您的 VelaFi 账户,因此一个 Webhook 会接收账户下所有商户的对应事件:ORDER_WEBHOOK
当通过 API 创建的法币兑加密货币或加密货币兑法币订单状态变更时触发。
GLOBAL_PAYMENT_WEBHOOK
当通过 API 创建的法币兑法币全球支付订单状态变更时触发。
FUNDING_WEBHOOK
当资金记录(存款、提现、加密货币购买或内部转账)完成、取消或退款时触发。
ON_RAMP_WITHDRAW_WEBHOOK
当已完成的 API 入金订单向订单目标钱包地址的加密货币提现成功时触发。
STABLE_COIN_PAYMENT_WEBHOOK
当稳定币支付订单被确认时触发。
CRYPTO_WITHDRAW_WEBHOOK
当商户钱包的加密货币提现成功、失败或被取消时触发。
推送与重试
每次推送都是一个带有 JSON 请求体和signature 请求头的 HTTP POST 请求。除事件特定字段外,每个负载都包含以下字段:
负载中的值(包括 ID、金额和时间戳)均以 JSON 字符串形式发送。
- 确认接收。 只有当您的端点返回
2xxHTTP 状态,且响应体为callbackStatus等于SUCCESS的 JSON 对象时,推送才算成功。任何其他状态或响应体都视为一次失败的尝试。VelaFi 的连接、写入和读取超时均为 6 秒,超时同样视为一次失败的尝试。 - 重试。 推送失败后通常会自动重试,总共尝试三次。第二次尝试在第一次失败后约 5–10 分钟进行,第三次尝试在第二次失败后约 60–65 分钟进行。第三次尝试失败后,该事件不再重试。Open API 不提供请求重新推送的端点。
- 重复推送。 同一事件可能会被推送多次。例如,如果您的端点已处理某次推送,但其响应未能及时送达,该事件将被重试。请以事件类型、记录 ID(
orderId、txId或withdrawId)和状态作为键,使您的处理逻辑具备幂等性。 - 顺序与跳过的状态。 VelaFi 不保证推送按照状态发生的顺序到达。对于
ORDER_WEBHOOK、GLOBAL_PAYMENT_WEBHOOK、FUNDING_WEBHOOK和ON_RAMP_WITHDRAW_WEBHOOK,VelaFi 会在每次尝试前检查记录的当前状态。如果自事件排队以来状态已发生变化,该事件将被丢弃且不会推送,因此您可能不会收到每一个中间状态。请查询订单或资金记录以获取其最新状态。CRYPTO_WITHDRAW_WEBHOOK只推送提现的最终状态。 - 仅限活跃的 Webhook。 只有当该事件类型存在活跃的 Webhook(状态
10)时,事件才会被排队。在没有活跃 Webhook 期间发生的事件不会被排队,之后也不会推送。Webhook 被禁用或删除时,已排队的事件不会被取消:它们会被保留,如果在约 15 天内该事件类型再次存在活跃的 Webhook,这些事件将以其原始webhookId推送到该 Webhook 的 URL。CRYPTO_WITHDRAW_WEBHOOK事件例外:它们只会推送到其排队时所属的 Webhook,因此在删除或停用旧 Webhook 后新建的 Webhook 不会收到这些事件。

