Hành vi webhook theo nhà cung cấp

Mỗi bên gửi làm gì khi endpoint của bạn chậm hoặc ngừng hoạt động, và ký những gì nó gửi ra sao. Mọi thông tin ở đây đều có nguồn; ô nào chúng tôi không tìm được nguồn thì để trống, không điền một con số nghe có vẻ hợp lý.

Các cột chữ ký

Kiểm chứng bằng bộ xác minh chạy thật cho từng nhà cung cấp, có bộ test chứng minh. Đọc sai spec thì test fail, chứ không lọt lên production.

kiểm tra lần cuối 2026-08-20

Các cột hành vi gửi

Lấy từ tài liệu của chính từng hãng, không qua bài viết thứ cấp. Mỗi dòng có link nguồn.

kiểm tra lần cuối 2026-08-06

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ấpThời hạn phản hồiThử lạiNgừng gửi / vô hiệu hóa
Slacknguồn3 giây3 lần thử lại: ngay lập tức, sau 1 phút, sau 5 phútEvent 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ồn2 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ầnCó 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ồn5 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ứngchưa kiểm chứng
Discordnguồn3 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ứngchưa kiểm chứng
Shopifynguồn5 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ồn5 giâyLive: 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útchưa kiểm chứng
HubSpotnguồn5 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ồn10 giâyKhông có. GitHub không tự thử lại các lượt gửi thất bạiKhô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ồnkhô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àychưa kiểm chứng
Twilionguồn15 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ạichưa kiểm chứng
Stripenguồnkhô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ồnkhô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.exhaustedEndpoint bị vô hiệu hóa khi mọi lần gửi đều thất bại trong 5 ngày
WooCommercenguồnkhô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ứngWebhook 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ấpThuật toánPayload được kýEncodingHeaderDung sai
SlackHMAC-SHA256v0:{timestamp}:{body}hexx-slack-signature = v0=hex5 phút
LINEHMAC-SHA256raw bodybase64x-line-signature = base64không có
XeroHMAC-SHA256raw bodybase64x-xero-signature = base64không có
DiscordEd25519{timestamp}{body}hexx-signature-ed25519 + x-signature-timestampkhông có
ShopifyHMAC-SHA256raw bodybase64x-shopify-hmac-sha256không có
PaddleHMAC-SHA256{timestamp}:{body}hexpaddle-signature = ts=X;h1=hex5 giây
HubSpotHMAC-SHA256POST{decodedUrl}{body}{timestamp}base64x-hubspot-signature-v35 phút
GitHubHMAC-SHA256raw bodyhexx-hub-signature-256 = sha256=hexkhông có
Meta (Instagram, Facebook, Threads)HMAC-SHA256raw bodyhexx-hub-signature-256 = sha256=hexkhông có
TwilioHMAC-SHA1full URL + form params sorted by keybase64x-twilio-signaturekhông có
StripeHMAC-SHA256{timestamp}.{body}hexstripe-signature = t=X,v1=hex5 phút
Svix (Clerk, Resend)HMAC-SHA256{id}.{timestamp}.{body}base64svix-signature = v1,base645 phút
WooCommerceHMAC-SHA256raw bodybase64x-wc-webhook-signaturekhông có
Lemon SqueezyHMAC-SHA256raw bodyhexx-signature + x-event-namekhông có
PayPalRSA-SHA256{txId}|{txTime}|{webhookId}|{crc32(body)}base64paypal-transmission-sig + 4 morekhông có
SendGridECDSA P-256{timestamp}{body}base64x-twilio-email-event-webhook-signaturekhông có
LinearHMAC-SHA256raw bodyhexlinear-signaturekhông có
SentryHMAC-SHA256raw body, no timestamphexsentry-hook-signaturekhông có
IntercomHMAC-SHA1raw bodyhexx-hub-signature = sha1=hexkhông có
VercelHMAC-SHA1raw bodyhexx-vercel-signaturekhô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