出金規則手冊
本頁說明
講什麼:所有影響出金行為的規則——每條都寫清楚:是什麼、為什麼存在、需求變更時改哪裡 適合誰:需要知道"這個規則能不能改、怎麼改"的產品經理 前置閱讀:出金方式總覽預計閱讀:5 分鐘 負責人:出金產品經理
核心要點:出金規則分為審批模板(6 種)、高風險判定(6 因子)、自動出金條件(6 項)、三層限額體系四大類——每條規則都標註了配置位置和變更方式。
審批模板
是什麼:系統根據出金來源和風險判定,為每筆出金任務選擇一套審批模板。模板決定了這筆出金要走幾步審批。
| 模板 Key | 審批步驟 | 適用場景 | 觸發來源 |
|---|---|---|---|
withdraw_default | Confirm → Remittance | 普通出金 | 用戶 App 發起 |
withdraw_unusual | Audit → Confirm → Remittance | 普通賬戶異常出金 | HighRiskCheck 升級 |
withdraw_om | Confirm → Remittance | OM(Omnibus)賬戶出金 | OM 子賬戶發起 |
withdraw_om_unusual | Audit → Confirm → Remittance | OM 賬戶異常出金 | HighRiskCheck 升級 |
fund | Confirm → Remittance | 現金寶/基金贖回出金 | 現金寶贖回/基金贖回回調 |
fund_unusual | Audit → Confirm → Remittance | 現金寶/基金贖回異常出金 | HighRiskCheck 升級 |
為什麼:大部分出金走 2 步(Confirm → Remittance)。只有被標記為異常(unusual)的出金才多一步 Audit——不限於 OM 賬戶,普通賬戶和基金贖回也可能觸發。
注意:任務創建時默認是 default/om/fund 模板。HighRiskCheck 執行後才可能升級為對應的 unusual 模板。在 HighRiskCheck 完成之前,用戶看到的是"處理中"。
如果需求變更:修改審批模板
代碼位置:withdraw/src/app/Business/Task.php → $stepTemplates 數組
常見變更場景:
- 新增一種模板(如 VIP 用戶免 Confirm)→ 新增模板 key + Step 數組
- 去掉 OM 的區分 → 合併
withdraw_om和withdraw_default - 給某種模板增加新步驟 → 新建 Step 類(實現
IFStep接口),加到模板數組中
審批步驟與權限
是什麼:每筆出金最多經過三個審批步驟,每步需要不同的 CRM 權限:
| 步驟 | 英文 | 權限代碼 | 何時需要 |
|---|---|---|---|
| Step 1 | Audit | PERMISSION_CASH_TASKS_OUT_AUDIT | 僅 unusual 模板 |
| Step 2 | Confirm | PERMISSION_CASH_TASKS_OUT_CONFIRM | 所有出金 |
| Step 3 | Remittance | PERMISSION_CASH_TASKS_OUT_REMIT | 所有出金 |
為什麼:出金是資金流出,風險比入金高。錯誤入金可以沖正(錢在自己賬戶裡),錯誤出金一旦匯出很難追回。多層確認是安全閥。
高風險判定(6 因子)
是什麼:出金任務創建後,隊列事件 HighRiskCheck 自動執行 6 因子檢測。用位掩碼(bitmask) 計算風險值,每個因子佔一個 bit:
| 因子 | 檢測內容 | 命中後果 |
|---|---|---|
| HIGH_RISK_USER | 用戶風險等級 = 3 | 觸發 Audit |
| HIGH_RISK_AREA | 收款銀行在高風險地區(含 PR、CN) | 觸發 Audit |
| HIGH_RISK_FREQUENCY | 同時間點 ≥10 筆出金 | 僅記錄 |
| HIGH_RISK_AMOUNT | 金額超過 max_amount(僅 BST) | 僅記錄 |
| HIGH_RISK_FRAUDULENT | 反欺詐檢測不通過 | 觸發 Audit |
| HIGH_RISK_SWIFT | SWIFT Code 在風險名單 | 觸發 Audit |
位掩碼技術細節
任務表的 high_risk 欄位用位掩碼存儲:USER=1, AREA=2, FREQUENCY=4, AMOUNT=8, FRAUDULENT=16, SWIFT=32。例如 high_risk = 3 表示同時命中了 USER(1) 和 AREA(2)。
為什麼 FREQUENCY 和 AMOUNT 不觸發 Audit:這兩個因子已經有獨立的安全機制控制(每日 10 筆上限、三層限額體系),不需要再增加人工審核環節。
如果需求變更:調整高風險規則
代碼位置:
- 風險計算:
withdraw/src/app/Business/HighRisk/HighRiskBiz.php→ 各checkHighRisk*()方法 - Audit 判定:
withdraw/src/app/Business/Event/HighRiskCheck.php→needAudit()方法
常見變更場景:
- 新增觸發 Audit 的因子 → 在
needAudit()中添加 bit 判斷 - 修改高風險國家列表 → 調整 API 接口返回的國家清單(每 5 分鐘更新一次)
- 讓 FREQUENCY 也觸發 Audit → 在
needAudit()中添加HIGH_RISK_FREQUENCY判斷 - CN(大陸)不再算高風險地區 → 從
HIGH_RISK_AREA的硬編碼國家列表中移除
月度複查流程
除了實時的 6 因子檢測,高風險客戶還需要月度複查:
| 步驟 | 操作 | 負責人 | 截止時間 |
|---|---|---|---|
| 1 | 導出上月所有 high_risk ≠ 0 的出金任務清單 | 出金運營 | 每月 5 日前 |
| 2 | 審閱交易記錄,重點關注以下可疑模式 | 出金運營 | 每月 10 日前 |
| 3 | 可疑記錄整理成報告,上報合規團隊 | 出金運營 | 發現後 2 個工作日內 |
| 4 | 合規團隊評估是否升級為 SAR(可疑交易報告) | 合規團隊 | 收到後 5 個工作日內 |
可疑交易模式參考:
- 同一用戶短期內頻繁大額出金(日均金額突增 3 倍以上)
- 出金目的地頻繁變更(短期內切換多張不同銀行卡)
- 入金後快速出金(入金到出金間隔 < 24 小時且金額接近)
- 出金目的地為高風險地區(AREA 因子命中)且金額異常
自動出金條件
是什麼:在 Remittance 步驟,BST 通道檢查 6 個條件。全部通過才全自動出金,任何一個不通過就降級為人工審批:
| # | 條件 | 說明 |
|---|---|---|
| 1 | 通道是 auto_bs | 只有 BST 支持全自動 |
| 2 | 非遷移數據 | 排除舊系統遷移的歷史數據 |
| 3 | 自動出金開關開啟 | auto_settings.status 按幣種獨立控制 |
| 4 | 金額在限額內 | 天星 HKD ≤ 300 萬 / USD ≤ 50 萬 |
| 5 | 餘額充足 | 可用餘額 ≥ 出金金額 |
| 6 | 每日不超 10 筆 | 同用戶當日計數 ≥ 10 筆時降級人工,防止批量異常 |
為什麼:這 6 個條件是安全閥,不是攔截器。不滿足 ≠ 出金失敗,只是降級為人工——運營確認後仍然可以執行。與入金的 5 個自動入賬條件邏輯一致。
條件 4 只是三層限額的第一層
即使單筆通過(條件 4),當日累計達到第三層(每日熔斷)時,後續出金也會降級為人工——這不是條件 6 的"10 筆"限制,而是金額維度的熔斷。詳見下節。
三層限額體系
是什麼:BST 銀證通道採用三層限額控制,從單筆到全局逐層收緊:
| 層級 | 名稱 | 作用 | 觸發後行為 |
|---|---|---|---|
| 第一層 | 單筆上限(max) | 單筆出入金金額上限 | 超限直接拒絕 |
| 第二層 | 累計報警(alarm) | 一段時間內累計金額達到報警閾值 | 觸發飛書告警,不阻斷交易 |
| 第三層 | 每日熔斷(stop) | 單日累計金額達到熔斷線 | 當日自動出金關閉,需人工處理 |
天星限額(已知值)
| 幣種 | 單筆上限 | 累計報警 | 每日熔斷 |
|---|---|---|---|
| HKD | 300 萬 | 4,000 萬 | 1,500 萬 |
| USD | 50 萬 | 1,000 萬 | 300 萬 |
天星線上開戶最低入金限額
| 幣種 | 最低入金 |
|---|---|
| HKD | 1 萬 |
| USD | 1,500 |
| CNH | 1 萬 |
招行 / 民生限額
招行和民生的三層限額值從 auto_settings 表運行時維護,此處列出運營操作規則:
| 規則 | 說明 |
|---|---|
| 大額雙人審批 | 單筆 HKD ≥ 300 萬 / USD ≥ 50 萬 時,需 2 位運營人員 點"處理"確認 |
| 通知會計 | 大額出金確認後需同步通知會計團隊 |
| 查詢當前值 | SELECT * FROM auto_settings WHERE id IN (1, 2);(id=1 民生,id=2 招行) |
天星限額數據需確認
源文檔(資金相關配置.xlsx)中天星大額閾值顯示為 HKD 800 萬 / USD 200 萬 / CNH 800 萬,與當前文檔記載的 HKD 300 萬 / USD 50 萬 存在差異。可能原因:xlsx 為產品規劃值,當前值為線上配置。請與技術確認後更新。
為什麼:三層設計平衡了效率和安全——小額全自動、中額提醒、大額熔斷。比簡單的"超限拒絕"更靈活。
自動出金配置(auto_settings)
是什麼:auto_settings 表為每家 BST 銀行(招行 id=2、民生 id=1、天星 id=3)、每個幣種維護獨立的自動出金配置。
每個幣種有 6 個欄位(前綴 hk_ / us_ / cn_ 分別對應 HKD / USD / CNH):
| 欄位 | 含義 | 示例值 |
|---|---|---|
{prefix}status | 開關:OPEN(1) / CLOSE(0) | 1 |
{prefix}amount | 當前自動出金餘額(系統內部賬本) | 5,000,000 |
{prefix}max_amount | 單筆上限(第一層) | 3,000,000 |
{prefix}alarm_amount | 餘額報警閾值(第二層) | 40,000,000 |
{prefix}stop_amount | 餘額熔斷閾值(第三層) | 15,000,000 |
{prefix}alarm_time | 上次告警時間 | 2026-04-28 10:00:00 |
自動關閉機制
每筆自動出金執行時,系統從 amount 中扣減出金金額。當餘額低於閾值:
- 低於 alarm_amount → 發飛書告警通知運營("自動出金餘額不足")
- 低於 stop_amount → 自動關閉該幣種的自動出金開關,後續出金全部降級為人工
重要:餘額扣減發生在銀行實際轉賬之前。即使銀行後來拒絕了轉賬,餘額已經被扣減。需運營手動調整恢復。
運維操作
| 操作 | 方法 |
|---|---|
| 查看餘額 | 查詢 auto_settings 表對應銀行和幣種的 {prefix}amount |
| 充值 | 更新 {prefix}amount(增加金額),同時確保 {prefix}status = 1 |
| 緊急關閉 | 將 {prefix}status 設為 0,所有該幣種的 BST 出金立即降級為人工 |
| 調整限額 | 更新 {prefix}max_amount、{prefix}alarm_amount、{prefix}stop_amount |
如果需求變更
- 修改單筆上限 → 更新
auto_settings表的{prefix}max_amount欄位 - 新增 JPY/SGD 自動出金 → 需要在
withdraw/src/app/Business/AutoSetting.php中添加新的前綴映射
費用規則
是什麼:出金手續費按銀行卡所在地和幣種計算。
| 銀行卡所在地 | HKD | USD | CNH |
|---|---|---|---|
| 香港 | 免費 | 免費 | 免費 |
| 中國大陸 | 不支持 | ||
| 美國 | |||
| 其他地區 |
當前全部免費
代碼中定義了跨境出金的費用(HKD 105、USD 15、CNH 105),但最後一行 $fee = 0 強制將所有費用設為 0。即當前所有出金免手續費。
通道附加費用
雖然出金手續費全免,但部分通道有銀行側費用:
| 通道 | 費用 | 承擔方 | 說明 |
|---|---|---|---|
| CHATS/RTGS | USD $8 / HKD $25 / CNY $25 | 用戶 | 用戶確認出金時彈窗提示 |
| FPS | 2.5 HKD/筆 | 富途 | 富途承擔,用戶不感知 |
| 跨境電匯 | 中轉行扣費(不可控) | 用戶 | 到賬金額可能少於申請金額 |
特殊限制:
- Velo 銀行:不支持提取港幣和離岸人民幣到 Velo 賬戶(僅支持 USD)
- 大陸銀行卡 + CNH:用戶端不允許提取離岸人民幣到大陸銀行卡,但 CRM 端不受此限制
如果需求變更:調整費用
代碼位置:withdraw/src/app/Business/CreatorBase.php → getFee() 方法
- 恢復跨境收費 → 刪除末尾的
$fee = 0 - 修改費率 → 修改
switch語句中的費用常量 - 新增幣種費用 → 在
switch中添加 case(如 JPY、SGD) - 某銀行免費優惠 → 在
getFee()開頭添加銀行判斷分支
處理時段
是什麼:自動出金不是 7×24 運行的,只在銀行的處理時段內執行:
| 通道 | 自動處理時段 | 非工作時段行為 |
|---|---|---|
| BST(招行) | 交易日 08:40 ~ 15:59(HKD/USD);08:40 ~ 10:59(CNH / 保證金) | 排隊等待下一交易日 |
| BST(民生) | 交易日 08:40 ~ 15:59(HKD/USD);CNH 不走 BST(人工選通道) | 排隊等待下一交易日 |
| BST(天星) | 見下方詳細表格 | 排隊等待下一交易日 |
| 網銀(匯豐/恒生) | 工作日 09:00 ~ 16:00 | 需人工次日處理 |
| FPS | 7×24 小時 | 全天候(但運營審批仍需工作日) |
天星 BST 詳細服務時段
天星的服務時段按融資/非融資和全日市/半日市四維度區分:
| 市場類型 | 賬戶類型 | 發起時段 | 自動出金 | 大額判定 | 預計到賬 |
|---|---|---|---|---|---|
| 全日市 | 融資 | 交易日 09:00~10:55 | 自動 | — | 5 分鐘內 |
| 融資 | 交易日 09:00~10:55 | 非自動 | HKD > 800 萬 / USD > 200 萬 | DD+1 15:55 前 | |
| 融資 | 交易日 09:00~10:55 | 非自動 | ≤ 大額閾值 | 當日 15:55 前 | |
| 融資 | 其他時間 | 自動 | — | DD+1 09:00 前 | |
| 融資 | 其他時間 | 非自動 | — | DD+1 15:55 前 | |
| 非融資 | 交易日 09:00~15:55 | 自動 | — | 5 分鐘內 | |
| 非融資 | 交易日 09:00~15:55 | 非自動 | HKD > 800 萬 / USD > 200 萬 | DD+1 15:55 前 | |
| 非融資 | 交易日 09:00~15:55 | 非自動 | ≤ 大額閾值 | 當日 15:55 前 | |
| 非融資 | 交易日 00:00~09:00 | 自動 | — | 當日 09:05 前 | |
| 非融資 | 其他時間 | 自動 | — | DD+1 09:00 前 | |
| 半日市 | 融資 | 交易日 09:00~10:00 | 自動 | — | 5 分鐘內 |
| 融資 | 交易日 09:00~10:00 | 非自動 | HKD > 800 萬 / USD > 200 萬 | DD+1 15:55 前 | |
| 融資 | 交易日 09:00~10:00 | 非自動 | ≤ 大額閾值 | 當日 12:00 前 | |
| 非融資 | 交易日 09:00~11:55 | 自動 | — | 5 分鐘內 | |
| 非融資 | 交易日 09:00~11:55 | 非自動 | HKD > 800 萬 / USD > 200 萬 | DD+1 15:55 前 | |
| 非融資 | 交易日 09:00~11:55 | 非自動 | ≤ 大額閾值 | 當日 12:00 前 |
通俗理解
- 融資賬戶窗口更短——因為融資出金涉及保證金計算,必須在清算前完成,所以提前截止(全日市 10:55 vs 非融資 15:55)
- 半日市所有截止時間提前——交易所中午收盤,清算跟著提前(非自動到賬截止從 15:55 縮到 12:00)
- 非交易日不處理任何天星出金——週末/公眾假期提交的出金排到下一個交易日
- DD = 下一個交易日(非日曆日),如週五提交可能到週一才處理
為什麼:即使 6 個自動出金條件全部滿足,如果提交時間在非處理時段,出金也會排隊等待。用戶看到的是"處理中"。
交易日 ≠ 工作日
BST 的處理時段以港交所交易日為準。非交易日(週末、公眾假期)的出金排隊到下一個交易日處理。
凍結類型
是什麼:用戶賬戶上的凍結標記會限制出金。4 種凍結類型:
| 代碼 | 含義 | 對出金的影響 |
|---|---|---|
| 1 | 貨幣兌換凍結 | 凍結金額不可出金 |
| 2 | 出金凍結 | 直接限制出金 |
| 6 | 現金寶基金凍結 | 凍結金額不可出金 |
| 7 | 融資出金凍結 | 融資相關資金凍結 |
防重複機制
是什麼:BST 通道使用三重標識防止重複出入金:
| 標識 | 來源 | 作用 |
|---|---|---|
procedure_id | SBA 編排系統 | moomoo 側唯一流水號 |
request_id | 出入金服務 | 請求維度去重 |
bank_ref_id | 銀行返回 | 銀行側唯一流水號 |
系統在創建指令時檢查三個標識的組合唯一性。檢測到重複時拒絕創建新指令,返回已有指令的狀態。
處理時效參考
| 通道 | 最快 | 典型 | 最慢 |
|---|---|---|---|
| BST 銀證 | 秒級 | 數分鐘 | 下一交易日 |
| 網銀(匯豐/恒生) | 分鐘級 | ~30 分鐘 | 數小時 |
| FPS(中銀/渣打/廣發) | 分鐘級 | ~10 分鐘 | 小時級 |
| 中銀同行 / 工銀手工 | 小時級 | 數小時 | 當日 |
| CHATS/RTGS | 小時級 | 數小時 | 當日 |
| 跨境電匯 / EWB | 1 天 | 2~3 天 | 3~5 天 |
| 支票 | 2 天 | 3~5 天 | 5+ 天 |
常見誤解
| 誤解 | 事實 |
|---|---|
| "自動出金條件不滿足 = 出金失敗" | 不是失敗,只是降級為人工模式。運營確認後仍然可以正常執行出金 |
| "三層限額是三道牆,每層都攔截" | 不是。第一層(單筆上限)超限才拒絕,第二層(累計報警)只發飛書告警不阻斷交易,第三層(每日熔斷)才關閉自動出金 |
| "高風險 = 出金被拒絕" | 高風險只是多一步 Audit 審核(模板從 default 升級為 unusual)。審核通過後出金正常進行 |
| "改了 auto_settings 的 max_amount 就完事了" | 改單筆上限時必須同步評估 alarm_amount 和 stop_amount。如果單筆上限調高但熔斷不調,幾筆大額出金就可能觸發熔斷關閉自動出金 |
讀完之後
| 我想... | 去看 |
|---|---|
| 理解一筆出金端到端怎麼走的 | 出金生命週期 |
| 看某種通道的執行細節 | 通道執行手冊 |
| 推動一個出金規則變更 | 出金變更指南 |
| 查某個狀態碼的具體數字 | 出金數據字典 |