golang生成SEPA支付二维码(ASCII & PNG)插件库payme的使用

Golang生成SEPA支付二维码(ASCII & PNG)插件库payme的使用

这是什么?

这个工具使欧洲用户更容易通过银行转账进行支付。它不作为支付网关或类似服务使用。它不进行任何支付验证,只是提供必要的支付信息以二维码形式呈现,可以被想要支付的人扫描。

二维码包含银行交易所需的信息,采用SEPA信用转账格式。如果你的银行应用支持通过二维码支付,它可以用来预填交易表单。

生成二维码的过程完全在本地和离线进行。可以以ASCII形式打印在终端中,或者导出为PNG格式以便包含在网页或邮件中。

一个二维码可以无限次使用,但始终包含相同的支付信息:金额、汇款信息、目标账户。多人可以扫描同一个二维码支付相同金额(例如与朋友分摊账单),或者一个人可以定期扫描同一个二维码(例如每月支付固定金额的互联网账单)。

安装

$ go install github.com/jovandeginste/payme@latest

使用

生成SEPA支付二维码

用法:

  payme [flags]

标志:

      --amount float        交易金额
      --bic string          收款人BIC
      --character-set int   QR码字符集 (默认2)
      --debug               打印调试输出
      --file string         将代码写入文件,留空则为标准输出
  -h, --help                payme帮助
      --iban string        收款人IBAN
      --name string        收款人姓名
      --output string       输出类型: png或stdout (默认"stdout")
      --purpose string      交易目的
      --remittance string   汇款信息
      --structured          使汇款信息结构化
      --qr-version int      QR码版本 (默认2)

你可以在环境变量中设置一些默认值,例如:

export PAYME_IBAN=DE71110220330123456789
export PAYME_NAME="Franz Mustermänn"
export PAYME_BIC=BHBLDEHHXXX

示例代码

生成ASCII格式的QR码,打印到控制台

package main

import (
	"fmt"
	"os"
	"os/exec"
)

func main() {
	cmd := exec.Command("payme",
		"--name", "Franz Mustermänn",
		"--iban", "DE71110220330123456789",
		"--amount", "12.3",
		"--remittance", "RF18539007547034")

	cmd.Stdout = os.Stdout
	cmd.Stderr = os.Stderr

	err := cmd.Run()
	if err != nil {
		fmt.Println("Error executing payme:", err)
	}
}

生成PNG格式的QR码,保存为文件

package main

import (
	"fmt"
	"os"
	"os/exec"
)

func main() {
	cmd := exec.Command("payme",
		"--name", "Franz Mustermänn",
		"--iban", "DE71110220330123456789",
		"--amount", "12.3",
		"--remittance", "RF18539007547034",
		"--output", "png",
		"--file", "QR.png")

	err := cmd.Run()
	if err != nil {
		fmt.Println("Error executing payme:", err)
	} else {
		fmt.Println("QR code saved as QR.png")
	}
}

支持

请提供反馈,告诉我们你的银行应用是否支持这些二维码。

以下银行的移动应用已测试支持这些二维码:

比利时

银行 支持情况
Belfius
Fortis 汇款信息中的字符有问题
KBC

参考

  • SEPA (单一欧元支付区)
  • EPC QR码标准
  • 欧洲支付委员会QR码规范

更多关于golang生成SEPA支付二维码(ASCII & PNG)插件库payme的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang生成SEPA支付二维码(ASCII & PNG)插件库payme的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


使用payme库生成SEPA支付二维码

SEPA (Single Euro Payments Area) 是欧洲范围内的支付系统标准。在Go语言中,我们可以使用payme库来生成SEPA支付二维码,包括ASCII和PNG格式。下面我将详细介绍如何使用这个库。

安装payme库

首先需要安装payme库:

go get github.com/boombuler/barcode
go get github.com/boombuler/barcode/qr
go get github.com/makiuchi-d/payme

基本用法

1. 生成SEPA支付数据

package main

import (
	"fmt"
	"github.com/makiuchi-d/payme"
)

