Skip to main content
无论您是交易所、钱包还是平台方,只要用户的 KYC、余额、卡或订单发生变化,DCS 都会通过实时通道告知您,避免轮询。本页帮您把两条通道一次配通:
  • Webhook:推送式。您提供一个 HTTPS 回调地址,DCS 在事件发生时把签名后的 JSON 推送到该地址。适合服务端到服务端的稳定接收。
  • WebSocket:订阅式(DeCard 托管特色)。您先获取一个专属私有频道,连上 wss 长连接实时收消息;漏收时还能按 version 回溯历史。适合需要前端/网关实时感知、或对补偿回溯有要求的场景。
隐私红线:DeCard 托管模式涉及大量终端用户隐私数据。本页所有示例中的 externalUserId、卡号、商户名、地址、txHashsecretKey均为占位/脱敏值,请勿当作真实数据;您的接收端日志也应脱敏,切勿明文记录真实 PII 与密钥。

1. Webhook(推送式)

1.1 核心能力

  • 自动重试:通知失败时 DCS 自动重试,最多 3 次
  • 签名验证:每条通知都在请求头携带 X-Signature 数字签名,确保来源可信。
  • 幂等处理:每个事件携带全局唯一 webhookId,便于您去重。

1.2 前置条件与接入流程

步骤 1:实现 Webhook 接收端

您的服务需暴露一个 POST 接口,满足以下要求:
  • 支持 application/json 请求体;
  • 返回 200 OK 表示接收成功;返回其他任何状态码都会触发 DCS 重试;
  • 必须在 2 秒内返回响应(DCS 侧 connectTimeout 与 socketTimeout 均为 2000 ms),否则视为超时失败(同样会触发重试)。

步骤 2:同步 DCS 配置回调 URL

把步骤 1 实现的回调 URL 同步给 DCS 团队。该 URL 必须为 HTTPS 且公网可访问

步骤 3:验证与上线

先在 UAT(沙盒)环境验证,验证通过后再上线生产。

1.3 推送时序与重试

Webhook 推送时序与重试Webhook 推送时序与重试

1.4 安全:X-Signature 验签

为确保通信安全,DCS 在每个 Webhook 请求头中携带 X-Signature。该签名由 HmacSHA256 算法生成:DCS 用您的 SecretKey原始消息体(raw body)计算签名。您收到后需用同一 SecretKey 对原始 body 复算,并与 X-Signature 比对,验证请求的真实性与完整性。
签名头名固定为 X-Signature,HMAC 密钥为您的 SecretKey(不是 apiKey)。请按此约定实现验签。

请求头(Headers)

签名计算参考(Java)

接收端参考(Java,含 7 步处理约定)

1.5 Webhook 公共结构

注意类型与字段差异:Webhook 用 notificationTimestamp / eventTimestampLong,毫秒);金额/数量类字段(如 freeDeltatransactionAmount)为 BigDecimaltranIdLongWebSocket 的对应字段是 string、且时间字段名为 timestamp(见 第 2.4 节),合并阅读时切勿混用类型。
Webhook 通知示例(资产变动,脱敏):

2. WebSocket(订阅式,★ DeCard 托管特色)

WebSocket 通道是 DeCard 托管独有能力——您可订阅一个专属私有频道实时收消息,并按 version 回溯漏收。
WebSocket 实时推送用于同步用户相关数据变化,覆盖 KYC 状态、资产变动、卡交易、订单状态等关键信息,提升您对用户操作的响应效率。

2.1 前置条件与三步接入

  1. 创建监听频道:调 GET /websocket/v1/get-channel 为机构生成专属私有频道(频道串即接收消息的唯一标识,例如 HBHmMK99SJEVMVUqCb4)。
  2. 连接 wss 长连接:把频道串拼到 wss 地址的 {channel} 处,按环境选择主网/测试网(见 第 2.3 节),建立连接并监听消息。
  3. 频道轮换 + 漏收回溯:每个频道存活 24 小时,过期失效;为避免消息丢失,请在过期前重新调 get-channel 取新频道。建议在频道到期前 1 小时重新调用 get-channel 获取新频道,确保新旧频道有足够的重叠窗口完成切换。漏收或需回溯时,用 GET /websocket/v1/searchversion 查历史消息。

2.2 频道生命周期

WebSocket 频道生命周期WebSocket 频道生命周期
频道安全机制:新频道生成后,旧频道不再推送数据。请确保切换时机正确,避免在旧频道上空等。

2.3 WebSocket 环境地址

{channel}get-channel 返回的频道串替换。

2.4 WebSocket 公共结构

与 Webhook 结构的差异:WebSocket 用 timestampstring,且多一个 version 字段data 内各业务字段(金额/数量/tranId 等)均为 string。这与 Webhook 的 Long / BigDecimal 类型不同,请按本表为准。
WebSocket 消息示例(资产变动,脱敏):

