Skip to content

中银 BOCHK

本页说明

讲什么:中银香港的 B2E 入金采集、FTS/FPS 出金汇款、匹配规则、定时任务的完整业务规则,以及渠道侧接口字段详情与 moomoo 侧适配映射 适合谁:需要深入了解中银对接细节的产品经理 前置阅读银行能力矩阵预计阅读:12 分钟 负责人:入金产品经理

核心要点:中银是最大的入金来源银行,通过 B2E 批量文件采集流水——文件拉取频率和解析逻辑直接决定中银用户的入金等待时间。


能力总览

能力支持情况协议/通道核心服务
入金流水采集B2E (Bank-to-Enterprise) XML APIbochk_flow_go (Go)
出金汇款FTS 文件通道 (S14/S16)bochk_fts_mgr (Python)
出金 FPSFPS(经中银 FPS 通道)boc_fps method
出金同行转账FTS 同行boc method
出金跨境电汇电汇tele_transfer method
eDDA/eDDI
银证 BST

中银是入金流水最大的来源银行——大部分香港用户通过中银转账入金,系统通过 B2E API 自动采集流水并匹配到入金申请。


渠道接口概览

维度说明
协议类型HTTP/HTTPS + XML(B2E 银企直联)
认证方式数字证书 + UserId/Password + ECertName/ECertPwd 三重认证
数据格式XML(UTF-8 编码),请求/响应均以 BOCHKE2B 为根节点
采集模式主动拉取(每日 3 次定时 + 每 2 小时 Flow Converter 转换)
证书轮换900 天周期,需提前 30 天更新
连接超时30 秒
限流策略银行侧限流返回 RJ0002,不触发故障转移
去重机制acct_no + seq_no + currency + boc_date 唯一键,UPSERT 操作

与其他银行对比

中银是唯一使用 XML 协议的银行——汇丰/恒生走 SFTP 文件,渣打走 HTTPS JSON,广发走 FPS 通知推送。B2E XML 的特点是结构固定、字段明确,但调试时需注意 XML 命名空间和编码问题。


入金:B2E 流水采集

什么是 B2E

B2E(Bank-to-Enterprise)是中银向企业客户提供的标准 API 接口。moomoo 通过 B2E 接口查询公司收款账户的交易流水,然后与用户的入金申请做匹配。

收款账户

moomoo 在中银开了 5 个币种的收款账户,每笔用户转账都会进入对应币种的账户:

币种账户号配置键
HKD01267600088450HKCUR
USD01267608014549USCUR
CNY01267606013676CNCUR
JPY01287521127472JPCUR
SGD01287526723084SGCUR
配置位置

bochk_flow_go/conf/conf.toml[conf.futu_account.account_numbers]

B2E 三种查询接口

系统通过三种 B2E 接口分时段采集流水,确保不漏单:

接口定时查什么写入表
TodayActivity每天 06:00当天实时交易acct_trd_record
AcctStatement每天 07:00前一天完整对账单acct_trd_record(is_addendum 标记)
AcctActivity每天 08:00详细账务活动(含余额)boc_transaction_record

此外,每 2 小时运行一次 Flow Converter,将原始记录转换为统一的 boc_bank_flow 格式供匹配引擎使用。

数据流

B2E 协议要点

  • 传输方式:HTTP POST,XML 请求/响应体
  • 认证:Token 认证(Ecert Name: FUTU1),Token 900 天轮换周期
  • 超时:30 秒
  • 去重:基于 acct_no + seq_no + currency + boc_date 唯一键,UPSERT 操作
  • 错误处理
    • E11071 / GE11012:无数据(正常,非失败)
    • RJ0002:请求频率限制(不触发切换)
    • 其他错误:记录日志,下次重试

渠道侧接口详情

以下是三种 B2E 接口的完整请求/响应字段定义。所有接口共享同一套认证头(Head),接口间的差异在请求体和响应字段上。

公共请求头(BOCHKE2B > Head)

