知识全景图/ 领域知识/ 银行直连

银行直连(银企直联)

企业系统与银行核心系统的直联对接:协议差异、报文解析、适配器设计、支付状态机、安全体系与多银行管理

一、银行直连是什么

企业系统(ERP/司库/费控)与银行核心系统之间建立专用通信通道,让企业在自己的系统里直接完成查询、转账、对账等操作,无需登录网银。

企业业务系统
ERP / 司库 / 费控
银企直联适配层
统一接口 + 多银行适配
银行核心系统
工行 / 建行 / 招行 ...
1.1 直连 vs 间连

银企直连(Direct)

  • 企业直接对接银行,专线或 VPN
  • 逐家银行对接,一家一个接口
  • 成本:银行收接口费/年费
  • 实时性:秒级
  • 功能深度:全功能(余额、交易、票据、外汇)
  • 安全:双向证书、专线、MAC 校验
  • 适用:大型企业、央企、集团资金集中管理

间连(第三方/银联网关)

  • 通过第三方支付平台间接对接
  • 一家平台覆盖多家银行
  • 成本:平台收服务费,按笔或包年
  • 实时性:准实时或批量
  • 功能深度:通常只有支付和查询
  • 安全:依赖平台安全能力
  • 适用:中小企业、电商、快速接入场景
二、直连覆盖的功能
功能大类具体能力业务场景使用频率
账户查询余额查询、当日明细、历史明细资金看板、实时头寸极高(实时)
支付结算单笔付款、批量付款、定时付款集中支付、工资代发、供应商付款
收款管理到账通知、收款认领、自动核销收款与应收匹配
电子回单获取银行电子回单(PDF/图片)自动归档、与业务单据匹配
资金归集自动归集、自动下拨、定存现金池管理
票据业务电票签发、背书、贴现、托收票据池、供应链金融
外汇业务结汇、售汇、远期、期权外汇资金管理
对账文件获取银行对账单文件自动对账高(日终)
代发业务代发工资、代发奖金HR 系统联动低(月度)
授信/融资查询授信额度、放款、还款融资管理
三、系统架构
业务层
支付模块
账户模块
对账模块
票据模块
外汇模块
↓ 调用统一接口 ↓
银企直联平台(统一层)
统一接口定义(查询/支付/对账/...)
报文组装/解析引擎
加解密/签名验签服务
支付状态机
路由策略(银行/通道选择)
日志/报文留存
↓ 银行适配器 ↓
工行 Adapter
报文模板
加密配置
交易码映射
建行 Adapter
报文模板
加密配置
交易码映射
招行 Adapter
报文模板
加密配置
交易码映射
... N 家银行
逐家对接
↓ 网络 ↓
网络层
专线 / VPN / HTTPS
IP 白名单
双向证书认证

适配层是核心设计难点

业务层只看到"支付""查询"等统一接口,不需要知道对接的是哪家银行。适配层负责把统一接口翻译成各家银行的私有报文格式。

新增一家银行 = 新增一个 Adapter,不改动业务代码。

四、银行接口差异全景

这是银行直连开发中最大的痛点:每家银行接口协议完全不同。

