Skip to content

银行流水采集

本页说明

讲什么:每家银行的流水如何到达系统、流水表结构与分片策略、采集定时任务、流水类型码 适合谁:需要理解"匹配引擎的输入从哪来"的产品经理 前置阅读入金方式总览预计阅读:5 分钟 负责人:入金产品经理

核心要点:银行流水采集是匹配引擎的输入源,不同银行的采集方式差异极大——从秒级实时推送到每日 3 次批量拉取,直接决定用户的入金等待时间。


快速跳转 — 你可能想做的事:

为什么需要这一页

Push 模式(FPS、网银、ATM 等)入金的核心前提:银行流水必须先到达系统,匹配引擎才能工作。

不同银行的流水到达方式差异极大——从秒级实时推送到每天仅 3 次的批量拉取。这直接决定了用户从转账到看到"入金成功"的等待时间。理解流水采集机制,是诊断"钱没到"问题和评估银行接入方案的基础。

eDDA/BST 不经过流水采集

Pull 模式(eDDA)和 Direct 模式(BST)的入金不依赖流水采集——系统自己发起扣款/转账指令,知道何时完成。本页仅覆盖 Push 模式的流水采集。


按银行的流水采集方式

实时推送类

汇丰 HSBC — MT910 实时通知

维度说明
协议SWIFT MT910 格式,通过 SFTP 传输 + GPG 加密
到达时效秒级——银行入账后即推送
采集服务hsbc_bank_flow_service(Python)
TransType218(HSBC)
去重机制Transaction Reference Number(:20: 字段)唯一约束

MT910 是 SWIFT 标准的"入账确认"报文。系统定期从 SFTP 下载 GPG 加密文件,解密后解析 MT910 格式,提取交易参考号、金额、币种、付款人姓名等字段。

关键解析字段

  • :20: → 交易参考号(去重标识)
  • :32A: → 日期 + 币种 + 金额(复合字段:YYMMDD + CCY + Amount)
  • :50K: → 付款人姓名(用于姓名匹配)
  • :72: → 附言信息(补充信息)

渣打 SCB / 广发 CGB — FPS API 实时

维度渣打 SCB广发 CGB
协议Webhook 回调 + REST APIREST API 批量/单笔
到达时效秒级秒级
采集服务scb_service(Go)cgb_fps_service(Go)
TransType219(SC_SUBACC)FPS 相关
队列机制DB Queue(9 个 Job Handler)DB Queue(4 个 Job Handler)

渣打通过 Webhook 主动推送交易事件到系统,系统先持久化事件再入队处理(ProcessWebhookEvent → 保存 → 入队)。广发通过 REST API 提交批量或单笔支付任务,系统通过查询 Job 轮询结果。

招行/民生 BST — Socket 双向链路

维度说明
协议二进制 Socket 双向链路,消息级加密
到达时效秒级——事件驱动,银行主动推送
采集服务cmb_stock_trans / ms_stock_bank_transaction
TransType101(民生 BST)、102(招行 BST)、304(天星 BST)

BST(Bank-Securities Transfer)银证转账通过长连接 Socket 通信。银行侧完成资金划转后,通过已建立的 Socket 链路主动推送结果。系统无需轮询。

注意区分

BST 流水是 Direct 模式的一部分,不经过匹配引擎。但 BST 流水仍会写入 flows 表,用于对账和监控。

定时拉取类

中银 BOCHK — B2E 批量拉取

维度说明
协议B2E(Business-to-Enterprise)XML-RPC
到达时效每日 3 次拉取 + 约 2 小时转换处理
采集服务bochk_flow_go(Go)
TransType301(BOC)
去重机制预查询 DB 跳过已存在记录

中银 B2E 是最慢的流水来源。系统每日分 3 次主动拉取:

批次时间拉取内容
TodayActivity~06:00当日已结算交易
AcctStatement~07:00前一日对账单
AcctActivity~08:00近 2 日交易明细(含对手方信息)

