Go语言之集合支付库-支持微信、支付宝、PayPal、QQ 支付

《开源精选》是我们分享Github、Gitee等开源社区中优质项目的栏目,包括技术、学习、实用与各种有趣的内容。本期推荐的是一个使用Go语言的相关集合支付库-支持微信、支付宝、PayPal、QQ 支付。

《开源精选》是我们分享Github、Gitee等开源社区中优质项目的栏目,包括技术、学习、实用与各种有趣的内容。本期推荐的是一个使用Go语言的相关集合支付库-支持微信、支付宝、PayPal、QQ 支付。

Go语言之集合支付库-支持微信、支付宝、PayPal、QQ 支付

一、安装

go get -u github.com/go-pay/gopay

查看 GoPay 版本

import (    "github.com/go-pay/gopay"    "github.com/go-pay/gopay/pkg/xlog")func main() {    xlog.Info("GoPay Version: ", gopay.Version)}

支付宝支付

1、初始化支付宝客户端并做配置

具体API使用介绍,请参考 gopay/alipay/client_test.go

import (    "github.com/go-pay/gopay/alipay"    "github.com/go-pay/gopay/pkg/xlog")// 初始化支付宝客户端//    appId:应用ID//    privateKey:应用私钥,支持PKCS1和PKCS8//    isProd:是否是正式环境client, err := alipay.NewClient("2016091200494382", privateKey, false)if err != nil {    xlog.Error(err)    return}// 打开Debug开关,输出日志,默认关闭client.DebugSwitch = gopay.DebugOn// 设置支付宝请求 公共参数//    注意:具体设置哪些参数,根据不同的方法而不同,此处列举出所有设置参数client.SetLocation(alipay.LocationShanghai).    // 设置时区,不设置或出错均为默认服务器时间    SetCharset(alipay.UTF8).                    // 设置字符编码,不设置默认 utf-8    SetSignType(alipay.RSA2).                   // 设置签名类型,不设置默认 RSA2    SetReturnUrl("https://www.fmm.ink").        // 设置返回URL    SetNotifyUrl("https://www.fmm.ink").        // 设置异步通知URL    SetAppAuthToken()                           // 设置第三方应用授权// 自动同步验签(只支持证书模式)// 传入 alipayCertPublicKey_RSA2.crt 内容client.AutoVerifySign([]byte("alipayCertPublicKey_RSA2 bytes"))// 公钥证书模式,需要传入证书,以下两种方式二选一// 证书路径err := client.SetCertSnByPath("appCertPublicKey.crt", "alipayRootCert.crt", "alipayCertPublicKey_RSA2.crt")// 证书内容err := client.SetCertSnByContent("appCertPublicKey bytes", "alipayRootCert bytes", "alipayCertPublicKey_RSA2 bytes")

2、API 方法调用及入参(统一收单交易支付接口 示例)

import (    "github.com/go-pay/gopay")// 初始化 BodyMapbm := make(gopay.BodyMap)bm.Set("subject", "条码支付").    Set("scene", "bar_code").    Set("auth_code", "286248566432274952").    Set("out_trade_no", "GZ201909081743431443").    Set("total_amount", "0.01").    Set("timeout_express", "2m")aliRsp, err := client.TradePay(bm)if err != nil {    xlog.Error("err:", err)    return}

3、同步返回参数验签Sign、异步通知参数解析和验签Sign、异步通知返回

异步通知请求参数需要先解析,解析出来的结构体或BodyMap再验签(此处需要注意,http.Request.Body 只能解析一次,如果需要解析前调试,请处理好Body复用问题)

  • 同步返回验签,手动验签(如已开启自动验签,则无需手动验签操作)
import (    "github.com/go-pay/gopay/alipay")aliRsp, err := client.TradePay(bm)if err != nil {    xlog.Error("err:", err)    return}// 公钥模式验签//    注意:APP支付,手机网站支付,电脑网站支付 不支持同步返回验签//    aliPayPublicKey:支付宝平台获取的支付宝公钥//    signData:待验签参数,aliRsp.SignData//    sign:待验签sign,aliRsp.Signok, err := alipay.VerifySyncSign(aliPayPublicKey, aliRsp.SignData, aliRsp.Sign)// 公钥证书模式验签//    aliPayPublicKeyCert:支付宝公钥证书存放路径 alipayCertPublicKey_RSA2.crt 或文件内容[]byte//    signData:待验签参数,aliRsp.SignData//    sign:待验签sign,aliRsp.Signok, err := alipay.VerifySyncSignWithCert(aliPayPublicKeyCert, aliRsp.SignData, aliRsp.Sign)
  • 异步通知验签
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("alipayCertPublicKey_RSA2.crt content", notifyReq)// ====异步通知,返回支付宝平台的信息====//    文档: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")

