投递行为
先看响应时限这一列。真正约束你的,是你接收的发送方里时限最紧的那个,而不是你最熟悉的那个。
| 平台 | 响应时限 | 重试 | 放弃/停用 |
|---|---|---|---|
| Slack出处 | 3 秒 | 重试 3 次:立即、1 分钟后、5 分钟后 | 60 分钟内超过 95% 的投递尝试失败时,事件订阅会被停用 |
| LINE出处 | 2 秒 机器人服务器 2 秒内没有应答,即计为 request_timeout | Webhook 重新投递,默认关闭(在频道的 Messaging API 设置中开启);次数和间隔未公开 | 机器人服务器持续无法接收时,可能暂停发送 Webhook;阈值未公开 |
| Xero出处 | 5 秒 5 秒内返回 200,不带响应体,也不带 Cookie;签名错误时返回 401 | 未核实 | 未核实 |
| Discord出处 | 3 秒 交互端点必须在 3 秒内发出初始响应 | 未核实 | 未核实 |
| Shopify出处 | 5 秒 建立连接限时 1 秒,整个请求限时 5 秒 | 4 小时内重试 8 次 | 通过 Admin API 创建的订阅在连续失败 8 次后会被删除,同时向该应用的紧急开发者联系人发送警告邮件 |
| Paddle出处 | 5 秒 | 生产环境:约 2 天内最多尝试 60 次,第一个小时内约 10 次,第一天内约 45 次。沙盒:约 2 分钟内尝试 3 次 | 未核实 |
| HubSpot出处 | 5 秒 时限按整批计算,一批最多包含 100 条通知 | 最多尝试 10 次,分布在 24 小时内 | 未核实 |
| GitHub出处 | 10 秒 | 无。GitHub 不会自动重新传递投递失败的 Webhook | 不会停用。投递在 3 天内都可以手动重新传递,之后记录不再保留 |
| Meta (Instagram, Facebook, Threads)出处 | 未公布 | 36 小时内以逐渐降低的频率重试,之后丢弃。WhatsApp Cloud API 最多重试 7 天 | 未核实 |
| Twilio出处 | 15 秒 可配置。rt 读取超时默认 15000 毫秒(最大 15000),ct 连接超时默认 5000 毫秒(最大 10000),tt 总超时默认 15000 毫秒 | 可配置:rc 取 0 到 5,默认 1。rp 指定哪些失败可以重试 | 未核实 |
| Stripe出处 | 未公布 Stripe 没有公布具体数值。它的文档只说要在任何耗时逻辑之前返回 2xx。20 秒是社区通用的经验值 | 生产环境下按指数退避重试,最长 3 天。沙盒:几个小时内尝试 3 次 | 持续失败后端点会被停用,停用前会先发邮件。事件在 Events API 中保留 30 天 |
| Svix (Clerk, Resend)出处 | 未公布 | 8 次尝试:立即、5 秒、5 分钟、30 分钟、2 小时、5 小时、10 小时、10 小时。之后发送一条 message.attempt.exhausted 运维 Webhook | 所有尝试连续失败 5 天后,端点会被停用 |
| WooCommerce出处 | 未公布 投递先进入 Action Scheduler 队列,由 WP-Cron 驱动,所以要等下一次有页面加载时才发出,而不是在事件发生时发出 | 未核实 | 连续投递失败超过五次后,Webhook 会被停用 |
有两行值得多看一遍。GitHub 完全不重试,所以一次失败的投递,除非有人在三天内手动重新传递,否则就丢了。Paddle 把 60 次尝试中的约 10 次放在第一个小时、约 45 次放在第一天,对一个只是慢了些的处理程序,惩罚远比 Stripe 的曲线重。
签名方案
最耗人时间的是“待签名串”这一列。只要不是 raw body,就说明不能只对请求体做哈希。
| 平台 | 算法 | 待签名串 | 编码 | 请求头 | 时间容差 |
|---|---|---|---|---|---|
| Slack | HMAC-SHA256 | v0:{timestamp}:{body} | hex | x-slack-signature = v0=hex | 5 分钟 |
| LINE | HMAC-SHA256 | raw body | base64 | x-line-signature = base64 | 无 |
| Xero | HMAC-SHA256 | raw body | base64 | x-xero-signature = base64 | 无 |
| Discord | Ed25519 | {timestamp}{body} | hex | x-signature-ed25519 + x-signature-timestamp | 无 |
| Shopify | HMAC-SHA256 | raw body | base64 | x-shopify-hmac-sha256 | 无 |
| Paddle | HMAC-SHA256 | {timestamp}:{body} | hex | paddle-signature = ts=X;h1=hex | 5 秒 |
| HubSpot | HMAC-SHA256 | POST{decodedUrl}{body}{timestamp} | base64 | x-hubspot-signature-v3 | 5 分钟 |
| GitHub | HMAC-SHA256 | raw body | hex | x-hub-signature-256 = sha256=hex | 无 |
| Meta (Instagram, Facebook, Threads) | HMAC-SHA256 | raw body | hex | x-hub-signature-256 = sha256=hex | 无 |
| Twilio | HMAC-SHA1 | full URL + form params sorted by key | base64 | x-twilio-signature | 无 |
| Stripe | HMAC-SHA256 | {timestamp}.{body} | hex | stripe-signature = t=X,v1=hex | 5 分钟 |
| Svix (Clerk, Resend) | HMAC-SHA256 | {id}.{timestamp}.{body} | base64 | svix-signature = v1,base64 | 5 分钟 |
| WooCommerce | HMAC-SHA256 | raw body | base64 | x-wc-webhook-signature | 无 |
| Lemon Squeezy | HMAC-SHA256 | raw body | hex | x-signature + x-event-name | 无 |
| PayPal | RSA-SHA256 | {txId}|{txTime}|{webhookId}|{crc32(body)} | base64 | paypal-transmission-sig + 4 more | 无 |
| SendGrid | ECDSA P-256 | {timestamp}{body} | base64 | x-twilio-email-event-webhook-signature | 无 |
| Linear | HMAC-SHA256 | raw body | hex | linear-signature | 无 |
| Sentry | HMAC-SHA256 | raw body, no timestamp | hex | sentry-hook-signature | 无 |
| Intercom | HMAC-SHA1 | raw body | hex | x-hub-signature = sha1=hex | 无 |
| Vercel | HMAC-SHA1 | raw body | hex | x-vercel-signature | 无 |
使用这些数据
同一张表以 JSON 格式发布在 /providers.json,采用 CC BY 4.0 许可。你可以复制、嵌入,也可以纠错。如果这里有数字错了,或者某个平台改了行为,在代码仓库提一个 issue,这里就会修正。
署名:AnyHook,Webhook 平台行为参考,https://anyhook.net/zh-cn/providers