深色模式
出金规则手册
本页说明
讲什么:所有影响出金行为的规则——每条都写清楚:是什么、为什么存在、需求变更时改哪里 适合谁:需要知道"这个规则能不能改、怎么改"的产品经理 前置阅读:出金方式总览预计阅读: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。如果单笔上限调高但熔断不调,几笔大额出金就可能触发熔断关闭自动出金 |
读完之后
| 我想... | 去看 |
|---|---|
| 理解一笔出金端到端怎么走的 | 出金生命周期 |
| 看某种通道的执行细节 | 通道执行手册 |
| 推动一个出金规则变更 | 出金变更指南 |
| 查某个状态码的具体数字 | 出金数据字典 |
这个页面有帮助吗?