|
@@ -0,0 +1,693 @@
|
|
|
|
|
+
|
|
|
|
|
+<div align=center><img width="220" height="220" alt="Logo was Loading Faild!" src="https://raw.githubusercontent.com/iGoogle-ink/gopay/master/logo.png"/></div>
|
|
|
|
|
+
|
|
|
|
|
+# GoPay
|
|
|
|
|
+
|
|
|
|
|
+<a href="https://www.gopay.ink" target="_blank"><img src="https://img.shields.io/badge/Author-Jerry-blue.svg"/></a>
|
|
|
|
|
+<a href="https://golang.org" target="_blank"><img src="https://img.shields.io/badge/Golang-1.11+-brightgreen.svg"/></a>
|
|
|
|
|
+<img src="https://api.travis-ci.org/iGoogle-ink/gopay.svg?branch=master"/>
|
|
|
|
|
+<a href="http://www.apache.org/licenses/LICENSE-2.0" target="_blank"><img src="https://img.shields.io/badge/License-Apache 2-blue.svg"/></a>
|
|
|
|
|
+
|
|
|
|
|
+## 微信Client
|
|
|
|
|
+
|
|
|
|
|
+* client := gopay.NewWeChatClient() => 初始化微信支付客户端
|
|
|
|
|
+* client的其他配置
|
|
|
|
|
+ * client.SetCountry() => 设置国家地区,默认中国国内
|
|
|
|
|
+
|
|
|
|
|
+## 微信支付API
|
|
|
|
|
+
|
|
|
|
|
+* 统一下单:client.UnifiedOrder()
|
|
|
|
|
+ * JSAPI - JSAPI支付(或小程序支付)
|
|
|
|
|
+ * NATIVE - Native支付
|
|
|
|
|
+ * APP - app支付
|
|
|
|
|
+ * MWEB - H5支付
|
|
|
|
|
+* 提交付款码支付:client.Micropay()
|
|
|
|
|
+* 查询订单:client.QueryOrder()
|
|
|
|
|
+* 关闭订单:client.CloseOrder()
|
|
|
|
|
+* 撤销订单:client.Reverse()
|
|
|
|
|
+* 申请退款:client.Refund()
|
|
|
|
|
+* 查询退款:client.QueryRefund()
|
|
|
|
|
+* 下载对账单:client.DownloadBill()
|
|
|
|
|
+* 下载资金账单:client.DownloadFundFlow()
|
|
|
|
|
+* 拉取订单评价数据:client.BatchQueryComment()
|
|
|
|
|
+
|
|
|
|
|
+## 微信公共API
|
|
|
|
|
+
|
|
|
|
|
+* gopay.GetMiniPaySign() => 获取微信小程序支付所需要的paySign
|
|
|
|
|
+* gopay.GetH5PaySign() => 获取微信内H5支付所需要的paySign
|
|
|
|
|
+* gopay.GetAppPaySign() => 获取APP支付所需要的paySign
|
|
|
|
|
+* gopay.ParseWeChatNotifyResultToBodyMap() => 解析微信支付异步通知的结果到BodyMap
|
|
|
|
|
+* gopay.ParseWeChatNotifyResult() => 解析微信支付异步通知的参数
|
|
|
|
|
+* gopay.VerifyWeChatResultSignByBodyMap() => 通过BodyMap验证微信支付异步通知的Sign值
|
|
|
|
|
+* gopay.VerifyWeChatResultSign() => 验证微信支付异步通知的Sign值
|
|
|
|
|
+* gopay.Code2Session() => 登录凭证校验:获取微信用户OpenId、UnionId、SessionKey
|
|
|
|
|
+* gopay.GetAccessToken() => 获取小程序全局唯一后台接口调用凭据
|
|
|
|
|
+* gopay.GetPaidUnionId() => 微信小程序用户支付完成后,获取该用户的 UnionId,无需用户授权
|
|
|
|
|
+* gopay.GetWeChatUserInfo() => 微信公众号:获取用户基本信息(UnionID机制)
|
|
|
|
|
+* gopay.DecryptOpenDataToStruct() => 加密数据,解密到指定结构体
|
|
|
|
|
+* gopay.GetOpenIdByAuthCode() => 授权码查询openid
|
|
|
|
|
+
|
|
|
|
|
+---
|
|
|
|
|
+
|
|
|
|
|
+## 支付宝Client
|
|
|
|
|
+
|
|
|
|
|
+* client := gopay.NewAliPayClient() => 初始化支付宝支付客户端
|
|
|
|
|
+* client的其他配置
|
|
|
|
|
+ * client.SetReturnUrl() => 设置返回URL
|
|
|
|
|
+ * client.SetNotifyUrl() => 设置异步通知URL
|
|
|
|
|
+ * client.SetCharset() => 设置字符编码,默认 utf-8
|
|
|
|
|
+ * client.SetSignType() => 设置签名类型,默认 RSA2
|
|
|
|
|
+ * client.SetAppAuthToken() => 设置应用授权
|
|
|
|
|
+
|
|
|
|
|
+## 支付宝支付API
|
|
|
|
|
+
|
|
|
|
|
+* 手机网站支付接口2.0(手机网站支付):client.AliPayTradeWapPay()
|
|
|
|
|
+* 统一收单下单并支付页面接口(电脑网站支付):client.AliPayTradePagePay()
|
|
|
|
|
+* APP支付接口2.0(APP支付):client.AliPayTradeAppPay()
|
|
|
|
|
+* 统一收单交易支付接口(当面付):client.AliPayTradePay()
|
|
|
|
|
+* 统一收单交易创建接口(小程序支付):client.AliPayTradeCreate()
|
|
|
|
|
+* 统一收单线下交易查询:client.AliPayTradeQuery()
|
|
|
|
|
+* 统一收单交易关闭接口:client.AliPayTradeClose()
|
|
|
|
|
+* 统一收单交易撤销接口:client.AliPayTradeCancel()
|
|
|
|
|
+* 统一收单交易退款接口:client.AliPayTradeRefund()
|
|
|
|
|
+* 统一收单退款页面接口:client.AliPayTradePageRefund()
|
|
|
|
|
+* 统一收单交易退款查询:client.AliPayTradeFastPayRefundQuery()
|
|
|
|
|
+* 统一收单交易结算接口:client.AliPayTradeOrderSettle()
|
|
|
|
|
+* 统一收单线下交易预创建:client.AliPayTradePrecreate()
|
|
|
|
|
+
|
|
|
|
|
+## 支付宝公共API
|
|
|
|
|
+
|
|
|
|
|
+* gopay.AliPaySystemOauthToken() => 换取授权访问令牌(得到access_token,user_id等信息)
|
|
|
|
|
+* gopay.FormatPrivateKey() => 格式化应用私钥
|
|
|
|
|
+* gopay.FormatAliPayPublicKey() => 格式化支付宝公钥
|
|
|
|
|
+* gopay.ParseAliPayNotifyResult() => 解析并返回支付宝支付异步通知的参数
|
|
|
|
|
+* gopay.VerifyAliPayResultSign() => 支付宝支付异步通知的签名验证和返回参数验签后的Sign
|
|
|
|
|
+* gopay.DecryptAliPayOpenDataToStruct() => 支付宝小程序敏感加密数据解析到结构体
|
|
|
|
|
+
|
|
|
|
|
+# 安装
|
|
|
|
|
+
|
|
|
|
|
+```bash
|
|
|
|
|
+$ go get -u github.com/iGoogle-ink/gopay
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+# 文档
|
|
|
|
|
+
|
|
|
|
|
+* [GoDoc](https://godoc.org/github.com/iGoogle-ink/gopay)
|
|
|
|
|
+
|
|
|
|
|
+* 有问题+微信群。另外,仅 Fork 的同志顺手点个星呗
|
|
|
|
|
+
|
|
|
|
|
+微信:
|
|
|
|
|
+<img width="226" height="300" alt="Photo was Loading Faild!" src="https://raw.githubusercontent.com/iGoogle-ink/gopay/master/wechat_jerry.png"/>
|
|
|
|
|
+讨论群(如过期请加微信):
|
|
|
|
|
+<img width="226" height="300" alt="Photo was Loading Faild!" src="https://raw.githubusercontent.com/iGoogle-ink/gopay/master/wechat_gopay.png"/>
|
|
|
|
|
+
|
|
|
|
|
+# 微信支付
|
|
|
|
|
+
|
|
|
|
|
+<font color='#0088ff'>注意:具体参数根据请求的不同而不同,请参考微信官方文档的参数说明!</font>
|
|
|
|
|
+
|
|
|
|
|
+参考文档:[微信支付文档](https://pay.weixin.qq.com/wiki/doc/api/index.html)
|
|
|
|
|
+
|
|
|
|
|
+---
|
|
|
|
|
+### 获取微信用户OpenId、UnionId、SessionKey
|
|
|
|
|
+
|
|
|
|
|
+```go
|
|
|
|
|
+userIdRsp, err := gopay.Code2Session(appID, secretKey, "")
|
|
|
|
|
+if err != nil {
|
|
|
|
|
+ fmt.Println("Error:", err)
|
|
|
|
|
+ return
|
|
|
|
|
+}
|
|
|
|
|
+fmt.Println("OpenID:", userIdRsp.Openid)
|
|
|
|
|
+fmt.Println("UnionID:", userIdRsp.Unionid)
|
|
|
|
|
+fmt.Println("SessionKey:", userIdRsp.SessionKey)
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+### 微信小程序支付,统一下单成功后,需要进一步获取微信小程序支付所需要的paySign
|
|
|
|
|
+
|
|
|
|
|
+* 小程序支付所需要的参数,paySign由后端计算
|
|
|
|
|
+ * timeStamp
|
|
|
|
|
+ * nonceStr
|
|
|
|
|
+ * package
|
|
|
|
|
+ * signType
|
|
|
|
|
+ * paySign
|
|
|
|
|
+
|
|
|
|
|
+> 微信小程序支付官方文档:[微信小程序支付API](https://developers.weixin.qq.com/miniprogram/dev/api/open-api/payment/wx.requestPayment.html)
|
|
|
|
|
+```go
|
|
|
|
|
+timeStamp := strconv.FormatInt(time.Now().Unix(), 10)
|
|
|
|
|
+packages := "prepay_id=" + wxRsp.PrepayId //此处的 wxRsp.PrepayId ,统一下单成功后得到
|
|
|
|
|
+// appId:APPID
|
|
|
|
|
+// nonceStr:随即字符串
|
|
|
|
|
+// prepayId:统一下单成功后得到的值
|
|
|
|
|
+// signType:签名类型
|
|
|
|
|
+// timeStamp:时间
|
|
|
|
|
+// apiKey:API秘钥值
|
|
|
|
|
+paySign := gopay.GetMiniPaySign(AppID, wxRsp.NonceStr, packages, gopay.SignType_MD5, timeStamp, ApiKey)
|
|
|
|
|
+
|
|
|
|
|
+//微信小程序支付需要的参数信息
|
|
|
|
|
+fmt.Println("paySign:", paySign)
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+### 微信内H5支付,统一下单成功后,需要进一步获取微信内H5支付所需要的paySign
|
|
|
|
|
+
|
|
|
|
|
+* 微信内H5支付所需要的参数,paySign由后端计算
|
|
|
|
|
+ * appId
|
|
|
|
|
+ * timeStamp
|
|
|
|
|
+ * nonceStr
|
|
|
|
|
+ * package
|
|
|
|
|
+ * signType
|
|
|
|
|
+ * paySign
|
|
|
|
|
+> 微信内H5支付官方文档:[微信内H5支付文档](https://pay.weixin.qq.com/wiki/doc/api/external/jsapi.php?chapter=7_7&index=6)
|
|
|
|
|
+```go
|
|
|
|
|
+timeStamp := strconv.FormatInt(time.Now().Unix(), 10)
|
|
|
|
|
+packages := "prepay_id=" + wxRsp.PrepayId //此处的 wxRsp.PrepayId ,统一下单成功后得到
|
|
|
|
|
+// appId:APPID
|
|
|
|
|
+// nonceStr:随即字符串
|
|
|
|
|
+// prepayId:统一下单成功后得到的值
|
|
|
|
|
+// signType:签名类型
|
|
|
|
|
+// timeStamp:时间
|
|
|
|
|
+// apiKey:API秘钥值
|
|
|
|
|
+paySign := gopay.GetH5PaySign(AppID, wxRsp.NonceStr, packages, gopay.SignType_MD5, timeStamp, ApiKey)
|
|
|
|
|
+
|
|
|
|
|
+//微信内H5支付需要的参数信息
|
|
|
|
|
+fmt.Println("paySign:", paySign)
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+### APP支付,统一下单成功后,需要进一步获取APP支付所需要的paySign
|
|
|
|
|
+
|
|
|
|
|
+* APP支付所需要的参数,paySign由后端计算
|
|
|
|
|
+ * appid
|
|
|
|
|
+ * partnerid
|
|
|
|
|
+ * noncestr
|
|
|
|
|
+ * prepayid
|
|
|
|
|
+ * package
|
|
|
|
|
+ * timestamp
|
|
|
|
|
+ * sign
|
|
|
|
|
+> APP支付官方文档:[APP端调起支付的参数列表文档](https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_12)
|
|
|
|
|
+```go
|
|
|
|
|
+timeStamp := strconv.FormatInt(time.Now().Unix(), 10)
|
|
|
|
|
+//注意:signType:此处签名方式,务必与统一下单时用的签名方式一致
|
|
|
|
|
+//注意:package:参数因为是固定值,不需开发者再传入
|
|
|
|
|
+// appId:APPID
|
|
|
|
|
+// partnerid:partnerid
|
|
|
|
|
+// nonceStr:随即字符串
|
|
|
|
|
+// prepayId:统一下单成功后得到的值
|
|
|
|
|
+// signType:此处签名方式,务必与统一下单时用的签名方式一致
|
|
|
|
|
+// timeStamp:时间
|
|
|
|
|
+// apiKey:API秘钥值
|
|
|
|
|
+paySign := gopay.GetAppPaySign(appid, partnerid, wxRsp.NonceStr, prepayid, gopay.SignType_MD5, timeStamp, apiKey)
|
|
|
|
|
+
|
|
|
|
|
+//APP支付需要的参数信息
|
|
|
|
|
+fmt.Println("paySign:", paySign)
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+### 1、解析并返回微信支付异步通知的参数,2、验证Sign值
|
|
|
|
|
+
|
|
|
|
|
+> 微信支付后的异步通知文档:[支付结果通知](https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=9_7&index=8)
|
|
|
|
|
+
|
|
|
|
|
+```go
|
|
|
|
|
+//解析微信支付异步通知的参数
|
|
|
|
|
+// req:*http.Request
|
|
|
|
|
+// 返回参数notifyRsp:Notify请求的参数
|
|
|
|
|
+// 返回参数err:错误信息
|
|
|
|
|
+notifyRsp, err := gopay.ParseWeChatNotifyResult(c.Request())
|
|
|
|
|
+if err != nil {
|
|
|
|
|
+ fmt.Println("err:", err)
|
|
|
|
|
+ return
|
|
|
|
|
+}
|
|
|
|
|
+fmt.Println("notifyRsp:", notifyRsp)
|
|
|
|
|
+
|
|
|
|
|
+//验证微信支付异步通知的Sign值
|
|
|
|
|
+// apiKey:API秘钥值
|
|
|
|
|
+// signType:签名类型 MD5 或 HMAC-SHA256(默认请填写 MD5)
|
|
|
|
|
+// notifyRsp:利用 gopay.ParseWeChatNotifyResult() 得到的结构体
|
|
|
|
|
+// 返回参数ok:是否验证通过
|
|
|
|
|
+// 返回参数sign:根据参数计算的sign值,非微信返回参数中的Sign
|
|
|
|
|
+ok, sign := gopay.VerifyWeChatResultSign("192006250b4c09247ec02edce69f6a2d", "MD5", notifyRsp)
|
|
|
|
|
+log.Println("ok:", ok)
|
|
|
|
|
+log.Println("sign:", sign)
|
|
|
|
|
+```
|
|
|
|
|
+或者
|
|
|
|
|
+```go
|
|
|
|
|
+//解析微信支付异步通知的结果到BodyMap
|
|
|
|
|
+// req:*http.Request
|
|
|
|
|
+// 返回参数bm:Notify请求的参数
|
|
|
|
|
+// 返回参数err:错误信息
|
|
|
|
|
+bm, err := gopay.ParseWeChatNotifyResultToBodyMap(c.Request())
|
|
|
|
|
+if err != nil {
|
|
|
|
|
+ fmt.Println("err:", err)
|
|
|
|
|
+ return
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+//通过BodyMap验证微信支付异步通知的Sign值
|
|
|
|
|
+// apiKey:API秘钥值
|
|
|
|
|
+// signType:签名类型 MD5 或 HMAC-SHA256(默认请填写 MD5)
|
|
|
|
|
+// bm:通过 gopay.ParseWeChatNotifyResult() 得到的BodyMap
|
|
|
|
|
+// 返回参数ok:是否验证通过
|
|
|
|
|
+// 返回参数sign:计算出的sign值,非微信返回参数中的Sign
|
|
|
|
|
+ok, sign := gopay.VerifyWeChatResultSignByBodyMap("192006250b4c09247ec02edce69f6a2d", gopay.SignType_MD5, bm)
|
|
|
|
|
+fmt.Println("ok:", ok)
|
|
|
|
|
+fmt.Println("sign:", sign)
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+### 加密数据,解密到指定结构体
|
|
|
|
|
+
|
|
|
|
|
+> 拿小程序获取手机号为例
|
|
|
|
|
+
|
|
|
|
|
+button按钮获取手机号码:[button组件文档](https://developers.weixin.qq.com/miniprogram/dev/component/button.html)
|
|
|
|
|
+
|
|
|
|
|
+微信解密算法文档:[解密算法文档](https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/signature.html)
|
|
|
|
|
+```go
|
|
|
|
|
+data := "Kf3TdPbzEmhWMuPKtlKxIWDkijhn402w1bxoHL4kLdcKr6jT1jNcIhvDJfjXmJcgDWLjmBiIGJ5acUuSvxLws3WgAkERmtTuiCG10CKLsJiR+AXVk7B2TUQzsq88YVilDz/YAN3647REE7glGmeBPfvUmdbfDzhL9BzvEiuRhABuCYyTMz4iaM8hFjbLB1caaeoOlykYAFMWC5pZi9P8uw=="
|
|
|
|
|
+iv := "Cds8j3VYoGvnTp1BrjXdJg=="
|
|
|
|
|
+sessionKey := "lyY4HPQbaOYzZdG+JcYK9w=="
|
|
|
|
|
+
|
|
|
|
|
+phone := new(gopay.WeChatUserPhone)
|
|
|
|
|
+err := gopay.DecryptOpenDataToStruct(data, iv, sessionKey, phone)
|
|
|
|
|
+if err != nil {
|
|
|
|
|
+ fmt.Println("err:", err)
|
|
|
|
|
+ return
|
|
|
|
|
+}
|
|
|
|
|
+fmt.Println("PhoneNumber:", phone.PhoneNumber)
|
|
|
|
|
+fmt.Println("PurePhoneNumber:", phone.PurePhoneNumber)
|
|
|
|
|
+fmt.Println("CountryCode:", phone.CountryCode)
|
|
|
|
|
+fmt.Println("Watermark:", phone.Watermark)
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+### 微信付款结果异步通知,需回复微信平台是否成功
|
|
|
|
|
+
|
|
|
|
|
+> 代码中return写法,由于本人用的 [Echo Web框架](https://github.com/labstack/echo),有兴趣的可以尝试一下
|
|
|
|
|
+
|
|
|
|
|
+```go
|
|
|
|
|
+rsp := new(gopay.WeChatNotifyResponse) //回复微信的数据
|
|
|
|
|
+
|
|
|
|
|
+rsp.ReturnCode = "SUCCESS"
|
|
|
|
|
+rsp.ReturnMsg = "OK"
|
|
|
|
|
+
|
|
|
|
|
+return c.String(http.StatusOK, rsp.ToXmlString())
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+### 统一下单
|
|
|
|
|
+```go
|
|
|
|
|
+//初始化微信客户端
|
|
|
|
|
+// appId:应用ID
|
|
|
|
|
+// mchID:商户ID
|
|
|
|
|
+// apiKey:API秘钥值
|
|
|
|
|
+// isProd:是否是正式环境
|
|
|
|
|
+client := gopay.NewWeChatClient("wxd678efh567hg6787", "1230000109", "192006250b4c09247ec02edce69f6a2d", false)
|
|
|
|
|
+
|
|
|
|
|
+number := gopay.GetRandomString(32)
|
|
|
|
|
+fmt.Println("out_trade_no:", number)
|
|
|
|
|
+//初始化参数Map
|
|
|
|
|
+body := make(gopay.BodyMap)
|
|
|
|
|
+body.Set("nonce_str", gopay.GetRandomString(32))
|
|
|
|
|
+body.Set("body", "测试支付")
|
|
|
|
|
+body.Set("out_trade_no", number)
|
|
|
|
|
+body.Set("total_fee", 1)
|
|
|
|
|
+body.Set("spbill_create_ip", "127.0.0.1")
|
|
|
|
|
+body.Set("notify_url", "http://www.gopay.ink")
|
|
|
|
|
+body.Set("trade_type", gopay.TradeType_H5)
|
|
|
|
|
+body.Set("device_info", "WEB")
|
|
|
|
|
+body.Set("sign_type", gopay.SignType_MD5)
|
|
|
|
|
+
|
|
|
|
|
+//sceneInfo := make(map[string]map[string]string)
|
|
|
|
|
+//h5Info := make(map[string]string)
|
|
|
|
|
+//h5Info["type"] = "Wap"
|
|
|
|
|
+//h5Info["wap_url"] = "http://www.gopay.ink"
|
|
|
|
|
+//h5Info["wap_name"] = "H5测试支付"
|
|
|
|
|
+//sceneInfo["h5_info"] = h5Info
|
|
|
|
|
+//body.Set("scene_info", sceneInfo)
|
|
|
|
|
+
|
|
|
|
|
+body.Set("openid", OpenID)
|
|
|
|
|
+
|
|
|
|
|
+//发起下单请求
|
|
|
|
|
+wxRsp, err := client.UnifiedOrder(body)
|
|
|
|
|
+if err != nil {
|
|
|
|
|
+ fmt.Println("Error:", err)
|
|
|
|
|
+ return
|
|
|
|
|
+}
|
|
|
|
|
+fmt.Println("ReturnCode:", wxRsp.ReturnCode)
|
|
|
|
|
+fmt.Println("ReturnMsg:", wxRsp.ReturnMsg)
|
|
|
|
|
+fmt.Println("Appid:", wxRsp.Appid)
|
|
|
|
|
+fmt.Println("MchId:", wxRsp.MchId)
|
|
|
|
|
+fmt.Println("DeviceInfo:", wxRsp.DeviceInfo)
|
|
|
|
|
+fmt.Println("NonceStr:", wxRsp.NonceStr)
|
|
|
|
|
+fmt.Println("Sign:", wxRsp.Sign)
|
|
|
|
|
+fmt.Println("ResultCode:", wxRsp.ResultCode)
|
|
|
|
|
+fmt.Println("ErrCode:", wxRsp.ErrCode)
|
|
|
|
|
+fmt.Println("ErrCodeDes:", wxRsp.ErrCodeDes)
|
|
|
|
|
+fmt.Println("PrepayId:", wxRsp.PrepayId)
|
|
|
|
|
+fmt.Println("TradeType:", wxRsp.TradeType)
|
|
|
|
|
+fmt.Println("CodeUrl:", wxRsp.CodeUrl)
|
|
|
|
|
+fmt.Println("MwebUrl:", wxRsp.MwebUrl)
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+### 提交付款码支付
|
|
|
|
|
+```go
|
|
|
|
|
+//初始化微信客户端
|
|
|
|
|
+// appId:应用ID
|
|
|
|
|
+// mchID:商户ID
|
|
|
|
|
+// apiKey:API秘钥值
|
|
|
|
|
+// isProd:是否是正式环境
|
|
|
|
|
+client := gopay.NewWeChatClient("wxd678efh567hg6787", "1230000109", "192006250b4c09247ec02edce69f6a2d", false)
|
|
|
|
|
+
|
|
|
|
|
+//初始化参数Map
|
|
|
|
|
+body := make(gopay.BodyMap)
|
|
|
|
|
+body.Set("nonce_str", gopay.GetRandomString(32))
|
|
|
|
|
+body.Set("body", "扫用户付款码支付")
|
|
|
|
|
+number := gopay.GetRandomString(32)
|
|
|
|
|
+log.Println("Number:", number)
|
|
|
|
|
+body.Set("out_trade_no", number)
|
|
|
|
|
+body.Set("total_fee", 1)
|
|
|
|
|
+body.Set("spbill_create_ip", "127.0.0.1")
|
|
|
|
|
+body.Set("notify_url", "http://www.gopay.ink")
|
|
|
|
|
+body.Set("auth_code", "120061098828009406")
|
|
|
|
|
+body.Set("sign_type", gopay.SignType_MD5)
|
|
|
|
|
+
|
|
|
|
|
+//请求支付,成功后得到结果
|
|
|
|
|
+wxRsp, err := client.Micropay(body)
|
|
|
|
|
+if err != nil {
|
|
|
|
|
+ fmt.Println("Error:", err)
|
|
|
|
|
+}
|
|
|
|
|
+fmt.Println("Response:", wxRsp)
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+### 申请退款
|
|
|
|
|
+```go
|
|
|
|
|
+//初始化微信客户端
|
|
|
|
|
+// appId:应用ID
|
|
|
|
|
+// mchID:商户ID
|
|
|
|
|
+// apiKey:API秘钥值
|
|
|
|
|
+// isProd:是否是正式环境
|
|
|
|
|
+client := gopay.NewWeChatClient("wxd678efh567hg6787", "1230000109", "192006250b4c09247ec02edce69f6a2d", false)
|
|
|
|
|
+
|
|
|
|
|
+//初始化参数结构体
|
|
|
|
|
+body := make(gopay.BodyMap)
|
|
|
|
|
+body.Set("out_trade_no", "MfZC2segKxh0bnJSELbvKNeH3d9oWvvQ")
|
|
|
|
|
+body.Set("nonce_str", gopay.GetRandomString(32))
|
|
|
|
|
+body.Set("sign_type", gopay.SignType_MD5)
|
|
|
|
|
+s := gopay.GetRandomString(64)
|
|
|
|
|
+fmt.Println("s:", s)
|
|
|
|
|
+body.Set("out_refund_no", s)
|
|
|
|
|
+body.Set("total_fee", 101)
|
|
|
|
|
+body.Set("refund_fee", 101)
|
|
|
|
|
+
|
|
|
|
|
+//请求申请退款(沙箱环境下,证书路径参数可传空)
|
|
|
|
|
+// body:参数Body
|
|
|
|
|
+// certFilePath:cert证书路径
|
|
|
|
|
+// keyFilePath:Key证书路径
|
|
|
|
|
+// pkcs12FilePath:p12证书路径
|
|
|
|
|
+wxRsp, err := client.Refund(body, "", "", "")
|
|
|
|
|
+if err != nil {
|
|
|
|
|
+ fmt.Println("Error:", err)
|
|
|
|
|
+}
|
|
|
|
|
+fmt.Println("Response:", wxRsp)
|
|
|
|
|
+```
|
|
|
|
|
+---
|
|
|
|
|
+
|
|
|
|
|
+# 支付宝支付
|
|
|
|
|
+
|
|
|
|
|
+<font color='#0088ff'>注意:具体请求参数根据请求的不同而不同,请参考支付宝官方文档的参数说明!</font>
|
|
|
|
|
+
|
|
|
|
|
+支付宝官方文档:[官方文档](https://docs.open.alipay.com/catalog)
|
|
|
|
|
+
|
|
|
|
|
+支付宝RSA秘钥生成文档:[生成 RSA 密钥](https://docs.open.alipay.com/291/105971/)
|
|
|
|
|
+
|
|
|
|
|
+支付宝在线调试:[在线调试地址](https://openhome.alipay.com/platform/demoManage.htm)
|
|
|
|
|
+
|
|
|
|
|
+沙箱环境使用说明:[文档地址](https://docs.open.alipay.com/200/105311)
|
|
|
|
|
+
|
|
|
|
|
+---
|
|
|
|
|
+
|
|
|
|
|
+### 换取授权访问令牌(得到access_token,user_id等信息)
|
|
|
|
|
+
|
|
|
|
|
+> 支付宝换取授权访问令牌文档:[换取授权访问令牌](https://docs.open.alipay.com/api_9/alipay.system.oauth.token)
|
|
|
|
|
+
|
|
|
|
|
+```go
|
|
|
|
|
+privateKey := "MIIEogIBAAKCAQEAy+CRzKw4krA2RzCDTqg5KJg92XkOY0RN3pW4sYInPqnGtHV7YDHu5nMuxY6un+dLfo91OFOEg+RI+WTOPoM4xJtsOaJwQ1lpjycoeLq1OyetGW5Q8wO+iLWJASaMQM/t/aXR/JHaguycJyqlHSlxANvKKs/tOHx9AhW3LqumaCwz71CDF/+70scYuZG/7wxSjmrbRBswxd1Sz9KHdcdjqT8pmieyPqnM24EKBexHDmQ0ySXvLJJy6eu1dJsPIz+ivX6HEfDXmSmJ71AZVqZyCI1MhK813R5E7XCv5NOtskTe3y8uiIhgGpZSdB77DOyPLcmVayzFVLAQ3AOBDmsY6wIDAQABAoIBAHjsNq31zAw9FcR9orQJlPVd7vlJEt6Pybvmg8hNESfanO+16rpwg2kOEkS8zxgqoJ1tSzJgXu23fgzl3Go5fHcoVDWPAhUAOFre9+M7onh2nPXDd6Hbq6v8OEmFapSaf2b9biHnBHq5Chk08v/r74l501w3PVVOiPqulJrK1oVb+0/YmCvVFpGatBcNaefKUEcA+vekWPL7Yl46k6XeUvRfTwomCD6jpYLUhsAKqZiQJhMGoaLglZvkokQMF/4G78K7FbbVLMM1+JDh8zJ/DDVdY2vHREUcCGhl4mCVQtkzIbpxG++vFg7/g/fDI+PquG22hFILTDdtt2g2fV/4wmkCgYEA6goRQYSiM03y8Tt/M4u1Mm7OWYCksqAsU7rzQllHekIN3WjD41Xrjv6uklsX3sTG1syo7Jr9PGE1xQgjDEIyO8h/3lDQyLyycYnyUPGNNMX8ZjmGwcM51DQ/QfIrY/CXjnnW+MVpmNclAva3L33KXCWjw20VsROV1EA8LCL94BUCgYEA3wH4ANpzo7NqXf+2WlPPMuyRrF0QPIRGlFBNtaKFy0mvoclkREPmK7+N4NIGtMf5JNODS5HkFRgmU4YNdupA2I8lIYpD+TsIobZxGUKUkYzRZYZ1m1ttL69YYvCVz9Xosw/VoQ+RrW0scS5yUKqFMIUOV2R/Imi//c5TdKx6VP8CgYAnJ1ADugC4vI2sNdvt7618pnT3HEJxb8J6r4gKzYzbszlGlURQQAuMfKcP7RVtO1ZYkRyhmLxM4aZxNA9I+boVrlFWDAchzg+8VuunBwIslgLHx0/4EoUWLzd1/OGtco6oU1HXhI9J9pRGjqfO1iiIifN/ujwqx7AFNknayG/YkQKBgD6yNgA/ak12rovYzXKdp14Axn+39k2dPp6J6R8MnyLlB3yruwW6NSbNhtzTD1GZ+wCQepQvYvlPPc8zm+t3tl1r+Rtx3ORf5XBZc3iPkGdPOLubTssrrAnA+U9vph61W+OjqwLJ9sHUNK9pSHhHSIS4k6ycM2YAHyIC9NGTgB0PAoGAJjwd1DgMaQldtWnuXjvohPOo8cQudxXYcs6zVRbx6vtjKe2v7e+eK1SSVrR5qFV9AqxDfGwq8THenRa0LC3vNNplqostuehLhkWCKE7Y75vXMR7N6KU1kdoVWgN4BhXSwuRxmHMQfSY7q3HG3rDGz7mzXo1FVMr/uE4iDGm0IXY="
|
|
|
|
|
+//换取授权访问令牌(默认使用utf-8,RSA2)
|
|
|
|
|
+// appId:应用ID
|
|
|
|
|
+// privateKey:应用私钥
|
|
|
|
|
+// grantType:值为 authorization_code 时,代表用code换取;值为 refresh_token 时,代表用refresh_token换取,传空默认code换取
|
|
|
|
|
+// codeOrToken:支付宝授权码或refresh_token
|
|
|
|
|
+rsp, err := gopay.AlipaySystemOauthToken("2016091200494382", privateKey, "authorization_code", "06e8961891d647c0ac99bb1cebe7SE69")
|
|
|
|
|
+if err != nil {
|
|
|
|
|
+ fmt.Println("gopay.AlipaySystemOauthToken:",err)
|
|
|
|
|
+ return
|
|
|
|
|
+}
|
|
|
|
|
+fmt.Println("rsp:", *rsp)
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+### 支付宝(小程序)敏感加密数据解析
|
|
|
|
|
+
|
|
|
|
|
+> 拿小程序获取手机号为例
|
|
|
|
|
+
|
|
|
|
|
+获取用户手机号文档:[获取用户手机号](https://docs.alipay.com/mini/api/getphonenumber)
|
|
|
|
|
+
|
|
|
|
|
+敏感信息加解密官方文档:[敏感信息加解密方法](https://docs.alipay.com/mini/introduce/aes)
|
|
|
|
|
+```go
|
|
|
|
|
+data := "MkvuiIZsGOC8S038cu/JIpoRKnF+ZFjoIRGf5d/K4+ctYjCtb/eEkwgrdB5TeH/93bxff1Ylb+SE+UGStlpvcg=="
|
|
|
|
|
+key := "TDftre9FpItr46e9BVNJcw=="
|
|
|
|
|
+rsp := new(gopay.PhoneNumberResponse)
|
|
|
|
|
+err := gopay.DecryptAliPayOpenDataToStruct(data, key, rsp)
|
|
|
|
|
+if err != nil {
|
|
|
|
|
+ fmt.Println("err:", err)
|
|
|
|
|
+ return
|
|
|
|
|
+}
|
|
|
|
|
+fmt.Println("rsp.Code:", rsp.Code)
|
|
|
|
|
+fmt.Println("rsp.Msg:", rsp.Msg)
|
|
|
|
|
+fmt.Println("rsp.SubCode:", rsp.SubCode)
|
|
|
|
|
+fmt.Println("rsp.SubMsg:", rsp.SubMsg)
|
|
|
|
|
+fmt.Println("rsp.Mobile:", rsp.Mobile)
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+### 1、支付结果异步通知参数解析;2、验签操作
|
|
|
|
|
+
|
|
|
|
|
+> 支付宝支付后的异步通知验签文档:[支付结果通知](https://docs.open.alipay.com/200/106120)
|
|
|
|
|
+
|
|
|
|
|
+```go
|
|
|
|
|
+//解析支付完成后的异步通知参数信息
|
|
|
|
|
+//此处 c.Request() 为 *http.Request
|
|
|
|
|
+notifyRsp, err := gopay.ParseAliPayNotifyResult(c.Request())
|
|
|
|
|
+if err != nil {
|
|
|
|
|
+ fmt.Println("gopay.ParseAliPayNotifyResult:", err)
|
|
|
|
|
+ return
|
|
|
|
|
+}
|
|
|
|
|
+fmt.Println("notifyRsp:", notifyRsp)
|
|
|
|
|
+
|
|
|
|
|
+aliPayPublicKey := "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA1wn1sU/8Q0rYLlZ6sq3enrPZw2ptp6FecHR2bBFLjJ+sKzepROd0bKddgj+Mr1ffr3Ej78mLdWV8IzLfpXUi945DkrQcOUWLY0MHhYVG2jSs/qzFfpzmtut2Cl2TozYpE84zom9ei06u2AXLMBkU6VpznZl+R4qIgnUfByt3Ix5b3h4Cl6gzXMAB1hJrrrCkq+WvWb3Fy0vmk/DUbJEz8i8mQPff2gsHBE1nMPvHVAMw1GMk9ImB4PxucVek4ZbUzVqxZXphaAgUXFK2FSFU+Q+q1SPvHbUsjtIyL+cLA6H/6ybFF9Ffp27Y14AHPw29+243/SpMisbGcj2KD+evBwIDAQAB"
|
|
|
|
|
+//验签操作
|
|
|
|
|
+// aliPayPublicKey:支付宝公钥
|
|
|
|
|
+// notifyRsp:利用 gopay.ParseAliPayNotifyResult() 得到的结构体
|
|
|
|
|
+// 返回参数ok:是否验证通过
|
|
|
|
|
+// 返回参数err:错误信息
|
|
|
|
|
+ok, err := gopay.VerifyAliPayResultSign(aliPayPublicKey, notifyRsp)
|
|
|
|
|
+if err != nil {
|
|
|
|
|
+ log.Println("gopay.VerifyAliPayResultSign:", err)
|
|
|
|
|
+ return
|
|
|
|
|
+}
|
|
|
|
|
+fmt.Println("ok:", ok)
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+### 支付宝付款结果异步通知,需回复支付宝平台是否成功
|
|
|
|
|
+
|
|
|
|
|
+* 程序执行完后必须打印输出“success”(不包含引号)。如果商户反馈给支付宝的字符不是success这7个字符,支付宝服务器会不断重发通知,直到超过24小时22分钟。一般情况下,25小时以内完成8次通知(通知的间隔频率一般是:4m,10m,10m,1h,2h,6h,15h)
|
|
|
|
|
+
|
|
|
|
|
+> 代码中return写法,由于本人用的 [Echo Web框架](https://github.com/labstack/echo),有兴趣的可以尝试一下
|
|
|
|
|
+
|
|
|
|
|
+```go
|
|
|
|
|
+return c.String(http.StatusOK, "success")
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+### 手机网站支付
|
|
|
|
|
+
|
|
|
|
|
+* 手机网站支付是通过服务端获取支付URL后,然后返回给客户端,请求URL地址即可打开支付页面
|
|
|
|
|
+
|
|
|
|
|
+> 文档说明:[手机网站支付-请求参数说明](https://docs.open.alipay.com/203/107090/)
|
|
|
|
|
+
|
|
|
|
|
+> 文档说明:[手机网站支付接口2.0](https://docs.open.alipay.com/api_1/alipay.trade.wap.pay/)
|
|
|
|
|
+
|
|
|
|
|
+```go
|
|
|
|
|
+privateKey := "MIIEogIBAAKCAQEAy+CRzKw4krA2RzCDTqg5KJg92XkOY0RN3pW4sYInPqnGtHV7YDHu5nMuxY6un+dLfo91OFOEg+RI+WTOPoM4xJtsOaJwQ1lpjycoeLq1OyetGW5Q8wO+iLWJASaMQM/t/aXR/JHaguycJyqlHSlxANvKKs/tOHx9AhW3LqumaCwz71CDF/+70scYuZG/7wxSjmrbRBswxd1Sz9KHdcdjqT8pmieyPqnM24EKBexHDmQ0ySXvLJJy6eu1dJsPIz+ivX6HEfDXmSmJ71AZVqZyCI1MhK813R5E7XCv5NOtskTe3y8uiIhgGpZSdB77DOyPLcmVayzFVLAQ3AOBDmsY6wIDAQABAoIBAHjsNq31zAw9FcR9orQJlPVd7vlJEt6Pybvmg8hNESfanO+16rpwg2kOEkS8zxgqoJ1tSzJgXu23fgzl3Go5fHcoVDWPAhUAOFre9+M7onh2nPXDd6Hbq6v8OEmFapSaf2b9biHnBHq5Chk08v/r74l501w3PVVOiPqulJrK1oVb+0/YmCvVFpGatBcNaefKUEcA+vekWPL7Yl46k6XeUvRfTwomCD6jpYLUhsAKqZiQJhMGoaLglZvkokQMF/4G78K7FbbVLMM1+JDh8zJ/DDVdY2vHREUcCGhl4mCVQtkzIbpxG++vFg7/g/fDI+PquG22hFILTDdtt2g2fV/4wmkCgYEA6goRQYSiM03y8Tt/M4u1Mm7OWYCksqAsU7rzQllHekIN3WjD41Xrjv6uklsX3sTG1syo7Jr9PGE1xQgjDEIyO8h/3lDQyLyycYnyUPGNNMX8ZjmGwcM51DQ/QfIrY/CXjnnW+MVpmNclAva3L33KXCWjw20VsROV1EA8LCL94BUCgYEA3wH4ANpzo7NqXf+2WlPPMuyRrF0QPIRGlFBNtaKFy0mvoclkREPmK7+N4NIGtMf5JNODS5HkFRgmU4YNdupA2I8lIYpD+TsIobZxGUKUkYzRZYZ1m1ttL69YYvCVz9Xosw/VoQ+RrW0scS5yUKqFMIUOV2R/Imi//c5TdKx6VP8CgYAnJ1ADugC4vI2sNdvt7618pnT3HEJxb8J6r4gKzYzbszlGlURQQAuMfKcP7RVtO1ZYkRyhmLxM4aZxNA9I+boVrlFWDAchzg+8VuunBwIslgLHx0/4EoUWLzd1/OGtco6oU1HXhI9J9pRGjqfO1iiIifN/ujwqx7AFNknayG/YkQKBgD6yNgA/ak12rovYzXKdp14Axn+39k2dPp6J6R8MnyLlB3yruwW6NSbNhtzTD1GZ+wCQepQvYvlPPc8zm+t3tl1r+Rtx3ORf5XBZc3iPkGdPOLubTssrrAnA+U9vph61W+OjqwLJ9sHUNK9pSHhHSIS4k6ycM2YAHyIC9NGTgB0PAoGAJjwd1DgMaQldtWnuXjvohPOo8cQudxXYcs6zVRbx6vtjKe2v7e+eK1SSVrR5qFV9AqxDfGwq8THenRa0LC3vNNplqostuehLhkWCKE7Y75vXMR7N6KU1kdoVWgN4BhXSwuRxmHMQfSY7q3HG3rDGz7mzXo1FVMr/uE4iDGm0IXY="
|
|
|
|
|
+//初始化支付宝客户端
|
|
|
|
|
+// appId:应用ID
|
|
|
|
|
+// privateKey:应用秘钥
|
|
|
|
|
+// isProd:是否是正式环境
|
|
|
|
|
+client := gopay.NewAliPayClient("2016091200494382", privateKey, false)
|
|
|
|
|
+//配置公共参数
|
|
|
|
|
+client.SetCharset("utf-8").
|
|
|
|
|
+ SetSignType("RSA2").
|
|
|
|
|
+ //SetAppAuthToken("").
|
|
|
|
|
+ //SetReturnUrl("https://www.gopay.ink").
|
|
|
|
|
+ SetNotifyUrl("https://www.gopay.ink")
|
|
|
|
|
+//请求参数
|
|
|
|
|
+body := make(gopay.BodyMap)
|
|
|
|
|
+body.Set("subject", "测试支付")
|
|
|
|
|
+body.Set("out_trade_no", "GYWX201901301040355706100409")
|
|
|
|
|
+body.Set("quit_url", "https://www.gopay.ink")
|
|
|
|
|
+body.Set("total_amount", "10.00")
|
|
|
|
|
+body.Set("product_code", "QUICK_WAP_WAY")
|
|
|
|
|
+//手机网站支付请求
|
|
|
|
|
+payUrl, err := client.AliPayTradeWapPay(body)
|
|
|
|
|
+if err != nil {
|
|
|
|
|
+ log.Println("err:", err)
|
|
|
|
|
+ return
|
|
|
|
|
+}
|
|
|
|
|
+fmt.Println("payUrl:", payUrl)
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+### APP支付
|
|
|
|
|
+
|
|
|
|
|
+* APP支付是通过服务端获取支付参数后,然后通过Android/iOS客户端的SDK调用支付功能
|
|
|
|
|
+
|
|
|
|
|
+> 文档说明:[APP支付-请求参数说明](https://docs.open.alipay.com/204/105465/)
|
|
|
|
|
+
|
|
|
|
|
+> 文档说明:[APP支付接口2.0](https://docs.open.alipay.com/api_1/alipay.trade.app.pay/)
|
|
|
|
|
+
|
|
|
|
|
+```go
|
|
|
|
|
+privateKey := "MIIEogIBAAKCAQEAy+CRzKw4krA2RzCDTqg5KJg92XkOY0RN3pW4sYInPqnGtHV7YDHu5nMuxY6un+dLfo91OFOEg+RI+WTOPoM4xJtsOaJwQ1lpjycoeLq1OyetGW5Q8wO+iLWJASaMQM/t/aXR/JHaguycJyqlHSlxANvKKs/tOHx9AhW3LqumaCwz71CDF/+70scYuZG/7wxSjmrbRBswxd1Sz9KHdcdjqT8pmieyPqnM24EKBexHDmQ0ySXvLJJy6eu1dJsPIz+ivX6HEfDXmSmJ71AZVqZyCI1MhK813R5E7XCv5NOtskTe3y8uiIhgGpZSdB77DOyPLcmVayzFVLAQ3AOBDmsY6wIDAQABAoIBAHjsNq31zAw9FcR9orQJlPVd7vlJEt6Pybvmg8hNESfanO+16rpwg2kOEkS8zxgqoJ1tSzJgXu23fgzl3Go5fHcoVDWPAhUAOFre9+M7onh2nPXDd6Hbq6v8OEmFapSaf2b9biHnBHq5Chk08v/r74l501w3PVVOiPqulJrK1oVb+0/YmCvVFpGatBcNaefKUEcA+vekWPL7Yl46k6XeUvRfTwomCD6jpYLUhsAKqZiQJhMGoaLglZvkokQMF/4G78K7FbbVLMM1+JDh8zJ/DDVdY2vHREUcCGhl4mCVQtkzIbpxG++vFg7/g/fDI+PquG22hFILTDdtt2g2fV/4wmkCgYEA6goRQYSiM03y8Tt/M4u1Mm7OWYCksqAsU7rzQllHekIN3WjD41Xrjv6uklsX3sTG1syo7Jr9PGE1xQgjDEIyO8h/3lDQyLyycYnyUPGNNMX8ZjmGwcM51DQ/QfIrY/CXjnnW+MVpmNclAva3L33KXCWjw20VsROV1EA8LCL94BUCgYEA3wH4ANpzo7NqXf+2WlPPMuyRrF0QPIRGlFBNtaKFy0mvoclkREPmK7+N4NIGtMf5JNODS5HkFRgmU4YNdupA2I8lIYpD+TsIobZxGUKUkYzRZYZ1m1ttL69YYvCVz9Xosw/VoQ+RrW0scS5yUKqFMIUOV2R/Imi//c5TdKx6VP8CgYAnJ1ADugC4vI2sNdvt7618pnT3HEJxb8J6r4gKzYzbszlGlURQQAuMfKcP7RVtO1ZYkRyhmLxM4aZxNA9I+boVrlFWDAchzg+8VuunBwIslgLHx0/4EoUWLzd1/OGtco6oU1HXhI9J9pRGjqfO1iiIifN/ujwqx7AFNknayG/YkQKBgD6yNgA/ak12rovYzXKdp14Axn+39k2dPp6J6R8MnyLlB3yruwW6NSbNhtzTD1GZ+wCQepQvYvlPPc8zm+t3tl1r+Rtx3ORf5XBZc3iPkGdPOLubTssrrAnA+U9vph61W+OjqwLJ9sHUNK9pSHhHSIS4k6ycM2YAHyIC9NGTgB0PAoGAJjwd1DgMaQldtWnuXjvohPOo8cQudxXYcs6zVRbx6vtjKe2v7e+eK1SSVrR5qFV9AqxDfGwq8THenRa0LC3vNNplqostuehLhkWCKE7Y75vXMR7N6KU1kdoVWgN4BhXSwuRxmHMQfSY7q3HG3rDGz7mzXo1FVMr/uE4iDGm0IXY="
|
|
|
|
|
+//初始化支付宝客户端
|
|
|
|
|
+// appId:应用ID
|
|
|
|
|
+// privateKey:应用秘钥
|
|
|
|
|
+// isProd:是否是正式环境
|
|
|
|
|
+client := gopay.NewAliPayClient("2016091200494382", privateKey, false)
|
|
|
|
|
+//配置公共参数
|
|
|
|
|
+client.SetCharset("utf-8").
|
|
|
|
|
+ SetSignType("RSA2").
|
|
|
|
|
+ //SetAppAuthToken("").
|
|
|
|
|
+ //SetReturnUrl("https://www.gopay.ink").
|
|
|
|
|
+ SetNotifyUrl("https://www.gopay.ink")
|
|
|
|
|
+//请求参数
|
|
|
|
|
+body := make(gopay.BodyMap)
|
|
|
|
|
+body.Set("subject", "测试APP支付")
|
|
|
|
|
+body.Set("out_trade_no", "GYWX201901301040355706100411")
|
|
|
|
|
+body.Set("total_amount", "1.00")
|
|
|
|
|
+//手机APP支付参数请求
|
|
|
|
|
+payParam, err := client.AliPayTradeAppPay(body)
|
|
|
|
|
+if err != nil {
|
|
|
|
|
+ fmt.Println("err:", err)
|
|
|
|
|
+ return
|
|
|
|
|
+}
|
|
|
|
|
+fmt.Println("payParam:", payParam)
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+### 电脑网站支付
|
|
|
|
|
+
|
|
|
|
|
+* 电脑网站支付是通过服务端获取支付URL后,然后返回给客户端,请求URL地址即可打开支付页面
|
|
|
|
|
+
|
|
|
|
|
+> 文档说明:[电脑网站支付](https://docs.open.alipay.com/270)
|
|
|
|
|
+
|
|
|
|
|
+> 文档说明:[统一收单下单并支付页面接口](https://docs.open.alipay.com/api_1/alipay.trade.page.pay)
|
|
|
|
|
+
|
|
|
|
|
+```go
|
|
|
|
|
+privateKey := "MIIEogIBAAKCAQEAy+CRzKw4krA2RzCDTqg5KJg92XkOY0RN3pW4sYInPqnGtHV7YDHu5nMuxY6un+dLfo91OFOEg+RI+WTOPoM4xJtsOaJwQ1lpjycoeLq1OyetGW5Q8wO+iLWJASaMQM/t/aXR/JHaguycJyqlHSlxANvKKs/tOHx9AhW3LqumaCwz71CDF/+70scYuZG/7wxSjmrbRBswxd1Sz9KHdcdjqT8pmieyPqnM24EKBexHDmQ0ySXvLJJy6eu1dJsPIz+ivX6HEfDXmSmJ71AZVqZyCI1MhK813R5E7XCv5NOtskTe3y8uiIhgGpZSdB77DOyPLcmVayzFVLAQ3AOBDmsY6wIDAQABAoIBAHjsNq31zAw9FcR9orQJlPVd7vlJEt6Pybvmg8hNESfanO+16rpwg2kOEkS8zxgqoJ1tSzJgXu23fgzl3Go5fHcoVDWPAhUAOFre9+M7onh2nPXDd6Hbq6v8OEmFapSaf2b9biHnBHq5Chk08v/r74l501w3PVVOiPqulJrK1oVb+0/YmCvVFpGatBcNaefKUEcA+vekWPL7Yl46k6XeUvRfTwomCD6jpYLUhsAKqZiQJhMGoaLglZvkokQMF/4G78K7FbbVLMM1+JDh8zJ/DDVdY2vHREUcCGhl4mCVQtkzIbpxG++vFg7/g/fDI+PquG22hFILTDdtt2g2fV/4wmkCgYEA6goRQYSiM03y8Tt/M4u1Mm7OWYCksqAsU7rzQllHekIN3WjD41Xrjv6uklsX3sTG1syo7Jr9PGE1xQgjDEIyO8h/3lDQyLyycYnyUPGNNMX8ZjmGwcM51DQ/QfIrY/CXjnnW+MVpmNclAva3L33KXCWjw20VsROV1EA8LCL94BUCgYEA3wH4ANpzo7NqXf+2WlPPMuyRrF0QPIRGlFBNtaKFy0mvoclkREPmK7+N4NIGtMf5JNODS5HkFRgmU4YNdupA2I8lIYpD+TsIobZxGUKUkYzRZYZ1m1ttL69YYvCVz9Xosw/VoQ+RrW0scS5yUKqFMIUOV2R/Imi//c5TdKx6VP8CgYAnJ1ADugC4vI2sNdvt7618pnT3HEJxb8J6r4gKzYzbszlGlURQQAuMfKcP7RVtO1ZYkRyhmLxM4aZxNA9I+boVrlFWDAchzg+8VuunBwIslgLHx0/4EoUWLzd1/OGtco6oU1HXhI9J9pRGjqfO1iiIifN/ujwqx7AFNknayG/YkQKBgD6yNgA/ak12rovYzXKdp14Axn+39k2dPp6J6R8MnyLlB3yruwW6NSbNhtzTD1GZ+wCQepQvYvlPPc8zm+t3tl1r+Rtx3ORf5XBZc3iPkGdPOLubTssrrAnA+U9vph61W+OjqwLJ9sHUNK9pSHhHSIS4k6ycM2YAHyIC9NGTgB0PAoGAJjwd1DgMaQldtWnuXjvohPOo8cQudxXYcs6zVRbx6vtjKe2v7e+eK1SSVrR5qFV9AqxDfGwq8THenRa0LC3vNNplqostuehLhkWCKE7Y75vXMR7N6KU1kdoVWgN4BhXSwuRxmHMQfSY7q3HG3rDGz7mzXo1FVMr/uE4iDGm0IXY="
|
|
|
|
|
+//初始化支付宝客户端
|
|
|
|
|
+// appId:应用ID
|
|
|
|
|
+// privateKey:应用秘钥
|
|
|
|
|
+// isProd:是否是正式环境
|
|
|
|
|
+client := gopay.NewAliPayClient("2016091200494382", privateKey, false)
|
|
|
|
|
+//配置公共参数
|
|
|
|
|
+client.SetCharset("utf-8").
|
|
|
|
|
+ SetSignType("RSA2").
|
|
|
|
|
+ //SetAppAuthToken("").
|
|
|
|
|
+ //SetReturnUrl("https://www.gopay.ink").
|
|
|
|
|
+ SetNotifyUrl("https://www.gopay.ink")
|
|
|
|
|
+//请求参数
|
|
|
|
|
+body := make(gopay.BodyMap)
|
|
|
|
|
+body.Set("subject", "网站测试支付")
|
|
|
|
|
+body.Set("out_trade_no", "GYWX201901301040355706100418")
|
|
|
|
|
+body.Set("total_amount", "88.88")
|
|
|
|
|
+body.Set("product_code", "FAST_INSTANT_TRADE_PAY")
|
|
|
|
|
+
|
|
|
|
|
+//电脑网站支付请求
|
|
|
|
|
+payUrl, err := client.AliPayTradePagePay(body)
|
|
|
|
|
+if err != nil {
|
|
|
|
|
+ fmt.Println("err:", err)
|
|
|
|
|
+ return
|
|
|
|
|
+}
|
|
|
|
|
+fmt.Println("payUrl:", payUrl)
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+### 当面付-条码支付
|
|
|
|
|
+
|
|
|
|
|
+* 商家使用扫码枪等条码识别设备扫描用户支付宝钱包上的条码/二维码,完成收款。
|
|
|
|
|
+
|
|
|
|
|
+> 文档说明:[当面付-条码支付](https://docs.open.alipay.com/194)
|
|
|
|
|
+
|
|
|
|
|
+> 文档说明:[统一收单交易支付接口](https://docs.open.alipay.com/api_1/alipay.trade.pay)
|
|
|
|
|
+
|
|
|
|
|
+```go
|
|
|
|
|
+privateKey := "MIIEogIBAAKCAQEAy+CRzKw4krA2RzCDTqg5KJg92XkOY0RN3pW4sYInPqnGtHV7YDHu5nMuxY6un+dLfo91OFOEg+RI+WTOPoM4xJtsOaJwQ1lpjycoeLq1OyetGW5Q8wO+iLWJASaMQM/t/aXR/JHaguycJyqlHSlxANvKKs/tOHx9AhW3LqumaCwz71CDF/+70scYuZG/7wxSjmrbRBswxd1Sz9KHdcdjqT8pmieyPqnM24EKBexHDmQ0ySXvLJJy6eu1dJsPIz+ivX6HEfDXmSmJ71AZVqZyCI1MhK813R5E7XCv5NOtskTe3y8uiIhgGpZSdB77DOyPLcmVayzFVLAQ3AOBDmsY6wIDAQABAoIBAHjsNq31zAw9FcR9orQJlPVd7vlJEt6Pybvmg8hNESfanO+16rpwg2kOEkS8zxgqoJ1tSzJgXu23fgzl3Go5fHcoVDWPAhUAOFre9+M7onh2nPXDd6Hbq6v8OEmFapSaf2b9biHnBHq5Chk08v/r74l501w3PVVOiPqulJrK1oVb+0/YmCvVFpGatBcNaefKUEcA+vekWPL7Yl46k6XeUvRfTwomCD6jpYLUhsAKqZiQJhMGoaLglZvkokQMF/4G78K7FbbVLMM1+JDh8zJ/DDVdY2vHREUcCGhl4mCVQtkzIbpxG++vFg7/g/fDI+PquG22hFILTDdtt2g2fV/4wmkCgYEA6goRQYSiM03y8Tt/M4u1Mm7OWYCksqAsU7rzQllHekIN3WjD41Xrjv6uklsX3sTG1syo7Jr9PGE1xQgjDEIyO8h/3lDQyLyycYnyUPGNNMX8ZjmGwcM51DQ/QfIrY/CXjnnW+MVpmNclAva3L33KXCWjw20VsROV1EA8LCL94BUCgYEA3wH4ANpzo7NqXf+2WlPPMuyRrF0QPIRGlFBNtaKFy0mvoclkREPmK7+N4NIGtMf5JNODS5HkFRgmU4YNdupA2I8lIYpD+TsIobZxGUKUkYzRZYZ1m1ttL69YYvCVz9Xosw/VoQ+RrW0scS5yUKqFMIUOV2R/Imi//c5TdKx6VP8CgYAnJ1ADugC4vI2sNdvt7618pnT3HEJxb8J6r4gKzYzbszlGlURQQAuMfKcP7RVtO1ZYkRyhmLxM4aZxNA9I+boVrlFWDAchzg+8VuunBwIslgLHx0/4EoUWLzd1/OGtco6oU1HXhI9J9pRGjqfO1iiIifN/ujwqx7AFNknayG/YkQKBgD6yNgA/ak12rovYzXKdp14Axn+39k2dPp6J6R8MnyLlB3yruwW6NSbNhtzTD1GZ+wCQepQvYvlPPc8zm+t3tl1r+Rtx3ORf5XBZc3iPkGdPOLubTssrrAnA+U9vph61W+OjqwLJ9sHUNK9pSHhHSIS4k6ycM2YAHyIC9NGTgB0PAoGAJjwd1DgMaQldtWnuXjvohPOo8cQudxXYcs6zVRbx6vtjKe2v7e+eK1SSVrR5qFV9AqxDfGwq8THenRa0LC3vNNplqostuehLhkWCKE7Y75vXMR7N6KU1kdoVWgN4BhXSwuRxmHMQfSY7q3HG3rDGz7mzXo1FVMr/uE4iDGm0IXY="
|
|
|
|
|
+//初始化支付宝客户端
|
|
|
|
|
+// appId:应用ID
|
|
|
|
|
+// privateKey:应用秘钥
|
|
|
|
|
+// isProd:是否是正式环境
|
|
|
|
|
+client := gopay.NewAliPayClient("2016091200494382", privateKey, false)
|
|
|
|
|
+//配置公共参数
|
|
|
|
|
+client.SetCharset("utf-8").
|
|
|
|
|
+ SetSignType("RSA2").
|
|
|
|
|
+ //SetAppAuthToken("").
|
|
|
|
|
+ //SetReturnUrl("https://www.gopay.ink").
|
|
|
|
|
+ SetNotifyUrl("https://www.gopay.ink")
|
|
|
|
|
+//请求参数
|
|
|
|
|
+body := make(gopay.BodyMap)
|
|
|
|
|
+body.Set("subject", "条码支付")
|
|
|
|
|
+body.Set("scene", "bar_code")
|
|
|
|
|
+body.Set("auth_code", "285860185283886370")
|
|
|
|
|
+body.Set("out_trade_no", "GYWX201901301040355706100456")
|
|
|
|
|
+body.Set("total_amount", "10.00")
|
|
|
|
|
+body.Set("timeout_express", "2m")
|
|
|
|
|
+
|
|
|
|
|
+//当面付-条码支付
|
|
|
|
|
+aliRsp, err := client.AliPayTradePay(body)
|
|
|
|
|
+if err != nil {
|
|
|
|
|
+ fmt.Println("err:", err)
|
|
|
|
|
+ return
|
|
|
|
|
+}
|
|
|
|
|
+fmt.Println("aliRsp:", *aliRsp)
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+### 统一收单交易退款接口
|
|
|
|
|
+
|
|
|
|
|
+* 交易订单退款接口,具体条件请看官方文档介绍
|
|
|
|
|
+
|
|
|
|
|
+> 文档说明:[统一收单交易退款接口](https://docs.open.alipay.com/api_1/alipay.trade.refund)
|
|
|
|
|
+
|
|
|
|
|
+```go
|
|
|
|
|
+privateKey := "MIIEogIBAAKCAQEAy+CRzKw4krA2RzCDTqg5KJg92XkOY0RN3pW4sYInPqnGtHV7YDHu5nMuxY6un+dLfo91OFOEg+RI+WTOPoM4xJtsOaJwQ1lpjycoeLq1OyetGW5Q8wO+iLWJASaMQM/t/aXR/JHaguycJyqlHSlxANvKKs/tOHx9AhW3LqumaCwz71CDF/+70scYuZG/7wxSjmrbRBswxd1Sz9KHdcdjqT8pmieyPqnM24EKBexHDmQ0ySXvLJJy6eu1dJsPIz+ivX6HEfDXmSmJ71AZVqZyCI1MhK813R5E7XCv5NOtskTe3y8uiIhgGpZSdB77DOyPLcmVayzFVLAQ3AOBDmsY6wIDAQABAoIBAHjsNq31zAw9FcR9orQJlPVd7vlJEt6Pybvmg8hNESfanO+16rpwg2kOEkS8zxgqoJ1tSzJgXu23fgzl3Go5fHcoVDWPAhUAOFre9+M7onh2nPXDd6Hbq6v8OEmFapSaf2b9biHnBHq5Chk08v/r74l501w3PVVOiPqulJrK1oVb+0/YmCvVFpGatBcNaefKUEcA+vekWPL7Yl46k6XeUvRfTwomCD6jpYLUhsAKqZiQJhMGoaLglZvkokQMF/4G78K7FbbVLMM1+JDh8zJ/DDVdY2vHREUcCGhl4mCVQtkzIbpxG++vFg7/g/fDI+PquG22hFILTDdtt2g2fV/4wmkCgYEA6goRQYSiM03y8Tt/M4u1Mm7OWYCksqAsU7rzQllHekIN3WjD41Xrjv6uklsX3sTG1syo7Jr9PGE1xQgjDEIyO8h/3lDQyLyycYnyUPGNNMX8ZjmGwcM51DQ/QfIrY/CXjnnW+MVpmNclAva3L33KXCWjw20VsROV1EA8LCL94BUCgYEA3wH4ANpzo7NqXf+2WlPPMuyRrF0QPIRGlFBNtaKFy0mvoclkREPmK7+N4NIGtMf5JNODS5HkFRgmU4YNdupA2I8lIYpD+TsIobZxGUKUkYzRZYZ1m1ttL69YYvCVz9Xosw/VoQ+RrW0scS5yUKqFMIUOV2R/Imi//c5TdKx6VP8CgYAnJ1ADugC4vI2sNdvt7618pnT3HEJxb8J6r4gKzYzbszlGlURQQAuMfKcP7RVtO1ZYkRyhmLxM4aZxNA9I+boVrlFWDAchzg+8VuunBwIslgLHx0/4EoUWLzd1/OGtco6oU1HXhI9J9pRGjqfO1iiIifN/ujwqx7AFNknayG/YkQKBgD6yNgA/ak12rovYzXKdp14Axn+39k2dPp6J6R8MnyLlB3yruwW6NSbNhtzTD1GZ+wCQepQvYvlPPc8zm+t3tl1r+Rtx3ORf5XBZc3iPkGdPOLubTssrrAnA+U9vph61W+OjqwLJ9sHUNK9pSHhHSIS4k6ycM2YAHyIC9NGTgB0PAoGAJjwd1DgMaQldtWnuXjvohPOo8cQudxXYcs6zVRbx6vtjKe2v7e+eK1SSVrR5qFV9AqxDfGwq8THenRa0LC3vNNplqostuehLhkWCKE7Y75vXMR7N6KU1kdoVWgN4BhXSwuRxmHMQfSY7q3HG3rDGz7mzXo1FVMr/uE4iDGm0IXY="
|
|
|
|
|
+//初始化支付宝客户端
|
|
|
|
|
+// appId:应用ID
|
|
|
|
|
+// privateKey:应用秘钥
|
|
|
|
|
+// isProd:是否是正式环境
|
|
|
|
|
+client := gopay.NewAliPayClient("2016091200494382", privateKey, false)
|
|
|
|
|
+//配置公共参数
|
|
|
|
|
+client.SetCharset("utf-8").
|
|
|
|
|
+ SetSignType("RSA2")
|
|
|
|
|
+//请求参数
|
|
|
|
|
+body := make(gopay.BodyMap)
|
|
|
|
|
+body.Set("out_trade_no", "GZ201907261437329516")
|
|
|
|
|
+body.Set("refund_amount", "100.00")
|
|
|
|
|
+body.Set("refund_reason", "测试支付退款")
|
|
|
|
|
+//发起退款请求
|
|
|
|
|
+aliRsp, err := client.AliPayTradeRefund(body)
|
|
|
|
|
+if err != nil {
|
|
|
|
|
+ fmt.Println("err:", err)
|
|
|
|
|
+ return
|
|
|
|
|
+}
|
|
|
|
|
+fmt.Println("aliRsp:", *aliRsp)
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+## License
|
|
|
|
|
+```
|
|
|
|
|
+Copyright 2019 Jerry
|
|
|
|
|
+
|
|
|
|
|
+Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
|
+you may not use this file except in compliance with the License.
|
|
|
|
|
+You may obtain a copy of the License at
|
|
|
|
|
+
|
|
|
|
|
+ http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
|
+
|
|
|
|
|
+Unless required by applicable law or agreed to in writing, software
|
|
|
|
|
+distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
|
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
|
+See the License for the specific language governing permissions and
|
|
|
|
|
+limitations under the License.
|
|
|
|
|
+```
|