- Webhook:推送式。您提供一个 HTTPS 回调地址,DCS 在事件发生时把签名后的 JSON 推送到该地址。适合服务端到服务端的稳定接收。
- WebSocket:订阅式(DeCard 托管特色)。您先获取一个专属私有频道,连上
wss长连接实时收消息;漏收时还能按version回溯历史。适合需要前端/网关实时感知、或对补偿回溯有要求的场景。
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 推送时序与重试
1.4 安全:X-Signature 验签
为确保通信安全,DCS 在每个 Webhook 请求头中携带 X-Signature。该签名由 HmacSHA256 算法生成:DCS 用您的 SecretKey 对原始消息体(raw body)计算签名。您收到后需用同一 SecretKey 对原始 body 复算,并与 X-Signature 比对,验证请求的真实性与完整性。
请求头(Headers)
签名计算参考(Java)
接收端参考(Java,含 7 步处理约定)
1.5 Webhook 公共结构
Webhook 通知示例(资产变动,脱敏):
2. WebSocket(订阅式,★ DeCard 托管特色)
WebSocket 通道是 DeCard 托管独有能力——您可订阅一个专属私有频道实时收消息,并按 version 回溯漏收。
WebSocket 实时推送用于同步用户相关数据变化,覆盖 KYC 状态、资产变动、卡交易、订单状态等关键信息,提升您对用户操作的响应效率。
2.1 前置条件与三步接入
- 创建监听频道:调
GET /websocket/v1/get-channel为机构生成专属私有频道(频道串即接收消息的唯一标识,例如HBHmMK99SJEVMVUqCb4)。 - 连接
wss长连接:把频道串拼到wss地址的{channel}处,按环境选择主网/测试网(见 第 2.3 节),建立连接并监听消息。 - 频道轮换 + 漏收回溯:每个频道存活 24 小时,过期失效;为避免消息丢失,请在过期前重新调
get-channel取新频道。建议在频道到期前 1 小时重新调用get-channel获取新频道,确保新旧频道有足够的重叠窗口完成切换。漏收或需回溯时,用GET /websocket/v1/search按version查历史消息。
2.2 频道生命周期
2.3 WebSocket 环境地址
{channel}用get-channel返回的频道串替换。
2.4 WebSocket 公共结构
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 / eventTimestamp(Long),WebSocket 用 timestamp + version(string),且 data 内字段类型如前述(Webhook BigDecimal/Long ↔ WebSocket string)。
术语说明:CARD_APPLY的最终状态SUCCEED是卡申请状态(枚举为SUCCEED而非SUCCESS),与卡订单和卡片的状态定义不同,请勿混淆。CARD_STATUS的NORMAL/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托管引导页(见 查看加密卡信息)。

