用 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_SIZE | HTTP 请求体上限,例:25MB,默认 10MB |
LOG_FORMAT | json / 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 需要购买。