每个 B2E 请求的 XML 根节点为 BOCHKE2B,其中 Head 部分携带认证和路由信息:

字段类型必填描述
PackageIdstring(17)包ID,自动生成的 17 位数字,每次请求唯一。如 "12345678901234567"
CBSAcctNostringCBS 账号(企业主账号)。如 "01227468128899"
UserIdstring用户ID。如 "FUTU1"
Passwordstring密码(加密传输)
ECertNamestring数字证书名称。如 "FUTU1"
ECertPwdstring数字证书密码(加密传输)

认证安全

Password 和 ECertPwd 在传输前经过加密处理,证书文件存储在服务器的受保护目录中。不要在日志中打印这两个字段的明文值。

公共响应头

所有 B2E 接口的响应都包含以下头部字段,用于判断请求是否成功:

字段类型描述示例
TxStatusstring交易状态,"S" = 成功,"F" = 失败"S"
ErrorCodestring错误码(成功时为空)"E11071"
ErrorDescstring错误描述(成功时为空)"No Record Found"
TxRefNostring银行交易参考号"BOCHK20260429001"
TxDatestring交易日期(YYYYMMDD)"20260429"
TxTimestring交易时间(HHMMSS)"100530"

接口 1:TodayActivity(当日交易查询)

调度时间:~06:00(每日首次拉取当天实时交易)

用途:查询指定账号当天发生的所有交易记录。这是最早获取当天流水的接口,用于尽快匹配入金申请。

请求参数(TodayActivityREQ)

字段类型必填描述
AcctNostring银行账号(即收款账户号)。如 "01267600088450"
请求 XML 示例
xml
<BOCHKE2B>
  <Head>
    <PackageId>12345678901234567</PackageId>
    <CBSAcctNo>01227468128899</CBSAcctNo>
    <UserId>FUTU1</UserId>
    <Password>***</Password>
    <ECertName>FUTU1</ECertName>
    <ECertPwd>***</ECertPwd>
  </Head>
  <TodayActivityREQ>
    <AcctNo>01267600088450</AcctNo>
  </TodayActivityREQ>
</BOCHKE2B>

响应字段(每条交易记录)

字段类型描述示例
SeqNostring当天交易序号,6 位左补零。格式 NN(数字序号)"000001"
Curstring币种代码。格式 3 字符 ISO 4217"HKD" / "USD"
Timestring交易时间(24 小时制)。格式 HH:mm:ss"10:05:30"
TxRefNostring交易参考号(全局唯一)。格式 16 字符"1234567890123456"
Amountstring交易金额(保留 2 位小数)。格式 decimal(16,2)"100000.00"
Particularsstring交易描述/摘要,用于识别交易类型。≤200 字符"E-BANKING TRANSFER"
TxDetailstring交易类型标识。≤50 字符"Transfer"
PayerOrPayeeNamestring付款方/收款方姓名。≤140 字符"CHAN TAI MAN"
PayerOrPayeeAcctNostring付款方/收款方账号。≤34 字符"01287500123456"

字段特别说明

  • SeqNo:同一天内递增,但跨天会重置。去重时必须结合日期使用。
  • TxRefNo:16 字符的全局唯一交易参考号,是匹配和去重的核心字段。
  • Particulars:这是最关键的业务字段——系统通过它的前缀来识别 FPS、网银、CHATS 等交易类型。
  • PayerOrPayeeName:用于姓名匹配,入金时为付款方姓名。注意大小写可能不一致。

接口 2:AcctStatement(账户结单查询)

调度时间:~07:00(查询前一个工作日的完整对账单)

用途:作为 TodayActivity 的补充,拉取前一天的完整结单。写入数据库时带 is_addendum 标记,与当天实时数据做去重合并。

请求参数(AcctStatementREQ)

字段类型必填描述
AcctNostring银行账号。如 "01267600088450"
Curstring币种(HKD/USD/CNY/JPY/SGD)。如 "HKD"
Datestring查询日期(YYYYMMDD),通常为前一工作日。如 "20260428"

