Skip to content

招商银行 CMB

本页说明

讲什么:招商银行银证转账(BST)渠道侧 Socket 协议规范 + moomoo 侧适配逻辑 适合谁:PM 了解对接细节 / 开发定位代码 / 运营理解银行特性 前置阅读银行能力矩阵 · BST 银证转账预计阅读:8 分钟 负责人:出入金产品团队

核心要点:招行通过 SM2 加密的 Socket 双向链路实现秒级银证转账,是三家 BST 银行中协议最复杂但响应最快的。


能力总览

能力支持情况协议/通道核心服务
入金(BST 银证转账)二进制 Socket 双向链路cmb_stock_trans Entry Server
出金(BST 银证自动)二进制 Socket 双向链路cmb_stock_trans Exit Server
SM2 国密加密SM2 签名 + 加密内置加密模块
eDDA/eDDI
FPS

招商银行是 moomoo 的核心 BST(银证转账)渠道之一,通过专线 Socket 双向持久连接实现实时入金通知和出金指令下发。支持 SM2 国密加密,保障资金指令的安全性。


核心参数速查

参数说明
IMPORT_BANK_ID7系统内银行标识 (CMBCCHINA)
TransType102 (BST) / 205 (普通)银证转账 / 普通入金两种类型
AUTO_SETTING_ID2auto_settings 表中的限额配置 ID
协议类型二进制 Socket固定字节长度消息帧
加密方式SM2 国密算法可选,默认 'N' 不加密
通信模式双向持久连接Entry Server + Exit Server

渠道接口概览

协议架构

维度说明
协议类型二进制 Socket(固定字节长度消息帧)
加密方式SM2 国密算法(可选,默认 'N' 不加密)
数据格式二进制(固定长度字段,ASCII 编码)
通信模式双向持久连接(Entry Server 接收 + Exit Server 发送)
心跳机制0009/1009 和 0010/1010 双向心跳保活
连接管理断连自动切换备用 Exit Server

消息帧结构

每条 Socket 消息由固定格式的头部 + 可变长度的业务数据组成:

部分长度格式说明
加密类型1 字节char'N' = 不加密,'Y' = SM2 加密
包总长度2 字节little-endian uint16整个消息帧的长度
签名64 字节binarySM2 数字签名(不加密时为空白填充)
命令码4 字节ASCII如 "0001"、"4001"
TX 包长度2 字节little-endian uint16业务数据部分的长度
头部合计73 字节
业务数据可变binary固定长度字段拼接

字节序注意

包长度字段使用 little-endian 字节序,开发时需注意编解码方向。


渠道侧接口详情 — 完整命令码表

登录与认证

命令码方向消息名用途
0001券商→银行BrokerageLoginToBankReq券商登录银行,建立 Entry 链路
1001银行→券商BrokerageLoginToBankRsp登录响应,返回认证结果
0002银行→券商BankLoginToBrokerageReq银行登录券商,建立 Exit 链路
1002券商→银行BankLoginToBrokerageRsp银行登录响应
0003券商→银行BrokerageLoginoutReq券商主动登出
1003银行→券商BrokerageLoginoutRsp登出响应确认

密码与配置

命令码方向消息名用途
0004/1004双向ModifyPwd修改通信密码
0005/1005双向ChangeDate修改对账日期

心跳保活

命令码方向消息名用途
0009/1009券商→银行Keepalive券商侧心跳(moomoo 发起)
0010/1010银行→券商Keepalive银行侧心跳(招行发起)

双向心跳确保连接存活。任一方超时未收到心跳即判定连接断开,触发重连。

客户管理

命令码方向消息名用途
2001/3001银行→券商GetCustmorInfo银行查询客户在券商的信息
2002/3002券商→银行NotifyCustmorResult通知客户验证结果(开户/验证)
2003/3003银行→券商Cancel取消客户的银证授权关系

资金转账(核心)

命令码方向消息名用途
4001/5001银行→券商BankMarginIn⭐⭐⭐ 入金通知 — 银行告知券商有客户转入资金
4002/5002券商→银行BrokerageMarginOut⭐⭐⭐ 出金指令 — 券商指示银行将资金转出到客户账户
4003/5003银行→券商BankMarginOut⭐⭐⭐ 出金结果通知 — 银行告知出金处理结果
4004/5004券商→银行BankMarginOutReject⭐⭐ 拒绝出金 — 券商拒绝银行侧发起的出金请求

对账

命令码方向消息名用途
6001/7001双向MarginCheck对账请求发起
6011/7011银行→券商BankMarginInList入金对账清单
6013/7013银行→券商BankNewCustmoerList新开户客户清单
6014/7014银行→券商BankCancelList取消授权客户清单
6015/7015银行→券商BankMarginOutList出金对账清单
6003/7003券商→银行NewCustmoerCheck新客户对账确认
6004/7004券商→银行CancelCheck取消授权对账确认
6005/7005券商→银行MarginOutCheck出金对账确认

