推荐一个Go版本的支付库

推荐一个Go版本的支付库

原创 Eagle1949 技术源泉
 
gopay是一个使用Golang编写的支付库。现在支持微信、支付宝、QQ、通联支付、拉卡拉、PayPal。使用方法如下:引入gopay库
go get -u github.com/go-pay/gopay
使用示例:
import (    "github.com/go-pay/gopay"    "github.com/go-pay/xlog")func main() {    xlog.Info("GoPay Version: ", gopay.Version)}
我是在服务端对接支付宝时找到该库的,当时还只是支付宝和微信。现在又新增了多个支付厂商,支付宝和微信版本已经升级到V3版本了。使用该库对接支付宝非常的方便。所以推荐一下该库。这里以支付宝为例。在支付宝开放平台开通支付产品,获取支付宝证书。支付宝推荐使用证书认证。常用的支付宝产品,gopay已经实现,直接调用方法即可。首先,初始化支付宝客户端并做配置。
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大小,默认 10MBclient.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")
然后,就是调用API方法和入参。以统一收单线下交易预创建作为示例:
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)
最后,设置回调函数,用于接收支付宝异步通知。异步通知参数解析和验签Sign,gopay已经提供方法。下面看下使用:
import (    "github.com/go-pay/gopay/alipay")// 解析异步通知的参数// req:*http.RequestnotifyReq, err = alipay.ParseNotifyToBodyMap(c.Request)     // c.Request 是 gin 框架的写法if err != nil {    xlog.Error(err)    return}// value:url.ValuesnotifyReq, 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 到指定结构体指针 ptrerr = 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")
gopay对支付宝支持非常棒,已经实现了很多支付API,如果你使用的产品还没有实现,也可以使用自定义方法。
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}
更多内容,请参考Github:https://github.com/go-pay/gopay使用好的库,可以大大提高工作效率。推荐使用1分钱测试法。可以使用frp搭建支付宝联调环境。打开DebugSwitch 可以非常方便排查问题。你如果有对接支付宝和微信支付的需求,推荐使用该库。最后,发个推荐:豆子工具是一个微信小程序,内含IP地址查询、音频格式转换、网络调试等工具。欢迎浏览收藏。
Eagle1949

 我需要您的支持 

Golang · 目录
上一篇如何自己搭建一个邮箱服务?
阅读 2214
 
posted @ 2024-12-07 23:24  技术颜良  阅读(5)  评论(0编辑  收藏  举报