支付回调验签

平台向产品站推送 order.paid 事件;用 HMAC-SHA256 验签并做幂等。

订单支付成功后,平台向你在站点配置的 Webhook URL 推送 order.paid 事件(带重试)。请务必验签 + 幂等。

请求头说明
X-Rekit-Event-Id事件唯一 ID(幂等键)
X-Rekit-Event-Typeorder.paid
X-Rekit-Timestamp秒级时间戳
X-Rekit-Signaturesha256=<hex>:HMAC-SHA256 十六进制签名;验签须先剥掉 sha256= 前缀

验签

签名 = HMAC_SHA256(secret, "<timestamp>.<raw_body>") 的 hex,secret 为站点 Webhook 密钥。X-Rekit-Signature 的值为 sha256=<hex>——验签须先剥掉 sha256= 前缀,再与本地计算的 hex 比对。用原始请求体参与计算,勿先反序列化再拼回。

typescript
import crypto from 'crypto';

function verify(rawBody: string, ts: string, signature: string, secret: string) {
  const sig = signature.replace(/^sha256=/, ''); // 先剥掉 sha256= 前缀
  const expected = crypto
    .createHmac('sha256', secret)
    .update(`${ts}.${rawBody}`)
    .digest('hex');
  return sig.length === expected.length &&
    crypto.timingSafeEqual(Buffer.from(sig), Buffer.from(expected));
}

重试与联调: 非 2xx / 超时按退避梯度重投(30s→2m→10m→30m→2h→6h→12h,最多 8 次),仍失败置 failed(后台可手动重发)。后台站点详情「发送测试事件」会推一条 type:"ping" 事件,用来验证地址连通 + 验签逻辑。

幂等
X-Rekit-Event-Id 去重:同一事件可能被重试多次,处理过就直接返回 200。校验通过后回 2xx,否则平台会按退避重投。