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

1 回复

更多关于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)
}

注意事项

  1. 确保你的金融机构支持OFX协议
  2. 不同的金融机构可能需要不同的配置参数
  3. 生产环境中应该妥善保存凭据,不要硬编码在代码中
  4. 处理错误时要检查响应状态码和消息
  5. OFX协议可能对请求频率有限制

ofxgo库提供了丰富的功能来与OFX服务器交互,包括查询账户信息、交易记录、下载对账单等。你可以根据具体需求调整上述示例代码。

回到顶部