func main() {
	// 创建SEPA支付信息
	sepa := &payme.SEPA{
		Name:      "John Doe",          // 收款人姓名
		IBAN:      "DE89370400440532013000", // IBAN账号
		BIC:       "DEUTDEBBXXX",       // BIC/SWIFT代码
		Amount:    123.45,              // 金额
		Remittance: "Invoice 12345",    // 备注信息
		Version:   "002",               // SEPA版本
		Charset:   "1",                 // 字符集 (1=UTF-8)
		Identification: "INV12345",     // 交易标识
	}
	
	// 生成SEPA支付字符串
	paymentStr := sepa.String()
	fmt.Println("SEPA Payment String:", paymentStr)
}

2. 生成ASCII二维码

func generateASCIIQR(paymentStr string) {
	qrCode, err := payme.NewQRCode(paymentStr)
	if err != nil {
		fmt.Println("Error generating QR code:", err)
		return
	}
	
	// 生成ASCII二维码
	ascii := qrCode.ToASCII(false)
	fmt.Println("ASCII QR Code:")
	fmt.Println(ascii)
}

3. 生成PNG格式二维码

import (
	"image/png"
	"os"
)

func generatePNGQR(paymentStr string, filename string) {
	qrCode, err := payme.NewQRCode(paymentStr)
	if err != nil {
		fmt.Println("Error generating QR code:", err)
		return
	}
	
	// 生成PNG图像
	img := qrCode.Image(256) // 256是图像大小(像素)
	
	// 保存到文件
	file, err := os.Create(filename)
	if err != nil {
		fmt.Println("Error creating file:", err)
		return
	}
	defer file.Close()
	
	err = png.Encode(file, img)
	if err != nil {
		fmt.Println("Error encoding PNG:", err)
		return
	}
	
	fmt.Println("PNG QR code saved to", filename)
}

完整示例

package main

import (
	"fmt"
	"image/png"
	"os"
	
	"github.com/makiuchi-d/payme"
)

func main() {
	// 1. 创建SEPA支付信息
	sepa := &payme.SEPA{
		Name:      "John Doe",
		IBAN:      "DE89370400440532013000",
		BIC:       "DEUTDEBBXXX",
		Amount:    123.45,
		Remittance: "Invoice 12345",
		Version:   "002",
		Charset:   "1",
		Identification: "INV12345",
	}
	
	// 2. 生成支付字符串
	paymentStr := sepa.String()
	fmt.Println("SEPA Payment String:", paymentStr)
	
	// 3. 生成ASCII二维码
	generateASCIIQR(paymentStr)
	
	// 4. 生成PNG二维码
	generatePNGQR(paymentStr, "sepa_payment.png")
}

func generateASCIIQR(paymentStr string) {
	qrCode, err := payme.NewQRCode(paymentStr)
	if err != nil {
		fmt.Println("Error generating QR code:", err)
		return
	}
	
	ascii := qrCode.ToASCII(false)
	fmt.Println("\nASCII QR Code:")
	fmt.Println(ascii)
}

func generatePNGQR(paymentStr string, filename string) {
	qrCode, err := payme.NewQRCode(paymentStr)
	if err != nil {
		fmt.Println("Error generating QR code:", err)
		return
	}
	
	img := qrCode.Image(256)
	
	file, err := os.Create(filename)
	if err != nil {
		fmt.Println("Error creating file:", err)
		return
	}
	defer file.Close()
	
	err = png.Encode(file, img)
	if err != nil {
		fmt.Println("Error encoding PNG:", err)
		return
	}
	
	fmt.Println("\nPNG QR code saved to", filename)
}

高级选项

自定义二维码大小和边距

// 创建自定义二维码
qrCode, err := payme.NewQRCodeWithOptions(paymentStr, &payme.QRCodeOptions{
	Size:   300,       // 二维码大小(像素)
	Margin: 10,        // 边距大小
	Level:  qr.M,      // 纠错级别 (L, M, Q, H)
})

验证IBAN和BIC

// 验证IBAN
if !payme.ValidateIBAN(sepa.IBAN) {
	fmt.Println("Invalid IBAN")
}

// 验证BIC
if !payme.ValidateBIC(sepa.BIC) {
	fmt.Println("Invalid BIC")
}

注意事项

  1. SEPA支付字符串有长度限制(最多331个字符)
  2. 确保所有必填字段都已设置
  3. 金额格式应为欧元,小数点后最多两位
  4. 对于生产环境,建议添加更多的错误处理

这个payme库提供了简单易用的接口来生成符合SEPA标准的支付二维码,适用于各种欧洲支付场景。

回到顶部