推荐一个Go版本的支付库
推荐一个Go版本的支付库
gopay是一个使用Golang编写的支付库。现在支持微信、支付宝、QQ、通联支付、拉卡拉、PayPal。使用方法如下:引入gopay库
go get -u github.com/go-pay/gopay
使用示例:
我是在服务端对接支付宝时找到该库的,当时还只是支付宝和微信。现在又新增了多个支付厂商,支付宝和微信版本已经升级到V3版本了。使用该库对接支付宝非常的方便。所以推荐一下该库。这里以支付宝为例。在支付宝开放平台开通支付产品,获取支付宝证书。支付宝推荐使用证书认证。常用的支付宝产品,gopay已经实现,直接调用方法即可。首先,初始化支付宝客户端并做配置。import (
"github.com/go-pay/gopay"
"github.com/go-pay/xlog"
)
func main() {
xlog.Info("GoPay Version: ", gopay.Version)
}
然后,就是调用API方法和入参。以统一收单线下交易预创建作为示例:import (
"github.com/go-pay/gopay/alipay/v3"
"github.com/go-pay/xlog"
)
// 初始化支付宝客V3户端
// appid:应用ID
// privateKey:应用私钥,支持PKCS1和PKCS8
// isProd:是否是正式环境,沙箱环境请选择新版沙箱应用。
client, err := alipay.NewClientV3("2016091200494382", privateKey, false)
if err != nil {
xlog.Error(err)
return
}
// 自定义配置http请求接收返回结果body大小,默认 10MB
client.SetBodySize() // 没有特殊需求,可忽略此配置
// 设置自定义RequestId生成方法,非必须
client.SetRequestIdFunc()
// 打开Debug开关,输出日志,默认关闭
client.DebugSwitch = gopay.DebugOn
// 设置biz_content加密KEY,设置此参数默认开启加密(目前不可用)
//client.SetAESKey("1234567890123456")
// 传入证书内容
err := client.SetCert("appPublicCert.crt bytes", "alipayRootCert bytes", "alipayPublicCert.crt bytes")
最后,设置回调函数,用于接收支付宝异步通知。异步通知参数解析和验签Sign,gopay已经提供方法。下面看下使用:import (
"github.com/go-pay/gopay"
"github.com/go-pay/gopay/pkg/js"
"github.com/go-pay/util"
"github.com/go-pay/xlog"
)
// 请求参数
bm := make(gopay.BodyMap)
bm.Set("subject", "预创建创建订单").
Set("out_trade_no", util.RandomString(32)).
Set("total_amount", "0.01")
// 创建订单
aliRsp, err := client.TradePrecreate(ctx, bm)
if err != nil {
xlog.Errorf("client.TradePrecreate(), err:%v", err)
return
}
xlog.Warnf("aliRsp:%s", js.Marshal(aliRsp))
if aliRsp.StatusCode != Success {
xlog.Errorf("aliRsp.StatusCode:%d", aliRsp.StatusCode)
return
}
xlog.Warnf("aliRsp.QrCode:", aliRsp.QrCode)
xlog.Warnf("aliRsp.OutTradeNo:", aliRsp.OutTradeNo)
gopay对支付宝支持非常棒,已经实现了很多支付API,如果你使用的产品还没有实现,也可以使用自定义方法。import (
"github.com/go-pay/gopay/alipay"
)
// 解析异步通知的参数
// req:*http.Request
notifyReq, err = alipay.ParseNotifyToBodyMap(c.Request) // c.Request 是 gin 框架的写法
if err != nil {
xlog.Error(err)
return
}
或
// value:url.Values
notifyReq, err = alipay.ParseNotifyByURLValues()
if err != nil {
xlog.Error(err)
return
}
// 支付宝异步通知验签(公钥模式)
ok, err = alipay.VerifySign(aliPayPublicKey, notifyReq)
// 支付宝异步通知验签(公钥证书模式)
ok, err = alipay.VerifySignWithCert("alipayPublicCert.crt content", notifyReq)
// 如果需要,可将 BodyMap 内数据,Unmarshal 到指定结构体指针 ptr
err = notifyReq.Unmarshal(ptr)
// ====异步通知,返回支付宝平台的信息====
// 文档:https://opendocs.alipay.com/open/203/105286
// 程序执行完后必须打印输出“success”(不包含引号)。如果商户反馈给支付宝的字符不是success这7个字符,支付宝服务器会不断重发通知,直到超过24小时22分钟。一般情况下,25小时以内完成8次通知(通知的间隔频率一般是:4m,10m,10m,1h,2h,6h,15h)
// 此写法是 gin 框架返回支付宝的写法
c.String(http.StatusOK, "%s", "success")
// 此写法是 echo 框架返回支付宝的写法
return c.String(http.StatusOK, "success")
更多内容,请参考Github:https://github.com/go-pay/gopay使用好的库,可以大大提高工作效率。推荐使用1分钱测试法。可以使用frp搭建支付宝联调环境。打开DebugSwitch 可以非常方便排查问题。你如果有对接支付宝和微信支付的需求,推荐使用该库。最后,发个推荐:豆子工具是一个微信小程序,内含IP地址查询、音频格式转换、网络调试等工具。欢迎浏览收藏。import (
"github.com/go-pay/gopay"
"github.com/go-pay/gopay/pkg/js"
"github.com/go-pay/util"
"github.com/go-pay/xlog"
)
// 请求参数
bm := make(gopay.BodyMap)
bm.Set("subject", "预创建创建订单").
Set("out_trade_no", util.RandomString(32)).
Set("total_amount", "0.01")
rsp := new(struct {
OutTradeNo string `json:"out_trade_no"`
QrCode string `json:"qr_code"`
})
// 创建订单
res, err := client.DoAliPayAPISelfV3(ctx, alipay.MethodPost, "/v3/alipay/trade/precreate", bm, rsp)
if err != nil {
xlog.Errorf("client.TradePrecreate(), err:%v", err)
return
}
xlog.Warnf("aliRsp:%s", js.Marshal(rsp))
if res.StatusCode != Success {
xlog.Errorf("aliRsp.StatusCode:%d", res.StatusCode)
return
}
我需要您的支持
Golang · 目录
上一篇如何自己搭建一个邮箱服务?