Hành vi gửi
Lấy từ tài liệu của chính hãng, kiểm tra lần cuối 2026-08-06. Hãng không nêu con số nào thì bảng này cũng không ghi.
| Thời hạn phản hồi | 3 giây |
|---|---|
| Thử lại | 3 lần thử lại: ngay lập tức, sau 1 phút, sau 5 phút |
| Ngừng gửi | 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 |
| Nguồn | https://docs.slack.dev/apis/events-api/ |
Chữ ký
Kiểm chứng bằng một bộ xác minh chạy thật, có bộ test chứng minh, chứ không đọc từ tài liệu. Kiểm chứng lần cuối 2026-08-20.
| Thuật toán | HMAC-SHA256 |
|---|---|
| Payload được ký | v0:{timestamp}:{body} |
| Encoding | hex |
| Header | x-slack-signature = v0=hex |
| Dung sai | 5 phút |
Xác minh
Dùng raw body của request, đúng từng byte, trước mọi bước parse JSON. Mọi cơ chế trên trang này đều hỏng ngay khi framework serialize lại payload.
const crypto = require("node:crypto");
const ts = req.headers["x-slack-request-timestamp"];
if (Math.abs(Date.now() / 1000 - Number(ts)) > 300) throw new Error("stale");
const expected =
"v0=" +
crypto
.createHmac("sha256", signingSecret) // Slack App → Basic Information
.update(`v0:${ts}:${rawBody}`)
.digest("hex");
const received = Buffer.from(req.headers["x-slack-signature"] ?? "");
const wanted = Buffer.from(expected);
// timingSafeEqual throws on a length mismatch, so check that first.
const valid =
received.length === wanted.length && crypto.timingSafeEqual(received, wanted);Những chỗ dễ vấp
Ba giây là thời hạn phản hồi ngắn nhất trong các bên gửi lớn, và cả ba lần thử lại đều rơi vào trong năm phút. Một handler chỉ chậm chứ không ngừng hoạt động sẽ thất bại cả bốn lần gửi trong cùng một sự cố.
Quy tắc vô hiệu hóa dựa trên tỷ lệ, không phải số lần: hơn 95% lần gửi thất bại trong 60 phút là Event Subscriptions bị tắt cho cả app, và người dùng của bạn thấy bot im bặt trong kênh ngay lúc đó.
Đọc thêm
AnyHook đứng trước các endpoint nhận webhook từ Slack: trả lời sau khoảng 1 giây, tự thử lại theo lịch riêng khi server của bạn ngừng hoạt động, và giữ mọi sự kiện để bạn phát lại được. Đổi một URL, giữ nguyên code; để nhận được các lần thử lại và phát lại, bạn xác minh AnyHook-Signature, vì chữ ký riêng của Slack hết hạn sau 5 phút.