Hành vi gửi
Đọc cột thời hạn phản hồi trước. Ràng buộc thật của bạn là bên gửi khắt khe nhất mà bạn nhận webhook, không phải bên quen thuộc nhất.
| Nhà cung cấp | Thời hạn phản hồi | Thử lại | Ngừng gửi / vô hiệu hóa |
|---|---|---|---|
| Slacknguồn | 3 giây | 3 lần thử lại: ngay lập tức, sau 1 phút, sau 5 phút | Event Subscriptions bị vô hiệu hóa nếu hơn 95% số lần gửi thất bại trong 60 phút |
| LINEnguồn | 2 giây Bị tính là request_timeout khi server của bot không phản hồi trong vòng 2 giây | Webhook redelivery, mặc định tắt (bật trong phần cài đặt Messaging API của kênh); không công bố số lần và khoảng cách giữa các lần | Có thể tạm ngừng gửi webhook nếu server của bot liên tục không nhận được; không công bố ngưỡng |
| Xeronguồn | 5 giây Trả về 200 trong vòng 5 giây, không kèm body hay cookie; trả về 401 khi chữ ký sai | chưa kiểm chứng | chưa kiểm chứng |
| Discordnguồn | 3 giây Endpoint nhận interaction phải gửi phản hồi đầu tiên trong vòng 3 giây | chưa kiểm chứng | chưa kiểm chứng |
| Shopifynguồn | 5 giây 1 giây để kết nối, 5 giây cho toàn bộ request | 8 lần thử lại trong 4 giờ | Subscription tạo qua Admin API bị xóa sau 8 lần thất bại liên tiếp, kèm email cảnh báo gửi tới liên hệ developer khẩn cấp của app |
| Paddlenguồn | 5 giây | Live: tối đa 60 lần gửi trong khoảng 2 ngày, khoảng 10 lần trong giờ đầu và khoảng 45 lần trong ngày đầu. Sandbox: 3 lần gửi trong khoảng 2 phút | chưa kiểm chứng |
| HubSpotnguồn | 5 giây Áp dụng cho cả batch, mỗi batch chứa tối đa 100 thông báo | Tối đa 10 lần gửi, rải trong 24 giờ | chưa kiểm chứng |
| GitHubnguồn | 10 giây | Không có. GitHub không tự thử lại các lượt gửi thất bại | Không vô hiệu hóa. Bạn có thể gửi lại thủ công các lượt gửi trong 3 ngày, sau đó bản ghi không còn nữa |
| Meta (Instagram, Facebook, Threads)nguồn | không công bố | Thử lại với tần suất giảm dần trong 36 giờ, sau đó bị bỏ. WhatsApp Cloud API thử lại trong tối đa 7 ngày | chưa kiểm chứng |
| Twilionguồn | 15 giây Có thể cấu hình. rt (timeout đọc) mặc định 15000 ms (tối đa 15000), ct (kết nối) mặc định 5000 ms (tối đa 10000), tt (tổng) mặc định 15000 ms | Có thể cấu hình: rc từ 0 đến 5, mặc định 1. rp chọn những lỗi nào được thử lại | chưa kiểm chứng |
| Stripenguồn | không công bố Stripe không công bố con số nào. Tài liệu chỉ nói phải trả về 2xx trước mọi logic chậm. 20 giây là con số cộng đồng thường dùng | Exponential backoff trong tối đa 3 ngày ở live mode. Sandbox: 3 lần gửi trong vài giờ | Endpoint bị vô hiệu hóa nếu tiếp tục thất bại, có email báo trước. Sự kiện vẫn nằm trong Events API trong 30 ngày |
| Svix (Clerk, Resend)nguồn | không công bố | 8 lần gửi: ngay lập tức, 5 giây, 5 phút, 30 phút, 2 giờ, 5 giờ, 10 giờ, 10 giờ. Sau đó là operational webhook message.attempt.exhausted | Endpoint bị vô hiệu hóa khi mọi lần gửi đều thất bại trong 5 ngày |
| WooCommercenguồn | không công bố Lượt gửi được đưa vào hàng đợi của Action Scheduler và do WP-Cron kích hoạt, nên chỉ đi khi có trang được tải tiếp theo, không phải lúc sự kiện xảy ra | chưa kiểm chứng | Webhook bị vô hiệu hóa sau hơn năm lần gửi thất bại liên tiếp |
Có hai dòng đáng đọc kỹ. GitHub hoàn toàn không thử lại, nên một lượt gửi thất bại sẽ mất luôn nếu không ai gửi lại nó trong vòng ba ngày. Paddle dồn khoảng 10 trong 60 lần gửi vào giờ đầu tiên và khoảng 45 lần vào ngày đầu, nên một handler chỉ chậm thôi cũng bị dồn dập hơn hẳn so với đường cong của Stripe.
Cơ chế chữ ký
Cột payload được ký là cột khiến nhiều người mất hàng giờ. Bất cứ giá trị nào khác raw body đều có nghĩa là bạn không thể chỉ băm riêng body của request.
| Nhà cung cấp | Thuật toán | Payload được ký | Encoding | Header | Dung sai |
|---|---|---|---|---|---|
| Slack | HMAC-SHA256 | v0:{timestamp}:{body} | hex | x-slack-signature = v0=hex | 5 phút |
| LINE | HMAC-SHA256 | raw body | base64 | x-line-signature = base64 | không có |
| Xero | HMAC-SHA256 | raw body | base64 | x-xero-signature = base64 | không có |
| Discord | Ed25519 | {timestamp}{body} | hex | x-signature-ed25519 + x-signature-timestamp | không có |
| Shopify | HMAC-SHA256 | raw body | base64 | x-shopify-hmac-sha256 | không có |
| Paddle | HMAC-SHA256 | {timestamp}:{body} | hex | paddle-signature = ts=X;h1=hex | 5 giây |
| HubSpot | HMAC-SHA256 | POST{decodedUrl}{body}{timestamp} | base64 | x-hubspot-signature-v3 | 5 phút |
| GitHub | HMAC-SHA256 | raw body | hex | x-hub-signature-256 = sha256=hex | không có |
| Meta (Instagram, Facebook, Threads) | HMAC-SHA256 | raw body | hex | x-hub-signature-256 = sha256=hex | không có |
| Twilio | HMAC-SHA1 | full URL + form params sorted by key | base64 | x-twilio-signature | không có |
| Stripe | HMAC-SHA256 | {timestamp}.{body} | hex | stripe-signature = t=X,v1=hex | 5 phút |
| Svix (Clerk, Resend) | HMAC-SHA256 | {id}.{timestamp}.{body} | base64 | svix-signature = v1,base64 | 5 phút |
| WooCommerce | HMAC-SHA256 | raw body | base64 | x-wc-webhook-signature | không có |
| Lemon Squeezy | HMAC-SHA256 | raw body | hex | x-signature + x-event-name | không có |
| PayPal | RSA-SHA256 | {txId}|{txTime}|{webhookId}|{crc32(body)} | base64 | paypal-transmission-sig + 4 more | không có |
| SendGrid | ECDSA P-256 | {timestamp}{body} | base64 | x-twilio-email-event-webhook-signature | không có |
| Linear | HMAC-SHA256 | raw body | hex | linear-signature | không có |
| Sentry | HMAC-SHA256 | raw body, no timestamp | hex | sentry-hook-signature | không có |
| Intercom | HMAC-SHA1 | raw body | hex | x-hub-signature = sha1=hex | không có |
| Vercel | HMAC-SHA1 | raw body | hex | x-vercel-signature | không có |
Dùng dữ liệu này
Bảng này cũng có dạng JSON tại /providers.json, theo giấy phép CC BY 4.0. Bạn cứ sao chép, nhúng hay sửa. Nếu một con số ở đây sai hoặc một hãng đã thay đổi gì đó, bạn mở issue trên repo và nó sẽ được sửa ở đây.
Ghi nguồn: AnyHook, Tra cứu hành vi webhook theo nhà cung cấp, https://anyhook.net/vi/providers
Từng con số được bàn ở đâu
- GitHub không thử lại, và bản ghi hết hạn sau ba ngày
- Ba giây của Slack, và ngưỡng vô hiệu hóa 95%
- 60 lần gửi của Paddle so với đường cong của Stripe
- Timeout tùy chỉnh được của Twilio, và vì sao lần thử lại mặc định không bao giờ chạy
- Tài liệu của HubSpot ghi rõ eventId không được đảm bảo là duy nhất
- Xác minh chữ ký theo từng nhà cung cấp