golang自动化清算所(ACH)文件读写与验证插件库ach的使用
Golang自动化清算所(ACH)文件读写与验证插件库ach的使用
Moov的使命是为开发者提供一种简单的方式,将银行处理功能创建并集成到他们自己的软件产品中。我们的开源项目每个都专注于解决金融服务中的单一职责,并围绕性能、可扩展性和易用性进行设计。
ACH实现了用于自动化清算所(ACH)文件的读取器、写入器和验证器,遵循Nacha标准。ACH是美国电子资金流动的主要方式。HTTP服务器可通过Docker镜像获得,Go包github.com/moov-io/ach
也可用。
项目状态
Moov ACH已在多个生产环境中积极使用。该项目支持生成和解析所有标准条目类(SEC)代码,并根据Nacha标准验证文件。
使用方式
ACH项目实现了HTTP服务器和Go库,用于创建和修改ACH文件。我们提供了Go和Node/JavaScript的客户端库,以及大量的读取器和写入器应用于各种ACH交易类型的示例。
作为Go模块使用
本项目使用Go Modules,需要Go v1.18或更新版本。我们强烈建议在生产中使用标记版本。
// 拉取到Go模块缓存
go get -u github.com/moov-io/ach
// 显示BatchHeader包的文档
go doc github.com/moov-io/ach BatchHeader
完整示例代码
下面是一个完整的ACH文件读写示例:
package main
import (
"fmt"
"log"
"os"
"github.com/moov-io/ach"
)
func main() {
// 创建一个新的ACH文件
file := ach.NewFile()
file.Header = ach.NewFileHeader()
file.Header.ImmediateDestination = "231380104" // 路由号码
file.Header.ImmediateOrigin = "121042882" // 发起方号码
file.Header.FileCreationDate = "200625" // YYMMDD格式
file.Header.FileCreationTime = "1234" // HHMM格式
file.Header.ImmediateDestinationName = "Federal Reserve Bank"
file.Header.ImmediateOriginName = "My Bank Name"
// 创建一个批次
batch := ach.NewBatchPPD()
batch.SetHeader(ach.NewBatchHeader())
batch.Header.ServiceClassCode = ach.DebitsOnly
batch.Header.CompanyName = "Company Name"
batch.Header.CompanyIdentification = "121042882"
batch.Header.StandardEntryClassCode = "PPD"
batch.Header.CompanyEntryDescription = "PAYROLL"
batch.Header.EffectiveEntryDate = "200625" // YYMMDD格式
batch.Header.ODFIIdentification = "12104288"
// 创建一个条目
entry := ach.NewEntryDetail()
entry.TransactionCode = ach.CheckingDebit
entry.SetRDFI("231380104")
entry.DFIAccountNumber = "12345678"
entry.Amount = 100000 // 金额(美分)
entry.IndividualName = "Receiver Account Name"
entry.SetTraceNumber(batch.Header.ODFIIdentification, 1)
entry.Category = ach.CategoryForward
// 将条目添加到批次
batch.AddEntry(entry)
if err := batch.Create(); err != nil {
log.Fatalf("创建批次失败: %v", err)
}
// 将批次添加到文件
file.AddBatch(batch)
if err := file.Create(); err != nil {
log.Fatalf("创建文件失败: %v", err)
}
// 将ACH文件写入标准输出
w := ach.NewWriter(os.Stdout)
if err := w.Write(file); err != nil {
log.Fatalf("写入ACH文件失败: %v", err)
}
// 验证文件
if err := file.Validate(); err != nil {
log.Fatalf("验证ACH文件失败: %v", err)
}
fmt.Println("\nACH文件验证通过")
}
支持的标准条目类(SEC)代码
SEC代码 | 描述 | 示例 | 读取 | 写入 |
---|---|---|---|---|
ACK | CCD的确认条目 | Credit | ACK Read | ACK Write |
PPD | 预先安排的付款和存款 | Debit Credit | PPD Read | PPD Write |
命令行工具
每个版本都发布一个achcli
实用程序。此工具可以以人类可读的格式显示ACH文件,这比它们的纯文本格式更容易阅读。它还允许使用-mask
标志屏蔽DFIAccountNumber
值。
学习ACH知识
常见问题
是否有将ACH文件转换为JSON的浏览器内工具? 是的!您可以在http://oss.moov.io/ach/找到我们的浏览器实用程序。
我的数据是否保存在某处? 不,我们不会保存与文件、批次或条目详细信息相关的任何数据。所有处理都在内存中完成。
支持哪些ACH交易类型? 我们支持生成和解析所有标准条目类(SEC)代码。
许可证
Apache License 2.0 - 详情请参阅LICENSE文件。
更多关于golang自动化清算所(ACH)文件读写与验证插件库ach的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
更多关于golang自动化清算所(ACH)文件读写与验证插件库ach的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
Golang ACH 文件处理与验证:ach 库使用指南
ACH (Automated Clearing House) 是美国常用的电子资金转账系统,用于银行间批量交易处理。在Go语言中,ach
库提供了创建、读取和验证ACH文件的功能。
安装 ach 库
go get github.com/moov-io/ach
基本使用示例
1. 创建 ACH 文件
package main
import (
"fmt"
"time"
"github.com/moov-io/ach"
)
func main() {
// 创建新的ACH文件头
fileHeader := ach.NewFileHeader()
fileHeader.ImmediateDestination = "231380104" // 接收方路由号码
fileHeader.ImmediateOrigin = "121042882" // 发起方路由号码
fileHeader.FileCreationDate = time.Now().Format("060102") // YYMMDD
fileHeader.FileCreationTime = time.Now().Format("1504") // HHMM
fileHeader.ImmediateDestinationName = "Federal Reserve Bank"
fileHeader.ImmediateOriginName = "My Bank Name"
fileHeader.ReferenceCode = "12345678"
// 创建新的ACH文件
file := ach.NewFile()
file.SetHeader(fileHeader)
// 创建批次
batchHeader := ach.NewBatchHeader()
batchHeader.ServiceClassCode = ach.CreditsOnly
batchHeader.CompanyName = "Company Name"
batchHeader.CompanyIdentification = file.Header.ImmediateOrigin
batchHeader.StandardEntryClassCode = ach.PPD
batchHeader.CompanyEntryDescription = "PAYROLL"
batchHeader.EffectiveEntryDate = time.Now().AddDate(0, 0, 1).Format("060102") // 明天
batchHeader.ODFIIdentification = "12104288" // 前8位路由号码
// 创建批次并添加到文件
batch, err := ach.NewBatch(batchHeader)
if err != nil {
fmt.Printf("Error creating batch: %v\n", err)
return
}
// 创建条目
entry := ach.NewEntryDetail()
entry.TransactionCode = ach.CheckingCredit
entry.SetRDFI("231380104") // 接收方路由号码
entry.DFIAccountNumber = "12345678"
entry.Amount = 100000 // 1000美元(以分为单位)
entry.IdentificationNumber = "1234567890"
entry.IndividualName = "Receiver Name"
entry.SetTraceNumber(batchHeader.ODFIIdentification, 1)
entry.Category = ach.CategoryForward
// 将条目添加到批次
batch.AddEntry(entry)
if err := batch.Create(); err != nil {
fmt.Printf("Error creating batch: %v\n", err)
return
}
// 将批次添加到文件
file.AddBatch(batch)
if err := file.Create(); err != nil {
fmt.Printf("Error creating file: %v\n", err)
return
}
// 输出ACH文件内容
fmt.Println(file.String())
}
2. 读取和验证ACH文件
package main
import (
"fmt"
"log"
"github.com/moov-io/ach"
)
func main() {
// 示例ACH文件内容
achFileContents := `101 231380104 1210428820610121504A094101Federal Reserve BankMy Bank Name 12345678
5225Company Name PPDPAYROLL 061013 1121042880000001
62723138010412345678 00001000001234567890 Receiver Name 0121042880000001
822500000100231380104000000000000001000000000000001121042880000001
90000010000010000000100231380104000000000000001000000000000001121042880000001`
// 从字符串读取ACH文件
file, err := ach.NewReader([]byte(achFileContents)).Read()
if err != nil {
log.Fatalf("Error reading ACH file: %v", err)
}
// 验证文件
if err := file.Validate(); err != nil {
log.Fatalf("ACH file validation failed: %v", err)
}
// 输出文件信息
fmt.Printf("File Header: %+v\n", file.Header)
for i, batch := range file.Batches {
fmt.Printf("Batch %d Header: %+v\n", i+1, batch.GetHeader())
for j, entry := range batch.GetEntries() {
fmt.Printf(" Entry %d: %+v\n", j+1, entry)
}
fmt.Printf("Batch %d Control: %+v\n", i+1, batch.GetControl())
}
fmt.Printf("File Control: %+v\n", file.Control)
}
3. 高级功能
自定义验证规则
// 自定义验证函数
func customValidate(file *ach.File) error {
// 检查文件是否包含至少一个批次
if len(file.Batches) == 0 {
return fmt.Errorf("file must contain at least one batch")
}
// 检查总金额是否超过限额
total := 0
for _, batch := range file.Batches {
for _, entry := range batch.GetEntries() {
total += entry.Amount
}
}
if total > 25000000 { // 250,000美元
return fmt.Errorf("total amount exceeds limit")
}
return nil
}
func main() {
file := createACHFile() // 假设这是创建ACH文件的函数
// 先执行标准验证
if err := file.Validate(); err != nil {
log.Fatal(err)
}
// 再执行自定义验证
if err := customValidate(file); err != nil {
log.Fatal(err)
}
fmt.Println("File passed all validations")
}
处理不同SEC代码
func createBatch(secCode string) (*ach.Batch, error) {
switch secCode {
case ach.PPD:
return createPPDBatch()
case ach.CCD:
return createCCDBatch()
case ach.TEL:
return createTELBatch()
default:
return nil, fmt.Errorf("unsupported SEC code: %s", secCode)
}
}
func createPPDBatch() (*ach.Batch, error) {
batchHeader := ach.NewBatchHeader()
batchHeader.ServiceClassCode = ach.CreditsOnly
batchHeader.CompanyName = "Company Name"
batchHeader.StandardEntryClassCode = ach.PPD
batchHeader.CompanyEntryDescription = "PAYROLL"
batch, err := ach.NewBatch(batchHeader)
if err != nil {
return nil, err
}
// 添加PPD条目...
return batch, batch.Create()
}
最佳实践
- 验证所有输入:在创建ACH条目前验证所有字段
- 错误处理:始终检查Create()和Validate()方法的错误
- 金额处理:记住ACH金额以分为单位(1美元=100)
- 日期格式:使用正确的日期格式(YYMMDD)
- 测试:为不同SEC代码和边缘情况编写测试
总结
ach
库提供了强大的功能来处理ACH文件的创建、读取和验证。通过合理使用这个库,可以轻松实现银行间的电子资金转账功能。记得始终验证生成的文件,并处理所有可能的错误情况。