Cinchoo NACHA
.NET 的简单 NACHA 驱动程序
1. 引言
ChoETL.NACHA 是一个开源的 .NET NACHA 驱动程序。它是一个基于代码的库,用于在 .NET 环境中读取和生成 NACHA 格式的文件。由于生成像 ACH 文件这样的大型固定宽度文档可能很繁琐且容易出错,因此我创建并开源了 Cinchoo NACHA。
如今,自动清算所 (ACH) 网络是资金通过银行系统电子化流动的最主要方式。它在美国使用 NACHA 文件格式来转移资金。
特点
- 遵循标准的 NACHA 规范
- 自动处理大部分的家政计算工作
- 详细且强大的错误处理,让您能够快速查找和修复问题
2. 要求
对 ACH/NACHA 规范有一些基本的了解。此框架库是用 C# 编写的,使用了 .NET 4.5 / .NET Core 框架。
通过 程序包管理器控制台,使用基于 .NET 环境的 Nuget 命令安装 NACHA 库
.NET Framework
install-package ChoETL.NACHA
.NET Core
install-package ChoETL.NACHA.NETStandard
3. 使用代码
3.1 什么是 NACHA 文件?
ACH 文件本质上就是一个包含多行 ASCII 文本的文件,每行长度为 94 个字符。一行被称为一个“记录”。
ACH 文件中有 5 种主要的记录类型
- 文件头记录
- 批头记录
- PPD 入账明细记录
- 批尾记录
- 文件尾记录
有关更多详细信息,请阅读 NACHA 规范。
3.2 读取 ACH 文件
如果您有一个 ACH 退回文件,您可以用 Cinchoo NACHA 库用几行代码加载它。
列表 3.2.1 NACHA 读取器示例
foreach (var r in new ChoNACHAReader("20151027B0000327P018CHK.ACH"))
Console.WriteLine(r.ToStringEx());
在上面的代码中,创建一个 ChoNACHAReader
类的对象并将 ACH 文件传递进去。该对象会返回一个 NACHA 记录列表供您迭代。
更新:如果 ACH 文件在文件尾记录之后包含填充记录,读取器现在会将其丢弃。
在下面的示例 ACH 文件中,NACHA 读取器将不会读取最后的 4 条记录。
列表 3.2.2 NACHA 示例文件
101123456789 123456789 1702170810A094101PNC Bank PNC Bank Internal
5200Microsoft Inc. 123456789 PPD 1123456780000001
82000000000000000000000000000000000000000000123456789 123456780000001
5200Microsoft Inc. 123456789 PPD 1123456780000002
82000000000000000000000000000000000000000000123456789 123456780000002
9000002000001000000000000000000000000000000000000000000
9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
3.3 生成 ACH 文件
如果您想生成 ACH 文件,您可以使用 Cinchoo NACHA 库用几行代码来完成。
列表 3.3.1 NACHA 写入器示例
ChoNACHAConfiguration config = new ChoNACHAConfiguration();
config.DestinationBankRoutingNumber = "123456789";
config.OriginatingCompanyId = "123456789";
config.DestinationBankName = "PNC Bank";
config.OriginatingCompanyName = "Microsoft Inc.";
config.ReferenceCode = "Internal Use Only.";
config.BlockingFactor = 10;
using (var nachaWriter = new ChoNACHAWriter("ACH.txt", config))
{
using (var bw1 = nachaWriter.CreateBatch(200))
{
using (var entry1 = bw1.CreateDebitEntryDetail
(20, "123456789", "1313131313", 22.505M,
"ID Number", "ID Name", "Desc Data"))
{
entry1.CreateAddendaRecord("Monthly bill");
}
using (var entry2 = bw1.CreateCreditEntryDetail
(20, "123456789", "1313131313", 22.505M,
"ID Number", "ID Name", "Desc Data"))
{
}
}
using (var bw2 = nachaWriter.CreateBatch(200))
{
}
}
在上面的代码中,我们创建一个 ChoNACHAConfiguration
对象,并为其分配基本和必需的银行相关信息。使用 ACH 文件名和配置对象实例化 ChoNACHWriter
对象以开始生成过程。
然后,您可以使用 ChoNACHAWriter.CreateBatch()
方法顺序创建多个 NACHA 批次。之后,使用 ChoNACHABatchWriter
对象创建借记或贷记入账明细记录。可选地,您可以使用 ChoNACHAEntryDetailWriter
对象创建附加记录。
完成后,ACH 文件将立即生成。
3.4 ChoNACHAConfiguration
在使用 Cinchoo NACHA 读取/写入 NACHA 文件时,以下是可用的 NACHA 配置选项。
- FieldValueTrimOption - 解析时修剪值的选项。可能的值为 None, TrimStart, TrimEnd, Trim。
- PriorityCode - 数字越小,处理优先级越高。目前只使用 01
- DestinationBankRoutingNumber - 标识处理文件的银行站点的编号。
- TurnOffDestinationBankRoutingNumber
- OriginatingCompanyId - 用于识别收集付款的实体(称为发起者)的编号。
- TurnOffOriginatingCompanyIdValidation
- FileIDModifier - 唯一文件标识符。用于区分多个输入文件的代码。
- BlockingFactor - 一个非零值,NACHAWriter 将在最后一个不完整的块中生成带有文件尾填充记录的文件。
- FormatCode - 目前只有一个代码。输入 1。
- DestinationBankName - 目标银行名称。
- OriginatingCompanyName - 起始银行名称。
- Reserved - 用于文件尾记录(类型 9)保留字段的保留字符。
- ReferenceCode - 可选字段,可用于内部会计目的描述输入文件。
- BatchNumber - 按顺序编号的批次。
- BatchNumberGenerator - 自定义批次编号生成器。
- EntryDetailTraceSource - 入账明细记录中跟踪号的来源(
DestinationBankRoutingNumber/OriginatingDFI
)
3.5 BlockingFactor 用法示例
如果 ChoNACHAConfiguration.BlockingFactor
指定为非零值,NACHAWriter
将在最后一个不完整的块中生成带有文件尾填充记录的文件。
以下示例显示了 BlockingFactor
为 10
的 ACH 输出文件。
列表 3.3.2 带有填充记录的 NACHA 文件输出
101123456789 123456789 1702170810A094101PNC Bank PNC Bank Internal
5200Microsoft Inc. 123456789 PPD 1123456780000001
82000000000000000000000000000000000000000000123456789 123456780000001
5200Microsoft Inc. 123456789 PPD 1123456780000002
82000000000000000000000000000000000000000000123456789 123456780000002
9000002000001000000000000000000000000000000000000000000
9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
如果 ChoNACHAConfiguration.BlockingFactor
指定为零值,NACHAWriter
将不在最后一个不完整的块中生成带有文件尾填充记录的文件。
列表 3.3.3 没有填充记录的 NACHA 文件输出
101123456789 123456789 1702170810A094101PNC Bank PNC Bank Internal
5200Microsoft Inc. 123456789 PPD 1123456780000001
82000000000000000000000000000000000000000000123456789 123456780000001
5200Microsoft Inc. 123456789 PPD 1123456780000002
82000000000000000000000000000000000000000000123456789 123456780000002
9000002000001000000000000000000000000000000000000000000