Z Zise Developers English

kyc.quick.compensated

一份快捷 KYC 绑定已失败补偿,不再是当前有效绑定

何时发

两种情形共用这一条:后台人工确认失败补偿,或首次上游申请终态失败后自动补偿。 收到它时,这份快捷绑定已经从“当前有效”变为已补偿:资料费已退回、该绑定不再参与后续开卡, 关联资料会回池等待后续重新分配。 data.id 是快捷 KYC 绑定 id,可继续作为你侧审计键保存;要看该会员当前仍有哪些有效快捷绑定, 请回查 GET /v1/kyc/quick(带 x-on-behalf-of)。这条回查只返回当前仍有效的绑定, 所以这条事件对应的 id 通常不会再出现在列表里。 compensation_source 表示补偿来源:admin 为后台人工确认,auto 为首次上游终态失败自动补偿。 application_id 仅在这次补偿关联到一笔开卡申请时返回,值是公开申请单号(带 cap_), 方便你直接关联原申请。

这条事件不由任何 API 调用发起

快捷 KYC 失败补偿由我方后台手动触发,或在首次上游申请终态失败后自动触发;两条路径都不是商户 OpenAPI 端点直接发起。

事件体

{
  "event_id": "evt_ad41781d3e763829951e2ce3ebf9ea46",
  "event_type": "kyc.quick.compensated",
  "created_at": "2026-09-30T16:21:00.157Z",
  "merchant_id": "acme",
  "livemode": true,
  "data": {
    "object": "quick_kyc_binding",
    "id": "bcce5b6a-e48b-4527-9738-a12957084f92",
    "external_member_id": "u_88123",
    "status": "compensated",
    "status_version": 1790785259185,
    "compensation_source": "admin",
    "application_id": "cap_e27e3409-4abb-4b52-8c45-9bc5729cf17f"
  }
}

事件体字段

字段类型说明
idstring去重用这个。evt_…,同一事件重投时不变。
typestring固定为 kyc.quick.compensated
created_atstring事件产生时刻(RFC3339)。不是投递时刻 —— 重投时它不变。
data.objectstring对象类型,决定 data.id 该拿去查哪个端点
data.idstring对象 ID,拿它回查详情
data.statusstring认不出的值按未知处理并告警,不要 fallback 成「处理中」
data.status_versionnumber单调递增,用它把慢到的旧状态丢掉

验签与去重

验签用原始请求体字节,不要先解析再重新序列化 —— 你的 JSON 库与我方的键顺序、空格几乎一定不同,重新序列化出来的签名一定对不上, 而那个错误长得像「密钥配错了」。

// Node · 放在解析 JSON 之前
const raw = await readRawBody(req);            // Buffer / string,别用已解析的 req.body
const expect = crypto.createHmac("sha256", WEBHOOK_SECRET).update(raw).digest("hex");
const got = req.headers["z-signature"];        // 形如 t=<unix>,v1=<hex>
if (!timingSafeEqual(expect, parseV1(got))) return res.status(400).end();

// 去重:用信封的 id,不是 data.id
if (await seen(JSON.parse(raw).id)) return res.status(200).end();

完整做法(含时间戳容差与重投语义)见 Webhook 指南。