Vibe Coder
Webhook 是什麼?接收、驗證、本機測試全攻略
Webhook 是什麼?接收、驗證、本機測試全攻略
付款結果、訂單狀態變更、LINE 訊息、GitHub push,這些事件無法主動查詢,只有在發生時才知道,要靠 Webhook 接收通知。每秒問一次有沒有新訊息很浪費資源,Webhook 的邏輯反過來,是有訊息時才通知你,即時且省資源。
如果你在做自動化工作流,例如 n8n、Zapier,Webhook 是最常見的觸發器,懂了才能設計完整的自動化流程。而任何人都可以對你的 Webhook URL 發送請求,不驗證簽名,就可能被偽造的事件欺騙,執行錯誤的操作。
你將學到什麼
Webhook vs Polling
對方主動推 vs 你主動問,兩種溝通方式的效率差在哪裡。
完整接收流程
建端點、對方後台設定、驗證簽名、立刻回傳 200 的四個步驟。
HMAC Signature 驗證
任何人都能偽造 Webhook 請求,簽名驗證是唯一的防線。
本機測試工具
用 ngrok、smee.io 把 localhost 暴露出去,實際測試流程。
Webhook vs API Polling:兩種溝通方式
| 方式 | 誰主動 | 即時性 | 效率 | 適用場景 |
|---|---|---|---|---|
| API Polling | 你主動問 | 取決於詢問頻率 | 低,大量無效請求 | 需要主動控制、對方不支援 Webhook |
| Webhook | 對方主動推 | 幾乎即時 | 高,只在有事件時觸發 | 付款、訊息、GitHub 事件、訂單狀態 |
Webhook 的完整接收流程
- 建立 Webhook 端點:在後端建立一個 POST 路由,例如 /webhook/stripe,這個 URL 就是你的 Webhook URL。
- 在對方後台設定:到 Stripe、GitHub、LINE 等服務的後台,填入你的 Webhook URL 和想接收的事件類型。
- 接收並驗證:對方有事件時會 POST 到你的 URL,要先驗證簽名確認是真的來自對方,再處理資料。
- 立刻回傳 200:接收到 Webhook 後要盡快回傳 200,告訴對方我收到了,耗時的處理放到背景執行。
from fastapi import FastAPI, Request, HTTPException
app = FastAPI()
@app.post("/webhook/stripe")
async def stripe_webhook(request: Request):
payload = await request.body()
sig_header = request.headers.get("stripe-signature")
# 步驟一:驗證簽名,下一節說明
event = verify_stripe_signature(payload, sig_header)
# 步驟二:根據事件類型處理
if event["type"] == "payment_intent.succeeded":
handle_payment_success(event["data"]["object"])
return {"status": "ok"} # 立刻回傳 200
驗證來源:HMAC Signature
不驗簽名的 Webhook 端點,任何人知道 URL 都能偽造事件。HMAC 簽名讓你能確認請求真的來自你設定的服務:你和對方共享一個 Webhook Secret,對方發送時用這個 Secret 對 Request Body 做 HMAC-SHA256 運算,把結果放在 Header 裡;你收到後用相同的 Secret 對 Body 做相同運算,比對結果,一致就是真的,不一致就是偽造的,拒絕並回傳 400。
import hmac, hashlib
def verify_signature(payload: bytes, signature: str, secret: str) -> bool:
expected = hmac.new(
secret.encode(),
payload,
hashlib.sha256
).hexdigest()
received = signature.replace("sha256=", "")
# 用 compare_digest 防止 timing attack
return hmac.compare_digest(expected, received)
常見 Webhook 場景
| 服務 | Signature Header | 事件範例 |
|---|---|---|
| Stripe | Stripe-Signature | 付款成功、退款、訂閱到期 |
| GitHub | X-Hub-Signature-256 | push、PR、issue 建立 |
| LINE Messaging API | 無,改用 Channel Secret 驗證 | 使用者傳訊息、加好友 |
| Shopify | X-Shopify-Hmac-Sha256 | 訂單建立、商品更新 |
| n8n(觸發節點) | 可選,自訂 | 自定義工作流觸發 |
本機測試 Webhook:ngrok 和 smee.io
本機的 localhost 外部無法存取,要測試 Webhook 需要把本機暴露到公開網路。
| 工具 | 用法 | 特點 |
|---|---|---|
| ngrok | ngrok http 8000 | 建立臨時公開 URL,轉發到本機 |
| smee.io | 建立頻道,用 CLI 轉發 | GitHub 官方推薦,可重播請求 |
| Cloudflare Tunnel | cloudflared tunnel | 免費、穩定,支援自訂域名 |
延伸學習
ChatGPT 很強,但真正讓你下班的是 Google
六小時完整實錄。從「AI 很厲害,為什麼你還是每天加班」這個問題出發,把 Google Workspace 當成真正的工作平台重新設計一次流程 ── Sheets 的資料結構、Drive 與 Docs 的文件流、Gmail 與 Calendar 的通知系統,再用 Apps Script 讓它自己跑起來,最後收斂成一張屬於你自己的 AI 工作能力地圖。
NT$ 4,599
寫給升國一的你的筆記術
寫給剛升上國中的你:筆記不是寫給老師看的,是寫給考前的自己看的。18 章 85 課圖文,從「為什麼要寫」講到七科各自怎麼記,附 78 份可以印出來寫的練習單,以及 80 課家長專區與 34 張三年筆記養成路徑圖。沒有閱讀期限,國一買、國三還在。
NT$ 3,599

