Skip to content

eDDA 代扣入金

本頁說明

講什麼:eDDA 授權生命週期、eDDI 扣款執行流程、匯豐與恒生的協議差異、異常場景與錯誤碼 適合誰:需要理解"用戶一鍵入金"背後完整鏈路的產品經理 前置閱讀入金方式總覽預計閱讀:5 分鐘 負責人:入金產品經理

核心要點:eDDA 是授權,eDDI 是扣款——兩個分離步驟實現"用戶一鍵入金"。匯豐用 OTP 短信 + 令牌桶並發,恒生用數字證書 + 悲觀鎖串行,協議差異是兩家銀行最大的區別。


快速跳轉 — 你可能想做的事:

eDDA 與 eDDI 是什麼

eDDA(Electronic Direct Debit Authorization)和 eDDI(Electronic Direct Debit Instruction)是兩個分離的步驟:

概念全稱作用頻率
eDDA電子直接付款授權用戶授權 moomoo 從其銀行帳戶扣款一次性,授權後長期有效
eDDI電子直接付款指令moomoo 向銀行發送具體的扣款指令每次入金一次

為什麼分離:監管要求銀行在執行代扣前,必須先獲得帳戶持有人的明確授權。eDDA 解決"誰允許扣",eDDI 解決"扣多少"。

與出金無關:eDDA/eDDI 僅用於入金代扣。匯豐和恒生的出金通道是企業網銀轉賬,不是 eDDI。

PM 視角

eDDA 入金是轉化率最高的入金方式——用戶無需切換到銀行 App,在 moomoo 內一鍵完成。理解這條鏈路的每個環節,是優化入金體驗的基礎。


授權生命週期

授權狀態機

狀態碼常量含義用戶感知
3EDDA_STATUS_WAITING等待授權——申請已創建,尚未發送到銀行"授權處理中"
1EDDA_STATUS_PENDING授權中——請求已發送,等待銀行回覆"授權處理中"
2EDDA_STATUS_EFFECT授權成功——可以發起 eDDI 扣款"已授權"
0EDDA_STATUS_FAIL授權失敗——銀行拒絕顯示具體失敗原因

數據表setup_eddis,按 uid + bank_card_number 唯一標識一條授權記錄。

授權輪詢機制

授權請求發送後,銀行不會立即返回結果。系統通過 SetupEddaCheckAuthorizationJob 定時輪詢銀行授權狀態:

參數說明
輪詢間隔600 秒(10 分鐘)每次檢查一次銀行端授權狀態
最大重試~3,000 次約 20 天後停止輪詢
觸發時機用戶提交授權申請後入隊SetupEddaCheckAuthorizationJob::enqueue()
配置位置
  • 輪詢間隔:硬編碼於 SetupEddaCheckAuthorizationJob 的 enqueue delay
  • 最大重試:Job 框架的 max_attempts 配置
  • 代碼路徑:deposit/src/app/Business/Job/Deposit/SetupEddaCheckAuthorizationJob.php

授權失敗錯誤碼

銀行返回的錯誤碼存儲在 setup_eddis.error_code 字段。以下是完整的錯誤碼映射:

錯誤碼失敗原因用戶提示失敗類型
MFISAC01帳戶號碼錯誤請輸入正確的帳戶號碼eDDA 授權
MPP01005證件類型/號碼錯誤請核對證件類型和號碼eDDA 授權
MPP01006與銀行綁定手機號不一致請輸入正確的手機號eDDA 授權
MPP01007授權帳戶與姓名不匹配請核對帳戶與姓名eDDA 授權
MPP01008銀行未綁定手機號碼請聯繫銀行綁定手機號eDDA 授權
MPP01023銀行綁定手機號碼錯誤請聯繫銀行修改綁定手機號eDDA 授權
MPP02003銀行帳戶號碼錯誤請重新輸入正確的帳戶號碼eDDA 授權
MPP02011銀行帳戶號碼錯誤請重新輸入正確的帳戶號碼eDDA 授權
MPP02013銀行未綁定手機號碼請聯繫銀行綁定手機號eDDA 授權
MPP02035銀行帳戶號碼錯誤請重新輸入正確的帳戶號碼eDDA 授權
MPP02040銀行帳戶號碼錯誤請重新輸入正確的帳戶號碼eDDA 授權
MPP03001銀行帳戶類型異常請聯繫銀行處理eDDA 授權
MPP04000驗證碼無效請重新獲取eDDA 授權
MPP04003驗證碼錯誤請重新輸入eDDA 授權
MPP04004驗證碼已過期請重新獲取eDDA 授權
MPP06001銀行帳戶狀態異常請聯繫銀行處理eDDA 授權
ECH09001銀行授權失敗(通用)請確認資訊正確後重新授權eDDA 授權
配置位置

