4. ACH文件结构

ACH批量支付清算的核心载体是NACHA(National Automated Clearing House Association)定义的文件格式。无论是发起工资代发、供应商付款,还是处理退票(Return)与更正(NOC),系统解析和生成的都是同一套结构化文本文件。理解NACHA文件结构,是排查“文件被拒”“批次不平衡”“退票定位不到原交易”等问题的前提。本节从记录类型、层级关系、字段含义三个维度拆解NACHA文件,并给出实战中的解析要点。

一、核心原理:四层记录与“头—明细—控制”闭环

NACHA文件是典型的行式定长记录结构,每行固定94个字符,以换行符分隔。文件由四种记录类型构成,形成“文件—批次—明细”的三级嵌套,每级都由“头记录”和“控制记录”包裹,构成完整性校验闭环。

  • 文件头记录(File Header,记录类型1):标识发起方、接收方、文件创建时间与文件ID,是整个文件的入口。
  • 批头记录(Batch Header,记录类型5):标识一个批次的服务类别码(SEC)、公司名称、公司标识、生效日期等,决定该批次的业务规则。
  • 明细记录(Entry Detail,记录类型6):承载具体交易,包含交易码、收款方路由号、账号、金额、个人标识号等。
  • 批控制记录(Batch Control,记录类型8):汇总本批次的明细笔数、借记总额、贷记总额、哈希值。
  • 文件控制记录(File Control,记录类型9):汇总整个文件的批次数量、明细块数、借记总额、贷记总额、哈希值。

其中“块(Block)”指每10行记录构成一个块,文件控制记录中的“块数”按10行向上取整计算。这是很多自研系统首次对接ACH时最容易算错的字段。

关键校验逻辑:批控制中的借记总额必须等于该批次所有借记明细金额之和,贷记总额同理;文件控制中的总额必须等于所有批控制之和。任何一处不匹配,接收方(RDFI或ACH运营方)都会整文件拒绝。

二、记录类型与字段含义速查

下表列出四类核心记录的定位与关键字段,便于开发与运维对照解析。

记录类型 位置 关键字段 实战关注点
1 文件头 文件第1行 立即目的地、立即发起方、文件创建日期、文件ID 发起方ID需与ACH运营方备案一致
5 批头 每批首行 服务类别码、公司名称、公司标识、生效日期 SEC决定退票时限与NOC规则
6 明细 批头之后 交易码、RDFI路由号、账号、金额、个人标识号 交易码区分借记/贷记与账户类型
8 批控制 每批末行 明细笔数、借记总额、贷记总额、哈希值 哈希值按路由号前8位累加取模
9 文件控制 文件末行 批次数量、块数、借记总额、贷记总额、哈希值 块数按10行向上取整

三、方法流程:从原始数据到合规文件

生成一个合规NACHA文件,通常遵循以下步骤:

  1. 确定SEC与交易码:根据业务场景选择PPD(个人)、CCD(企业)、WEB(网络发起)等,并匹配对应交易码,如22(活期贷记)、27(活期借记)。
  2. 组装批头:填写公司名称、公司标识、生效日期,确保生效日期符合ACH运营方的提前提交要求。
  3. 写入明细:逐笔填充路由号、账号、金额,金额以“分”为单位右对齐补零,共10位。
  4. 计算批控制:统计笔数、借记总额、贷记总额,并按路由号前8位计算哈希值。
  5. 组装文件头与文件控制:汇总批次数量、块数、总额与哈希值。
  6. 填充块:若文件总行数不是10的倍数,用记录类型9的填充行补齐至整块。
101 021000021 1234567890 2504010000A094101BANK OF TEST        ORIGINATOR CO
5200ORIGINATOR CO        1234567890PPDPAYROLL        250401   1021000020000001
6220210000211234567890       0000010000               JOHN DOE            0
822000000100000000100000000000000000000000001234567890
9000001000001000000010000000000000000000000
9999999999999999999999999999999999999999999999999999999999999999999999999999

上面示例中,第1行是文件头,第2行是批头,第3行是明细,第4行是批控制,第5行是文件控制,第6行是填充行。注意金额字段“0000010000”表示100.00元,单位为分。

四、案例与复盘:退票定位为何失败

某财务系统发起工资代发后收到一笔R01(账户不存在)退票。运维人员尝试用退票文件中的“原始交易标识”回查,却无法定位到原明细。复盘发现:退票文件中的原始条目追踪号(Original Entry Trace Number)由原批头中的“生效日期+发起方路由号+序列号”组成,而该系统在生成原文件时序列号未按批次重置,导致追踪号重复,回查时命中多条记录。

常见误区:
  • 把“块数”按实际行数除以10直接取整,忽略向上取整规则。
  • 哈希值计算时误用完整路由号,正确做法是取路由号前8位数字累加后对10取模。
  • 退票处理时只看金额和账号,忽略原始条目追踪号,导致无法关联原交易。
  • 批控制中的借记/贷记总额与明细不符,文件被整批拒绝。

正确的做法是:在生成文件时即建立“追踪号—业务单号”映射表,退票文件到达后先解析原始条目追踪号,再通过映射表定位原交易,最后根据退票码(R01、R02、R03等)决定是重发、更正还是转人工。

NACHA 文件四层记录结构与校验闭环 记录类型 1 · 文件头 File Header 立即目的地 | 立即发起方 | 文件创建日期 | 文件ID 记录类型 5 · 批头 Batch Header 服务类别码 SEC | 公司名称 | 公司标识 | 生效日期 记录类型 6 · 明细 Entry Detail 交易码 | RDFI路由号 | 账号 | 金额 | 个人标识号 记录类型 8 · 批控制 Batch Control 明细笔数 | 借记总额 | 贷记总额 | 哈希值 记录类型 9 · 文件控制 File Control 批次数量 | 块数 | 借记总额 | 贷记总额 | 哈希值 总额与哈希校验 批控制总额 = 明细之和