跳转到主要内容
Transaction Monitoring 会发出三个 Webhook 事件,覆盖交易的完整生命周期,另外还有一个可选的第四个事件,用于通知新的规则建议。所有事件都基于 Didit 标准的 Webhook 基础设施,并使用 HMAC-SHA256 签名。有关 Webhook 目标、签名和测试的说明,请参阅 Webhook 参考文档。

事件目录

实体级事件(user.status.updated、business.status.updated)也可能因交易活动而触发,详见实体 Webhook。
沙盒应用不会发出 transaction.created 或 transaction.status.updated Webhook。如需测试这些事件,请使用生产应用,或在控制台中使用 API & Webhooks → Try Webhook。Travel Rule 沙盒交换会发出 environment: sandbox 的 travel_rule.status.updated Webhook。正式上线前,请使用 Didit Test VASP 测试交换流程。

信封结构

Didit 的 Webhook 采用扁平结构:事件字段与信封字段并列位于顶层,没有嵌套的 data 对象。每次投递都包含以下字段:

Payload 结构

transaction.created 和 transaction.status.updated

这两个事件共用同一种 payload:一个精简摘要,外加 action_required 块(若无则为 null):
该 payload 有意保持精简。收到后,请使用 GET /v3/transactions/{transaction_id}/ 获取完整记录。返回内容包括完整详情(参与方、rule_runs、provider_results、travel_rule、cost_breakdown、decision_reason_code),以及状态发生变化的原因。

transaction_rule_suggestions.created

该事件针对的是您的规则集,而非某一笔交易,因此不包含交易 ID。 事件内容绝不包含个人数据,仅包括建议 ID、类型、标题和数量。
通用信封字段(event_id、timestamp、application_id、environment)同样会添加到请求体中。

travel_rule.status.updated

每次状态转换都会触发此事件,包括进入 FINISHED、CANCELLED 或 EXPIRED。转账一旦到达其中任一状态,便不会再为其发送任何 Travel Rule 事件。 事件的状态可能与上一个事件相同,例如重新发送时仍未找到通道,转账保持在 COUNTERPARTY_VASP_NOT_FOUND。 rail 的取值为 INTERNAL、TRP、GTR、TRUST、VERIFYVASP、SYGNA、EMAIL、TEST_VASP(由 Didit Test VASP 应答的沙盒转账,同时带有 test_vasp: true 和 test_vasp_scenario),或在未选定通道时为 ""(sunrise 注册始终为 "")。 在创建交易、sunrise 注册、入站 TRP 查询或 INTERNAL 通道的入站段中,Didit 会先发送 transaction.created,再发送该交易的 travel_rule.status.updated 事件。若某条规则在此步骤中改变了交易状态,也可能在 transaction.created 之前发送 transaction.status.updated。 附加到您已创建的存款交易上的 sunrise 注册,不会发送 transaction.created。 每个 Webhook 都独立投递和重试,因此被重试的事件可能晚于之后的事件到达。请以 transaction_id 为键处理事件,需要了解当前状态时,重新读取该交易。

状态流转示例

直接通过

先审核后通过

升级验证

Travel Rule 转账

前两个事件来自同一个请求,其中 transaction.created 先入队。每个 Webhook 都独立投递,因此不要依赖到达顺序。 通过 TRUST 发送的转账永远不会收到 COMPLETED 事件,因为 TRUST 不会返回 Didit 可读取的任何内容:转账会停留在 AWAITING_COUNTERPARTY,直到确认截止时间,然后以 EXPIRED 结束。通过 GTR、VerifyVASP 和 Sygna Bridge 发送时,Didit 会从网络中读取交易对手的应答,事件随之发出。

签名验证

每次投递都会使用目标的共享密钥进行 HMAC-SHA256 签名,并附带三个签名请求头和一个时间戳:
完整的验证代码(包括时间戳新鲜度检查)请参阅 Webhook 参考。

重试与投递保证

  • 遇到 5xx、404、超时或连接失败时,Didit 最多重试 2 次:首次失败约 1 分钟后重试一次,之后再过约 4 分钟重试一次。
  • 重试的投递会复用相同的 event_id,请在您的处理程序中据此去重。
  • 最后一次失败后,该事件的投递停止,并会通知您的组织;Webhook 目标绝不会被静默禁用。
  • 请尽快返回 2xx(先入队,再处理)。ACK 响应缓慢可能导致超时和重复投递。

幂等性

请将 event_id 存入您自己的去重存储,以确保每个 Webhook 仅被处理一次。当您的端点响应 ACK 缓慢或在请求过程中断开连接时,同一事件可能会被重新投递。

订阅

后续步骤

Webhook 参考

Webhook 目标、签名与重试。

状态

完整的状态机。

集成指南

在生产环境中处理 Webhook。
最后修改于 2026年11月7日