golang查询OFX服务器并解析响应数据的插件库ofxgo的使用
Golang查询OFX服务器并解析响应数据的插件库ofxgo的使用
OFXGo简介
OFXGo是一个用于查询OFX服务器和/或解析响应的库。它还提供了一个示例命令行客户端来演示库的使用。
主要目标
该项目的主要目的是提供一个库,使从Golang中查询OFX财务信息变得更加容易,而无需编组/解组到SGML或XML。该库不打算抽象掉OFX规范的所有细节,而是将OFX SGML/XML层次结构暴露为与其相似的struct。
完整示例
查询OFX服务器并解析响应
以下代码片段演示了如何使用OFXGo查询和解析支票账户的OFX代码,打印余额和返回的交易记录:
client := ofxgo.BasicClient{} // 接受默认的Client设置
// 这些值特定于您的银行
var query ofxgo.Request
query.URL = "https://secu.example.com/ofx"
query.Signon.Org = ofxgo.String("SECU")
query.Signon.Fid = ofxgo.String("1234")
// 设置您的用户名/密码
query.Signon.UserID = ofxgo.String("username")
query.Signon.UserPass = ofxgo.String("hunter2")
uid, _ := ofxgo.RandomUID() // 在实际代码中处理错误
query.Bank = append(query.Bank, &ofxgo.StatementRequest{
TrnUID: *uid,
BankAcctFrom: ofxgo.BankAcct{
BankID: ofxgo.String("123456789"), // 可能是您的路由号码
AcctID: ofxgo.String("00011122233"), // 可能是您的账号
AcctType: ofxgo.AcctTypeChecking,
},
Include: true, // 包含交易(而不仅仅是余额信息)
})
response, _ := client.Request(&query) // 在实际代码中处理错误
// 处理我们的请求时是否有OFX错误?
if response.Signon.Status.Code != 0 {
meaning, _ := response.Signon.Status.CodeMeaning()
fmt.Printf("Nonzero signon status (%d: %s) with message: %s\n", response.Signon.Status.Code, meaning, response.Signon.Status.Message)
os.Exit(1)
}
if len(response.Bank) < 1 {
fmt.Println("No banking messages received")
os.Exit(1)
}
if stmt, ok := response.Bank[0].(*ofxgo.StatementResponse); ok {
fmt.Printf("Balance: %s %s (as of %s)\n", stmt.BalAmt, stmt.CurDef, stmt.DtAsOf)
fmt.Println("Transactions:")
for _, tran := range stmt.BankTranList.Transactions {
currency := stmt.CurDef
if ok, _ := tran.Currency.Valid(); ok {
currency = tran.Currency.CurSym
}
fmt.Printf("%s %-15s %-11s %s%s%s\n", tran.DtPosted, tran.TrnAmt.String()+" "+currency.String(), tran.TrnType, tran.Name, tran.Payee.Name, tran.Memo)
}
}
解析本地OFX文件
如果您有本地可用的OFX文件,可以直接解析它:
func main() {
f, err := os.Open("./transactions.qfx")
if err != nil {
fmt.Printf("can't open file: %v\n", err)
return
}
defer f.Close()
resp, err := ofxgo.ParseResponse(f)
if err != nil {
fmt.Printf("can't parse response: %v\n", err)
return
}
// 对resp(*ofxgo.Response)做一些处理
}
要求
OFXGo需要go >= 1.12
使用命令行客户端
要安装命令行客户端并进行测试,您可以执行以下操作:
$ go get -v github.com/aclindsa/ofxgo/cmd/ofx && go install -v github.com/aclindsa/ofxgo/cmd/ofx
安装后(默认在~/go/bin/ofx,如果您没有设置$GOPATH),命令的使用应该可以帮助您使用它(./ofx --help
查看可用的子命令及其用途,./ofx subcommand --help
查看单个子命令用法)。
更多关于golang查询OFX服务器并解析响应数据的插件库ofxgo的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
更多关于golang查询OFX服务器并解析响应数据的插件库ofxgo的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
使用ofxgo库查询OFX服务器并解析响应数据
ofxgo是一个用于与OFX(Open Financial Exchange)服务器交互的Go语言库,它支持查询金融数据并解析响应。下面我将介绍如何使用这个库。
安装ofxgo
首先安装ofxgo库:
go get github.com/aclindsa/ofxgo
基本使用示例
1. 创建客户端并查询账户信息
package main
import (
"fmt"
"log"
"os"
"github.com/aclindsa/ofxgo"
)
func main() {
// 1. 创建客户端
client := ofxgo.DefaultClient
// 2. 准备查询请求
uid, err := ofxgo.RandomUID()
if err != nil {
log.Fatalf("生成UID错误: %v\n", err)
}
// 3. 创建账户信息请求
acctInfoRequest := ofxgo.AcctInfoRequest{
TrnUID: *uid,
DtAsOf: ofxgo.Date(time.Now()), // 当前日期
}
// 4. 创建OFX请求
request := ofxgo.Request{
Signon: ofxgo.SignonRequest{
UserID: "your_username", // 替换为你的用户名
UserPass: "your_password", // 替换为你的密码
Org: "YOUR_FI_ORG", // 金融机构组织代码
Fid: "YOUR_FI_ID", // 金融机构ID
ClientUID: *uid,
AppID: "OFXGO", // 应用ID
AppVer: "0001", // 应用版本
Language: "ENG", // 语言
DtProfUp: ofxgo.Date{}, // 置空
DtAcctUp: ofxgo.Date{}, // 置空
Fi: &ofxgo.Fi{},
},
AcctInfo: []ofxgo.AcctInfoRequest{acctInfoRequest},
}
// 5. 发送请求
response, err := client.Request(&request)
if err != nil {
log.Fatalf("请求失败: %v\n", err)
}
// 6. 检查响应状态
if response.Signon.Status.Code != 0 {
log.Fatalf("登录失败: %v\n", response.Signon.Status.Message)
}
// 7. 处理账户信息响应
if len(response.AcctInfo) > 0 {
for _, acctInfo := range response.AcctInfo {
fmt.Printf("账户描述: %s\n", acctInfo.Desc)
fmt.Printf("账户号码: %s\n", acctInfo.AcctID)
fmt.Printf("账户类型: %s\n", acctInfo.AcctType)
}
} else {
fmt.Println("没有找到账户信息")
}
}
2. 查询银行账户交易
func queryBankTransactions() {
client := ofxgo.DefaultClient
uid, err := ofxgo.RandomUID()
if err != nil {
log.Fatal(err)
}
// 设置银行账户信息
bankAcct := ofxgo.BankAcct{
BankID: "123456789", // 银行路由号
AcctID: "987654321", // 账户号码
AcctType: ofxgo.AcctTypeChecking, // 账户类型(支票账户)
}
// 创建交易查询请求
transactionRequest := ofxgo.StatementRequest{
TrnUID: *uid,
BankAcctFrom: bankAcct,
DtStart: ofxgo.Date(time.Now().AddDate(0, -1, 0)), // 一个月前
DtEnd: ofxgo.Date(time.Now()), // 当前日期
Include: true, // 包含交易详情
}
request := ofxgo.Request{
Signon: ofxgo.SignonRequest{
UserID: "your_username",
UserPass: "your_password",
Org: "YOUR_FI_ORG",
Fid: "YOUR_FI_ID",
ClientUID: *uid,
},
Bank: []ofxgo.Message{&transactionRequest},
}
response, err := client.Request(&request)
if err != nil {
log.Fatal(err)
}
if len(response.Bank) > 0 {
stmtResponse, ok := response.Bank[0].(*ofxgo.StatementResponse)
if !ok {
log.Fatal("响应类型不是StatementResponse")
}
fmt.Printf("账户余额: %.2f\n", stmtResponse.BalAmt)
fmt.Printf("可用余额: %.2f\n", stmtResponse.AvailBalAmt)
fmt.Printf("交易数量: %d\n", len(stmtResponse.BankTranList.Transactions))
for _, transaction := range stmtResponse.BankTranList.Transactions {
fmt.Printf("日期: %s, 金额: %.2f, 描述: %s\n",
transaction.DtPosted,
transaction.TrnAmt,
transaction.Name)
}
}
}
高级功能
1. 自定义HTTP客户端
func customClient() {
// 创建自定义HTTP客户端
client := &ofxgo.Client{
RequestClient: &http.Client{
Timeout: 30 * time.Second,
Transport: &http.Transport{
TLSClientConfig: &tls.Config{
InsecureSkipVerify: true, // 仅用于测试,生产环境不要跳过验证
},
},
},
// 其他自定义配置...
}
// 然后使用这个client发送请求...
}
2. 解析已有的OFX文件
func parseExistingOFX(filename string) {
file, err := os.Open(filename)
if err != nil {
log.Fatal(err)
}
defer file.Close()
response, err := ofxgo.ParseResponse(file)
if err != nil {
log.Fatal(err)
}
// 处理响应数据...
fmt.Printf("响应版本: %s\n", response.Version)
}
注意事项
- 确保你的金融机构支持OFX协议
- 不同的金融机构可能需要不同的配置参数
- 生产环境中应该妥善保存凭据,不要硬编码在代码中
- 处理错误时要检查响应状态码和消息
- OFX协议可能对请求频率有限制
ofxgo库提供了丰富的功能来与OFX服务器交互,包括查询账户信息、交易记录、下载对账单等。你可以根据具体需求调整上述示例代码。