Cách Twilio gửi webhook

Mọi núm chỉnh timeout và thử lại đều cấu hình được, điều không bên gửi lớn nào khác cho phép. Chữ ký HMAC-SHA1 trên URL và code xác minh Node.

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ồi15 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

Kiểm tra handler của bạn có phản hồi kịp không

Thử lạiCó 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
Ngừng gửihãng không công bố
Nguồnhttps://www.twilio.com/docs/usage/webhooks/webhooks-connection-overrides

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ánHMAC-SHA1
Payload được kýfull URL + form params sorted by key
Encodingbase64
Headerx-twilio-signature
Dung saikhông quy định

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");

// base64(HMAC-SHA1(auth token, url + form params sorted by key, concatenated))
const sorted = Object.keys(req.body).sort();
const base = fullUrl + sorted.map((k) => k + req.body[k]).join("");
const expected = crypto
  .createHmac("sha1", authToken)
  .update(base)
  .digest("base64");
const received = Buffer.from(req.headers["x-twilio-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);

Chữ ký bao trùm toàn bộ URL công khai, gồm cả query string. TLS termination hoặc một proxy viết lại path đặt trước handler sẽ làm thay đổi URL mà Twilio đã ký, và sự sai lệch đó trông y hệt một request giả mạo.

Những chỗ dễ vấp

Có năm tham số gửi cấu hình được cho mỗi URL (connect timeout, read timeout, tổng thời gian, số lần thử lại, chính sách thử lại), và giá trị mặc định (15 giây tổng, 1 lần thử lại) là thứ gần như ai cũng dùng. Núm chỉnh có sẵn; không ai vặn.

Đọc thêm

AnyHook đứng trước các endpoint nhận webhook từ Twilio: 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.

Cách hoạt động →