微信支付

1、初始化微信v3客户端并做配置

import (    "github.com/go-pay/gopay/pkg/xlog"    "github.com/go-pay/gopay/wechat/v3")// NewClientV3 初始化微信客户端 v3//	mchid:商户ID 或者服务商模式的 sp_mchid// 	serialNo:商户证书的证书序列号//	apiV3Key:apiV3Key,商户平台获取//	privateKey:私钥 apiclient_key.pem 读取后的内容client, err = wechat.NewClientV3(MchId, SerialNo, APIv3Key, PrivateKey)if err != nil {    xlog.Error(err)    return}// 启用自动同步返回验签,并定时更新微信平台API证书err = client.AutoVerifySign()if err != nil {    xlog.Error(err)    return}// 打开Debug开关,输出日志,默认是关闭的client.DebugSwitch = gopay.DebugOn

2、API 方法调用及入参(JSAPI下单 示例)

import (    "github.com/go-pay/gopay")expire := time.Now().Add(10 * time.Minute).Format(time.RFC3339)// 初始化 BodyMapbm := make(gopay.BodyMap)bm.Set("sp_appid", "sp_appid").    Set("sp_mchid", "sp_mchid").    Set("sub_mchid", "sub_mchid").    Set("description", "测试Jsapi支付商品").    Set("out_trade_no", tradeNo).    Set("time_expire", expire).    Set("notify_url", "https://www.fmm.ink").    SetBodyMap("amount", func(bm gopay.BodyMap) {        bm.Set("total", 1).            Set("currency", "CNY")    }).    SetBodyMap("payer", func(bm gopay.BodyMap) {        bm.Set("sp_openid", "asdas")    })wxRsp, err := client.V3TransactionJsapi(bm)if err != nil {    xlog.Error(err)    return}

3、下单后,获取微信小程序支付、APP支付、JSAPI支付所需要的 pay sign

// 小程序applet, err := client.PaySignOfApplet("appid", "prepayid")// appapp, err := client.PaySignOfApp("appid", "prepayid")// jsapijsapi, err := client.PaySignOfJSAPI("appid", "prepayid")

4、同步返回参数验签Sign、异步通知参数解析和验签Sign、异步通知返回

异步通知请求参数需要先解析,解析出来的结构体或BodyMap再验签(此处需要注意,http.Request.Body 只能解析一次,如果需要解析前调试,请处理好Body复用问题)

  • 同步返回验签,手动验签(如已开启自动验签,则无需手动验签操作)
import (    "github.com/go-pay/gopay/wechat/v3"    "github.com/go-pay/gopay/pkg/xlog")wxRsp, err := client.V3TransactionJsapi(bm)if err != nil {    xlog.Error(err)    return}// wxPublicKey 通过 client.WxPublicKey() 获取err = wechat.V3VerifySignByPK(wxRsp.SignInfo.HeaderTimestamp, wxRsp.SignInfo.HeaderNonce, wxRsp.SignInfo.SignBody, wxRsp.SignInfo.HeaderSignature, wxPublicKey)if err != nil {    xlog.Error(err)    return}
  • 异步通知验签 及 敏感参数解密
import (    "github.com/go-pay/gopay/wechat/v3"    "github.com/go-pay/gopay/pkg/xlog")notifyReq, err := wechat.V3ParseNotify()if err != nil {    xlog.Error(err)    return}// wxPublicKey 通过 client.WxPublicKey() 获取err = notifyReq.VerifySignByPK(wxPublicKey)if err != nil {    xlog.Error(err)    return}// ========异步通知敏感信息解密========// 普通支付通知解密result, err := notifyReq.DecryptCipherText(apiV3Key)// 合单支付通知解密result, err := notifyReq.DecryptCombineCipherText(apiV3Key)// 退款通知解密result, err := notifyReq.DecryptRefundCipherText(apiV3Key)// ========异步通知应答========// 退款通知http应答码为200且返回状态码为SUCCESS才会当做商户接收成功,否则会重试。// 注意:重试过多会导致微信支付端积压过多通知而堵塞,影响其他正常通知。// 此写法是 gin 框架返回微信的写法c.JSON(http.StatusOK, &wechat.V3NotifyRsp{Code: gopay.SUCCESS, Message: "成功"})// 此写法是 echo 框架返回微信的写法return c.JSON(http.StatusOK, &wechat.V3NotifyRsp{Code: gopay.SUCCESS, Message: "成功"})

更多内容:https://github.com/go-pay/gopay

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/87598.html

(0)

