本頁涵蓋所有 webhook 事件,跨越多個平台領域(交易活動、存款、元件流程,以及 OAuth 帳戶連結),而非僅屬於任何單一功能。
運作方式
- 在開發者入口網站為你的應用程式註冊 webhook URL。
- 選擇要監聽的事件類型(或訂閱全部)。
- 當相符事件發生時,Fluz 會以 HTTP
POST將已簽章的 JSON 負載送至你的 URL。 - 你的伺服器驗證簽章、以
2xx確認並處理該事件。
依應用程式類型的 Webhooks
事件如何路由至你的應用,取決於你的應用程式模型。私人應用 — 你的自有帳戶
Webhooks 會針對你的自有帳戶的活動觸發。你所擁有的帳戶上任何交易、拒絕、或存款,皆會觸發註冊於你應用上的 webhooks。 常見使用情境: 當虛擬卡交易被授權或結算時的通知;即時拒絕警示;監控消費帳戶的存款與餘額變動。公共應用(OAuth)— 代表使用者行動
Webhooks 會針對已授權你的應用之帳戶的活動觸發。當使用者透過 OAuth 授與你的應用存取權時,只要其 OAuth 授權包含所需的範圍,該使用者的事件就會路由到你註冊的 webhooks。無論該使用者透過你的直接 API 整合或內嵌元件互動皆然;關鍵是使用者與你的應用之間存在 OAuth 關係。 常見使用情境: 知道使用者已將帳戶連結(或重新連結)至你的應用;監控已連結帳戶的虛擬卡消費;即時拒絕通知;追蹤存款完成;接收 KYC 狀態更新。元件應用(Widget apps)
元件應用是特殊的公共應用。事件會以相同方式路由(基於 OAuth 關係),且元件應用另外支援如轉帳完成與禮品卡購買等元件專屬事件。事件類型
Fluz 僅在你的應用——以及對公共/OAuth 應用而言,個別使用者的 OAuth 授權——擁有所需範圍時傳遞事件。對於沒有必需範圍的事件(例如OAUTH_USER_LINKED),任何已訂閱的公共/OAuth 應用都會收到。
交易事件
涵蓋完整交易生命週期。適用於所有應用程式類型。存款事件
OAuth 事件
適用於公共/OAuth 與元件應用。OAUTH_USER_LINKED 僅傳遞至公共/OAuth 類型應用——私人應用訂閱者不會收到。因其沒有範圍需求,你會對每位連結或重新連結至你應用的使用者收到該事件,無論他們授與哪些範圍。用它來佈建或更新你本地的已連結使用者記錄、擷取授與的範圍集合,並透過 externalReferenceId 對應你自己的使用者識別碼。
元件專屬事件
適用於使用者透過 Fluz 內嵌流程互動的元件與 OAuth 整合。📘 命名說明:WIDGET_DEPOSIT_COMPLETE與WIDGET_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. 選擇事件
選擇你想接收的事件類型。5. 儲存
點擊 Create Webhook。你的端點會立即開始接收事件。管理 webhooks
- 多個端點 — 你可以為每個應用註冊多個 webhook URL。
- 變更訂閱事件 — 刪除該 webhook,並以新的事件選擇重新建立。
- 移除 webhook — 點擊其旁的 Remove。該 webhook 會立即封存並停止接收事件。
接收 webhooks
請求格式
每個 webhook 以 HTTPPOST 傳遞,並包含以下標頭:
本文為 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(這會觸發重試)。
重試原則
當你的端點恢復後,新事件會自動恢復投遞。若要重新傳送已經耗盡重試次數的事件,請聯絡支援並提供相關的
X-Event-ID。
冪等性與順序
Webhooks 可能會被重複投遞,且不保證投遞順序。- 使用
X-Event-ID標頭進行去重。將已處理的 ID 持久化(正式環境可用 Redis 或資料庫),並略過你已處理的事件。 - 依資料而非到達順序排序。 若順序很重要,請依負載的時間戳(
createdAt、updatedAt、transactionDateTime)與事件 ID 排序。
識別應用與使用者
- 使用者:
userId是 Fluz 的使用者 ID。對於 OAuth/元件事件,externalReferenceId對應到你在 OAuth 流程中的使用者識別碼。 - 應用: 交易負載包含
connectedAppId與connectedAppName。如果你將多個應用路由到同一端點,請以connectedAppId分流。對於OAUTH_USER_LINKED,應用以appId識別。
負載參考
每個負載都包含eventType。欄位可用性會依事件而異;為了前向相容性,處理器應忽略未識別的欄位。
📘 關於status值的說明。 對於已建立/已更新的交易,status欄位會是PENDING、SETTLED或FAILED之一。被拒交易會帶有DECLINED(或FAILED)的status。本頁早期草稿曾顯示COMPLETED作為狀態——實際上不會發出該值;請以SETTLED判斷交易已最終完成。
交易已建立(TRANSACTION_CREATE)
針對任何新交易觸發——虛擬卡購買、存款、轉帳等。
交易已更新(TRANSACTION_UPDATE)
當交易的狀態或細節變更時觸發——例如待授權改為已結算。
TRANSACTION_CREATE 相同處相同,另包含 updatedAt(ISO 8601)標記變更發生時間。userId、connectedAppId 與 connectedAppName 會如同 TRANSACTION_CREATE 一樣帶出,因此你可以在整個生命週期中一致地識別使用者與應用。status 轉為 SETTLED 表示先前的待處理交易已最終完成。
交易被拒(TRANSACTION_DECLINE)
當交易被拒時觸發。包含可供你的應用採取動作的結構化拒絕原因。
視交易情況,可能會有其他選用欄位(例如
merchantId、merchantCity、merchantState、merchantCountry、cardDisplayName、virtualCardProgram、channel、bankAccountNickname、bankAccountLastFour)。對於未使用者可忽略。
存款完成(DEPOSIT_COMPLETE)
當從資金來源至消費帳戶的存款完成時觸發。
OAuth 使用者已連結(OAUTH_USER_LINKED)
當使用者完成與你的應用的 OAuth 連結時觸發——包含初次連結與後續更新(例如使用者以不同範圍重新授權)。僅適用於公共/OAuth 與元件應用。接收此事件不需要任何範圍。
由於
OAUTH_USER_LINKED 在重新連結/更新時會再次觸發,請將其視為 upsert:第一次建立已連結使用者,其後每次都更新所儲存的範圍集合。
KYC 啟動(WIDGET_KYC_INITIATION)
當使用者開始身分驗證時觸發。僅限公共/元件應用。
轉帳完成 — 顧客至應用(WIDGET_DEPOSIT_COMPLETE)
當使用者將資金轉入你的應用時觸發。
轉帳完成 — 應用至顧客(WIDGET_WITHDRAW_COMPLETE)
當你的應用將資金轉給使用者時觸發。
禮品卡購買(WIDGET_PURCHASE_GIFT_CARD)
當透過元件完成禮品卡購買時觸發。
userId(Fluz 使用者 ID)、accountId(Fluz 帳戶 ID)、externalReferenceId(你在 OAuth 流程中的使用者識別碼),以及適用時的 amount。
最佳實務
- 先快速回應,再行處理。 先立即回傳
200,並非同步處理事件,以避免逾時與不必要的重試。 - 驗證每個請求。 使用你的 API 金鑰,針對原始本文驗證
X-HMAC-Signature後再處理。 - 以事件 ID 去重。 追蹤
X-Event-ID以處理重試/重複投遞。 - 將類列舉欄位視為開放字串。 新的
transactionType、channel、declineCategory值可能陸續出現;只針對你關心的值分支,並寬容未知值。 - 對
OAUTH_USER_LINKED採用 upsert。 它對每位使用者可能觸發多次;每次都更新已儲存的範圍集合,而非假設只在首次連結觸發。 - 接受未知欄位。 負載可能隨時間新增欄位;請忽略未識別的欄位而非失敗。
- 監控你的端點。 對連續非
2xx回應發出警報——在 5 次嘗試失敗後,該事件的投遞會被放棄。
疑難排解
需要協助?
- 技術問題: 檢查你的端點日誌,並連絡支援時提供
X-Event-ID。 - 範圍相關問題: 請參閱 Application Scopes 與 Decline Codes。