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 | 2 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 |
|---|---|
| Thử lại | 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ần |
| Ngừng gửi | Có 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 |
| Nguồn | https://developers.line.biz/en/docs/messaging-api/receiving-messages/ |
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ý | raw body |
| Encoding | base64 |
| Header | x-line-signature = base64 |
| Dung sai | khô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-SHA256(channel secret, raw body))
const expected = crypto
.createHmac("sha256", channelSecret) // Messaging API → Basic settings
.update(rawBody)
.digest("base64");
const received = Buffer.from(req.headers["x-line-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
LINE có redelivery nhưng mặc định tắt: phải bật trong phần cài đặt Messaging API của kênh, và LINE không công bố số lần hay khoảng cách giữa các lần. Chưa bật thì mỗi lượt gửi thất bại là một tin nhắn bị mất.
LINE có thể ngừng gửi webhook hoàn toàn nếu server bot liên tục không nhận được, và ngưỡng này không được công bố. Một dịch vụ trung chuyển webhook (webhook relay) trả lời sau khoảng 1 giây và chỉ từ chối những gì không lưu được sẽ loại bỏ phần lớn ẩn số đó.
Đọc thêm
AnyHook đứng trước các endpoint nhận webhook từ LINE: 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.