FinTS 是德国银行采用的金融信息交换标准,XML 仅作为业务数据载荷嵌入其二进制/文本封装结构中,严格遵循官方 XSD 规范,用于余额查询、转账等操作,需配合 TLS、签名加密及会话管理使用。

FinTS(Financial Transaction Services)是德国银行系统广泛采用的金融信息交换标准,其底层通信可基于多种格式,包括 XML(常用于 FinTS 3.0 及更高版本,尤其是与 HBCI 兼容的接口)。它不是纯 XML 协议(如 SOAP),而是将 XML 作为消息载荷格式嵌入在 FinTS 的二进制或文本封装结构中(例如通过 TLS 加密通道传输的 FDMS 或 FINTS 报文块)。
以下是实际使用中关键要点:
FinTS 中 XML 的定位和作用
- FinTS 定义了应用层协议框架(含认证、会话管理、命令分组、签名/加密机制),XML 仅用于承载具体的业务数据(如账户余额查询、转账指令、银行列表等)。
- 每个 FinTS 消息由多个“段”(segments)组成,其中
HNVSK(签名)、HNSHK(加密头)等控制段负责安全,而业务数据段(如HKKAZ查询余额、HKCCS转账)的内容体(SegData)才以 XML 形式编码。 - 使用的 XML 不是通用自由格式,而是严格遵循 FinTS/XSD 规范(由 Deutsche Bundesbank 和 BCS e.V. 发布),每个命令对应特定命名空间和元素结构。
如何构造和解析 FinTS XML 数据
-
必须依据官方 XSD 文件:例如
HKKAZ_V4_0.xsd(余额查询 v4.0)、HKCCS_V5_0.xsd(转账 v5.0)。这些文件定义根元素、必选字段(如BIC,IBAN,Amount,Currency,CustomerReference)、格式约束(日期为YYYYMMDD, 金额为整数分单位)和签名位置。 - 示例(简化版
HKCCS转账 XML 片段):DE44500105170123456789 COBADEFFXXX DE89370400440532013000 DEUTDEDBXXX Max Mustermann 12345 20251216 Rechnung Nr. 123 - 解析时需注意:
- XML 必须带正确命名空间(
xmlns="http://www.fints.org/3.0"),否则验证失败; - 所有数值字段不可带小数点或逗号(欧元金额以“分”为单位,整数表示);
- 时间戳用
YYYYMMDD或YYYYMMDDHHMMSS,无分隔符; - 空元素(如可选字段未填)应省略,不可留
或空字符串。
- XML 必须带正确命名空间(
实际集成中的关键步骤
- 获取银行提供的 FinTS URL、Bankleitzahl(BLZ)、User-ID、PIN,并确认支持的 FinTS 版本(推荐 3.0+,XML 模式);
- 使用支持 FinTS 的 SDK(如 Java 的 jFints、C# 的 FinTS.NET、Python 的 fints 库),它们已封装 XML 序列化、PKCS#1 签名、TLS 握手、报文分段与重传逻辑;
- 手动构造 XML 仅建议用于调试或轻量测试——生产环境务必依赖成熟库处理签名计算、会话密钥协商(如
PINTAN或ChipTAN流程); - 银行返回的响应也是 XML(如
HKKAZ对应HKCAZ),需按相同 XSD 反序列化,并校验和段完整性。
常见陷阱提醒
- 混淆 FinTS 和纯 Web Service:FinTS 不走 HTTP/SOAP,而是基于 TCP 自定义二进制帧(部分网关提供 HTTPS 封装,但内部仍是 FinTS 协议栈);
- 忽略字符编码:所有 XML 必须声明
encoding="UTF-8",且银行系统对非 ASCII 字符(如ü,ß)敏感,需 UTF-8 编码后 Base64 或直接传输; - 未处理会话状态:FinTS 是有状态协议,需维护
DialogID、MessageNumber、SecurityProfile等上下文,XML 本身不包含这些,由外层协议管理。
FinTS XML 的本质是受控的结构化数据容器,安全性和合规性比灵活性更重要。真正难点不在 XML 语法,而在协议流程、加密签名和银行侧配置匹配。