核心接口字段详情

4001 BankMarginInReq(入金通知)

银行通知券商有一笔入金到账,是 BST 入金的核心消息。

字段长度类型描述
m_brokerage_custmor_id20Bstring券商客户 ID。取值 moomoo UID
m_bank_custmor_id16Bstring银行客户 ID。取值 银行卡号
m_currency3Bstring币种。取值 HKD / USD / CNH
m_amount20Bstring金额。如 "50000.00"
m_tx_date8Bstring交易日期。格式 YYYYMMDD
m_tx_time6Bstring交易时间。格式 HHMMSS
m_tx_seq16Bstring交易序号。唯一标识(去重依据)
m_reconciliation_date8Bstring对账日期。格式 YYYYMMDD
字段编码说明

所有字段为固定长度 ASCII 字符串,不足部分右补空格。金额字段包含小数点,如 "50000.00" 后补空格至 20 字节。币种严格 3 字节:HKD、USD、CNH。

4002 BrokerageMarginOutReq(出金指令)

券商向银行发起出金指令,将客户资金从证券账户转回银行账户。

字段长度类型描述
m_brokerage_custmor_id20Bstring券商客户 ID。moomoo UID
m_bank_custmor_id16Bstring银行客户 ID。银行卡号
m_bank_custmor_name20Bstring银行客户姓名。用于银行侧验证
m_currency3Bstring币种。HKD / USD / CNH
m_amount20Bstring金额。出金金额
m_tx_date8Bstring交易日期。格式 YYYYMMDD
m_tx_time6Bstring交易时间。格式 HHMMSS
m_tx_seq16Bstring交易序号。唯一标识
m_reconciliation_date8Bstring对账日期。格式 YYYYMMDD

通用响应字段

字段长度类型描述
m_rsp_code4Bstring响应码,"0000" = 成功

moomoo 侧适配

Entry/Exit Server 双向架构

招行 BST 采用双向持久连接架构,moomoo 侧部署两个 Server 分别处理入站和出站消息:

Server进程名职责连接方向
Entry Serverentrance_business接收银行发来的消息(入金通知、对账清单等)→ 转发给 CRM银行 → moomoo
Exit Serverexit_business接收 CRM 的出金指令 → 发送给银行moomoo → 银行

断连处理:Exit Server 支持备用地址。当主连接断开时,自动切换到备用 exit_server 地址,确保出金指令不中断。

SM2 国密加密流程

招行 BST 支持 SM2 国密算法对消息进行签名和加密,保障资金指令的安全性。

加密配置
  • 加密类型字段 = 'Y' 时启用 SM2
  • 默认为 'N'(不加密),可按需开启
  • 证书文件位于 cmb_stock_trans/conf/ 目录下

入金:BST 实时入金

入金流程

BST 入金的最大优势是实时性和确定性:银行直接告知客户 ID 和金额,无需像普通银行转账那样做模糊匹配。


出金:BST 自动出金 (auto_bs)

出金流程

处理时段

币种处理时段说明
HKD / USD交易日 08:40 ~ 15:59全交易日可处理
CNH交易日 08:40 ~ 10:59仅上午,下午不可处理
保证金提取交易日 08:40 ~ 10:59与 CNH 同窗口

CNH 出金时段限制

CNH(离岸人民币)的出金窗口仅到上午 10:59,远短于 HKD/USD。运营和用户需注意在此窗口内发起 CNH 出金,超时将延至下一个交易日处理。

CNH 出金限制

calcMethod() 方法中对 CNH 有额外限制:

  • CNH + 非香港银行 → method = null(不支持)
  • 即 CNH 出金到大陆银行卡 = 不支持
  • CNH 仅支持出金到香港本地的招行账户

出金取消规则

场景可否取消条件
非交易时间(< 08:20 或 ≥ 16:00)无条件可取消
交易日 08:20 ~ 16:00✅ / ❌距预定执行时间 ≥ 10 分钟方可取消
非交易日无条件可取消

为什么交易时段内有 10 分钟限制? 出金指令一旦进入银行处理队列就无法撤回。10 分钟的缓冲期确保取消请求能在银行实际执行前到达。

回调结果码

result含义系统处理是否需人工
0成功Task 状态 → DONE
-5超时自动切换备用 exit_server 重试
-6银行拒绝Task 状态 → 异常✅ 人工处理
超时重试机制

当收到 result = -5(超时)时:

  1. 记录当前 exit_server 超时事件
  2. 切换到备用 exit_server 地址
  3. 使用相同的 m_tx_seq 重新发送出金指令
  4. 如果备用 exit_server 也超时,标记为异常,等待人工处理

出金限额配置

招行 BST 出金的限额通过 auto_settings 表配置(WHERE id = 2):

字段含义说明
hk_max_amount单笔最大金额超过则拒绝
hk_alarm_amount告警金额超过则触发告警但不阻断
hk_stop_amount熔断金额超过则暂停自动出金