代碼路徑:deposit/src/app/Business/SetupEddi.php:91-113errorCodeMessageDict()


扣款執行流程

任務鏈

用戶發起 eDDA 入金後,系統通過異步 Job 鏈執行扣款:

步驟Job / 方法職責
1ApplyFollowJob檢查申請狀態,路由到對應銀行的 eDDI 創建邏輯
2Eddi::applyHsEddi() / Eddi::applyHsbcEddi()獲取 eDDA 授權資訊,標記 Apply 為已使用,創建扣款記錄
3SBA HsEddi/HsbcEddi.create()向 SBA 服務發送扣款 Procedure 創建請求
4HsEddiResultJob / HsbcEddiResultJob輪詢 SBA Procedure 狀態,獲取銀行處理結果
5入賬 / 失敗處理成功:寫入銀行流水 + SBA 執行入賬;失敗:更新 setup_eddis 狀態

防重複扣款機制

機制實現方式防護場景
Apply 佔用鎖Apply::setUsed() 原子更新同一申請不會被兩個 Job 同時處理
apply_id 唯一索引hsbc_eddis / hs_eddis 表的 unique index同一申請只生成一條扣款記錄
request_id 冪等SBA 端按 request_id 去重網絡重試不會導致重複扣款
SBA 創建重試HsbcEddiSBACreateRetryJob / HsEddiSBACreateRetryJobSBA 創建失敗時延遲 60 秒重試

eDDI 入金類型

eDDI 入金區分為 6 種子類型,決定入金後資金是否被凍結:

代碼常量含義資金是否凍結
1FOUNDING_AIP基金定投
2STOCK_MP股票定投
3FUND_PURCHASE購買基金
11FUND_HOLD基金定投 + 凍結
21STOCK_HOLD股票定投 + 凍結
31FUND_PURCHASE_HOLD購買基金 + 凍結

凍結的含義:代碼 11/21/31 的入金,資金到賬後會被系統凍結,預留給對應的投資操作(定投扣款、基金申購)。凍結釋放時機由投資側系統控制。

對應的 DepositType 為 NORMAL_HOLD = 11(入金類型速查 → 入金規則速查 § 入金類型)。

配置位置

代碼路徑:deposit/src/app/Common/EddiDepositType.php

  • HOLD_LIST = [11, 21, 31] — 需要凍結的類型列表
  • ALL_LIST = [1, 2, 3, 11, 21, 31] — 全部類型
如果需求變更:eDDA/eDDI 相關
變更改動位置說明
新增 eDDI 入金類型EddiDepositType.php + SBA 編排配置加枚舉值,配置是否凍結
修改扣款幣種sba_hsbc_eddi / sba_hase_eddi 請求參數當前僅支持 HKD
修改輪詢間隔sba_hsbc_eddi_worker.ini / sba_hase_eddi 配置調整 rush/normal 間隔
修改令牌桶速率(匯豐)sba_hsbc_eddi token_bucket 守護進程調整 frequency 參數
更換恒生數字證書sba_hase_eddi/conf/替換 P12 文件和密碼
新增 eDDA 支持銀行入金變更指南 § 場景八涉及商務+技術+SBA,數月週期

eDDA 支持範圍

匯豐通道支持的銀行(15 家)

通過匯豐通道發起的 eDDA,支持以下 15 家銀行的個人帳戶:

