用途:创建安全的 Webhook 接收端点,处理来自 Stripe、GitHub、Twilio、Slack 等提供方的事件,包含 HMAC 签名验证、幂等事件处理与自动重试。
前置条件:具备原始请求体访问能力的 Web 框架(如 Express 的 express.raw()、FastAPI 的 Request.body());提供方的签名密钥或共享密钥;用于幂等追踪的持久化存储(Redis 或数据库表);可选异步处理队列(Bull、Celery、SQS);本地开发可用 ngrok 等隧道。
主要步骤:用 Grep 与 Read 检查现有路由和中间件,确定集成位置;创建专用 Webhook 路由(如 POST /webhooks/:provider),在 JSON 解析中间件前捕获原始请求体;通过计算 HMAC(raw_body, signing_secret) 并与提供方签名头(X-Hub-Signature-256、Stripe-Signature、X-Twilio-Signature)比对来实现 HMAC-SHA256 验证;通过存储已处理事件 ID(如 evt_xxx)实现幂等,重复事件返回 200 OK 阻止重试;从载荷解析事件类型(event.type、action、EventType)并用分发表路由到对应处理器;立即返回 200 OK 后将载荷入队异步处理,避免超时;对超过最大重试次数仍失败的事件做死信处理并记录完整载荷;编写回放测试,用有效与篡改签名验证接受与拒绝行为。
输出包括:src/webhooks/receiver.js 端点、handlers/ 各事件处理器、verify.js 签名验证工具、idempotency.js 去重逻辑、src/queues/webhook-processor.js 异步队列工作器、tests/webhooks/ 回放测试。
错误处理:401 签名不匹配时记录预期与实际签名(脱敏)并检查密钥轮换;400 载荷格式错误时记录原始体;重复事件返回 200 防止重试循环;504 超时改为异步队列并即时响应;500 处理器异常在分发层捕获并记录完整错误。
示例:Stripe 支付 Webhook 用 stripe.webhooks.constructEvent() 验证 Stripe-Signature 后分发 payment_intent.succeeded 与 charge.refunded;GitHub push Webhook 验证 X-Hub-Signature-256 后触发 CI/CD;多提供方路由器通过注册表加载对应验证器与事件模式。
限制与说明:具体实现细节见引用文档;完整代码示例、收费与价格信息暂未提供。