Skip to content

出金规则手册

本页说明

讲什么:所有影响出金行为的规则——每条都写清楚:是什么、为什么存在、需求变更时改哪里 适合谁:需要知道"这个规则能不能改、怎么改"的产品经理 前置阅读出金方式总览预计阅读:5 分钟 负责人:出金产品经理

核心要点:出金规则分为审批模板(6 种)、高风险判定(6 因子)、自动出金条件(6 项)、三层限额体系四大类——每条规则都标注了配置位置和变更方式。


审批模板

是什么:系统根据出金来源和风险判定,为每笔出金任务选择一套审批模板。模板决定了这笔出金要走几步审批。

模板 Key审批步骤适用场景触发来源
withdraw_defaultConfirm → Remittance普通出金用户 App 发起
withdraw_unusualAudit → Confirm → Remittance普通账户异常出金HighRiskCheck 升级
withdraw_omConfirm → RemittanceOM(Omnibus)账户出金OM 子账户发起
withdraw_om_unusualAudit → Confirm → RemittanceOM 账户异常出金HighRiskCheck 升级
fundConfirm → Remittance现金宝/基金赎回出金现金宝赎回/基金赎回回调
fund_unusualAudit → 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_omwithdraw_default
  • 给某种模板增加新步骤 → 新建 Step 类(实现 IFStep 接口),加到模板数组中

审批步骤与权限

是什么:每笔出金最多经过三个审批步骤,每步需要不同的 CRM 权限:

步骤英文权限代码何时需要
Step 1AuditPERMISSION_CASH_TASKS_OUT_AUDIT仅 unusual 模板
Step 2ConfirmPERMISSION_CASH_TASKS_OUT_CONFIRM所有出金
Step 3RemittancePERMISSION_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_SWIFTSWIFT 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.phpneedAudit() 方法

常见变更场景

  • 新增触发 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)单日累计金额达到熔断线当日自动出金关闭,需人工处理

天星限额(已知值)

币种单笔上限累计报警每日熔断
HKD300 万4,000 万1,500 万
USD50 万1,000 万300 万

天星线上开户最低入金限额

币种最低入金
HKD1 万
USD1,500
CNH1 万

招行 / 民生限额

招行和民生的三层限额值从 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 中添加新的前缀映射

费用规则

是什么:出金手续费按银行卡所在地和币种计算。

银行卡所在地HKDUSDCNH
香港免费免费免费
中国大陆105 免费15 免费不支持
美国105 免费15 免费105 免费
其他地区105 免费15 免费105 免费

当前全部免费

代码中定义了跨境出金的费用(HKD 105、USD 15、CNH 105),但最后一行 $fee = 0 强制将所有费用设为 0。即当前所有出金免手续费

通道附加费用

虽然出金手续费全免,但部分通道有银行侧费用:

通道费用承担方说明
CHATS/RTGSUSD $8 / HKD $25 / CNY $25用户用户确认出金时弹窗提示
FPS2.5 HKD/笔富途富途承担,用户不感知
跨境电汇中转行扣费(不可控)用户到账金额可能少于申请金额

特殊限制

  • Velo 银行:不支持提取港币和离岸人民币到 Velo 账户(仅支持 USD)
  • 大陆银行卡 + CNH:用户端不允许提取离岸人民币到大陆银行卡,但 CRM 端不受此限制
如果需求变更:调整费用

代码位置withdraw/src/app/Business/CreatorBase.phpgetFee() 方法

  • 恢复跨境收费 → 删除末尾的 $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需人工次日处理
FPS7×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_idSBA 编排系统moomoo 侧唯一流水号
request_id出入金服务请求维度去重
bank_ref_id银行返回银行侧唯一流水号

系统在创建指令时检查三个标识的组合唯一性。检测到重复时拒绝创建新指令,返回已有指令的状态。


处理时效参考

通道最快典型最慢
BST 银证秒级数分钟下一交易日
网银(汇丰/恒生)分钟级~30 分钟数小时
FPS(中银/渣打/广发)分钟级~10 分钟小时级
中银同行 / 工银手工小时级数小时当日
CHATS/RTGS小时级数小时当日
跨境电汇 / EWB1 天2~3 天3~5 天
支票2 天3~5 天5+ 天

常见误解

误解事实
"自动出金条件不满足 = 出金失败"不是失败,只是降级为人工模式。运营确认后仍然可以正常执行出金
"三层限额是三道墙,每层都拦截"不是。第一层(单笔上限)超限才拒绝,第二层(累计报警)只发飞书告警不阻断交易,第三层(每日熔断)才关闭自动出金
"高风险 = 出金被拒绝"高风险只是多一步 Audit 审核(模板从 default 升级为 unusual)。审核通过后出金正常进行
"改了 auto_settings 的 max_amount 就完事了"改单笔上限时必须同步评估 alarm_amount 和 stop_amount。如果单笔上限调高但熔断不调,几笔大额出金就可能触发熔断关闭自动出金

读完之后

我想...去看
理解一笔出金端到端怎么走的出金生命周期
看某种通道的执行细节通道执行手册
推动一个出金规则变更出金变更指南
查某个状态码的具体数字出金数据字典
这个页面有帮助吗?

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