用途:帮助开发者搭建 SparkPost 事件 Webhook 的接收端,并正确完成认证、解析与幂等处理。
主要能力与要点:
- 认证:SparkPost 事件 Webhook 不签名,没有 HMAC 或签名头,不要计算 HMAC。认证按 webhook 的 auth_type 字段配置,取值仅有 none、basic、oauth2,默认 none。Basic 方式发送 Authorization: Basic base64(username:password);OAuth 2.0 客户端凭证发送 Authorization: Bearer {token};旧版 auth_token 对应 X-MessageSystems-Webhook-Token,已废弃。处理器须失败关闭:未配置凭证就拒绝,不能静默接受未认证批次。
- 载荷:POST 体为 JSON 数组,每个元素是单个 msys 键包裹的事件对象,含 type 字段。msys 下可能是 message_event、track_event、gen_event、unsubscribe_event、relay_event、ab_test_event、ingest_event 等,应按实际键取值后按 type 分支,不要硬编码 message_event。多数标量字段为字符串,如 timestamp、num_retries、bounce_class。event_id 格式不一致,当作不透明字符串。
- 验证批次:创建或修改目标 URL 时 SparkPost 会发送 [{ "msys": {} }],即空 msys 对象,处理器必须接受并返回 200。
- 交付与幂等:必须返回 200,非 2xx 会重试;单次超时 10 秒,重试按对数增长并在 8 小时后停止(共 12 次尝试)。批次大小约 1 至 350 条以上,可混合事件类型。建议先存原始批次再异步处理,并按 X-MessageSystems-Batch-ID 和 event_id 去重,重复批次仍返回 200。
- Relay Webhook(入站邮件)是独立 API,提供 msys.relay_message,auth_type 仅 none|oauth2,无 Basic。
本地开发:可用 npx hookdeck-cli listen 3000 sparkpost --path /webhooks/sparkpost 建立隧道(SparkPost 仅接受 80/443 端口目标)。Hookdeck 的 SparkPost 源仅支持 Basic Auth。
限制:无 SDK 验证辅助函数;HTTPS 建议使用,mTLS 将于 2026 年 5 月 18 日起弃用;IP 白名单应使用主机名 wh.egress.sparkpost.com,勿硬编码 IP。示例与参考文档见该技能的 overview.md、setup.md、verification.md 及 examples 目录。