各平台的 Webhook 行为

你的端点变慢或宕机时,每个发送方会怎么做,以及它如何为发出的内容签名。这里的每条结论都有出处,找不到出处的字段一律留空,不拿一个看似合理的数字来填。

签名列

用每个平台各自的可运行验证器核对,并由测试套件证明。规范读错了,测试就会失败,错误不会上线。

最近核对:2026-08-20

投递列

取自各平台的官方文档,而不是二手文章。每一行都附有出处链接。

最近核对:2026-08-06

投递行为

先看响应时限这一列。真正约束你的,是你接收的发送方里时限最紧的那个,而不是你最熟悉的那个。

平台响应时限重试放弃/停用
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,就说明不能只对请求体做哈希。

平台算法待签名串编码请求头时间容差
SlackHMAC-SHA256v0:{timestamp}:{body}hexx-slack-signature = v0=hex5 分钟
LINEHMAC-SHA256raw bodybase64x-line-signature = base64无
XeroHMAC-SHA256raw bodybase64x-xero-signature = base64无
DiscordEd25519{timestamp}{body}hexx-signature-ed25519 + x-signature-timestamp无
ShopifyHMAC-SHA256raw bodybase64x-shopify-hmac-sha256无
PaddleHMAC-SHA256{timestamp}:{body}hexpaddle-signature = ts=X;h1=hex5 秒
HubSpotHMAC-SHA256POST{decodedUrl}{body}{timestamp}base64x-hubspot-signature-v35 分钟
GitHubHMAC-SHA256raw bodyhexx-hub-signature-256 = sha256=hex无
Meta (Instagram, Facebook, Threads)HMAC-SHA256raw bodyhexx-hub-signature-256 = sha256=hex无
TwilioHMAC-SHA1full URL + form params sorted by keybase64x-twilio-signature无
StripeHMAC-SHA256{timestamp}.{body}hexstripe-signature = t=X,v1=hex5 分钟
Svix (Clerk, Resend)HMAC-SHA256{id}.{timestamp}.{body}base64svix-signature = v1,base645 分钟
WooCommerceHMAC-SHA256raw bodybase64x-wc-webhook-signature无
Lemon SqueezyHMAC-SHA256raw bodyhexx-signature + x-event-name无
PayPalRSA-SHA256{txId}|{txTime}|{webhookId}|{crc32(body)}base64paypal-transmission-sig + 4 more无
SendGridECDSA P-256{timestamp}{body}base64x-twilio-email-event-webhook-signature无
LinearHMAC-SHA256raw bodyhexlinear-signature无
SentryHMAC-SHA256raw body, no timestamphexsentry-hook-signature无
IntercomHMAC-SHA1raw bodyhexx-hub-signature = sha1=hex无
VercelHMAC-SHA1raw bodyhexx-vercel-signature无

使用这些数据

同一张表以 JSON 格式发布在 /providers.json,采用 CC BY 4.0 许可。你可以复制、嵌入,也可以纠错。如果这里有数字错了,或者某个平台改了行为,在代码仓库提一个 issue,这里就会修正。

署名:AnyHook,Webhook 平台行为参考,https://anyhook.net/zh-cn/providers

这些数字出现在哪些文章里