相关推荐

  • 中国城镇化发展的现状及趋势,中国未来城镇化率目标

    目前我国的国情是城市化滞后于经济增长,但是北上广深哪一个不是人满为患,说明这些传统发达地区的城市化水平已经与经济发展水平匹配了,甚至是超前了,而其他新兴地区则还处在滞后阶段,我们需要额外的增长极,不管是明星城市也好,扎实的中小城市群也好,总要有一种路线把人口重新吸引到中西部。

    生活 2021年11月25日
  • 为什么说全面电动化是中国传统车桥厂的唯一生路?,电动车车桥

    汽车零部件当中,车桥起着传动、承载,和制动的关键作用, 是汽车构造重要的组成部分。

    科技 2021年10月22日
  • 夏末秋初宜吃梨

    广州日报讯 (全媒体记者周洁莹 通讯员宋莉萍)目前正值夏末秋初,暑湿虽盛,天气却也越来越干燥。尤其夏天的“惯性”下,大多数家长孩子都会长时间待在空调房内,鼻子和喉咙难免干痒。有的孩子喜欢揉鼻子、抠鼻子来缓解不适,很容易因此损伤脆弱的鼻黏膜、流鼻血。 省中医院儿科主任医师许尤佳教授提醒家长,开空调时不妨在房间内放一盆水,有意控制空调使用时间,适时开窗透气。除此之外,还可以给孩子用银耳、百合等食药材,适当滋润一下。 梨,味甘、微酸,性凉,归肺、胃经;具有生津、润燥、清热、化痰的功效。市面上的梨子品种很多,雪梨、鸭梨和香水梨是较好选择。 要注意的是,梨子生吃性凉,生津、清热效果显著。当孩子体内有热,出现咽喉干痛、干咳、口渴的症状时,可以吃一点生梨,但梨的寒凉性质对脾胃的刺激比较大,孩子如果脾胃虚寒明显,没有明显热相,就不建议吃大量生梨,更建议吃桃,或者在确保消化好、没有热气上火的情况下,吃一点当季的杏子。 如果确实比较喜欢吃梨的话,不妨煮成糖水、汤水、或蒸熟后再食用,能降低凉性,同时滋阴润肺,更适合给孩子吃。很多家长在孩子咳嗽时,会给孩子吃一点冰糖炖雪梨。但其实只有当孩子属于风热咳嗽时,才可以用梨子止咳,不然只会越吃越咳。 下面给大家推荐几道适合夏末及秋季食用的鲜梨食疗方: 百合梨汤(1~2人量) 【材料】百合10克,麦冬10克,雪梨1个,胖大海5枚。 【做法】雪梨切块;锅中注水烧开,加入雪梨、百合、麦冬、胖大海同煮,待梨八成熟时加入冰糖,糖溶即可。 【儿童用量】3岁以上少量多次分食,每次食用半碗,喝糖水,可以酌情吃少量梨肉,每周不超过2次。 雪梨无花果煲排骨 【材料】无花果5个,排骨500克,雪梨2个。 【做法】无花果提前用清水泡好,排骨焯水,雪梨切开去核;所有材料一起放入锅中,加入适量清水,大火煮开,小火煮1小时,放适量盐调味即可。 【儿童用量】3岁以上消化好、无病痛时少量多次分食,每次食用半碗,消化好的情况下,可以吃少量排骨和梨肉。

    生活 2021年9月26日
  • 女科学家创业:花300天整数据,如今为超100家AI企业输送“原油”

    爱数智慧创始人兼CEO 张晴晴 作者丨巴里 编辑丨子钺 图源丨受访者 “能够让机器理解人的所思所想,并能够将这些内容转化成文字是一件很酷的事情。” 17年前,还在北邮读通信的本科生...

    科技 2021年11月6日
  • 对孩子不能要求太高,是不是我对孩子要求太高了

    昨天晚上二娃在同学家赔同学玩了两个小时,晚上陪我睡觉,我在看手机,突然孩子提醒我说爸爸你看看我的脸,我一直看手机没看他,我说怎么了,他说,你看看我的脸,我一看孩子流泪了,我问他怎么了,孩子说想幼儿园的同学了,我问他具体想哪个了,孩子告诉我那个同学的名字,这个同学今年夏天幼儿园毕业,转到其他区域上小学了,是孩子心目中最好的朋友,也是幼儿园期间孩子约他一起玩次数最多的同学,四五个月没见面了,孩子还在惦记着他的同学。同学有他自己的规划安排的。

    生活 2021年11月21日
  • 孕妈额外补充DHA是交了智商税?

    很多孕妈妈咨询我们,孕期要不要额外补充DHA?要回答这个问题,我们得先了解下什么是DHA。

    生活 2021年9月28日