跳到主要内容

Webhook 验证

商户必须验证 Webhook 签名,避免伪造请求修改业务状态。

验签输入

需要使用:

  1. 原始请求体 raw_body
  2. Webhook secret
  3. 请求头 X-Beyounger-Signature

签名算法

hex(HMAC_SHA256(raw_body, webhook_secret))

Node.js 示例

import crypto from 'crypto';

export function verifyWebhook(rawBody, signature, secret) {
const expected = crypto
.createHmac('sha256', secret)
.update(rawBody)
.digest('hex');

return crypto.timingSafeEqual(
Buffer.from(expected),
Buffer.from(signature),
);
}

注意事项

  1. 必须使用原始请求体,不要用重新序列化后的 JSON
  2. 比较签名时使用 timing-safe 比较
  3. 验签失败应拒绝处理业务
  4. 即使验签成功,也要做幂等
  5. 不要在日志中打印 webhook secret

payout.verify.request 响应

如果事件是 payout.verify.request,商户需要返回明确决策:

通过:

{
"verified": true
}

拒绝:

{
"verified": false
}

响应不清晰时,Beyounger 会把该次验证视为可重试。