銀行銀行代碼接入日期備註
匯豐 HSBC004初始同行扣款
恒生 Hang Seng024初始跨行扣款
中銀 BOCHK0122021-06跨行扣款
南洋商業銀行0412021-07跨行扣款
富融銀行 Fusion Bank2021-09虛擬銀行
工銀亞洲 ICBC(Asia)0722021-09跨行扣款
渣打 SCB0032021-12跨行扣款
眾安銀行 ZA Bank2021-12虛擬銀行
中信銀行國際 CNCBI0182021-12跨行扣款,卡號需 15 位格式(前 3 位補 0)
永隆銀行 CMB Wing Lung2382021-12跨行扣款
天星銀行 Airstar2022-09虛擬銀行
建銀亞洲 CCB(Asia)0092023-10跨行扣款
LIVI BANK2024-01虛擬銀行
招商銀行2024-03跨行扣款
大新銀行 Dah Sing0402024-03跨行扣款

恒生通道支持的銀行(12 家)

通過恒生通道發起的 eDDA,支持以下 12 家銀行的個人帳戶:

兩條通道均支持(7 家)——這些銀行同時支持匯豐通道和恒生通道,優先推薦匯豐通道:

銀行銀行代碼備註
恒生 Hang Seng024同行扣款
匯豐 HSBC004跨行扣款
中銀 BOCHK012跨行扣款
南洋商業銀行041跨行扣款
工銀亞洲 ICBC(Asia)072跨行扣款
渣打 SCB003跨行扣款
永隆銀行 CMB Wing Lung238跨行扣款

恒生通道專屬(5 家)——以下銀行僅能通過恒生通道使用 eDDA,不支持匯豐通道:

銀行銀行代碼備註
花旗銀行 Citibank250跨行扣款
東亞銀行 BEA015跨行扣款,注意"每日單筆"頻率限制
華僑永亨銀行 OCBC Wing Hang跨行扣款
集友銀行 Chiyu Banking跨行扣款
交通銀行香港分行 BANKCOMM382需櫃台申請

支持的證件類型

eDDA 授權時需驗證用戶證件資訊,支持的證件類型因銀行而異:

證件類型匯豐通道恒生通道說明
香港身份證(HKID)支持支持最常見,覆蓋大部分用戶
中國居民身份證支持支持大陸開戶用戶
護照支持支持海外用戶

不支持的場景

以下場景不支持 eDDA 入金,PM 和運營需注意:

場景原因用戶提示建議
企業帳戶eDDA 僅支持個人帳戶,銀行側不允許企業帳戶授權引導使用網銀轉賬或 FPS
信銀國際卡號非 15 位信銀國際銀行卡號需補齊至 15 位(前 3 位補 0),否則授權失敗引導用戶確認正確的卡號格式
天星銀行超日限天星 eDDA 單日限額 HKD 200,000,每日累計不超過 5 筆(合計 HKD 1,000,000)提示用戶分多日入金或使用其他通道

匯豐 vs 恒生協議差異

維度匯豐 HSBC恒生 Hang Seng
TransType303 (HSBC_EDDI)302 (HASE_EDDI)
入金方式碼eddaHSBC(代碼 9)edda(代碼 8)
通信協議HTTPS REST APISM2 簽名 HTTP POST
加密方式TLS(標準 HTTPS)香港郵政電子證書 SM2 數字簽名
SBA 服務sba_hsbc_eddisba_hase_eddi
數據表hsbc_eddishs_eddis
授權要求(同行)必須預授權必須預授權
授權要求(跨行+線上開戶)允許後置授權不允許,必須預授權
扣款幣種僅 HKD僅 HKD
扣款結果 JobHsbcEddiResultJobHsEddiResultJob
SBA 創建重試 JobHsbcEddiSBACreateRetryJobHsEddiSBACreateRetryJob

授權前置 vs 後置

PM 關注點:恒生的"必須預授權"意味著新用戶首次入金的流程更長(需等待授權生效),而匯豐跨行+線上開戶場景允許"先入金後授權",降低了首次入金門檻。

完整扣款流程對比

下圖並排展示匯豐和恒生從用戶點擊到資金到賬的完整鏈路差異:

關鍵差異點

  • 通信協議:匯豐用標準 HTTPS REST API;恒生用 SM2 簽名 HTTP POST(國密算法)
  • 數據表:匯豐寫 hsbc_eddis;恒生寫 hs_eddis
  • 輪詢 Job:匯豐用 HsbcEddiResultJob;恒生用 HsEddiResultJob
  • 扣款回調時間:兩家銀行的處理時間相近(通常幾分鐘),但恒生在週日維護窗口(00:00~08:30)更短