三级阈值逻辑

  • 金额 ≤ alarm_amount:正常自动处理
  • alarm_amount < 金额 ≤ max_amount:自动处理 + 触发告警通知
  • 金额 > max_amount 或累计 > stop_amount:暂停自动出金,转人工审批

异常场景与告警

Socket 断连

告警项级别响应时限说明
Entry Server 断连严重15 分钟内无法接收入金通知
Exit Server 断连严重15 分钟内无法发送出金指令
双向心跳超时警告30 分钟内可能即将断连

Socket 断连是最严重的告警之一——断连期间所有 BST 入金通知和出金指令都会中断。系统会自动尝试重连,但如果 15 分钟内未恢复,需要开发人员介入排查。

常见异常处理

异常场景表现处理方式
Socket 断连入金/出金中断自动重连;15 分钟未恢复则人工介入
SM2 签名验证失败消息被拒绝检查证书是否过期或被替换
出金超时 (result=-5)银行无响应自动切换备用 exit_server
银行拒绝 (result=-6)出金失败人工核实原因后重试或退款
对账不平入金/出金金额不一致运营核查差异,联系招行对账
CNH 超时段出金出金被拒延至下一个交易日上午处理

双方功能对应矩阵

功能渠道侧(招商银行)moomoo 侧说明
登录认证双向握手Entry/Exit Server0001-1003,建立双向链路
心跳保活双向心跳Entry/Exit Server0009-1010,每 30s 一次
入金通知4001 BankMarginInEntry → CRMm_brokerage_custmor_id 等,实时入金
出金指令5002 接收执行CRM → Exit → 银行m_amount / m_currency 等,自动出金
出金结果4003 BankMarginOutEntry → CRMresult 码,回调通知
对账6xxx 系列Entry/Exit多种清单,每日对账
加密SM2 验签解密SM2 签名加密消息头 64B 签名,可选

定时任务

任务频率说明
心跳检测每 30 秒Entry/Exit Server 双向心跳
断连检查每 5 分钟检查 Socket 连接状态,异常则告警
对账发起每日收盘后发起 6001 对账请求
对账核验每日 T+1比对入金/出金/客户清单

需求变更指引

变更需求改动位置说明
修改出金限额auto_settings WHERE id = 2调整 max/alarm/stop 三级阈值
修改处理时段exit_business → 时段配置调整各币种的处理窗口
修改 CNH 限制calcMethod() → CNH 判断逻辑修改 CNH 出金的银行/地区限制
修改取消规则出金取消逻辑 → 时间判断调整 10 分钟缓冲期
更换 SM2 证书cmb_stock_trans/conf/替换公私钥文件并重启服务
调整心跳间隔cmb_stock_trans → keepalive 配置修改心跳频率
新增命令码cmb_stock_trans/comm/pact.h协议定义文件
修改 Entry Server 逻辑cmb_stock_trans/entrance_business/入站消息处理
修改 Exit Server 逻辑cmb_stock_trans/exit_business/出站消息处理
调整备用 exit_serverExit Server 配置修改备用地址列表

代码位置速查

模块路径说明
协议定义cmb_stock_trans/comm/pact.h所有命令码和消息结构定义
Entry Servercmb_stock_trans/entrance_business/入站消息接收和转发
Exit Servercmb_stock_trans/exit_business/出站消息发送(出金指令)
SM2 加密cmb_stock_trans/ 内置模块签名 / 加密 / 解密
限额配置auto_settings 表 id = 2数据库配置
出金通道withdraw/.../Method.phpauto_bs出金方法注册

与其他 BST 银行的对比

维度招商银行 CMB民生银行天星银行
协议二进制 Socket
加密SM2 国密
连接模式双向持久连接
入金✅ 实时通知
出金✅ auto_bs
CNH 支持✅(仅上午)
对账自动对账

BST 的优势

相比普通银行转账入金需要模糊匹配,BST 银证转账最大的优势是确定性——银行直接告知客户 ID 和金额,无需匹配引擎介入,入金实时到账。


常见客诉 Top 3

#用户反馈原因客服话术
1"BST 出金超时"Socket 连接抖动,回调码 -5"出金正在处理中,系统已自动重试,请稍候查看结果"
2"BST 出金被拒"回调码 -6,银行侧拒绝"银行暂时无法处理您的出金,请稍后重试或联系客服"
3"为什么不能用招行出金"银证授权未生效或已失效"请确认您的银证授权状态正常,如已过期请重新签约"

读完之后

我想...去看
了解 BST 银证转账的整体架构BST 银证转账
看招行在各银行中的位置银行能力矩阵
了解出金通道的执行细节通道执行手册
了解出金审批规则出金规则与审批
查 TransType 和 Bank ID 对照入金规则速查
查错误码和状态码统一错误码中心
了解其他入金匹配逻辑匹配与自动入账
这个页面有帮助吗?

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