WooCommerce 如何傳遞 Webhook

WooCommerce 的傳遞靠 WP-Cron 上的 Action Scheduler,所以要等有頁面載入才送出。連續失敗超過五次就停用 Webhook。附格式與 Node 驗證程式。

傳遞行為

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

回應時限服務商未公開

傳遞會排入 Action Scheduler,由 WP-Cron 驅動,所以要等下一次有頁面載入才送出,而不是在事件發生時

重試服務商未公開
放棄連續傳遞失敗超過五次後,停用 Webhook
出處https://woocommerce.com/document/webhooks/

簽章

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

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

驗證簽章

要用原始請求主體(raw body),逐位元組原封不動,並在任何 JSON 解析之前取得。框架只要重新序列化 payload,這頁上的每一種機制就會立刻失效。

const crypto = require("node:crypto");

// base64(HMAC-SHA256(secret, raw body))
const expected = crypto
  .createHmac("sha256", webhookSecret)
  .update(rawBody)
  .digest("base64");
const received = Buffer.from(req.headers["x-wc-webhook-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);

容易踩的坑

訂單成立時,Webhook 並不會觸發。傳遞會排入 Action Scheduler,而它在 WP-Cron 上執行,WP-Cron 又要等下一次有人載入頁面才執行。在流量少的商店,第一個位元組送出前就內建了好幾分鐘的延遲。

連續傳遞失敗超過五次,Webhook 就會直接被停用,而店主通常要等到下游的資料明顯過時才會發現。

延伸閱讀

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

運作方式 →