响应字段:与 TodayActivity 结构相同(SeqNo、Cur、Time、TxRefNo、Amount、Particulars、TxDetail、PayerOrPayeeName、PayerOrPayeeAcctNo)。

注意事项

AcctStatement 需要为 每个币种单独发起请求。系统会遍历 5 个收款账户的币种,分别请求 HKD、USD、CNY、JPY、SGD 的对账单。如果某币种无交易,接口返回 E11071,这是正常的。

接口 3:AcctActivity(账户动账明细查询)

调度时间:~08:00(支持日期范围查询,获取最详细的账务活动)

用途:这是字段最丰富的接口,除了交易明细外还包含余额信息、GPI 追踪等。写入 boc_transaction_record 表,为对账和审计提供详细数据。

请求参数(AcctActivityREQ)

字段类型必填描述
AcctNostring银行账号。如 "01267600088450"
BicCodestringBIC 代码(筛选特定银行)。如 "BKCHHKHH"
Regionstring地区代码
StartDatestring起始日期(YYYYMMDD)。如 "20260428"
EndDatestring结束日期(YYYYMMDD)。如 "20260429"
TransFlagstring交易方向筛选:C = 贷方(入账),D = 借方(出账)。如 "C"
TransCurstring筛选特定币种。如 "HKD"
MinAmtstring最小金额筛选。如 "1000.00"
MaxAmtstring最大金额筛选。如 "999999.99"
可选参数用法
  • TransFlag:入金采集时通常设为 "C"(仅拉贷方/入账),减少无关数据。如果需要对账,则不传此参数以获取全部。
  • MinAmt / MaxAmt:用于大额交易监控场景,常规采集不使用。
  • BicCode:用于筛选特定来源银行的交易,常规采集不使用。

响应字段(每条交易记录)

字段类型描述示例
TransTypestring交易类型标识"Transfer"
TransRefstring唯一交易参考号。格式 16 字符"1234567890123456"
Particularstring交易描述/摘要。≤200 字符"FPS Transfer"
Curstring币种。格式 3 字符"HKD"
Amtstring交易金额。格式 decimal(16,2)"50000.00"
TransFlagstringC = 贷方(入账),D = 借方(出账)。格式 1 字符"C"
PayerOrPayeeNamestring付款方/收款方姓名。≤140 字符"CHAN TAI MAN"
PayerOrPayeeAcctNostring付款方/收款方账号。≤34 字符"01287500123456"
TransDatestring交易日期时间(含时区)。格式 YYYY/MM/DD HH:mm GMT+08:00"2026/04/29 10:05 GMT+08:00"
ValueDatestring起息日。格式 YYYY/MM/DD"2026/04/29"
AcctNostring本方账号"01267600088450"
LedBalstring分类账余额(交易后)。格式 decimal(16,2)"5000000.00"
AvalBalstring可用余额(交易后)。格式 decimal(16,2)"4800000.00"
GPIFlagstringSWIFT GPI 指示符(跨境汇款时有值)"Y"
GPIIdstringSWIFT GPI 追踪 ID"d2fca123-..."
ChequeNostring支票号码(支票交易时有值)"CHQ001234"

AcctActivity 独有字段

相比 TodayActivity 和 AcctStatement,AcctActivity 多出以下关键字段:

  • LedBal / AvalBal:余额信息,用于对账和余额监控
  • GPIFlag / GPIId:SWIFT GPI 追踪,用于跨境汇款的全流程追踪
  • ChequeNo:支票号码,支票入金场景需要
  • ValueDate:起息日,可能与交易日期不同(跨境汇款常见)
  • TransFlag:明确标记借贷方向,TodayActivity 需要通过金额正负判断

B2E 错误码速查

错误码含义处理策略
E11071无数据(No Record Found)正常,不重试——该时段无交易
GE11012备选无数据标记与 E11071 等效,不重试
RJ0002请求频率限制(Rate Limit)等待后重试,不触发故障转移
E99999通用系统错误指数退避重试(间隔 30s → 60s → 120s)
E10001认证失败检查证书/密码是否过期
E10002账号无权限联系银行确认 B2E 权限

