跳轉到主要內容
Webhook 讓你的應用程式在 Fluz 平台上發生事件時即時接收通知。你不需要輪詢變更,而是註冊一個 HTTPS 端點,Fluz 會在事件發生的當下把事件資料推送給你——例如虛擬卡交易、被拒絕的購買、完成的入金,等等。
本頁作為 Webhooks 的頂層說明,因為 webhook 事件跨越多個平台區域(元件流程與交易活動),而不是屬於單一功能。
Webhooks 適用於 Fluz 平台上的所有應用程式類型:在你自有帳戶上運作的私人應用、公用 OAuth 應用(透過 API 代表其他使用者操作),以及嵌入式元件應用。

運作方式

  1. 在開發者入口註冊你的應用程式的 webhook URL。
  2. 選擇你要接收的事件類型(或訂閱全部)。
  3. 當符合的事件發生時,Fluz 會以帶簽章的 JSON 有效負載發出 HTTP POST 至你的 URL。
  4. 你的伺服器驗證簽章、以 2xx 回應並處理事件。
如果你的端點無法使用或回傳錯誤,Fluz 會採用指數退避最多重試 5 次,之後才將事件標記為 FAILED

依應用程式類型的 Webhooks

事件如何路由到你的應用,取決於你的應用程式模型。

私人應用 — 你的自有帳戶

Webhooks 會針對發生在「你的自有帳戶」上的活動觸發。任何你擁有的帳戶上的交易、拒絕、或入金,都會觸發註冊在你應用上的 webhooks。 常見使用情境: 當虛擬卡交易被授權或結算時的通知;即時拒絕提醒;監控你的消費帳戶的入金與餘額變動。

公用應用(OAuth)— 代表使用者行事

Webhooks 會針對「已授權你的應用」之帳戶的活動觸發。當使用者透過 OAuth 授權你的應用存取,他們的事件就會路由至你註冊的 webhooks——前提是該使用者的 OAuth 授權涵蓋必要的範圍(scopes)。無論使用者是經由你直接的 API 串接或嵌入式元件互動都適用;關鍵是使用者與你的應用之間存在 OAuth 關係。 常見使用情境: 監控已連結帳戶的虛擬卡消費;即時拒絕通知;追蹤入金完成;接收 KYC 狀態更新。

元件應用(Widget apps)

元件應用是特殊的公用應用。事件以相同方式路由(基於 OAuth 關係),且元件應用另外支援元件專屬事件,例如轉帳完成與禮品卡購買。

事件類型

只有在你的應用——以及對於公用/OAuth 應用,個別使用者的 OAuth 授權——持有所需的範圍(scopes)時,Fluz 才會傳送事件。

交易事件

涵蓋完整的交易生命週期。適用於「所有應用類型」。

入金事件

元件專屬事件

適用於使用者透過 Fluz 嵌入式流程互動的元件與 OAuth 整合。
📘 命名說明: WIDGET_DEPOSIT_COMPLETEWIDGET_WITHDRAW_COMPLETE 代表客戶↔應用之間的「轉帳」;DEPOSIT/WITHDRAW 的用語屬於歷史緣由。將「deposit」視為「客戶 → 應用」,「withdraw」視為「應用 → 客戶」。

設定 webhooks

1. 開啟開發者入口

前往 Developer Portal 並選擇你的應用程式。

2. 開啟 Webhooks 區段

  • OAuth 應用: OAuth 分頁 → Webhook URLs
  • 元件應用: Widget 分頁 → Webhook URLs
  • API / 私人應用: 應用設定中的 Webhook URLs 區段。

3. 新增 webhook URL