2.5 WebSocket 接口参考

两个接口均返回全站统一响应结构:
判断成功请以 code == "SYS_SUCCESS" 为准;响应结构不含 success 布尔字段。

获取监听频道

无请求参数。data 返回机构专属的私有频道标识串。

按版本查询历史消息

这两个 REST 接口与全站其余 REST 接口一致,请按 鉴权指南 携带签名头(X-DAPI-API-KEY / X-DAPI-TIMESTAMP / X-DAPI-NONCE / X-DAPI-SIGN)。

3. 业务事件总表(两通道共享)

两条通道共享同一套业务事件类型与 data 结构,共 8 类。仅消息格式不同:Webhook 用 notificationTimestamp / eventTimestampLong),WebSocket 用 timestamp + versionstring),且 data 内字段类型如前述(Webhook BigDecimal/Long ↔ WebSocket string)。
术语说明:CARD_APPLY 的最终状态 SUCCEED卡申请状态(枚举为 SUCCEED 而非 SUCCESS),与卡订单和卡片的状态定义不同,请勿混淆。CARD_STATUSNORMAL/FROZEN/CANCELLED卡管理 中的卡状态定义一致。

3.1 BALANCE_CHANGE 数字资产变动

3.2 CARD_TRANSACTION 卡交易记录

当前 CARD_TRANSACTION 只通过 response=A/D 区分批准与拒绝,不携带更细的拒绝原因码;交易查询侧也没有 declinedReason / declineCode 字段。若需要细分原因,需 DCS 侧后续系统支持(请与 DCS 确认排期);现阶段按余额、卡状态与风控/MCC 逐项排查。
示例(退款,含 originalExternalTranId,脱敏):

3.3 CARD_TRANSACTION_SETTLEMENT 卡清算记录

字段与 CARD_TRANSACTION 大体一致,差异点:用 settledAmount(清算金额)+ settledCurrencyCode(清算币种 ISO 4217)替代 settlement 系字段;仅含 direction,不含 response 及其他授权专有字段(如 systemTraceAuditNumber)。

3.4 CARD_PHYSICAL_SHIPPING 实体卡物流信息

3.5 ORDER_STATUS FOMO 充值状态

transStatus 枚举:

3.6 QR_ORDER_STATUS 扫码付订单状态

orderStatus 枚举:

3.7 CARD_APPLY 卡片申请状态

status 枚举: needExtraInfo 说明:

3.8 CARD_STATUS 卡状态

当卡状态发生变更时通知最新的卡状态。目前支持虚拟卡状态(cardStatus),实体卡状态(physicalCardStatus)后续补充。 cardStatus 枚举(与 卡管理状态机 对齐):

4. 最佳实践与常见问题

  • 先验签,再处理:处理任何消息内容前,先用 SecretKey 对原始请求体复算 HmacSHA256 并比对 X-Signature;验签失败应拒绝(返回 401)并告警,切勿处理。
  • 快速返回 200、业务异步化:DCS 要求 2 秒内返回。收到后建议先存储(带 webhookId)并立即回 200,再异步处理业务,避免拖过超时触发不必要的重试。
  • 基于 webhookId 幂等去重:通知可能因重试被多次投递。请存储已处理的 webhookId,处理前先查重。
  • 注意时序:Webhook 可能因网络抖动或重试而乱序到达。如需按事件真实发生顺序处理,请以 eventTimestamp(事件落表时间,见第 1.5 节)而非接收时间排序,必要时设置一个短缓冲窗口(如 30 秒)再批量处理。
  • 忽略您不关心的 type:对不关心的事件类型,直接返回 200 忽略即可,不要返回错误码(错误码会触发重试)。
  • WebSocket 提前轮换频道:频道仅存活 24 小时且新频道生成后旧频道停推,请在过期前重新 get-channel 并平滑切换。
  • version 补查:WebSocket 连接因网络抖动可能漏收,定期对账后用 GET /websocket/v1/search?version= 回溯补齐。
  • 两条通道按需取舍:对接收稳定性优先选 Webhook;对实时性/前端感知/回溯能力有要求可加用 WebSocket,二者事件语义一致。
  • 不会通过实时通道下发敏感卡数据:通知中卡号仅为后 4 位(脱敏),不含完整 PAN / CVV;获取卡敏感信息请走 action=CARD_INFO 托管引导页(见 查看加密卡信息)。

下一步 / 相关

  • 鉴权指南:WebSocket 两个 REST 接口与全站其余 REST 接口一致,按本指南携带签名头。
  • 卡管理CARD_STATUS 卡状态定义。
  • 交易生命周期:理解 CARD_TRANSACTIONCARD_TRANSACTION_SETTLEMENT 的授权/清算两段式。