退款與沖正
本頁說明
講什麼:入金系統中三種退款/沖正機制的產品邏輯——什麼時候用哪種、系統做了什麼、失敗了怎麼辦 適合誰:需要理解退款全貌的產品經理 前置閱讀:入金方式總覽、入金規則速查預計閱讀:8 分鐘 負責人:入金產品經理
核心要點:入金系統有三種反向操作——任務沖正(已入賬資金扣回)、流水退款(僅標記不動賬)、BST 銀行退款(天星獨有),使用場景和系統行為完全不同。
快速跳轉 — 你可能想做的事:
- 收到退款需求,不確定走哪條路?→ 退款決策樹
- 想了解三種機制的區別?→ 三種退款機制對比
- 沖正失敗了怎麼辦?→ 退款失敗與恢復
- 想看運營怎麼操作?→ 沖正操作手冊
- 想改沖正流程?→ 入金變更指南 § 修改沖正流程
- 想查沖正相關的狀態碼?→ 入金規則速查 § 沖正參考數據
三種退款機制對比
入金系統有三種"已完成交易的反向操作",雖然用戶側看起來都是"錢退回來了",但系統行為完全不同:
| 任務沖正(Task Reversal) | 流水退款(Flow Refund) | BST 銀行退款(REFUNDED) | |
|---|---|---|---|
| 一句話 | 已入賬的錢從證券帳戶扣回 | 標記銀行流水為"已退款",不動證券帳戶 | 天星銀行主動退回已入賬資金 |
| 觸發方 | 運營主動發起 | 運營主動發起 | 銀行自動觸發 |
| 資金影響 | 有 — SBA 從證券帳戶扣款 | 無 — 僅標記流水狀態 | 有 — 系統自動執行 SBA 扣款 |
| 前置狀態 | Apply.status = 2(已完成) | Flow.status = 0(待處理) | 入金已完成 |
| 結果狀態 | Apply.status = 5, Task.status = REVERSE | Flow.result = 3(RESULT_REFUND) | 入金記錄標記 REFUNDED |
| 權限要求 | CASH_IN_TASK_REVERSE | CASH_IN_FLOW_HANDLE | 系統自動,無需權限 |
| 是否可撤銷 | 不可撤銷 | 不可撤銷 | 不可撤銷 |
| API 入口 | /deposit/reverse | /flow/refund、/flow/refund-batch | 天星 API 回調 |
| 適用場景 | 銀行 chargeback、錯誤入賬、風控攔截 | 流水無法匹配且需退回銀行、錯誤流水清理 | 天星 BST 獨有——銀行事後合規退款 |
| 涉及銀行 | 所有 | 所有 | 僅天星 |
核心區別
任務沖正動真金白銀(從證券帳戶扣款);流水退款只是標記流水狀態,證券帳戶餘額不變。搞混這兩種操作會導致資金差異——如果本該做任務沖正卻只做了流水退款,用戶證券帳戶裡的錢不會被扣回。
任務沖正(Task Reversal)
任務沖正是最"重"的退款操作——它會把已經入賬到用戶證券帳戶的資金扣回。
狀態流轉
系統執行步驟
當運營點擊「沖正」後,系統依次執行:
- 狀態校驗:確認 Apply.status = 2(已完成)且非處理中
- SBA 反向編排:調用
turnAround('CashDepositReverse', ...)從證券帳戶扣回資金 - 狀態更新:Apply.status → 5(已沖正),Task.status → REVERSE
- 銀行卡解綁:如果是通過綁卡入金的(
notice_type = BIND_CARD),自動解綁該銀行卡 - 通知用戶:發送沖正通知(App 推送 + 消息中心)
前置條件
| 條件 | 說明 |
|---|---|
| 申請狀態 = 已完成(2) | 只有已完成的入金才能沖正。處理中(1)的不允許 |
權限 CASH_IN_TASK_REVERSE | 操作人必須有沖正權限 |
| 證券帳戶餘額充足 | 沖正需要從帳戶扣款,餘額不足會導致 SBA Procedure 失敗 |
SBA 反向編排
任務沖正的核心是 SBA(Server Bank Account)的反向 Procedure。系統先檢查原入金的 SBA Procedure 狀態是否為 PROCEDURE_STATUS_END_OK(即原入金確實成功了),然後調用 turnAround 執行反向操作。
反向操作的本質:把原入金 Procedure 的每一步倒過來執行——原來是"公司帳戶 → 證券帳戶"的資金劃轉,反向就是"證券帳戶 → 公司帳戶"。
代碼位置
- 任務沖正入口:
deposit/src/app/Business/Deposit.php:877-935—reverse()方法 - SBA 反向調用:
deposit/src/app/Business/SOA/SBA/Deposit.php:309—turnAround('CashDepositReverse', ...) - 沖正中間件:
deposit/src/app/Business/Tasks/Deposit.php:276-287—reverseMiddleware() - Apply 狀態常量:
deposit/src/app/Business/Apply.php—STATUS_REVERSE = 5 - Task 狀態常量:
deposit/src/app/Classes/Task/Status.php—REVERSE = 5 - API 入口:
DepositController::reverseAction()—/deposit/reverse - 批量沖正:
DepositController::batchAction()—/deposit/batchwith action=reverse
流水退款(Flow Refund)
流水退款比任務沖正"輕"得多——它只標記銀行流水的處置結果為「退款」,不影響證券帳戶餘額。
什麼時候用流水退款
- 銀行流水到了系統,但無法匹配到任何入金申請,且確認需要退回銀行
- 銀行流水匹配錯誤(匹配到了錯誤的用戶),需要先退款再重新處理
- 流水本身有問題(重複流水、測試流水等),需要清理
狀態流轉
三種操作入口
| 操作 | API 入口 | 場景 |
|---|---|---|
| 單筆退款 | /flow/refund | 對單條流水標記退款 |
| 批量退款 | /flow/refund-batch | 批量標記多條流水為退款 |
| 解鎖退款 | /flow/unlock with is_refund=1 | 先解鎖被鎖定的流水,同時標記退款 |
流水退款 vs 任務沖正
| 維度 | 流水退款 | 任務沖正 |
|---|---|---|
| 操作對象 | 銀行流水(Flow) | 入金任務(Task/Apply) |
| 前提 | 流水處於待處理狀態 | 入金已完成(資金已到證券帳戶) |
| 資金變動 | 無 | 有(從證券帳戶扣回) |
| 影響範圍 | 僅標記流水 | 更新 Apply + Task + SBA + 可能解綁銀行卡 |
| 使用頻率 | 較高(日常流水清理) | 較低(異常情況才用) |
| 風險等級 | 低 | 高 |
代碼位置
- 流水退款入口:
deposit/src/app/Business/BankFlow.php:674-724—refund()方法 - 解鎖退款:
deposit/src/app/Business/BankFlow.php:1639-1695—unlock()with is_refund - 退款結果常量:
deposit/src/app/Business/BankFlow.php—RESULT_REFUND = 3 - API 入口:
FlowController::refund()、FlowController::refundBatch()
BST 銀行退款(REFUNDED)
這是天星 BST 獨有的異常狀態——招行和民生的 BST 沒有退款機制。
觸發條件
- 銀行側事後發現交易異常(合規問題),主動發起退款
- 銀行風控系統事後攔截
系統行為
REFUNDED vs FAILED
| REFUNDED | FAILED | |
|---|---|---|
| 資金狀態 | 入金已成功,銀行事後退回 | 銀行拒絕入金,資金從未到賬 |
| 系統影響 | 需執行沖正(SBA 反向扣款) | 無需沖正,直接標記失敗 |
| 複雜度 | 高——已入賬資金可能已被用戶交易 | 低——只需更新狀態 |
| 運營介入 | 必須——確認退款原因、通知用戶 | 通常不需要 |
退款決策樹
收到退款/沖正需求時,按以下路徑判斷該走哪條操作:
關鍵判斷:
- 資金是否已到證券帳戶 — 已到賬用任務沖正,未到賬用流水退款
- 誰發起的 — 運營主動走手工沖正,銀行自動走系統處理
- 餘額是否充足 — 不足時需要先協調(用戶可能已用資金交易)
CRM 退款管理流程
當退款需求通過客服渠道進入時,走 CRM 退款管理模組的三階段流程。CRM 是退款的"入口"——它管理審批流程,確定走哪種退款路徑後,最終執行的還是上面介紹的三種機制之一。
| 階段 | 負責團隊 | 關鍵動作 | SLA |
|---|---|---|---|
| 登記 | 客服 | 記錄用戶投訴、填寫退款原因、關聯入金記錄 | 當日 |
| 審核 | 業務運營 | 核實退款依據、確認走沖正還是流水退款、評估餘額影響 | 1 工作日 |
| 處理 | 財務 | 執行系統操作(沖正/流水退款)、確認銀行側資金回退 | 1~3 工作日 |
CRM 不直接操作資金
CRM 退款管理模組只管理審批流程,不直接操作證券帳戶餘額或銀行資金。所有實際的資金操作都通過 SBA Procedure 執行。
退款失敗與恢復
SBA Procedure 執行失敗
症狀:沖正操作發起後,Apply 狀態未變為 5,SBA 日誌顯示 Procedure 失敗。
可能原因:
| 原因 | 表現 | 處理方式 |
|---|---|---|
| 證券帳戶餘額不足 | SBA 返回餘額不足錯誤 | 聯繫用戶補足餘額,或協調風控凍結帳戶後處理 |
| SBA 服務異常 | Procedure 超時或返回系統錯誤 | 確認 SBA 服務狀態,服務恢復後重試沖正 |
| 原入金 Procedure 狀態異常 | PROCEDURE_STATUS_END_OK 校驗不通過 | 人工核實原入金的 SBA 執行記錄,必要時走手工補償 |
餘額不足的特殊處理
這是沖正失敗最常見的原因——用戶入金後可能已經:
- 用資金買了股票(餘額被持倉佔用)
- 發起了出金(餘額在出金途中)
- 做了其他投資操作
處理路徑:
- 確認用戶當前可用餘額和持倉情況
- 如果差額不大:等待用戶賣出持倉或出金到賬後重新沖正
- 如果差額較大或緊急(如銀行 chargeback):凍結帳戶 → 聯合風控處理 → 分批沖正
- 不要嘗試部分沖正——系統不支持沖正部分金額,只能全額沖正
流水退款誤操作
症狀:運營誤將正常流水標記為退款,但該流水實際應該用於匹配入金。
處理方式:
- 流水退款標記後不可直接撤銷
- 需要在 OA 後台手動創建一條新的異常入金(DepositType = ABNORMAL),替代被誤退款的流水
- 記錄操作日誌,標註"流水退款誤操作補償"
真實案例
案例一:標準沖正 — 銀行 Chargeback
背景:用戶 A 通過 FPS 入金 HKD 100,000,入金成功。3 天後,銀行通知該筆 FPS 交易因"未授權交易"發起 chargeback。
處理過程:
- 運營收到銀行 chargeback 通知
- 在 OA 找到對應入金申請(Apply.status = 2)
- 確認用戶證券帳戶可用餘額 ≥ HKD 100,000
- 確認無在途出金任務
- 執行任務沖正 → Apply.status → 5
- SBA 執行 CashDepositReverse,從證券帳戶扣回 HKD 100,000
- 用戶收到沖正通知
結果:沖正成功,銀行卡自動解綁(因為是綁卡入金)。
案例二:餘額不足沖正 — 用戶已交易
背景:用戶 B 入金 HKD 500,000 後,買入了 HKD 450,000 的股票。隨後運營發現該筆入金為錯誤入賬(匹配到了錯誤用戶)。
處理過程:
- 嘗試沖正 → SBA 返回餘額不足(可用餘額僅 HKD 50,000,持倉佔用 HKD 450,000)
- 凍結用戶帳戶,防止進一步交易
- 聯繫用戶說明情況,要求賣出持倉
- 用戶賣出股票後,可用餘額恢復到 ≥ HKD 500,000
- 重新執行沖正 → 成功
- 將 HKD 500,000 重新入賬到正確用戶
教訓:大額入金沖正應盡快執行(發現問題後第一時間凍結帳戶),避免用戶使用資金後難以追回。
案例三:流水退款 — 無法匹配的孤立流水
背景:一條 HKD 25,000 的匯豐 MT910 流水在系統中存在超過 5 天,匹配引擎多次掃描均無法配對(無對應的入金申請)。
處理過程:
- 運營在 OA 流水列表發現該孤立流水
- 核實:無用戶提交過 HKD 25,000 的入金申請
- 聯繫銀行確認:該筆轉賬為客戶誤轉(轉錯收款帳號)
- 在 OA 對該流水執行「退款」標記 → Flow.result = 3(RESULT_REFUND)
- 銀行側安排資金退回
說明:此操作只標記流水狀態,不涉及證券帳戶資金變動。資金退回由銀行側完成。
沖正時效參考
| 操作 | 預期耗時 | 說明 |
|---|---|---|
| 任務沖正(餘額充足) | 秒級 | SBA Procedure 通常幾秒內完成 |
| 任務沖正(餘額不足) | 數小時~數天 | 取決於用戶配合釋放資金的時間 |
| 流水退款 | 即時 | 僅標記狀態,立即生效 |
| BST REFUNDED | 分鐘級 | 系統自動處理,但運營需後續跟進 |
| 銀行側資金退回 | 1~5 個工作日 | 取決於銀行處理速度和轉賬類型 |
常見誤解
| 誤解 | 事實 |
|---|---|
| "沖正和退款是一回事" | 不是。任務沖正會從證券帳戶扣款(動真金白銀),流水退款只標記流水狀態(不動證券帳戶)。混用會導致資金差異 |
| "沖正失敗了可以重試" | 可以重試,但要先排查失敗原因(通常是餘額不足)。盲目重試不會改變結果 |
| "可以沖正部分金額" | 不可以。系統只支持全額沖正——要麼全沖,要麼不沖。沒有"沖正 HKD 50,000 中的 30,000"這種操作 |
| "流水退款後資金會自動退回銀行" | 不會。流水退款只是系統內部標記,資金退回需要銀行側另行處理 |
| "所有銀行都有 REFUNDED 機制" | 不是。REFUNDED 是天星 BST 獨有的狀態,招行和民生的 BST 沒有退款機制 |
| "沖正後用戶還能看到原入金記錄" | 可以。沖正不刪除記錄,只是把狀態改為"已沖正"(5)。用戶在 App 中可以看到這條記錄及其沖正狀態 |
讀完之後
| 我想... | 去看 |
|---|---|
| 看運營怎麼操作沖正 | 沖正/退款指引 |
| 排查沖正失敗的問題 | 入金排障 § 沖正失敗 |
| 查沖正相關的狀態碼和 API | 入金規則速查 § 沖正參考數據 |
| 修改沖正流程 | 入金變更指南 § 修改沖正流程 |
| 了解入金的完整生命週期 | 入金方式總覽 |
| 了解匹配後的沖正路徑 | 匹配與自動入賬 § 匹配後路徑 |