golang实现欧盟VAT号码验证和税率查询的插件库vat的使用

Golang实现欧盟VAT号码验证和税率查询的插件库vat的使用

包介绍

这是一个用于验证VAT号码和查询VAT税率(数据来自ibericode/vat-rates)的Go语言包。

Go Report Card GoDoc MIT licensed

安装

使用go get安装:

go get github.com/dannyvankooten/vat

然后在你的代码中导入这个包:

import "github.com/dannyvankooten/vat"

使用方法

验证VAT号码

VAT号码可以通过格式、存在性或两者同时进行验证。VAT号码使用VIES VAT验证API进行查询。

package main

import "github.com/dannyvankooten/vat"

func main() {
  // 通过格式+存在性验证号码
  validity, err := vat.ValidateNumber("NL123456789B01")

  // 验证号码格式
  validity, err := vat.ValidateNumberFormat("NL123456789B01")

  // 验证号码存在性
  validity, err := vat.ValidateNumberExistence("NL123456789B01")
}

查询VAT税率

这个包依赖于社区维护的VAT税率库。我们建议您关注该库并在您所在国家/地区宣布税率变更时贡献变更。

要获取某个国家的VAT税率期间,首先使用该国家的ISO-3166-1-alpha2代码获取CountryRates结构体。

您可以使用GetRate函数获取当前生效的税率。

package main

import (
  "fmt"
  "github.com/dannyvankooten/vat"
)

func main() {
  c, err := vat.GetCountryRates("NL")
  r, err := c.GetRate("standard")

  fmt.Printf("Standard VAT rate for NL is %.2f", r)
  // 输出: Standard VAT rate for NL is 21.00
}

完整示例Demo

package main

import (
	"fmt"
	"github.com/dannyvankooten/vat"
)

func main() {
	// VAT号码验证示例
	vatNumber := "NL123456789B01"
	
	// 验证格式
	validFormat, err := vat.ValidateNumberFormat(vatNumber)
	if err != nil {
		fmt.Printf("验证格式出错: %v\n", err)
	} else {
		fmt.Printf("VAT号码格式验证结果: %v\n", validFormat)
	}

	// 验证存在性
	validExistence, err := vat.ValidateNumberExistence(vatNumber)
	if err != nil {
		fmt.Printf("验证存在性出错: %v\n", err)
	} else {
		fmt.Printf("VAT号码存在性验证结果: %v\n", validExistence)
	}

	// 综合验证
	valid, err := vat.ValidateNumber(vatNumber)
	if err != nil {
		fmt.Printf("综合验证出错: %v\n", err)
	} else {
		fmt.Printf("VAT号码综合验证结果: %v\n", valid)
	}

	// 查询税率示例
	countryCode := "NL"
	rateType := "standard"
	
	rates, err := vat.GetCountryRates(countryCode)
	if err != nil {
		fmt.Printf("获取国家税率出错: %v\n", err)
		return
	}

	rate, err := rates.GetRate(rateType)
	if err != nil {
		fmt.Printf("获取税率出错: %v\n", err)
		return
	}

	fmt.Printf("%s的%s税率是: %.2f%%\n", countryCode, rateType, rate)
}

许可证

MIT许可证。详见LICENSE文件。


更多关于golang实现欧盟VAT号码验证和税率查询的插件库vat的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang实现欧盟VAT号码验证和税率查询的插件库vat的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


Golang 实现欧盟 VAT 号码验证和税率查询

在欧盟进行电子商务交易时,正确处理增值税(VAT)是非常重要的。下面我将介绍如何使用 Go 语言实现欧盟 VAT 号码验证和税率查询。

1. 使用 vat 库

一个常用的 Go 库是 github.com/tiaguinho/gosoap 结合欧盟的 VIES SOAP 服务,或者使用专门的 VAT 库如 github.com/davidscholberg/go-vat.

安装

go get github.com/davidscholberg/go-vat

基本使用示例

package main

import (
	"fmt"
	"github.com/davidscholberg/go-vat"
)

func main() {
	// VAT 号码验证
	v := vat.NewVAT()
	
	// 验证 VAT 号码 (例如: DE 开头的德国 VAT)
	valid, err := v.ValidateVAT("DE123456789")
	if err != nil {
		fmt.Printf("验证错误: %v\n", err)
		return
	}
	
	if valid {
		fmt.Println("VAT 号码有效")
	} else {
		fmt.Println("VAT 号码无效")
	}
	
	// 获取国家税率信息
	rate, err := v.GetVATRate("DE")
	if err != nil {
		fmt.Printf("获取税率错误: %v\n", err)
		return
	}
	
	fmt.Printf("德国的标准增值税率: %.2f%%\n", rate.StandardRate)
}

2. 直接使用欧盟 VIES SOAP 服务

如果需要更直接的控制,可以使用 SOAP 客户端直接调用欧盟的 VIES 服务。

安装 SOAP 客户端

go get github.com/tiaguinho/gosoap

实现代码

package main

import (
	"fmt"
	"github.com/tiaguinho/gosoap"
)

const viesURL = "http://ec.europa.eu/taxation_customs/vies/services/checkVatService"