恒生扣款被拒錯誤碼

恒生 eDDI 扣款失敗時,銀行返回的錯誤碼和對應含義:

錯誤碼含義用戶提示
BRC_8I1餘額不足銀行帳戶餘額不足,銀行可能收取手續費且取消授權
BRC_8RZ帳戶異常銀行帳戶異常,請聯繫銀行
BRC_8RW + FP2414未查詢到授權無法扣款,請聯繫銀行
BRC_8RW + FP2415授權未生效請至銀行激活 eDDA
BRC_8RW + FP2416授權已過期請至銀行重新授權
BRC_8RW + FP2417超過授權限額請減少金額後重新發起
000通用失敗請聯繫銀行確認原因

匯豐扣款被拒錯誤碼

錯誤碼含義用戶提示
MPP02020授權已取消/不存在請聯繫銀行重新授權
MPP02021付款帳戶已關閉請聯繫銀行
MPP02022超過 eDDA 扣款上限請聯繫銀行調整限額
MPP02023授權已取消/不存在請聯繫銀行重新授權
MPP02038授權已休眠請聯繫銀行重新授權
MPP02039授權已過期請聯繫銀行重新授權
MPP05000超過扣款上限請聯繫銀行調整限額
配置位置
  • 恒生錯誤碼:deposit/src/app/Business/Eddi.php:341-377hsRejectMessage()
  • 匯豐錯誤碼:deposit/src/app/Business/Eddi.php:379-397hsbcRejectMessage()

處理時段與維護窗口

維度恒生匯豐說明
工作時段週一 07:00 ~ 週六 10:00週一 07:00 ~ 週六 10:00此時段內 SBA 會處理 eDDI 指令
週日維護00:00 ~ 08:3000:00 ~ 12:00銀行系統維護,不接受請求
非工作時段行為指令進入 Blank 狀態,下個工作時段自動激活同左用戶不會感知延遲
對賬暫停16:05 ~ 16:1016:05 ~ 16:10與全局 2412 規則一致

非工作時段提交的處理:如果用戶在週六 10:00 之後提交 eDDA 入金,系統會創建 Apply 和 setup_eddis 記錄,但 SBA 的 eDDI Procedure 不會立即執行。Procedure 進入 Blank 狀態,等到下週一 07:00 自動激活並發送扣款指令到銀行。

配置位置
  • 恒生維護窗口:sba_hase_eddi 服務常量配置
  • 匯豐維護窗口:sba_hsbc_eddi 服務常量配置
  • 2412 暫停規則:deposit/src/app/Business/DepositConfigNew.php:603-641

setup_eddis 完整狀態流轉

eDDA 入金涉及 setup_eddis 表的狀態流轉,覆蓋從授權到入金完成的全過程:

狀態碼常量含義後續動作
0STATUS_PENDING待處理——記錄已創建applySetupEddi() 觸發處理
1STATUS_PROCESSING處理中——扣款指令已發送等待銀行回調
2STATUS_DEDUCTED扣款完成——銀行已扣款SBA 執行入賬
3STATUS_FAIL失敗——授權失敗或扣款失敗通知用戶,記錄 error_code
4STATUS_FINISH入金完成——資金已到賬流程結束

特殊場景STATUS_DEDUCTED → STATUS_FAIL(CRM 駁回)——當銀行已完成扣款但後台運營終止入金時,error_code 為 REJECT_BY_CRM,此時需要人工處理退款。


eDDA 異常場景速查

異常現象排查路徑處理方式
授權長時間未生效用戶等待超過 24hsetup_eddis.edda_status,確認是否仍在 PENDING引導用戶聯繫銀行確認
授權失敗用戶看到錯誤提示setup_eddis.error_code,對照上方錯誤碼表按錯誤碼引導用戶修正資訊
扣款失敗Apply 狀態變為已駁回hsbc_eddis / hs_eddis 表的 reject 資訊對照扣款錯誤碼表處理
扣款成功但未入賬銀行已扣款,餘額未增加setup_eddis.status 是否卡在 DEDUCTED(2)檢查 SBA Procedure 狀態
扣款超時銀行無回調查 ResultJob 輪詢狀態等待輪詢完成或人工查詢銀行
授權失效歷史已授權用戶突然無法入金查銀行端授權狀態(可能被用戶在銀行側取消)引導用戶重新授權