拉取后还需 ~2 小时的流水转换TrdRecordFlowConverter / TransactionRecordFlowConverter),将原始记录标准化为 boc_bank_flow 格式后写入 flows 表。

PM 关注点:中银入金的"到账慢"主要来自流水采集延迟,而非匹配引擎。这也是中银匹配时间窗口为 -3~+4 天(比标准 -3~+2 宽 2 天)的原因。

工银亚洲 ICBC — 银企 API 轮询

维度说明
协议银企直连 REST API,RSA 验签
到达时效分钟级
采集服务icbc_be_relay(Python)
TransType202(ICBCASIA)
工银已知系统限制

工银是入金量第二大来源(约 12.3%),但系统限制在所有银行中最多。PM 和运营需特别注意以下已知问题:

限制影响应对措施
无唯一交易 ID流水去重只能依赖组合字段(金额+日期+卡号+备注),重复风险高于其他银行匹配引擎增加额外去重校验逻辑
T-1 迟到流水部分流水在交易日次日才到达系统(非实时)匹配时间窗口额外放宽 1 天
退款/冲正余额校验缺失冲正前无法自动校验证券账户余额是否充足运营冲正前必须手动查询余额
流水格式不稳定工银偶尔调整流水报文格式,无事先通知流水解析器保持兼容性冗余

涉及工银的变更需额外回归

因为上述限制,任何涉及匹配规则或流水解析的变更,都需要额外针对工银做回归测试——特别是去重逻辑和 T-1 流水场景。排障时如遇工银相关问题 → 入金排障 § 工银流水重复

其他 API 轮询

银行采集服务TransType到达时效
星展 DBSdbs_service208分钟级
建银亚洲 CCBAPI 轮询206分钟级
众安 ZAAPI 轮询221分钟级
天星 AirstarAPI 回调304秒级

手工上传类

EWB — CSV + BAI2 文件

维度说明
协议运营手工上传 CSV / BAI2 文件到 OA 后台
到达时效取决于运营操作,通常每日 1-2 次
TransType217(EWB_SUBACC)

CSV 提供基础交易信息,BAI2 补充付款人姓名等匹配所需字段。上传后系统自动解析、去重、写入 flows 表。

汇总对比表

银行采集方式协议到达时效
汇丰 HSBC实时推送MT910 via SFTP秒级
渣打 SCB实时推送Webhook + API秒级
广发 CGB实时推送FPS REST API秒级
招行/民生实时推送Socket 双向链路秒级
天星 AirstarAPI 回调REST API秒级
工银 ICBC定时拉取银企 API分钟级
星展 DBS定时拉取API分钟级
建银 CCB定时拉取API分钟级
众安 ZA定时拉取API分钟级
中银 BOCHK批量拉取B2E XML-RPC小时级
恒生特殊接口分钟~小时
EWB手工上传CSV + BAI2取决于运营

银行到账时效可视化

从用户转账到流水进入系统,各银行的等待体验差异极大:

时效等级银行典型等待用户感知
秒级汇丰(MT910)、渣打(Webhook)、广发(FPS API)、天星(API)<1 分钟"刚转完就看到了"
分钟级 ⏱️工银(银企API)、星展(API)、建银(API)、众安(API)5~30 分钟"过一会就到了"
小时级 🕐中银(B2E 每日3次)2~6 小时"上午转的,下午才到"
不确定恒生(特殊接口)、EWB(手工上传)数小时~次日"要等运营处理"

PM 关注:用户投诉"钱没到"时,先看是哪家银行——如果是中银,2~6 小时的等待是正常的,不是系统故障。

如果需求变更:流水采集相关
变更改动位置说明
新增银行流水采集新建 Go/Python 服务 + crontab 配置参考 入金变更指南 § 场景七
修改 B2E 拉取频率(中银)bochk_flow_go/conf/conf.toml调整 cron 表达式
修改匹配频率deposit/doc/crontab.sh → 对应 match:*参考 入金变更指南 § 场景六
更换 SFTP/API 凭证对应银行采集服务的配置文件通常需运维部署
修改 Flow Converter 频率(中银)bochk_flow_go cron 配置当前每 2 小时