关于 RJ0002

RJ0002 是银行侧限流响应,不应触发故障转移到备用通道。正确做法是等待 30 秒后重试。如果连续出现 RJ0002,需检查是否有多个实例同时在拉取。

B2E XML 字段映射
XML 字段数据库字段说明
SeqNoseq_no交易序号
Currencycurrency币种
Amountamount金额
BOCDateboc_date交易日期 (YYYYMMDD)
BOCTimeboc_time交易时间
TxRefNotx_ref_no交易参考号
Particularsparticulars交易摘要(用于识别交易类型)
PayerOrPayeeNamepayer_or_payee_name付款人/收款人名称
PayerOrPayeeAcctNopayer_or_payee_acct_no付款人/收款人账号

moomoo 侧适配

B2E 接口返回的原始字段不能直接用于匹配引擎——需要经过 Flow Converter 标准化后写入 boc_bank_flow 表。以下是完整的字段映射和转换逻辑。

流水标准化映射

B2E 原始字段BankFlow 标准字段转换逻辑说明
TxRefNotransaction_id"BOC_" + YYYYMMDD + "_" + TxRefNo加前缀防止跨银行 ID 冲突
Amountcredit直接映射 decimal(16,2)入金流水取贷方金额
Curccy直接映射(HKD/USD/CNY/JPY/SGD)ISO 4217 三字符代码
TimetimeHH:mm:ssHHMMSS(去除冒号)统一为 6 位数字格式
Particularsremarks直接映射保留原始描述,用于交易类型识别
PayerOrPayeeNameen_name直接映射付款方英文姓名
PayerOrPayeeAcctNocustomer_account直接映射付款方银行账号
TxDetailtype交易类型标识用于分类统计
BOCDateboc_dateYYYYMMDD → DATE交易日期
AcctNoacct_no直接映射收款方账号(moomoo 的账号)
SeqNoseq_no直接映射交易序号

transaction_id 生成规则

transaction_id = "BOC_" + boc_date + "_" + tx_ref_no

例如:TxRefNo 为 1234567890123456,日期为 20260429,则生成: BOC_20260429_1234567890123456

这个 ID 是全局唯一的,也是去重和匹配的核心标识。

交易类型自动识别

系统通过流水的 particulars(交易摘要) 字段自动识别交易类型,不同类型的匹配规则和手续费容差不同:

Particulars 关键词识别为可自动入账手续费特征
FPS TransferFPS 转数快无手续费,精确匹配。最常见的入金方式
E-BANKING TRANSFER网银转账无手续费,精确匹配。中银网银到账
CHATS TransferCHATS 同城清算可能有手续费,本地容差。即时支付结算
REMIT IN跨境汇款中转行扣费,跨境容差。海外汇入,容差最大
CBS TRANSFERCBS 内部转账❌ 仅匹配特殊处理。中银体系内转账,需人工审核
ATM TransferATM 转账无法验证来源,仅记录
Cheque Clearing支票入账支票有退票风险,需人工确认
Interest利息收入非入金流水,自动忽略
对应代码

deposit/src/app/Business/Match/BocMatch.phpNewMatchRule() 方法,根据 remarks 字段的正则匹配分发到不同规则。

匹配规则详解(BocMatch)

FPS 转数快规则

维度规则
识别条件particulars"FPS" 开头
金额匹配精确匹配(流水金额 = CRM 申请金额)
姓名匹配精确匹配 → 自动入账;相似匹配 → 人工确认
日期窗口申请日期 ± 15 天
自动入账✅ 金额精确 + 姓名精确时自动入账
卡号校验BOC 卡号必须为 14 位

网银转账规则

