深色模式
内银系 BST 总览
本页说明
讲什么:三家 BST(银证转账)银行的接入模式、协议差异、限额体系、异常处理全对比 适合谁:需要深入了解 BST 通道细节的产品经理 前置阅读:出金方式总览、银行能力矩阵预计阅读:6 分钟 负责人:入金产品经理
核心要点:BST(银证转账)是最快的出金通道。三家银行协议差异大:招行/民生用 Socket 双向链路(秒级响应),天星用 REST API 轮询(分钟级响应)。
三家银行总览
| 维度 | 招行(CMB) | 民生(CMBC) | 天星(Airstar) |
|---|---|---|---|
| 协议 | Socket 二进制 (GB18030) | Socket XML 文本 (SM2 加密) | REST API (JSON/UTF-8) |
| 授权模型 | 银证签约 | 银证签约 | Mandate 授权(6 状态) |
| 出金发起方 | 银行端 + moomoo 端均可 | 仅银行端可发起 | moomoo 端 + 银行端均可 |
| 结果获取 | 实时推送(Socket 回调) | 实时推送(Socket 回调) | 轮询(polling) |
| 入金状态 | 成功 / 失败 | 成功 / 失败 | NEW / PENDING / SUCCESS / FAILED / REFUNDED |
| 出金状态 | 0(成功) / -5(超时) / -6(拒绝) | 0(成功) / -5(超时) / -6(拒绝) | NEW / PENDING / SUCCESS / FAILED |
核心区别一句话:招行和民生是传统 Socket 专线(银行主导),天星是现代 REST API(moomoo 主导)。
各银行渠道接口详情
本页是 BST 协议的总览对比。每家银行的渠道侧接口字段、moomoo 侧适配映射、完整匹配规则等详情,请查阅各银行独立页面:
- 招商银行 CMB — Socket 二进制协议、33 个命令码、SM2 加密
- 民生银行 MS — XML 文本协议、SM2 加密、Socket 通信
- 天星银行 Airstar — REST API、RSA-OAEP 加密、10 个 API 方法
银证授权(Mandate)
授权模型对比
| 招行 / 民生 | 天星 | |
|---|---|---|
| 术语 | 银证签约 | Mandate 授权 |
| 发起方式 | 用户在银行端完成签约 | 用户在 moomoo 端发起,银行端确认 |
| 状态数量 | 2 个(已签约 / 未签约) | 6 个(完整状态机) |
| 多市场 | 每个市场单独签约 | 一次授权自动映射 3 个市场 |
| 核心标识 | 银行卡号 | mandate_id |
天星 Mandate 状态机
自动 3 市场映射:用户完成一次天星 Mandate 授权后,系统自动为 HK(港股)、US(美股)、CN(A 股通)三个市场创建银证绑定关系。用户不需要分别为每个市场单独操作。
mandate_id 是天星的核心标识:不同于招行/民生以银行卡号作为主键,天星以 mandate_id 作为银证关系的唯一标识。银行卡管理、入金、出金的所有操作都通过 mandate_id 串联。
入金流程对比
通用 BST 入金
所有 BST 银行共享同一个入金逻辑框架:
- 用户发起入金 → 系统创建入金指令 → 发送到银行 → 银行处理 → 结果回传 → 入账
天星入金特殊性
两种入金来源:
| 来源 | source 值 | 说明 |
|---|---|---|
| 用户在 moomoo 端发起 | 1 | 用户在 moomoo App 点击入金 |
| 用户在银行端发起 | 2 | 用户在天星银行 App 发起转账到证券账户 |
银行端发起(source=2)是天星独有的能力——招行/民生的 BST 入金只能从 moomoo 端发起。
轮询机制:
天星不像招行/民生通过 Socket 实时推送结果,而是由 moomoo 系统主动轮询:
| Job 名称 | 职责 | 轮询次数 | 说明 |
|---|---|---|---|
AsbBstCreateJob | 创建入金指令 | — | 发送入金请求到天星 |
AsbBstCreateResultJob | 轮询入金结果 | 最多 60 次 + 慢轮询 | 每次间隔轮询天星 API 查询入金状态 |
AsbBstDepositJob | 入金到账处理 | — | 确认入金成功后执行内部到账逻辑 |
前 60 次每 5 秒轮询一次;超过 60 次后切换为每 5 分钟轮询一次(慢轮询),持续直到获得终态或人工介入。
REFUNDED 退款状态(天星独有):
天星入金有一个其他 BST 银行没有的状态——REFUNDED。表示入金已成功到账后,银行又发起了退款。
触发场景:
- 银行侧发现交易异常后主动退款
- 合规原因触发退款
系统处理:收到 REFUNDED 状态后,需要冲正已入账的资金,并通知用户。这是需要运营关注的异常场景。
出金流程对比
通用 BST 出金
BST 出金遵循冻结-转账-释放三步模式:
为什么先冻结? 因为从发送指令到银行确认之间有时间窗口。如果不冻结,用户可能在这段时间内花掉这笔钱,导致账户出现负余额。冻结保证了出金金额在处理期间不会被其他操作使用。
天星出金特殊性
两种出金模式:
| 模式 | 说明 |
|---|---|
| moomoo 端发起 | 用户在 moomoo App 点击出金,系统通过 API 发送指令 |
| 银行端发起 | 用户在天星银行 App 发起从证券账户转出到银行(天星独有) |
轮询机制:
| Job 名称 | 职责 | 重试 | 说明 |
|---|---|---|---|
AsbBstTransfer | 出金转账指令 | 最多 10 次 | 发送出金请求并轮询结果 |
SyncAsbBstWithdraw | 银行端出金拉取 | 每分钟 cron | 拉取银行端发起的出金请求,创建 moomoo 侧出金任务 |
流程:moomoo 端发起出金 → AsbBstTransfer 轮询最多 10 次 → 仍未完成则标记异常需人工确认。银行端发起出金 → SyncAsbBstWithdraw 每分钟拉取 → 创建出金任务处理。
招行 / 民生出金
招行和民生通过 Socket 连接发送出金指令:
- 出金服务调用银证服务(
cmb_stock_trans/ms_stock_bank_transaction) - 加密请求数据
- 通过 Socket 发送到银行的
exit_server - 银行处理后通过同一条双向链路实时返回结果
- 结果码:0(成功)/ -5(超时,自动切换备用 exit_server 重试)/ -6(银行拒绝)
三层限额体系
BST 通道对单笔金额、累计金额、每日金额分层控制。详细说明见 出金规则手册 § 三层限额。
天星限额详情
| 维度 | HKD | USD |
|---|---|---|
| 单笔上限(max) | 300 万 | 50 万 |
| 累计报警(alarm) | 4,000 万 | 1,000 万 |
| 每日熔断(stop) | 1,500 万 | 300 万 |
线上开户最低入金:HKD 1 万 / USD 1,500 / CNH 1 万
三层如何协作:
- 第一层(单笔):超过 300 万 HKD 的单笔出入金直接拒绝
- 第二层(累计报警):累计达到 4,000 万 HKD 时触发告警通知运营,但交易不中断
- 第三层(每日熔断):当日累计达到 1,500 万 HKD 时自动关闭当日自动出入金,后续需人工处理
招行 / 民生限额
招行/民生限额说明
招行和民生的限额由银行侧系统控制(非 moomoo 配置),具体数值需向银行确认。已知其具备单笔上限和每日限额机制,超限时银行侧直接拒绝并返回回调码 -6。如遇超限问题,参考出金排障 § BST 回调异常。
线上开户(天星独有)
天星支持三合一线上开户流程——新客户可以在一个连贯的流程中完成:
- 开立证券账户:完成 KYC 身份验证
- Mandate 授权:授权天星银行进行银证转账
- 首笔入金:完成首笔入金到证券账户
这个流程的价值在于新客获取——降低了新用户从注册到可交易的门槛。传统流程需要用户在多个系统间切换(开户 → 去银行签约 → 回来入金),三合一流程在 moomoo App 内一站式完成。
线上开户的入金限制:首笔入金有最低金额要求(HKD 1 万 / USD 1,500 / CNH 1 万),高于普通入金的最低限额,目的是确保新客户有足够资金进行交易。
仅天星支持
招行和民生的银证签约需要用户在银行端完成,不支持在 moomoo 端完成三合一流程。
定时任务
天星任务清单
| Job 名称 | 职责 | 频率 | 重试 | 依赖 |
|---|---|---|---|---|
AsbBstCreateJob | 创建银证入金指令 | 触发式 | — | 用户入金请求 |
AsbBstCreateResultJob | 轮询入金结果 | 定时 | 60 次后转慢轮询 | AsbBstCreateJob |
AsbBstDepositJob | 入金到账处理 | 触发式 | — | AsbBstCreateResultJob 返回 SUCCESS |
AsbBstTransfer | 出金转账 + 轮询结果 | 触发式 | 最多 10 次 | 审批通过 |
SyncAsbBstWithdraw | 银行端出金拉取 | 每分钟 cron | — | 银行端发起出金 |
AsbBstCreateFromBankJob | 银行端入金处理 | 触发式 | — | 银行端发起入金 |
AsbBstCreateRetryJob | 入金创建重试 | 触发式 | — | AsbBstCreateJob 失败 |
任务链路:
入金:AsbBstCreateJob(moomoo 端)/ AsbBstCreateFromBankJob(银行端)→ AsbBstCreateResultJob(60 次快轮询 + 慢轮询)→ AsbBstDepositJob(到账)
出金:moomoo 端:AsbBstTransfer(轮询 10 次)→ 超时需人工确认 | 银行端:SyncAsbBstWithdraw(每分钟拉取)→ 创建出金任务
招行 / 民生任务
| 服务名 | 银行 | 职责 |
|---|---|---|
cmb_stock_trans | 招行 | 银证转账服务,Socket 二进制通信 |
ms_stock_bank_transaction | 民生 | 银证转账服务,Socket XML 文本通信 |
招行/民生采用实时双向 Socket,不需要轮询任务——银行处理完成后通过同一连接直接推送结果。
完整定时任务列表 → 定时任务与监控
异常场景手册
授权异常(5 类)
| # | 异常 | 症状 | 原因 | 处理 |
|---|---|---|---|---|
| 1 | 授权超时 | Mandate 停在 PendingAuthorise 状态 | 银行处理延迟或通信中断 | 等待 + 人工查询银行侧状态 |
| 2 | 授权失败 | Mandate 变为 RejectAuthorise | 用户信息校验不通过 / 银行侧风控 | 排查失败原因,引导用户重新发起 |
| 3 | 授权解除 | Mandate 变为 Revoked | 用户发起解除授权 | 确认用户意图,必要时重新授权 |
| 4 | 部分市场授权失败 | 3 个市场中部分绑定成功 | 某个市场的银证配置异常 | 检查失败市场的配置,手动补充绑定 |
| 5 | 银行端解除未同步 | 银行侧已解除但 moomoo 仍显示 Authorised | 同步延迟或回调丢失 | 手动同步 Mandate 状态 |
入金异常(7 类)
| # | 异常 | 症状 | 原因 | 处理 |
|---|---|---|---|---|
| 1 | 指令创建失败 | AsbBstCreateJob 报错 | 参数异常 / Mandate 非 Authorised | 检查 Mandate 状态和请求参数 |
| 2 | 轮询超时 | 60 次轮询后仍为 PENDING | 银行处理异常 | 人工查询银行侧状态 |
| 3 | 入金失败 | 状态变为 FAILED | 银行拒绝(余额不足/限额等) | 查看银行返回的错误码 |
| 4 | 入金退款 | 状态变为 REFUNDED | 银行发起退款 | 冲正已入账资金,通知用户 |
| 5 | 银行端入金未同步 | source=2 入金 moomoo 未收到 | 回调丢失 | 手动查询天星 API 补录 |
| 6 | 金额不一致 | 到账金额与请求金额不符 | 银行侧扣费或汇率差异 | 核对银行侧交易明细 |
| 7 | 重复入金 | 同一笔入金创建了多条记录 | 去重机制失效 | 检查 procedure_id/request_id/bank_ref_id |
出金异常(5 类)
| # | 异常 | 症状 | 原因 | 处理 |
|---|---|---|---|---|
| 1 | 出金指令失败 | AsbBstTransfer 报错 | 参数异常 / 银行拒绝 | 检查错误码,释放冻结资金 |
| 2 | 轮询超时 | 10 次轮询后仍 PENDING | 银行处理异常 | 人工查询银行侧状态 |
| 3 | 冻结未释放 | 出金失败但资金仍冻结 | 释放流程异常 | 手动释放冻结 |
| 4 | 银行端出金未同步 | 用户从银行端发起出金但 moomoo 未扣款 | 回调丢失 | 手动查询天星 API,执行扣款 |
| 5 | 部分出金 | 银行只转了部分金额 | 银行侧限额或余额不足 | 核对金额差异,处理剩余部分 |
监控告警
天星 13 项告警
| # | 告警项 | 触发条件 | 严重度 | 处理方式 |
|---|---|---|---|---|
| 1 | 授权创建超时 | Mandate 在 PendingAuthorise 超过阈值 | 高 | 检查天星 API 连通性 |
| 2 | 授权失败率突增 | 单位时间内 RejectAuthorise 数量超限 | 高 | 排查银行侧异常 |
| 3 | 入金创建失败 | AsbBstCreateJob 连续失败 | 高 | 检查请求参数和 API 状态 |
| 4 | 入金轮询超时 | AsbBstCreateResultJob 进入慢轮询仍无终态 | 高 | 人工查询银行侧状态 |
| 5 | 入金退款 | 收到 REFUNDED 状态 | 高 | 立即冲正,通知用户 |
| 6 | 出金轮询超时 | AsbBstTransfer 10 次用尽 | 高 | 人工确认银行侧状态 |
| 7 | 银行端出金拉取异常 | SyncAsbBstWithdraw cron 报错 | 严重 | 检查天星 API 连通性 |
| 8 | 冻结未释放 | 出金失败但冻结未回滚 | 严重 | 手动释放冻结 |
| 9 | 每日熔断触发 | 当日累计金额达到 stop 阈值 | 中 | 运营确认后决定是否恢复 |
| 10 | 累计报警触发 | 累计金额达到 alarm 阈值 | 中 | 运营关注,评估风险 |
| 11 | 重复交易检测 | procedure_id/request_id 重复 | 高 | 检查去重逻辑 |
| 12 | API 连通性异常 | 天星 API 响应超时或错误率升高 | 严重 | 联系天星银行技术支持 |
| 13 | 银行端发起量异常 | source=2 交易量突增 | 中 | 排查是否为正常业务波动 |
错误码
错误码体系
天星错误码按操作类型划分前缀,而非按业务领域:
| 错误码前缀 | 操作类型 | 说明 |
|---|---|---|
| 14060xxxx | 创建授权 | 富途发起 Mandate 创建时的错误 |
| 14061xxxx | 取消授权 | 富途发起取消 Mandate 的错误 |
| 14062xxxx | 查询授权 | 富途查询 Mandate 状态的错误 |
| 14063xxxx | 富途发起转账 | 富途发起入金/出金转账的错误 |
| 14064xxxx | 查询转账 | 富途查询转账状态的错误 |
| 14067xxxx | 银行发起转账 | 银行端发起转账时 moomoo 侧校验错误 |
| 14072xxxx | 通知转账结果 | 银行通知转账结果时的错误 |
| 14073xxxx | 通知授权结果 | 银行通知授权结果时的错误 |
招行/民生的错误码
招行和民生通过 Socket 回调返回结果码(0/-5/-6),没有独立的错误码系列。详细的回调处理逻辑见 出金数据字典 § 银行回调结果码。
BST 通道对比
天星 vs 招行/民生
| 对比维度 | 天星(Airstar) | 招行 / 民生 |
|---|---|---|
| 协议 | REST API(HTTP + JSON) | Socket 二进制协议 |
| 编码 | UTF-8 | GB18030 |
| 发起方 | moomoo + 银行双向 | 招行双向 / 民生仅银行端 |
| 授权模型 | Mandate(6 状态) | 银证签约(2 状态) |
| 多市场映射 | 一次授权 → 3 市场自动映射 | 每市场单独签约 |
| 核心标识 | mandate_id | 银行卡号 |
| 结果获取 | 轮询(polling) | 实时推送(Socket 回调) |
| 入金状态 | NEW/PENDING/SUCCESS/FAILED/REFUNDED | 成功/失败 |
| 出金状态 | NEW/PENDING/SUCCESS/FAILED | 0(成功)/-5(超时)/-6(拒绝) |
| 入金轮询 | 60 次快轮询 + 慢轮询 | 无需轮询 |
| 出金轮询 | 10 次 | 无需轮询 |
| 退款机制 | 支持 REFUNDED 状态 | 无 |
| 线上开户 | 支持三合一 | 不支持 |
| 错误码 | 按操作类型划分(14060~14073 系列) | 0 / -5 / -6 |
BST vs 其他出金通道
| 对比维度 | BST 银证 | 网银(汇丰/恒生) | FPS | 传统通道 |
|---|---|---|---|---|
| 自动化 | 全自动(唯一) | 半自动 | 半自动 | 人工 |
| 到账速度 | 秒~分钟 | 分钟~小时 | 分钟级 | 小时~天 |
| 协议复杂度 | 高(Socket/API) | 低(企业网银) | 中(FPS API) | 低(网银/电汇) |
| 运营介入 | 仅异常时 | Confirm 步骤 | Confirm 步骤 | 全程介入 |
| 适用银行 | 招行/民生/天星 | 汇丰/恒生 | 中银/渣打/广发 | 所有银行 |
| 限额控制 | 三层限额体系 | 银行侧限额 | FPS 系统限额 | 各银行不同 |
读完之后
| 我想... | 去看 |
|---|---|
| 深入了解招行的 Socket 二进制协议 | 招商银行 CMB |
| 深入了解民生的 XML 文本协议 | 民生银行 MS |
| 深入了解天星的 REST API + RSA-OAEP | 天星银行 Airstar |
| 看 BST 在出金体系中的角色 | 出金方式总览 |
| 看自动出金的 6 个条件和三层限额 | 出金规则手册 |
| 查 Mandate 状态码和天星错误码 | 统一错误码中心 |
| 看 BST 任务的运行频率和告警 | 定时任务与监控 |
| 看其他银行的接入方式 | 银行能力矩阵 |
这个页面有帮助吗?