维度差异表现影响
传输协议HTTP/HTTPS、Socket 长连接、MQ、FTP适配层需要支持多种通信方式
报文格式XML、JSON、定长报文、ISO 8583每种格式需要对应的解析器
加密方式RSA、SM2、DES、3DES、AES每家银行的密钥体系和加解密流程不同
签名方式数字证书、U 盾、硬件加密机(HSM)签名/验签的实现路径不同
编码规则GBK、UTF-8、GB18030报文解析时的编码转换
日期格式yyyyMMdd、yyyyMMddHHmmss、Unix 时间戳统一时间处理
金额精度分(整型)、元(2 位小数)、4 位小数金额转换和精度对齐
文件格式CSV、TXT(定长/分隔)、Excel、PDF对账文件解析器
响应模式同步返回、异步轮询、主动推送支付状态追踪逻辑不同
错误码每家银行完全不同的错误码体系需要统一的错误码映射表
4.1 主流银行接口特点
银行传输方式报文格式加密特点
工商银行HTTPS / 专线XMLRSA + SM2接口文档相对规范,功能覆盖全面
建设银行HTTPS / 专线XML / 定长RSA + 3DES对账文件格式特殊,定长报文解析复杂
农业银行HTTPS / SocketXMLRSA + SM2Socket 长连接模式,需维护连接池
中国银行HTTPSXML / JSONRSA外汇业务接口丰富
招商银行HTTPSJSONRSA接口设计现代,JSON 格式友好
交通银行HTTPS / 专线XMLRSA + SM4国密支持较早
五、报文交互模型
5.1 典型请求-响应流程
1
报文交互全流程
组装请求报文
数字签名
加密传输
银行处理
银行返回响应
验签 + 解密
解析报文
更新业务状态
5.2 报文结构
请求报文(Request)
<Header>
  版本号(Version)
  交易代码(TranCode)    ← 每家银行编码不同
  企业签约号(CoprId)
  日期时间(TranDate / TranTime)
  请求流水号(ReqSeqNo)  ← 幂等控制关键
</Header>
<Body>
  业务参数(账号、金额、用途...)
</Body>
<Signature>
  MAC / 数字签名         ← 对 Header+Body 做摘要+加密
</Signature>
响应报文(Response)
<Header>
  返回码(RetCode)
  返回信息(RetMsg)
</Header>
<Body>
  业务返回数据(余额、流水号、状态...)
</Body>
<Signature>
  银行签名               ← 必须验签,防篡改
</Signature>
5.3 三种交互模式
模式说明适用场景状态追踪
同步 发送请求,等待银行实时返回结果 余额查询、单笔小额支付 直接根据返回码判断成功/失败
异步 发送请求,银行先返回受理结果,后续通知最终结果 大额支付、批量支付 需要轮询查询或等待银行主动推送
文件 上传/下载文件(对账单、批量明细) 日终对账、批量代发 通过文件处理状态判断
六、支付状态机

这是银行直连最复杂的业务逻辑。一笔支付从发起到最终到账,经历多个状态转换。最棘手的是"超时未知"状态。

  [初始化]
     ↓
  [待审批] → 审批拒绝 → [已取消]
     ↓ 审批通过
  [待发送]
     ↓ 发送到银行
  [已发送]
     ↓
  ┌──────────────────────────────────────────┐
  │              银行处理                      │
  │  → 银行受理    → 交易成功 → [已到账]    │
  │  → 银行处理中  → 交易成功 → [已到账]    │
  │                 → [超时未知]              │
  │  → 银行拒绝  → [交易失败]             │
  └──────────────────────────────────────────┘

超时未知(最棘手的状态)

场景:请求已发送到银行,但在超时时间内没有收到银行响应。钱到底扣没扣?不知道。

处理策略

1. 主动查询:用企业流水号查询银行交易状态

2. 等待轮询:设定查询间隔(如每 30 秒查一次,最多查 N 次)

3. 人工介入:多次查询仍无法确认时,生成异常工单,人工联系银行确认

4. 幂等保护:同一笔业务不允许重复发送,必须等确认后再决定重试或取消

错误原则

宁可多查,不可重发。重复付款的损失远大于查询的延迟。在超时未知状态下,绝对不能直接重发支付指令。

6.1 批量支付状态

批量支付更复杂

一个批量文件包含 N 笔支付,银行返回的是整体受理状态 + 逐笔结果:

- 文件级状态:已接收 / 处理中 / 处理完成 / 处理失败

- 明细级状态:每笔各自的成功/失败/退回

需要两层级联的状态管理:先等文件级处理完成,再逐笔更新明细状态。

