Cara Twilio mengirim webhook

Setiap kenop timeout dan retry dapat dikonfigurasi, sesuatu yang tidak ditawarkan pengirim besar lain. Signature URL HMAC-SHA1 dan verifier Node.

Perilaku pengiriman

Diambil dari dokumentasi resmi vendor, terakhir diperiksa 2026-08-06. Jika vendor tidak menyebut angka, tabel ini juga tidak mencantumkannya.

Batas waktu respons15 detik

Dapat dikonfigurasi. rt (read timeout) default 15000ms (maks. 15000), ct (connect) default 5000ms (maks. 10000), tt (total) default 15000ms

Periksa apakah handler Anda menjawab tepat waktu

Percobaan ulangDapat dikonfigurasi: rc 0 sampai 5, default 1. rp menentukan kegagalan mana yang dicoba ulang
Berhenti mencobatidak dipublikasikan vendor
Sumberhttps://www.twilio.com/docs/usage/webhooks/webhooks-connection-overrides

Tanda tangan

Diverifikasi dengan verifier yang berfungsi dan dibuktikan oleh test suite, bukan dibaca dari dokumentasi. Terakhir diverifikasi 2026-08-20.

AlgoritmaHMAC-SHA1
Payload bertanda tanganfull URL + form params sorted by key
Encodingbase64
Headerx-twilio-signature
Toleransitidak diberlakukan

Verifikasi

Raw body dari permintaan, byte demi byte, sebelum parsing JSON apa pun. Setiap skema di halaman ini rusak begitu framework melakukan serialisasi ulang pada 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);

Tanda tangan mencakup URL publik lengkap, termasuk query string. TLS termination atau proxy yang menulis ulang path di depan handler mengubah URL yang ditandatangani Twilio, dan ketidakcocokannya terlihat persis seperti permintaan palsu.

Yang sering menjebak

Lima parameter pengiriman dapat dikonfigurasi per URL (connect timeout, read timeout, total waktu, jumlah percobaan ulang, kebijakan percobaan ulang), dan nilai default-nya (15 detik total, 1 percobaan ulang) dipakai hampir semua orang. Kenopnya ada; tidak ada yang memutarnya.

Baca juga

AnyHook berada di depan endpoint yang menerima webhook dari Twilio: AnyHook menjawab dalam sekitar satu detik, mencoba ulang sesuai jadwalnya sendiri saat server Anda mati, dan menyimpan setiap event agar dapat diputar ulang (replay). Ganti satu URL, kode Anda tetap.

Cara kerjanya →