網站載入中

YayJun

LOADING

↖ 返回首頁
CASE 04國內外電子金流交易平台
CASE 04協作開發

國內外
電子金流交易介接

單一金流異常就收不到錢 動態路由熱切換與三層補償。

多家金流熱切換排程補償發票開立

我的角色|協作開發國內外金流介接、動態路由熱切換設計,以及排程補償、每日對帳與電子發票開立的實作。

SCROLL

THE PROBLEM / 問題與情境

金流只要有一家出事,錢就收不進來。

多家

每家金流的簽章、參數與回調格式都不同,接一家就要重寫一套流程。

單點

任一家異常就整條收款斷掉,得改設定重新部署才能換人收。

對不平

callback 會延遲、重送或遺漏,訂單狀態與帳務容易對不起來。

THE SOLUTION / 解決方案

假設每一步都會失敗,再決定失敗後怎麼救。

01 起單

統一訂單模型

各家金流的差異全部收斂在轉接層,上層只看得到一種訂單。

02 路由

動態熱切換

路由設定放 Redis,改設定即生效,不必重新部署。

03 關鍵

三層補償

重複的擋掉、逾時的排程補查、剩下的每日對帳,任一層漏掉都由下一層接住。

04 收手

人工邊界

補查連續失敗就停止自動處理,標記人工介入,不讓程式硬猜結果。

ARCHITECTURE / 系統架構

一筆錢從下單到入帳,中途斷了怎麼接回來。

進線層

網頁商城
遊戲內兌換
供應商儲值

訂單與轉接層

訂單服務
統一訂單模型・訂單狀態控制
路由服務
費率・支付方式・健康度
金流轉接層
A/B/C・Redis 路由熱切換

補償層・三層接住

去重
補查
對帳

逐層接住漏掉的

callback 去重・逾時主動查回
差異標記待人工處理

資料與通知

MSSQL/訂單與交易
發票開立
通知服務/異常告警
琥珀色=失敗後的接手路徑,正常收款不經過 虛線=前一層漏掉的,由下一層接住去識別化示意,金流商名稱非實際廠商

INTERACTIVE DEMO / 互動演示

可互動

選一個異常情境,看它怎麼失敗、又怎麼救回來。

STEP 1

建立訂單

統一訂單模型,各家金流差異收斂在轉接層

STEP 2

動態路由

依 Redis 設定選金流商,可即時熱切換

STEP 3

Callback 異常

逾時、失敗或重送,都在這一步被攔下

STEP 4

補償重試

排程主動查詢補寫,同一筆只入帳一次

異常情境 / 合成資料

訂單狀態時序

待機中

從左邊選一個異常情境,看它在哪一步失敗、又是怎麼補回來的。

本頁為去識別化整理,不含前雇主原始碼或資料;訂單編號、金額與時間皆為前端合成資料。

TECHNOLOGY & DESIGN DECISIONS / 技術選型與設計決策

每個技術都對應一個要解的問題

ASP.NET Core訂單領域邏輯與各金流商的轉接層
Redis路由設定熱讀取,以及 callback 冪等去重
BackgroundService補償排程,定時掃描逾時未完成的交易
HMAC各金流商的請求簽章產生與回調驗簽
MS SQL Server訂單、交易明細與補償紀錄
對帳批次每日與金流商帳務核對,差異自動標記待人工處理

ALTERNATIVE CONSIDERED

為何不只做 callback 重試,而要三層補償?

只靠 callback 重試,僅限「對方有送、我方沒收到」這一種故障。真實情況還包括金流商沒送、我方收到但寫入異常,以及雙方金額或狀態不一致。因此分成三層:callback 進來先擋掉重複的、排程主動查詢補寫、每日對帳標記人工介入。代價是三套邏輯都要維護,但少任何一層,就會留下無法回查的缺口。

CHALLENGES & RESULTS / 挑戰與成果

最難的不是接通金流,是當有金流異常的時候。

挑戰 01

callback 重送與亂序

同一筆交易可能收到多次、甚至先收到後面的狀態;用交易鍵檢查是否處理過,搭配只能單向前進的訂單狀態擋下。

挑戰 02

切換金流商時的在途訂單

路由切換只影響新訂單,已送出的在途訂單沿用原金流商直到終態,避免對不到帳。

熱切換

改 Redis 設定即生效,不必重新部署。

自動補償

逾時交易由排程主動查回,不必人工撈。

對帳可追

每日核對差異,異常一定留下紀錄。