七、安全体系
审计层
全报文留存(请求+响应)
操作日志
异常告警
业务层
交易限额控制
操作员权限
双签/多签审批
报文层
数字签名(RSA/SM2)
MAC 校验
报文加密
传输层
HTTPS / TLS 1.2+
双向证书认证
网络层
专线 / VPN
IP 白名单
网络隔离
7.1 签名与加密流程
原始报文
SHA-256/SM3 摘要
RSA/SM2 私钥签名
附加签名到报文
AES/SM4 加密报文体
发送到银行

密钥管理

企业私钥:用于签名请求报文。存储在硬件加密机(HSM)中,绝不落地明文。

银行公钥证书:用于验签银行响应报文。银行定期更换,需监控有效期。

会话密钥:部分银行使用动态会话密钥加密报文体,每次交易协商。

密钥轮换:定期更换密钥对(通常每年),旧密钥过期前完成切换。

八、核心数据模型
实体核心字段说明
银行通道(BankChannel) 银行代码、银行名称
连接方式(专线/VPN/HTTPS)
企业签约号、证书信息
IP 白名单、超时配置、重试策略
一家银行的一个签约关系。同一银行可能有多个签约(不同分公司)。
银行账户(BankAccount) 账号、账户名称
账户类型(基本户/一般户/专用户/临时户)
币种(CNY/USD/EUR)
关联银行通道、签约状态
实时余额(缓存)、最后更新时间
企业在银行开立的账户。一个通道下可以有多个账户。
接口定义(BankInterface) 交易代码(银行原始码)
标准交易类型(查询/支付/对账/...)
报文模板(请求/响应)
加密配置、签名配置
每家银行的每个交易接口定义。适配层的核心配置。
银行交易流水(BankTransaction) 企业流水号(我方生成)
银行流水号(银行返回)
交易类型、金额、币种
交易状态、银行返回码
请求报文(原始留存)
响应报文(原始留存)
发起时间、完成时间
关联业务单据号
每笔与银行交互的完整记录。报文留存用于审计和排查。
对账文件(ReconciliationFile) 文件日期、银行代码
文件类型(日终对账单/交易明细)
原始文件内容
解析状态、解析结果明细
对账结果(匹配/未匹配/差异)
银行提供的日终对账文件。每日自动下载、解析、对账。
错误码映射(ErrorCodeMapping) 银行代码、银行原始错误码
标准错误分类
错误描述、处理建议
把各银行的私有错误码统一映射到标准分类。
8.1 流水号体系

为什么流水号体系是关键

银行直连涉及多方系统,必须通过流水号串联全链路:

- 业务单号:业务系统生成(如付款申请单号)

- 支付流水号:司库/支付平台生成(一笔业务可能拆分为多笔支付)

