Cách Meta (Instagram, Facebook, Threads) gửi webhook

Meta thử lại với tần suất giảm dần trong 36 giờ, rồi bỏ sự kiện. Bước bắt tay hub.challenge, định dạng chữ ký 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ồihãng không công bố
Thử lạiThử 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
Ngừng gửihãng không công bố
Nguồnhttps://developers.facebook.com/docs/graph-api/webhooks/getting-started

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-SHA256
Payload được kýraw body
Encodinghex
Headerx-hub-signature-256 = sha256=hex
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");

// Same scheme as GitHub: "sha256=" + hex HMAC of the raw body, keyed by the
// app secret.
const expected =
  "sha256=" +
  crypto.createHmac("sha256", appSecret).update(rawBody).digest("hex");
const received = Buffer.from(req.headers["x-hub-signature-256"] ?? "");
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);

Trước khi những bước này chạy, Meta phải chấp nhận callback URL: Meta gửi một GET kèm hub.mode=subscribe và chờ bạn trả lại nguyên văn hub.challenge. Không trả lại thì không có subscription.

Những chỗ dễ vấp

Meta công bố khoảng thời gian thử lại (36 giờ, tần suất giảm dần, sau đó thông báo bị bỏ) nhưng không công bố thời hạn phản hồi cho mỗi request hay ngưỡng vô hiệu hóa. Hãng không nêu con số nào thì trang này cũng không ghi.

Đọc thêm

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