LINE 如何傳遞 Webhook

LINE 給機器人伺服器的時限是 2 秒,重新傳送預設關閉。哪些已驗證、哪些 LINE 沒說,附 x-line-signature 的 Node 驗證程式。

傳遞行為

取自服務商自己的文件,最後檢查於 2026-08-06。服務商沒寫數字的地方,這張表也不填。

回應時限2 秒

機器人伺服器 2 秒內沒有回應,就記為 request_timeout

檢查你的處理程式能否及時回應

重試Webhook redelivery(Webhook 重新傳送),預設關閉(在頻道的 Messaging API 設定中開啟);次數與間隔未公開
放棄機器人伺服器持續無法接收時,可能暫停傳送 Webhook;門檻未公開
出處https://developers.line.biz/en/docs/messaging-api/receiving-messages/

簽章

用一個經測試套件證明可運作的驗證程式核對過,不是照文件抄來的。最後驗證於 2026-08-20。

演算法HMAC-SHA256
簽章內容raw body
編碼base64
標頭x-line-signature = base64
容許時間差不強制

驗證簽章

要用原始請求主體(raw body),逐位元組原封不動,並在任何 JSON 解析之前取得。框架只要重新序列化 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);

容易踩的坑

重新傳送功能存在,但預設是關閉的:必須在頻道的 Messaging API 設定中開啟,而且 LINE 不公開次數與間隔。在你開啟之前,每一次傳遞失敗都是一則遺失的訊息。

機器人伺服器持續無法接收時,LINE 可能會完全暫停傳送 Webhook,而門檻沒有公開。一個大約 1 秒就回應、只拒收無法儲存之請求的中繼服務,能把這個變數的大部分排除掉。

延伸閱讀

AnyHook 架在接收 LINE Webhook 的端點前面:大約 1 秒就回應,伺服器當機時依自己的排程重試,並讓每個事件都能重播。 換一個網址,程式碼不用動。

運作方式 →