收不到 webhook,或驗籤失敗
使用分步檢查清單排查 StableOps Webhook 未送達、返回非成功狀態、簽名驗證失敗、請求體被改寫和重複投遞等問題,並透過投遞日誌、重放與金鑰輪換恢復可靠處理。內容涵蓋代理與防火牆檢查、原始請求體驗證、時間戳容差、快速回應和事件去重等常見故障點。
webhook 問題大多落在兩類:投遞根本沒到達你的伺服器,或到達了但驗籤失敗。請按下面對應的清單逐條排查。
投遞沒有到達
-
該端點訂閱了這個事件所在的分組嗎? 在控制台裡訂閱是按分組而非單個事件選擇的,共三類:支付事件(
payment_order.*、payment.*)、商家訂閱事件(end_user_subscription.*、end_user_invoice.*)與運維事件(address.pool.low以及agent.action.*審批)。只訂閱了支付事件的端點不會收到訂閱類或運維/Agent 事件,反之亦然。三類都不勾是不允許的;三類都勾表示“全部事件”,含將來新增的型別。(API 的enabled_events欄位技術上可攜帶任意子集,但控制台的分組模型無法表達任意子集。在控制台儲存一個自定義子集會把它擴成整組。) -
你的伺服器是否在 10 秒內返回了
2xx? 任何非2xx狀態、網路錯誤,或 10 秒內無回應都算失敗。處理函式在回應前就做了大量實際工作是常見原因。先返回200,再非同步處理。 -
檢視投遞日誌。 每次嘗試都會記錄
response_status、response_duration_ms、error_message、attempts、next_retry_at以及status(pending/succeeded/failed/dead_letter)。這通常能立刻看出問題是否出在你這一側。 -
把重試也算進去。 失敗的投遞按下面的曲線重試,到第 6 次進入死信佇列:
嘗試次數 延遲 1 30 秒 2 60 秒 3 5 分鐘 4 30 分鐘 5 2 小時 6+ 死信佇列 -
修復後重放。 重放介面(以及面板上的重放按鈕)會入隊一條全新的投遞記錄,原始審計日誌會被保留。用 replay-dead-letters 排空在你的端點宕機期間落入死信佇列的投遞。
驗籤失敗
-
針對原始 body 驗籤。 在任何 JSON 解析或重新序列化之前,對你收到的精確位元組計算簽名。會先解析再 re-stringify body 的框架會改變它從而破壞簽名。這是最常見的單一原因。
-
從正確的請求頭讀取簽名。 使用 SDK 的
SIGNATURE_HEADER常量,而不要硬編碼欄位名。 -
使用正確的 secret。
secret僅在建立和輪換時返回。如果沒存下來,輪換一次拿新的。 -
輪換期間同時接受兩個 secret。 輪換後,舊 secret 會與新 secret 並存有效 24 小時。把兩者都傳給驗籤器,讓灰度過程中在途的投遞不會失敗:
import { SIGNATURE_HEADER, verifySignature } from '@stableops/api-sdk/webhooks' const result = verifySignature({ secrets: [currentSecret, previousSecret], // 24 小時重疊期內兩者都有效 header: request.headers.get(SIGNATURE_HEADER) ?? undefined, rawBody, }) if (!result.ok) { console.error('Invalid signature:', result.reason) // 拒絕該請求 }
相關
這篇文件怎麼樣?
最後更新