推薦一個 Go 版本的支付庫

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大小,默認 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")

然後,就是調用 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.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")

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

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/vNktVO1Nxr9V37Niu69aYw