维度规则
识别条件particulars"E-BANKING TRANSFER" 开头
金额匹配精确匹配(无手续费扣除)
姓名匹配精确匹配 → 自动入账;相似匹配 → 人工确认
日期窗口申请日期 ± 15 天
自动入账✅ 金额精确 + 姓名精确时自动入账
特殊处理网银转账通常附带完整的付款人信息,匹配成功率高

CHATS 同城清算规则

维度规则
识别条件particulars"CHATS" 开头
HKD/CNH/JPY 金额容差CRM - 20 ≤ 流水 ≤ CRM
USD/SGD 金额容差CRM - 3 ≤ 流水 ≤ CRM
姓名匹配精确匹配 → 自动入账;相似匹配 → 人工确认
日期窗口申请日期 ± 15 天
自动入账✅ 容差内 + 姓名精确时自动入账

跨境汇入规则(REMIT IN)

维度规则
识别条件particulars"REMIT IN" 开头
HKD/CNH/JPY 金额容差CRM - 420 ≤ 流水 ≤ CRM
USD/SGD 金额容差CRM - 60 ≤ 流水 ≤ CRM
姓名匹配精确匹配 → 自动入账;相似匹配 → 人工确认
日期窗口申请日期 ± 15 天
自动入账✅ 容差内 + 姓名精确时自动入账
特殊说明跨境汇款经过中转行会扣除 20-400 港币手续费,所以容差设为 -420

CBS / ATM 规则

类型识别条件自动入账原因
CBS 内部转账particulars"CBS TRANSFER" 开头❌ 仅匹配可能涉及集团内部资金调拨,需区分客户入金和运营转账
ATM 转账particulars"ATM" 开头缺少付款人信息,无法可靠验证来源

为什么跨境容差大得多? 跨境汇款经过中转行,中转行可能扣除 20-400 港币手续费,跨境容差设为 -420,远大于本地的 -20。

为什么日期窗口是 ±15 天? 中银是最大的入金来源,部分用户转账后很久才提交入金申请(或反过来),15 天窗口覆盖绝大多数延迟场景。

大额在线入金门槛

对于通过银行卡绑定(bind_card, notice_type)触发的在线入金,还有金额下限限制:

  • HKD/CNH/JPY:流水金额 ≥ 10,000
  • USD/SGD:流水金额 ≥ 1,500

入金超时配置

不同转账方式、不同银行类型、不同币种下的预期到账时间和超时阈值:

FPS 转数快

维度时间
预期到账即时(通常 1-5 分钟)
系统超时30 分钟
超时处理标记待人工核实
适用币种HKD、CNY

网银转账(中银同行)

维度时间
预期到账即时 - 2 小时(取决于银行处理时间)
系统超时4 小时
超时处理标记待人工核实
适用币种HKD、USD、CNY、JPY、SGD

CHATS 同城清算

维度时间
预期到账同日(工作日 09:00-17:30 处理)
系统超时T+1 工作日
超时处理标记待人工核实
适用币种HKD
注意事项非工作时间提交的 CHATS 会在下一工作日处理

跨境汇入(REMIT IN)

维度HKD/CNYUSDJPY/SGD
预期到账T+1 - T+2T+1 - T+3T+2 - T+5
系统超时T+3 工作日T+5 工作日T+7 工作日
超时处理标记待人工核实标记待人工核实标记待人工核实
注意事项中转行处理时间不确定涉及 SWIFT 清算小众币种清算链路更长

定时任务

任务频率说明
B2E TodayActivity每天 06:00拉取当天流水
B2E AcctStatement每天 07:00拉取前日对账单
B2E AcctActivity每天 08:00拉取详细账务
Flow Converter每 2 小时将原始记录转为 boc_bank_flow
match:boc每 3 分钟执行 BOC 流水匹配

出金:FTS 文件通道

什么是 FTS

FTS(Fund Transfer Service)是中银的批量汇款文件通道。moomoo 将出金指令以 S14 格式上传到中银 SFTP 服务器,中银处理后生成 S16 结果文件供下载。

数据流

S14/S16 文件格式