type checkVatRequest struct {
	CountryCode string `xml:"countryCode"`
	VatNumber   string `xml:"vatNumber"`
}

type checkVatResponse struct {
	CountryCode string `xml:"countryCode"`
	VatNumber   string `xml:"vatNumber"`
	RequestDate string `xml:"requestDate"`
	Valid       bool   `xml:"valid"`
	Name        string `xml:"name"`
	Address     string `xml:"address"`
}

func main() {
	// 创建 SOAP 客户端
	soap, err := gosoap.SoapClient(viesURL)
	if err != nil {
		fmt.Printf("创建 SOAP 客户端错误: %v\n", err)
		return
	}

	// 准备请求
	params := checkVatRequest{
		CountryCode: "DE",
		VatNumber:   "123456789",
	}

	// 调用 VIES 服务
	res, err := soap.Call("checkVat", params)
	if err != nil {
		fmt.Printf("调用 VIES 服务错误: %v\n", err)
		return
	}

	// 解析响应
	var vatRes checkVatResponse
	err = res.Unmarshal(&vatRes)
	if err != nil {
		fmt.Printf("解析响应错误: %v\n", err)
		return
	}

	fmt.Printf("验证结果: %+v\n", vatRes)
}

3. 完整的 VAT 处理包示例

下面是一个更完整的 VAT 处理包示例:

package vat

import (
	"errors"
	"fmt"
	"strings"
)

// VATRate 包含一个国家的增值税率信息
type VATRate struct {
	CountryCode  string
	StandardRate float64
	ReducedRates map[string]float64 // 可能有多档优惠税率
}

// VATValidator 提供 VAT 验证功能
type VATValidator interface {
	Validate(number string) (bool, error)
	GetRates(countryCode string) (VATRate, error)
}

// EUVATValidator 实现欧盟 VAT 验证
type EUVATValidator struct {
	// 可以缓存税率数据
	ratesCache map[string]VATRate
}

// NewEUVATValidator 创建新的欧盟 VAT 验证器
func NewEUVATValidator() *EUVATValidator {
	return &EUVATValidator{
		ratesCache: make(map[string]VATRate),
	}
}

// Validate 验证欧盟 VAT 号码
func (v *EUVATValidator) Validate(number string) (bool, error) {
	// 基本格式检查
	if len(number) < 3 {
		return false, errors.New("VAT 号码太短")
	}

	countryCode := strings.ToUpper(number[:2])
	vatNumber := number[2:]

	// 检查国家代码是否有效
	if _, ok := euCountries[countryCode]; !ok {
		return false, fmt.Errorf("不支持的国家代码: %s", countryCode)
	}

	// 这里应该调用欧盟 VIES 服务进行实际验证
	// 简化示例中我们只做格式检查
	return true, nil
}

// GetRates 获取指定国家的增值税率
func (v *EUVATValidator) GetRates(countryCode string) (VATRate, error) {
	countryCode = strings.ToUpper(countryCode)
	
	// 检查缓存
	if rate, ok := v.ratesCache[countryCode]; ok {
		return rate, nil
	}

	// 检查国家代码是否有效
	rate, ok := euCountries[countryCode]
	if !ok {
		return VATRate{}, fmt.Errorf("不支持的国家代码: %s", countryCode)
	}

	// 缓存结果
	v.ratesCache[countryCode] = rate

	return rate, nil
}

// euCountries 包含欧盟国家代码和标准增值税率
var euCountries = map[string]VATRate{
	"AT": {CountryCode: "AT", StandardRate: 20.0}, // 奥地利
	"BE": {CountryCode: "BE", StandardRate: 21.0}, // 比利时
	"BG": {CountryCode: "BG", StandardRate: 20.0}, // 保加利亚
	// 其他欧盟国家...
	"DE": {CountryCode: "DE", StandardRate: 19.0}, // 德国
	"FR": {CountryCode: "FR", StandardRate: 20.0}, // 法国
	// 继续添加其他欧盟国家...
}

4. 使用示例

package main

import (
	"fmt"
	"yourmodulepath/vat"
)

func main() {
	validator := vat.NewEUVATValidator()
	
	// 验证 VAT 号码
	valid, err := validator.Validate("DE123456789")
	if err != nil {
		fmt.Printf("验证错误: %v\n", err)
		return
	}
	
	fmt.Printf("VAT 号码有效性: %v\n", valid)
	
	// 获取税率
	rate, err := validator.GetRates("DE")
	if err != nil {
		fmt.Printf("获取税率错误: %v\n", err)
		return
	}
	
	fmt.Printf("德国的标准增值税率: %.2f%%\n", rate.StandardRate)
}

注意事项

  1. 欧盟 VIES 服务有请求频率限制,建议缓存结果
  2. 税率可能会变化,需要定期更新
  3. 对于生产环境,建议使用官方库或经过充分测试的第三方库
  4. 英国脱欧后,GB 开头的 VAT 号码处理方式已改变

以上代码提供了基本的欧盟 VAT 验证和税率查询功能,可以根据实际需求进行扩展和完善。

回到顶部