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
更多关于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")
}
注意事项
- SEPA支付字符串有长度限制(最多331个字符)
- 确保所有必填字段都已设置
- 金额格式应为欧元,小数点后最多两位
- 对于生产环境,建议添加更多的错误处理
这个payme库提供了简单易用的接口来生成符合SEPA标准的支付二维码,适用于各种欧洲支付场景。