文件类型方向内容
S14moomoo → 中银出金指令(收款人信息、金额、币种)
S16中银 → moomoo处理结果(含交易状态、实际金额、余额)

S16 文件为定宽格式(每条记录 1024+ 字符),支持多编码(UTF-8、Big5HKSCS、GBK)。

S16 文件关键字段
字段说明
seq_no交易序号(16位,唯一标识)
futu_account富途监管账号(14位)
t_date交易日期 (YYYYMMDD)
v_date起息日 (YYYYMMDD)
ccy币种 (HKD/USD/CNY...)
amount交易金额
borrowing_directionC=贷记(入账) / D=借记(出账)
ledger_balance交易后余额
account对手方账号
name对手方名称
settlement_method结算方式
fee银行手续费
abstract交易摘要

Relay 层

bochk_relay 是 B2E 请求的中继层(SRPC 服务),提供 5 个 RPC 接口:

RPC 方法超时用途
InternalTrans60s内部转账指令
QueryInternalTrans30s查询转账状态
QueryAcctBalance30s查询账户余额
QueryTodayActivity50s查询当天活动
QueryAcctStatement50s查询账户对账单

S14/S16 一致性校验

系统会对比 S14(指令)和 S16(结果)的关键字段,确保数据一致:

监控指标含义
1946146S14/S16 流水不匹配(需要关注)
1946147S16 比 S14 信息更完整(正常)
1946148S14 和 S16 完全一致

出金:BOC FPS

除了 FTS 文件通道,中银还支持通过 FPS(转数快) 通道出金,方法码为 boc_fps

适用条件

条件要求
收款银行所在地香港
币种HKD 或 CNY
金额上限< 100 万
银行卡状态已验证 (checked=1)
排除的收款银行工银(10)、恒生(8)、中银(9)、汇丰(11)

为什么排除这些银行? 这些银行有自己的专属出金通道(如恒生走 hase 网银,汇丰走 hsbc 网银),走 FPS 反而可能更慢或有限额限制。


出金:同行转账与跨境电汇

通道方法码适用场景
中银同行提款boc收款方也是中银账户
中银跨境电汇tele_transfer跨境汇款到境外银行

需求变更指引

如果需要修改中银相关的业务规则,以下是具体的改动位置:

变更需求改动位置说明
新增收款币种bochk_flow_go/conf/conf.toml添加新币种账户映射
修改入金匹配容差BocMatch.phplocalTransferSimilarAmount / isDifAreaSimilarAmount调整金额容差阈值
新增交易类型识别BocMatch.phpNewMatchRule()添加新的 particulars 正则规则
修改匹配日期窗口BocMatch.phpdaySimilar调整天数参数
修改 FPS 出金限额BOCFPS.phpmake_able_where修改金额阈值
调整 FPS 排除银行BOCFPS.phpmake_able_where修改 bank_id 排除列表
修改 B2E 拉取频率bochk_flow_go/conf/conf.toml → cron 表达式调整定时任务
修改匹配频率deposit/doc/crontab.shmatch:boc调整 cron 间隔
FTS 超时/重试bochk_relay 各 RPC 方法的 timeout 参数调整超时时间
新增 FTS 监控指标bochk_fts_mgrcus_fmonitor.py添加新的监控 ID
修改流水标准化映射bochk_flow_go → Flow Converter 模块调整 B2E → BankFlow 字段映射
修改入金超时阈值匹配引擎配置调整各转账方式的超时时间

常见客诉 Top 3

#用户反馈原因客服话术
1"FPS 入金没到"particulars 无法识别入金方式,流水标记为未识别"您的转账正在处理中,我们会尽快完成匹配入账"
2"跨境汇入扣了手续费"中间行/汇入行扣除手续费属正常"跨境汇款可能产生银行手续费,实际到账金额以银行扣费后为准"
3"入金等了好几天"中银日期窗口 ±15 天,匹配周期较长"中银入金匹配周期较长,请耐心等待,如超过 3 个工作日请联系客服"

读完之后

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

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