代码 用 Go 处理 ACH 文件:moov-io/ach 的 reader/writer/validator 与 HTTP 服务

2026-10-10 21:31:29

用 Go 处理 ACH 文件:moov-io/ach 的 reader/writer/validator 与 HTTP 服务

ACH(Automated Clearing House)是美国电子资金转移的主要方式,文件本身遵循 Nacha 标准,是固定宽度的文本文件。生成、解析、校验这类文件意味着要处理一堆按列切分的字段,moov-io/ach 把 reader、writer 和 validator 都实现好了。

项目地址:
文档站:

项目状态上,Moov ACH 已在多个生产环境使用,支持生成和解析全部 Standard Entry Class (SEC) 代码,并按 Nacha 标准校验文件。除 HTTP 服务外,也提供 Go 库。

如果需要的是事件驱动的 ACH 引擎,用来上传/下载文件和做各种操作,moov 另外做了 moov-io/achgateway,同样在生产环境跑着。官方那篇 How and When to use the Moov ACH Library 讲的是如何生成 ACH 文件并上传到你的 ODFI。

用 Docker 起一个 HTTP 服务

公开镜像 moov/ach 在 Docker Hub 上,不需要任何配置,默认在 :8080 提供服务,指标在 :9090/metrics,Prometheus 格式。

docker pull moov/ach:latest
docker run -p 8080:8080 -p 9090:9090 moov/ach:latest

列出内存中已存储的文件:

curl localhost:8080/files
{"files":[],"error":null}

在服务上创建一个文件:

curl -X POST --data-binary "@./test/testdata/ppd-debit.ach" http://localhost:8080/files/create
{"id":"","error":null}

再按 ID 读回来,返回的是 JSON 形式:

curl http://localhost:8080/files/

配置项

服务通过环境变量配置:

变量说明
ACH_FILE_TTL内存仓库中 *ach.File 对象的 TTL,0 表示永不删除,例:240m
ACH_MAX_BODY_SIZEHTTP 请求体上限,例:25MB,默认 10MB
LOG_FORMATjson / plain,默认 plain
HTTP_BIND_ADDRESS默认 :8080
HTTP_ADMIN_BIND_ADDRESS默认 :9090
HTTP_WRITE_TIMEOUT默认 30s
HTTPS_CERT_FILE / HTTPS_KEY_FILE启用 HTTPS 时使用

持久化上的取舍

按设计,ACH 不持久化任何文件、批次、entry 明细数据。唯一的存储是进程内存,重启之后文件、批次、数据全部不存在。进程内存中的数据也不做加密。需要留存和加密的话,得自己在外面接一层。

Go 库

使用 Go Modules,要求 Go 1.18 或更新版本。

$ go get -u github.com/moov-io/ach
$ go doc github.com/moov-io/ach BatchHeader

Go 模块路径为 github.com/moov-io/ach。客户端库除 Go 外还有 Node/JavaScript;README 里有大量 reader 和 writer 应用于各类 ACH 交易类型的示例。

支持的 SEC 代码

ACK、ADV、ARC、ATX、BOC、CCD、CIE、COR (NOC)、CTX、DNE、ENR、IAT、MTE、POP、POS、PPD(借记+贷记)、RCK、SHR、TEL、TRC、TRX、WEB、XCK。分段文件(segment files)支持 IAT 和 PPD。

命令行 achcli

achcli 随每个 release 发布,把 ACH 文件以人类可读的格式打印出来,带 -mask 参数可以遮蔽 DFIAccountNumber 的值。

输出内容包括文件头(Origin / OriginName / Destination / DestinationName / FileCreationDate / FileCreationTime)、批次信息(BatchNumber / SECCode / ServiceClassCode / CompanyName / EntryDescription)、交易行(TransactionCode / RDFIIdentification / AccountNumber / Amount / Name / TraceNumber / Category),以及批次和文件的控制总计(EntryAddendaCount / EntryHash / TotalDebits / TotalCredits)。

浏览器解析与 SDK

浏览器内 reader:,把 ACH 文件转成 JSON,完全在客户端完成,不存储任何内容。

openapi.yaml 是 OpenAPI 3.0.2 规范,描述了创建、解析、校验 ACH 文件的 HTTP API。可以据此生成客户端 SDK,接入 Swagger UI / Redoc,或做自动化测试。Node SDK 就是从 API 文档生成的。

主要 API 端点

  • POST /files/{fileID} — 从 JSON 或纯文本创建 ACH 文件
  • GET /files — 列出所有 ACH 文件
  • GET /files/{fileID} — 获取指定 ACH 文件
  • POST /files/{fileID}/validate — 校验 ACH 文件
  • POST /files/{fileID}/segments — 对 ACH 文件做分段

校验选项(query 参数)

skipAll、allowEmptyIndividualName、allowInvalidAmounts、customTraceNumbers、bypassBatchValidation,以及若干其他选项。

了解 ACH 本身

Nacha 面向开发者提供了一份免费的 ACH guide;官方的 Nacha Operating Rules 需要购买。

复制全文 生成海报 Go ACH Nacha 支付文件 开源工具

推荐文章

程序员茄子在线接单