流水采集异常排查

当流水不进来或处理异常时,按以下路径排查。

快速诊断:流水为什么没到

分步 Runbook:收到"某银行流水不进来"告警

第 1 分钟 — 确认影响范围

  1. 查看告警内容:哪家银行?堆积了多少条待处理流水?
  2. 在 OA 流水列表筛选该银行,查看最近一条流水的到达时间
  3. 如果最近流水是几分钟前 → 可能是虚警(流水正常进来,只是匹配延迟)
  4. 如果最近流水是几小时前 → 确认是采集中断

第 2~5 分钟 — 定位采集服务 5. 检查对应的采集服务进程是否存活:

  • 汇丰:hsbc_bank_flow_service(Python)
  • 渣打:scb_service(Go)
  • 广发:cgb_fps_service(Go)
  • 中银:bochk_flow_go(Go)
  • 工银:icbc_be_relay(Python)
  1. 查看服务最近的日志 → 是否有连接超时、鉴权失败、解析异常

第 5~10 分钟 — 尝试恢复 7. 如果服务挂了 → 重启服务,观察 1~2 个周期是否有新流水进入 8. 如果鉴权/证书过期 → 需要更新凭证(联系银行关系团队获取新凭证) 9. 如果银行侧没推送数据 → 非系统故障,记录后联系银行关系团队

第 10~15 分钟 — 补偿处理 10. 服务恢复后,检查中断期间是否有遗漏的流水(对比银行对账单) 11. 如果有遗漏 → 中银可手动触发补拉;其他银行需联系银行重推

超过 15 分钟未恢复 → 升级到技术运维值班人员

分步 Runbook:匹配 Cron 任务未执行

第 1 分钟 — 确认问题

  1. 检查对应的 match:{bank} Cron 是否在运行
  2. 查看最近一次匹配任务的执行时间和结果

第 2~5 分钟 — 排查原因 3. Cron 进程是否存活?如果 Cron 调度器本身挂了 → 所有银行的匹配都会停 4. 检查是否有某个匹配任务执行时间过长(超过 3 分钟),导致下一轮被跳过 5. 检查 DB 连接是否正常 — 匹配任务需要同时访问 flowsapplys

第 5~10 分钟 — 恢复 6. 重启 Cron 调度器 7. 手动触发一次匹配任务,确认执行成功 8. 观察下一个周期是否自动恢复

超过 10 分钟未恢复 → 升级到技术运维


流水表结构与分片

分表策略

流水表按 银行类型 + 月份 分片:

flows_{trans_type}_{YYYYMM}

例如:flows_218_202604 = 2026 年 4 月汇丰 MT910 流水。

为什么这样分

  • trans_type 分:不同银行的流水字段差异大,分开便于各银行独立优化索引
  • 按月分:流水量大,按月归档,历史月份可逐步冻结
配置位置

分表逻辑:deposit/src/app/Business/Flow.php:80 表不存在时自动创建:CREATE_WHEN_TABLE_NOT_FOUND 配置

流水状态生命周期

状态码含义说明
0待处理流水已入库,等待匹配引擎处理
1已处理已成功匹配并创建入金任务
2标记失败需要人工介入解决的问题流水
3标记锁定运营锁定,暂不参与匹配(如等待用户补充信息)
4标记在途已确认转账但流水信息不完整,等待补全
9软删除标记删除(非物理删除)

流水处置结果

当流水被处理时,系统记录处置方式:

结果码含义触发场景
0系统匹配匹配引擎自动匹配成功
1人工添加运营在 OA 后台手动关联
2发起入金运营直接从流水发起入金
3退款流水对应的资金需要退回(详见 退款与冲正
4其他非入金类流水(如利息、手续费)
5已紧急处理通过异常入金流程处理
6自动入金匹配引擎自动匹配 + 自动入账
配置位置

状态码:deposit/src/app/Business/BankFlow.php:59-64 结果码:deposit/src/app/Business/BankFlow.php:80-87


采集定时任务

匹配相关 Cron

匹配引擎每 3 分钟扫描各银行的待处理流水:

任务名频率银行说明
match:ccbasia每 3 分钟建银亚洲CCB 流水匹配
match:ewb每 3 分钟EWBEast West Bank 匹配
match:boc每 3 分钟中银BOCHK B2E 匹配
match:hangseng每 3 分钟恒生恒生直连流水匹配
match:hsbc每 3 分钟汇丰HSBC MT910 匹配
match:main icbc-new每 3 分钟工银ICBC 新版匹配
match:main za-sub-account每 3 分钟众安ZA 子账户匹配

监控相关 Cron

任务名频率说明
monitor:flow-monitor每 30 分钟(07:00~23:00)检测流水堆积——待处理流水超阈值告警
abnormal-deposit:search每 30 分钟扫描无匹配的孤立流水
abnormal-deposit:update-status每 3 分钟更新异常入金状态

对账相关 Cron

任务名频率说明
bank_reconciliation:generate16:15 每日生成当日对账报告(CNH/HKD/USD)
bank_reconciliation:generate --date=yesterday USD09:05 每日生成昨日 USD 对账(因美元 T+1 结算)
crmbos_reconciliation:generate每小时整点CRM-BOS 系统间对账
配置位置

所有 Cron 定义:deposit/doc/crontab.sh


银行流水类型码

不同银行的流水携带不同的 type 字段,标识转账方式。匹配引擎会根据 type 选择不同的匹配规则:

中银 BOCHK

TypeRemarks 关键词含义匹配规则
TransferFPSFPS 转账实时匹配窗口
TransferE-BANKING TRANSFER网银转账标准匹配窗口
TransferCHATSCHATS 清算转账标准匹配窗口
TransferREMIT IN汇入汇款跨区容差
TransferCBS TRANSFERCBS 系统转账标准匹配窗口
Clearing Cheque支票清算标准匹配窗口

恒生 Hang Seng

Type 代码含义匹配规则
ATMATM 存款/转账标准匹配
GT柜台转账标准匹配
WY网银转账标准匹配
ZP支票标准匹配
BPBill Payment 缴费标准匹配

工银 ICBC

Type 关键词含义
匯款存入汇款转入
FPS 轉賬FPS 转账
網上轉賬存款网银转入
櫃員機跨行轉賬存款ATM 跨行转入
支票支票存入

与匹配引擎的衔接

流水一旦写入 flows 表且 status = 0(PROCESSING),就会在下一个 3 分钟匹配周期被扫描。

匹配引擎的详细逻辑 → 匹配与自动入账


常见误解

误解事实
"流水到了就会马上入账"流水到了只是第一步。还需要等匹配引擎下一个 3 分钟周期扫描,匹配成功后才能入账。最快也要等一个匹配周期
"中银入金慢是匹配引擎的问题"不是。中银慢的原因是 B2E 每日只拉取 3 次 + 2 小时转换时间。流水都没进系统,匹配引擎无从匹配
"EWB 流水是自动采集的"不是。EWB 需要运营手工上传 CSV/BAI2 文件。如果运营没上传,系统里就没有流水
"BST 和 eDDA 也需要流水采集"不需要。BST 和 eDDA 是系统主动发起的扣款,系统自己知道结果。本页的流水采集仅针对 Push 模式
"所有银行的流水格式是一样的"完全不一样。每家银行的字段、编码、时间格式都不同,所以每家银行都有独立的采集服务和解析逻辑

读完之后

我想...去看
了解流水到达后的匹配逻辑匹配与自动入账
排查"流水没到系统"的问题入金排障
查 TransType 和流水状态码入金规则速查
看某家银行的详细对接规则银行能力矩阵
了解采集服务在架构中的位置系统架构与数据流
这个页面有帮助吗?

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