內銀系 BST 總覽 Pull 模式
本頁說明
講什麼:三家 BST(銀證轉賬)銀行的接入模式、協議差異、限額體系、異常處理全對比 適合誰:需要深入了解 BST 通道細節的產品經理 前置閱讀:出金方式總覽、銀行能力矩陣預計閱讀:6 分鐘 負責人:入金產品經理
核心要點:BST(銀證轉賬)是最快的出金通道。三家銀行協議差異大:招行/民生用 Socket 雙向鏈路(秒級響應),天星用 REST API 輪詢(分鐘級響應)。
三家銀行總覽
| 維度 | 招行(CMB) | 民生(CMBC) | 天星(Airstar) |
|---|---|---|---|
| 協議 | Socket 二進制 (GB18030) | Socket XML 文本 (SM2 加密) | REST API (JSON/UTF-8) |
| 授權模型 | 銀證簽約 | 銀證簽約 | Mandate 授權(6 狀態) |
| 出金發起方 | 銀行端 + moomoo 端均可 | 僅銀行端可發起 | moomoo 端 + 銀行端均可 |
| 結果獲取 | 實時推送(Socket 回調) | 實時推送(Socket 回調) | 輪詢(polling) |
| 入金狀態 | 成功 / 失敗 | 成功 / 失敗 | NEW / PENDING / SUCCESS / FAILED / REFUNDED |
| 出金狀態 | 0(成功) / -5(超時) / -6(拒絕) | 0(成功) / -5(超時) / -6(拒絕) | NEW / PENDING / SUCCESS / FAILED |
核心區別一句話:招行和民生是傳統 Socket 專線(銀行主導),天星是現代 REST API(moomoo 主導)。
各銀行渠道接口詳情
本頁是 BST 協議的總覽對比。每家銀行的渠道側接口字段、moomoo 側適配映射、完整匹配規則等詳情,請查閱各銀行獨立頁面:
- 招商銀行 CMB — Socket 二進制協議、33 個命令碼、SM2 加密
- 民生銀行 MS — XML 文本協議、SM2 加密、Socket 通信
- 天星銀行 Airstar — REST API、RSA-OAEP 加密、10 個 API 方法
銀證授權(Mandate)
授權模型對比
| 招行 / 民生 | 天星 | |
|---|---|---|
| 術語 | 銀證簽約 | Mandate 授權 |
| 發起方式 | 用戶在銀行端完成簽約 | 用戶在 moomoo 端發起,銀行端確認 |
| 狀態數量 | 2 個(已簽約 / 未簽約) | 6 個(完整狀態機) |
| 多市場 | 每個市場單獨簽約 | 一次授權自動映射 3 個市場 |
| 核心標識 | 銀行卡號 | mandate_id |
天星 Mandate 狀態機
自動 3 市場映射:用戶完成一次天星 Mandate 授權後,系統自動為 HK(港股)、US(美股)、CN(A 股通)三個市場創建銀證綁定關係。用戶不需要分別為每個市場單獨操作。
mandate_id 是天星的核心標識:不同於招行/民生以銀行卡號作為主鍵,天星以 mandate_id 作為銀證關係的唯一標識。銀行卡管理、入金、出金的所有操作都通過 mandate_id 串聯。
入金流程對比
通用 BST 入金
所有 BST 銀行共享同一個入金邏輯框架:
- 用戶發起入金 → 系統創建入金指令 → 發送到銀行 → 銀行處理 → 結果回傳 → 入賬
天星入金特殊性
兩種入金來源:
| 來源 | source 值 | 說明 |
|---|---|---|
| 用戶在 moomoo 端發起 | 1 | 用戶在 moomoo App 點擊入金 |
| 用戶在銀行端發起 | 2 | 用戶在天星銀行 App 發起轉賬到證券帳戶 |
銀行端發起(source=2)是天星獨有的能力——招行/民生的 BST 入金只能從 moomoo 端發起。
輪詢機制:
天星不像招行/民生通過 Socket 實時推送結果,而是由 moomoo 系統主動輪詢:
| Job 名稱 | 職責 | 輪詢次數 | 說明 |
|---|---|---|---|
AsbBstCreateJob | 創建入金指令 | — | 發送入金請求到天星 |
AsbBstCreateResultJob | 輪詢入金結果 | 最多 60 次 + 慢輪詢 | 每次間隔輪詢天星 API 查詢入金狀態 |
AsbBstDepositJob | 入金到賬處理 | — | 確認入金成功後執行內部到賬邏輯 |
前 60 次每 5 秒輪詢一次;超過 60 次後切換為每 5 分鐘輪詢一次(慢輪詢),持續直到獲得終態或人工介入。
REFUNDED 退款狀態(天星獨有):
天星入金有一個其他 BST 銀行沒有的狀態——REFUNDED。表示入金已成功到賬後,銀行又發起了退款。
觸發場景:
- 銀行側發現交易異常後主動退款
- 合規原因觸發退款
系統處理:收到 REFUNDED 狀態後,需要沖正已入賬的資金,並通知用戶。這是需要運營關注的異常場景。
出金流程對比
通用 BST 出金
BST 出金遵循凍結-轉賬-釋放三步模式:
為什麼先凍結? 因為從發送指令到銀行確認之間有時間窗口。如果不凍結,用戶可能在這段時間內花掉這筆錢,導致帳戶出現負餘額。凍結保證了出金金額在處理期間不會被其他操作使用。
天星出金特殊性
兩種出金模式:
| 模式 | 說明 |
|---|---|
| moomoo 端發起 | 用戶在 moomoo App 點擊出金,系統通過 API 發送指令 |
| 銀行端發起 | 用戶在天星銀行 App 發起從證券帳戶轉出到銀行(天星獨有) |
輪詢機制:
| Job 名稱 | 職責 | 重試 | 說明 |
|---|---|---|---|
AsbBstTransfer | 出金轉賬指令 | 最多 10 次 | 發送出金請求並輪詢結果 |
SyncAsbBstWithdraw | 銀行端出金拉取 | 每分鐘 cron | 拉取銀行端發起的出金請求,創建 moomoo 側出金任務 |
流程:moomoo 端發起出金 → AsbBstTransfer 輪詢最多 10 次 → 仍未完成則標記異常需人工確認。銀行端發起出金 → SyncAsbBstWithdraw 每分鐘拉取 → 創建出金任務處理。
招行 / 民生出金
招行和民生通過 Socket 連接發送出金指令:
- 出金服務調用銀證服務(
cmb_stock_trans/ms_stock_bank_transaction) - 加密請求數據
- 通過 Socket 發送到銀行的
exit_server - 銀行處理後通過同一條雙向鏈路實時返回結果
- 結果碼:0(成功)/ -5(超時,自動切換備用 exit_server 重試)/ -6(銀行拒絕)
三層限額體系
BST 通道對單筆金額、累計金額、每日金額分層控制。詳細說明見 出金規則手冊 § 三層限額。
天星限額詳情
| 維度 | HKD | USD |
|---|---|---|
| 單筆上限(max) | 300 萬 | 50 萬 |
| 累計報警(alarm) | 4,000 萬 | 1,000 萬 |
| 每日熔斷(stop) | 1,500 萬 | 300 萬 |
線上開戶最低入金:HKD 1 萬 / USD 1,500 / CNH 1 萬
三層如何協作:
- 第一層(單筆):超過 300 萬 HKD 的單筆出入金直接拒絕
- 第二層(累計報警):累計達到 4,000 萬 HKD 時觸發告警通知運營,但交易不中斷
- 第三層(每日熔斷):當日累計達到 1,500 萬 HKD 時自動關閉當日自動出入金,後續需人工處理
招行 / 民生限額
招行/民生限額說明
招行和民生的限額由銀行側系統控制(非 moomoo 配置),具體數值需向銀行確認。已知其具備單筆上限和每日限額機制,超限時銀行側直接拒絕並返回回調碼 -6。如遇超限問題,參考出金排障 § BST 回調異常。
線上開戶(天星獨有)
天星支持三合一線上開戶流程——新客戶可以在一個連貫的流程中完成:
- 開立證券帳戶:完成 KYC 身份驗證
- Mandate 授權:授權天星銀行進行銀證轉賬
- 首筆入金:完成首筆入金到證券帳戶
這個流程的價值在於新客獲取——降低了新用戶從註冊到可交易的門檻。傳統流程需要用戶在多個系統間切換(開戶 → 去銀行簽約 → 回來入金),三合一流程在 moomoo App 內一站式完成。
線上開戶的入金限制:首筆入金有最低金額要求(HKD 1 萬 / USD 1,500 / CNH 1 萬),高於普通入金的最低限額,目的是確保新客戶有足夠資金進行交易。
僅天星支持
招行和民生的銀證簽約需要用戶在銀行端完成,不支持在 moomoo 端完成三合一流程。
定時任務
天星任務清單
| Job 名稱 | 職責 | 頻率 | 重試 | 依賴 |
|---|---|---|---|---|
AsbBstCreateJob | 創建銀證入金指令 | 觸發式 | — | 用戶入金請求 |
AsbBstCreateResultJob | 輪詢入金結果 | 定時 | 60 次後轉慢輪詢 | AsbBstCreateJob |
AsbBstDepositJob | 入金到賬處理 | 觸發式 | — | AsbBstCreateResultJob 返回 SUCCESS |
AsbBstTransfer | 出金轉賬 + 輪詢結果 | 觸發式 | 最多 10 次 | 審批通過 |
SyncAsbBstWithdraw | 銀行端出金拉取 | 每分鐘 cron | — | 銀行端發起出金 |
AsbBstCreateFromBankJob | 銀行端入金處理 | 觸發式 | — | 銀行端發起入金 |
AsbBstCreateRetryJob | 入金創建重試 | 觸發式 | — | AsbBstCreateJob 失敗 |
任務鏈路:
入金:AsbBstCreateJob(moomoo 端)/ AsbBstCreateFromBankJob(銀行端)→ AsbBstCreateResultJob(60 次快輪詢 + 慢輪詢)→ AsbBstDepositJob(到賬)
出金:moomoo 端:AsbBstTransfer(輪詢 10 次)→ 超時需人工確認 | 銀行端:SyncAsbBstWithdraw(每分鐘拉取)→ 創建出金任務
招行 / 民生任務
| 服務名 | 銀行 | 職責 |
|---|---|---|
cmb_stock_trans | 招行 | 銀證轉賬服務,Socket 二進制通信 |
ms_stock_bank_transaction | 民生 | 銀證轉賬服務,Socket XML 文本通信 |
招行/民生採用實時雙向 Socket,不需要輪詢任務——銀行處理完成後通過同一連接直接推送結果。
完整定時任務列表 → 定時任務與監控
異常場景手冊
授權異常(5 類)
| # | 異常 | 症狀 | 原因 | 處理 |
|---|---|---|---|---|
| 1 | 授權超時 | Mandate 停在 PendingAuthorise 狀態 | 銀行處理延遲或通信中斷 | 等待 + 人工查詢銀行側狀態 |
| 2 | 授權失敗 | Mandate 變為 RejectAuthorise | 用戶信息校驗不通過 / 銀行側風控 | 排查失敗原因,引導用戶重新發起 |
| 3 | 授權解除 | Mandate 變為 Revoked | 用戶發起解除授權 | 確認用戶意圖,必要時重新授權 |
| 4 | 部分市場授權失敗 | 3 個市場中部分綁定成功 | 某個市場的銀證配置異常 | 檢查失敗市場的配置,手動補充綁定 |
| 5 | 銀行端解除未同步 | 銀行側已解除但 moomoo 仍顯示 Authorised | 同步延遲或回調丟失 | 手動同步 Mandate 狀態 |
入金異常(7 類)
| # | 異常 | 症狀 | 原因 | 處理 |
|---|---|---|---|---|
| 1 | 指令創建失敗 | AsbBstCreateJob 報錯 | 參數異常 / Mandate 非 Authorised | 檢查 Mandate 狀態和請求參數 |
| 2 | 輪詢超時 | 60 次輪詢後仍為 PENDING | 銀行處理異常 | 人工查詢銀行側狀態 |
| 3 | 入金失敗 | 狀態變為 FAILED | 銀行拒絕(餘額不足/限額等) | 查看銀行返回的錯誤碼 |
| 4 | 入金退款 | 狀態變為 REFUNDED | 銀行發起退款 | 沖正已入賬資金,通知用戶 |
| 5 | 銀行端入金未同步 | source=2 入金 moomoo 未收到 | 回調丟失 | 手動查詢天星 API 補錄 |
| 6 | 金額不一致 | 到賬金額與請求金額不符 | 銀行側扣費或匯率差異 | 核對銀行側交易明細 |
| 7 | 重複入金 | 同一筆入金創建了多條記錄 | 去重機制失效 | 檢查 procedure_id/request_id/bank_ref_id |
出金異常(5 類)
| # | 異常 | 症狀 | 原因 | 處理 |
|---|---|---|---|---|
| 1 | 出金指令失敗 | AsbBstTransfer 報錯 | 參數異常 / 銀行拒絕 | 檢查錯誤碼,釋放凍結資金 |
| 2 | 輪詢超時 | 10 次輪詢後仍 PENDING | 銀行處理異常 | 人工查詢銀行側狀態 |
| 3 | 凍結未釋放 | 出金失敗但資金仍凍結 | 釋放流程異常 | 手動釋放凍結 |
| 4 | 銀行端出金未同步 | 用戶從銀行端發起出金但 moomoo 未扣款 | 回調丟失 | 手動查詢天星 API,執行扣款 |
| 5 | 部分出金 | 銀行只轉了部分金額 | 銀行側限額或餘額不足 | 核對金額差異,處理剩餘部分 |
監控告警
天星 13 項告警
| # | 告警項 | 觸發條件 | 嚴重度 | 處理方式 |
|---|---|---|---|---|
| 1 | 授權創建超時 | Mandate 在 PendingAuthorise 超過閾值 | 高 | 檢查天星 API 連通性 |
| 2 | 授權失敗率突增 | 單位時間內 RejectAuthorise 數量超限 | 高 | 排查銀行側異常 |
| 3 | 入金創建失敗 | AsbBstCreateJob 連續失敗 | 高 | 檢查請求參數和 API 狀態 |
| 4 | 入金輪詢超時 | AsbBstCreateResultJob 進入慢輪詢仍無終態 | 高 | 人工查詢銀行側狀態 |
| 5 | 入金退款 | 收到 REFUNDED 狀態 | 高 | 立即沖正,通知用戶 |
| 6 | 出金輪詢超時 | AsbBstTransfer 10 次用盡 | 高 | 人工確認銀行側狀態 |
| 7 | 銀行端出金拉取異常 | SyncAsbBstWithdraw cron 報錯 | 嚴重 | 檢查天星 API 連通性 |
| 8 | 凍結未釋放 | 出金失敗但凍結未回滾 | 嚴重 | 手動釋放凍結 |
| 9 | 每日熔斷觸發 | 當日累計金額達到 stop 閾值 | 中 | 運營確認後決定是否恢復 |
| 10 | 累計報警觸發 | 累計金額達到 alarm 閾值 | 中 | 運營關注,評估風險 |
| 11 | 重複交易檢測 | procedure_id/request_id 重複 | 高 | 檢查去重邏輯 |
| 12 | API 連通性異常 | 天星 API 響應超時或錯誤率升高 | 嚴重 | 聯繫天星銀行技術支持 |
| 13 | 銀行端發起量異常 | source=2 交易量突增 | 中 | 排查是否為正常業務波動 |
錯誤碼
錯誤碼體系
天星錯誤碼按操作類型劃分前綴,而非按業務領域:
| 錯誤碼前綴 | 操作類型 | 說明 |
|---|---|---|
| 14060xxxx | 創建授權 | 富途發起 Mandate 創建時的錯誤 |
| 14061xxxx | 取消授權 | 富途發起取消 Mandate 的錯誤 |
| 14062xxxx | 查詢授權 | 富途查詢 Mandate 狀態的錯誤 |
| 14063xxxx | 富途發起轉賬 | 富途發起入金/出金轉賬的錯誤 |
| 14064xxxx | 查詢轉賬 | 富途查詢轉賬狀態的錯誤 |
| 14067xxxx | 銀行發起轉賬 | 銀行端發起轉賬時 moomoo 側校驗錯誤 |
| 14072xxxx | 通知轉賬結果 | 銀行通知轉賬結果時的錯誤 |
| 14073xxxx | 通知授權結果 | 銀行通知授權結果時的錯誤 |
招行/民生的錯誤碼
招行和民生通過 Socket 回調返回結果碼(0/-5/-6),沒有獨立的錯誤碼系列。詳細的回調處理邏輯見 出金數據字典 § 銀行回調結果碼。
BST 通道對比
天星 vs 招行/民生
| 對比維度 | 天星(Airstar) | 招行 / 民生 |
|---|---|---|
| 協議 | REST API(HTTP + JSON) | Socket 二進制協議 |
| 編碼 | UTF-8 | GB18030 |
| 發起方 | moomoo + 銀行雙向 | 招行雙向 / 民生僅銀行端 |
| 授權模型 | Mandate(6 狀態) | 銀證簽約(2 狀態) |
| 多市場映射 | 一次授權 → 3 市場自動映射 | 每市場單獨簽約 |
| 核心標識 | mandate_id | 銀行卡號 |
| 結果獲取 | 輪詢(polling) | 實時推送(Socket 回調) |
| 入金狀態 | NEW/PENDING/SUCCESS/FAILED/REFUNDED | 成功/失敗 |
| 出金狀態 | NEW/PENDING/SUCCESS/FAILED | 0(成功)/-5(超時)/-6(拒絕) |
| 入金輪詢 | 60 次快輪詢 + 慢輪詢 | 無需輪詢 |
| 出金輪詢 | 10 次 | 無需輪詢 |
| 退款機制 | 支持 REFUNDED 狀態 | 無 |
| 線上開戶 | 支持三合一 | 不支持 |
| 錯誤碼 | 按操作類型劃分(14060~14073 系列) | 0 / -5 / -6 |
BST vs 其他出金通道
| 對比維度 | BST 銀證 | 網銀(匯豐/恒生) | FPS | 傳統通道 |
|---|---|---|---|---|
| 自動化 | 全自動(唯一) | 半自動 | 半自動 | 人工 |
| 到賬速度 | 秒~分鐘 | 分鐘~小時 | 分鐘級 | 小時~天 |
| 協議複雜度 | 高(Socket/API) | 低(企業網銀) | 中(FPS API) | 低(網銀/電匯) |
| 運營介入 | 僅異常時 | Confirm 步驟 | Confirm 步驟 | 全程介入 |
| 適用銀行 | 招行/民生/天星 | 匯豐/恒生 | 中銀/渣打/廣發 | 所有銀行 |
| 限額控制 | 三層限額體系 | 銀行側限額 | FPS 系統限額 | 各銀行不同 |
讀完之後
| 我想... | 去看 |
|---|---|
| 深入了解招行的 Socket 二進制協議 | 招商銀行 CMB |
| 深入了解民生的 XML 文本協議 | 民生銀行 MS |
| 深入了解天星的 REST API + RSA-OAEP | 天星銀行 Airstar |
| 看 BST 在出金體系中的角色 | 出金方式總覽 |
| 看自動出金的 6 個條件和三層限額 | 出金規則手冊 |
| 查 Mandate 狀態碼和天星錯誤碼 | 統一錯誤碼中心 |
| 看 BST 任務的運行頻率和告警 | 定時任務與監控 |
| 看其他銀行的接入方式 | 銀行能力矩陣 |