傳遞行為
先看回應時限這一欄。真正限制你的,是你接收的發送端裡時限最緊的那一個,不是最熟悉的那一個。
| 服務商 | 回應時限 | 重試 | 放棄/停用 |
|---|---|---|---|
| Slack出處 | 3 秒 | 重試 3 次:立即、1 分鐘後、5 分鐘後 | 60 分鐘內有超過 95% 的嘗試失敗時,停用 Event Subscriptions |
| LINE出處 | 2 秒 機器人伺服器 2 秒內沒有回應,就記為 request_timeout | Webhook redelivery(Webhook 重新傳送),預設關閉(在頻道的 Messaging API 設定中開啟);次數與間隔未公開 | 機器人伺服器持續無法接收時,可能暫停傳送 Webhook;門檻未公開 |
| Xero出處 | 5 秒 5 秒內回 200,不帶回應主體、不帶 Cookie;簽章錯誤時回 401 | 未驗證 | 未驗證 |
| Discord出處 | 3 秒 Interaction 端點必須在 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 不會自動重新傳送 | 不會停用。3 天內可以手動重新傳送,之後紀錄就會消失 |
| Meta (Instagram, Facebook, Threads)出處 | 未公開 | 36 小時內以遞減的頻率重試,之後丟棄。WhatsApp Cloud API 最多重試 7 天 | 未驗證 |
| Twilio出處 | 15 秒 可設定。rt 讀取逾時預設 15000ms(上限 15000),ct 連線預設 5000ms(上限 10000),tt 總時間預設 15000ms | 可設定: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 的 Operational 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 授權。可以複製、嵌入、更正。如果這裡的數字有錯,或某家服務商改了什麼,到 repo 開一個 issue,這裡就會修正。
姓名標示:AnyHook,「Webhook 服務商行為參考資料」,https://anyhook.net/zh-tw/providers