Webhook 验证
商户必须验证 Webhook 签名,避免伪造请求修改业务状态。
验签输入
需要使用:
- 原始请求体
raw_body - Webhook secret
- 请求头
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),
);
}
注意事项
- 必须使用原始请求体,不要用重新序列化后的 JSON
- 比较签名时使用 timing-safe 比较
- 验签失败应拒绝处理业务
- 即使验签成功,也要做幂等
- 不要在日志中打印 webhook secret
payout.verify.request 响应
如果事件是 payout.verify.request,商户需要返回明确决策:
通过:
{
"verified": true
}
拒绝:
{
"verified": false
}
响应不清晰时,Beyounger 会把该次验证视为可重试。