詳細的排障流程 → 入金排障 § eDDA 授權失敗

分步 Runbook:eDDA 扣款成功但未入賬(SBA Procedure 掛起)

現象:銀行已扣款(setup_eddis.status = 2 DEDUCTED),但用戶餘額未增加。

第 1 分鐘 — 定位阻塞點

  1. setup_eddis 表:確認 status = 2(已扣款)
  2. 查 SBA Procedure 狀態:是 Running / Pending / Failed?
  3. 如果 Procedure 是 Running 且超過 10 分鐘 → 異常

第 2~5 分鐘 — 排查 SBA 異常 4. 查 SBA 服務日誌:Procedure 是否卡在某個 Step? 5. 常見卡點:

  • CRM 帳戶鎖定(正在執行其他操作)→ 等待釋放
  • SBA 餘額計算失敗 → 檢查帳戶數據一致性
  • SBA 服務本身異常 → 檢查 SBA 服務狀態

第 5~15 分鐘 — 處理 6. 如果 Procedure 狀態是 Failed → 需要手動觸發重新執行(聯繫技術支持) 7. 如果 Procedure 狀態是 Pending → 檢查是否有前置 Procedure 在排隊 8. 如果 SBA 服務異常 → 等服務恢復後 Procedure 會自動繼續

用戶溝通:告知用戶"銀行已扣款成功,資金正在處理中",避免用戶恐慌

超過 30 分鐘未解決 → 升級到入金技術負責人

餘額不足自動取消授權

恒生銀行有一個特殊行為:當 eDDI 扣款因餘額不足(BRC_8I1)被拒時,銀行可能自動取消該用戶的 eDDA 授權。這意味著:

  1. 用戶需要先往銀行帳戶充值
  2. 然後還需要重新完成 eDDA 授權才能再次使用 eDDA 入金
  3. 運營需要主動告知用戶這個情況,否則用戶會以為充值後就能繼續入金

匯豐沒有這個行為——餘額不足被拒後,授權仍然有效,充值後可直接重試。

處理建議:如果用戶反饋"之前可以用 eDDA,現在不行了",先檢查是否是恒生用戶 + 曾經因餘額不足被拒。如果是 → 引導重新授權。


常見誤解

誤解事實
"eDDA 和 eDDI 是出金通道"不是。eDDA/eDDI 僅用於入金代扣。匯豐/恒生的出金走企業網銀轉賬,與 eDDA 無關
"所有銀行都能用 eDDA"匯豐通道支持 15 家銀行的個人帳戶,恒生通道支持 12 家(含 5 家專屬)。企業帳戶不支持。詳見 支持範圍
"eDDA 授權一次就永久有效"授權可能因為銀行側維護、用戶在銀行 App 取消、餘額不足自動取消(恒生)而失效
"eDDA 入金需要匹配引擎"不需要。eDDA 是系統主動發起扣款,天然知道資金歸屬,完全跳過匹配引擎
"匯豐和恒生的 eDDA 實現是一樣的"協議完全不同。匯豐用 HTTPS REST API,恒生用 SM2 簽名。數據表、Job、SBA 服務都是獨立的
"週末可以用 eDDA 入金"週六 10:00 後到週日結束是非工作時段。提交的請求會排隊到週一 07:00 才執行

讀完之後

我想...去看
了解 eDDA 授權如何開啟入金通道銀行卡綁定與入金授權 § eDDA
跟著一筆 eDDA 入金走全程新人導讀 § eDDA 入金
看 eDDA 授權/扣款失敗怎麼處理入金排障
看運營側 eDDA 排障操作指引eDDA 排障指引
查 eDDI 類型碼和狀態碼入金規則速查
深入了解匯豐 eDDA 實現匯豐 HSBC
深入了解恒生 eDDA 實現恒生 Hang Seng
了解 SBA 編排如何執行入賬SBA 資金編排
這個頁面有幫助嗎?

内部业务文档 · 仅限 moomoo 团队使用