- 企业流水号:发送给银行的唯一标识(幂等控制的关键

- 银行流水号:银行返回的交易流水号(用于查询和追溯)

关键规则:同一笔支付,企业流水号不能变。重试必须用同一个企业流水号查询,不能生成新的。

九、适配器设计模式

多银行对接的核心是"统一接口 + 多适配器"。业务层不关心银行差异,适配器负责翻译。

// 统一接口定义 interface BankAdapter { BalanceResult queryBalance(account, currency) PaymentResult singlePayment(fromAccount, toAccount, amount, purpose) PaymentResult batchPayment(paymentList) TransactionResult queryTransaction(reqSeqNo) ReconciliationFile downloadStatement(date) } // 工行适配器实现 class ICBCAdapter implements BankAdapter { // 报文模板从配置加载,不在代码里硬编码 queryBalance(account, currency) { msg = assembleFromTemplate("ICBC_BAL_QUERY", params) signed = sign(msg, privateKey) response = send(signed, icbcEndpoint) verify(response, icbcPublicKey) return parseResponse(response, "ICBC_BAL_QUERY") } } // 路由:根据银行代码选择适配器 class BankAdapterRouter { adapters = { "ICBC": ICBCAdapter, "CCB": CCBAdapter, ... } route(bankCode) { return adapters[bankCode] } }

适配器设计的核心原则

配置驱动:报文模板、字段映射、加密配置都做成配置项,不在代码里硬编码。新增银行尽量只加配置,不改代码。

报文模板化:用模板引擎(如 Freemarker/Velocity)定义每家银行的报文格式,运行时动态填充参数。

字段映射表:统一字段名 ↔ 银行私有字段名的映射关系,存在数据库/配置文件中。

全报文留存:每笔交易的请求报文和响应报文必须完整保存,用于审计和问题排查。

十、自动对账

内部账和银行账必须每日核对。对账不是报表,是纠偏机制。

日终触发
下载银行对账单
解析对账文件
与企业流水逐笔匹配
生成差异报告
差错处理
对账结果含义处理方式
匹配成功企业流水与银行流水一一对应,金额一致自动确认,更新状态
企业有银行无企业记录了支付,银行对账单没有可能银行处理延迟 → 次日再查或人工确认
银行有企业无银行有交易记录,企业没有可能是银行端扣费、利息、或其他被动交易 → 自动补录
金额不一致双方都有记录但金额不同可能是手续费差异、汇率差异 → 人工核实
十一、常见认知误区与踩坑
误区: 超时就等于失败
  • 超时只是"没收到响应",不代表银行没处理
  • 直接重发可能导致重复付款
  • 必须先查询确认状态,再决定下一步
误区: 银行接口都差不多
  • 每家银行的报文格式、加密方式、状态码完全不同
  • 以为接了一家就很快能接其他的,是常见误判
  • 适配层的设计质量决定了多银行扩展的代价
误区: 对账是财务的事
  • 没有自动化对账系统,财务只能看到结果,无法修正原因
  • 对账是系统自动纠偏能力的一部分
  • 差错的自动分类和处理才是对账系统真正的价值
误区: 报文解析很简单
  • XML/JSON 还好,定长报文、GBK 编码、特殊分隔符很容易踩坑
  • 银行的"接口文档"经常与实际行为不一致
  • 联调阶段要预留充足时间
十二、趋势与展望
确定性趋势:

国密普及: 越来越多银行支持 SM2/SM3/SM4 国密算法,逐步替代 RSA/SHA-256。

API 化: 银行开放银行(Open Banking)趋势下,RESTful JSON 接口逐渐替代传统 XML 报文。

标准统一: 央行推动金融标准化,报文格式和接口规范趋向统一(但完全统一还有很长的路)。

值得关注:

RPA 辅助: 对于不支持直连的小银行,用 RPA 模拟网银操作获取数据,作为直连的补充。

实时对账: 从日终批量对账走向准实时对账,更快发现差异。

银企直联 SaaS: 第三方平台提供统一银企直联服务,降低中小企业的对接成本。

需要警惕:

报文硬编码: 把报文格式写死在代码里,新增银行就要改代码、发版,维护成本指数级增长。

超时处理缺失: 没有完善的超时状态机和查询机制,积累大量悬挂交易。

密钥管理随意: 私钥明文存储在服务器上,或密钥轮换流程不健全。

十三、与其他领域的关联
司库建设
  • 银企直联是司库系统的核心基础设施
  • 司库通过直连实现资金可视、集中支付、自动归集
政务财务 · 支付结算
  • 财政支付通过国库集中支付体系,底层也是银政直连
  • 支付状态机、对账机制高度相似
油气行业
  • 油气贸易的信用证、票据结算依赖银行直连
  • 大型油气集团也是银企直联的重度用户
总结:
银行直连的本质,不是"调一个银行接口",而是在银行私有协议的丛林中,建立一套统一的适配体系,让业务系统对银行差异无感。核心挑战是:接口差异管理、超时状态处理、报文安全、全链路可追溯

一句话:
这张图回答的不是"怎么调银行 API",而是"一个企业系统怎样在多银行、多协议、多状态的真实世界里持续保持资金操作的正确和可追溯"。
← 返回领域知识