點擊 Add new URL 並輸入你的 HTTPS 端點(例如:https://api.yourapp.com/webhooks/fluz)。

4. 選取事件

選擇你想接收的事件類型。將選取留空可作為接收全部,你會收到你的應用具備 scope 的所有事件。

5. 儲存

點擊 Create Webhook。你的端點會立即開始接收事件。

管理 webhooks

  • 多個端點 — 你可以在每個應用程式註冊多個 webhook URL。
  • 變更訂閱事件 — 刪除該 webhook,並以新的事件選擇重新建立。
  • 移除 webhook — 點擊其旁的 Remove。該 webhook 會立即封存並停止接收事件。

接收 webhooks

請求格式

每個 webhook 都以 HTTP POST 傳遞,並包含以下標頭: 本文為 JSON 物件,且每個有效負載都包含 eventType 欄位來識別事件。

端點需求

  • 僅限 HTTPS — 純 HTTP 端點會在註冊時被拒。
  • 可公開存取,且可接受 POST 請求。
  • 在 30 秒內以 2xx 回應。2xx 回應或逾時會觸發重試。
  • 驗證每個請求的 HMAC 簽章

驗證簽章

每次傳遞都包含 X-HMAC-Signature 標頭——以你應用的 API 金鑰 對「原始」JSON 本文計算的 HMAC-SHA256 雜湊。務必在信任有效負載前先驗證。
⚠️ 請以原始請求本文驗證。 對 Fluz 傳送的精確位元組計算 HMAC——請勿重新序列化解析後的 JSON。重新字串化可能改變鍵順序或空白,導致有效簽章驗證失敗。以下範例因此會擷取原始本文。

Node.js (Express)

Python (Flask)

回應 webhooks

你的端點「必須」:
  • 在 30 秒內以 2xx 狀態回應。
  • 快速回應——先確認,後續非同步處理。
  • 可透過 HTTPS 連線。
你的端點「不得」:
  • 回應重新導向(3xx)。
  • 對有效的 webhooks 回應 4xx/5xx(這會觸發重試)。

重試政策

當你的端點恢復時,新事件會自動恢復投遞。若要重新傳送已達到 FAILED 的事件,請與客服聯繫並提供相關的 X-Event-ID

事件狀態生命週期

冪等性與順序

Webhooks 可能會被「投遞多次」,且「不保證投遞順序」。
  • 使用 X-Event-ID 標頭進行「去重」。在生產環境中使用 Redis 或資料庫持久化已處理的 ID,跳過已處理的事件。
  • 以資料排序,而非到達順序。若順序重要,請依據有效負載上的時間戳(createdAtupdatedAttransactionDateTime)與事件 ID 排序。

辨識應用與使用者

  • 使用者: userId 是 Fluz 使用者 ID。對於 OAuth/元件事件,externalReferenceId 對應於你在 OAuth 流程中的使用者識別符。
  • 應用: 交易有效負載包含 connectedAppIdconnectedAppName。如果你把多個應用路由到同一端點,請依 connectedAppId 分支處理。

有效負載參考

每個有效負載都包含 eventType。欄位可用性會依事件而異;為了前向相容,處理程式應忽略未識別的欄位。

交易已建立(TRANSACTION_CREATE

針對任何新交易觸發——虛擬卡購買、入金、轉帳等。

交易已更新(TRANSACTION_UPDATE

當交易狀態或細節變更時觸發——例如待授權完成結算。
欄位在可用時與 TRANSACTION_CREATE 對應,並新增 updatedAt(ISO 8601)表示變更發生時間。
🚧 一致性檢查: 請確認 TRANSACTION_UPDATE(與 TRANSACTION_DECLINE)是否也包含 userIdconnectedAppId/connectedAppName,以便使用方能在整個生命週期一致識別使用者與應用。

交易被拒絕(TRANSACTION_DECLINE

當交易被拒絕時觸發。包含結構化的拒絕原因,讓你的應用可據以處理。

入金完成(DEPOSIT_COMPLETE

當從資金來源入金至消費帳戶完成時觸發。

啟動 KYC(WIDGET_KYC_INITIATION

當使用者開始身分驗證時觸發。僅限公用/元件應用。

轉帳完成 — 客戶至應用(WIDGET_DEPOSIT_COMPLETE

當使用者把資金轉至你的應用時觸發。

轉帳完成 — 應用至客戶(WIDGET_WITHDRAW_COMPLETE

當你的應用把資金轉給使用者時觸發。

禮品卡購買(WIDGET_PURCHASE_GIFT_CARD

當透過元件完成禮品卡購買時觸發。
🚧 待補充。 請新增 WIDGET_PURCHASE_GIFT_CARD 的有效負載範例與欄位表(例如商家、金額、禮品卡識別碼)。
常見的元件有效負載欄位: userId(Fluz 使用者 ID)、accountId(Fluz 帳戶 ID)、externalReferenceId(你在 OAuth 流程中的使用者識別符),以及在適用時的 amount

最佳實務

  • 快速回應,稍後處理。 立即回傳 200,並以非同步方式處理事件,以避免逾時與不必要的重試。
  • 驗證每個請求。 使用你的 API 金鑰,針對原始本文驗證 X-HMAC-Signature 後再處理。
  • 以事件 ID 去重。 追蹤 X-Event-ID 以處理重試/重複投遞。
  • 接受未知欄位。 有效負載可能隨時間新增欄位;忽略未識別欄位而非失敗。
  • 監控你的端點。 對連續的非 2xx 回應發出警報——在 5 次失敗後事件會被標記為 FAILED

疑難排解

需要協助?

  • 技術問題: 請檢查你的端點日誌,並提供 X-Event-ID 與客服聯繫。
  • Scope 相關問題: 參見 Application ScopesDecline Codes