作為一個后端開發(fā)人員來說,微信開發(fā)已經(jīng)是必備的技能之一了,今天小編就來分享一個相關(guān)的類庫shenghui0779/gochat(以下簡稱wechat)。這個類庫簡單易用,看源碼的時候目錄結(jié)構(gòu)一目了然,可以看出作者的思路很清晰,功能也挺豐富日常開發(fā)來絕對夠用。下面跟著小編的節(jié)湊來一探究竟吧。
目錄結(jié)構(gòu)
- mch: 商戶平臺相關(guān)業(yè)務(wù), 下單、支付、退款、查詢、委托代扣、企業(yè)付款、企業(yè)紅包 等
- mp:小程序端相關(guān)業(yè)務(wù), 小程序授權(quán)、用戶數(shù)據(jù)解析、消息發(fā)送、二維碼生成、消息 等
- pub:公眾號相關(guān)業(yè)務(wù), 網(wǎng)頁授權(quán)、菜單、模板消息、消息回復(fù)、用戶管理、消息轉(zhuǎn)客服 等
- wechat.go 包的入口,獲取以上三個業(yè)務(wù)的實(shí)例
一、支付
下單用法
import (
"github.com/iiinsomnia/gochat"
"github.com/iiinsomnia/gochat/mch"
)// UnifiedOrder 統(tǒng)一下單數(shù)據(jù) 直接引用包里的結(jié)構(gòu)體即可
type UnifiedOrder struct {
// 必填參數(shù)
OutTradeNO string // 商戶系統(tǒng)內(nèi)部的訂單號,32個字符內(nèi)、可包含字母,其他說明見商戶訂單號
TotalFee int // 訂單總金額,單位為分,詳見支付金額
SpbillCreateIP string // App和網(wǎng)頁支付提交用戶端ip,Native支付填調(diào)用微信支付API的機(jī)器IP
TradeType string // 取值如下:JSAPI,NATIVE,APP,MWEB,詳細(xì)說明見參數(shù)規(guī)定
Body string // 商品或支付單簡要描述
NotifyURL string // 接收微信支付異步通知回調(diào)地址,通知url必須為直接可訪問的url,不能攜帶參數(shù)
// 選填參數(shù)
DeviceInfo string // 終端設(shè)備號(門店號或收銀設(shè)備ID),注意:PC網(wǎng)頁或公眾號內(nèi)支付請傳"WEB"
Detail string // 商品名稱明細(xì)列表
Attach string // 附加數(shù)據(jù),在查詢API和支付通知中原樣返回,該字段主要用于商戶攜帶訂單的自定義數(shù)據(jù)
FeeType string // 符合ISO 4217標(biāo)準(zhǔn)的三位字母代碼,默認(rèn)人民幣:CNY,其他值列表詳見貨幣類型
TimeStart string // 訂單生成時間,格式為yyyyMMddHHmmss,如:2009年12月25日9點(diǎn)10分10秒 表示為:20091225091010
TimeExpire string // 訂單失效時間,格式為yyyyMMddHHmmss,如:2009年12月27日9點(diǎn)10分10秒 表示為:20091227091010
GoodsTag string // 商品標(biāo)記,代金券或立減優(yōu)惠功能的參數(shù),說明詳見代金券或立減優(yōu)惠
ProductID string // trade_type=NATIVE,此參數(shù)必傳。此id為二維碼中包含的商品ID,商戶自行定義
LimitPay string // no_credit--指定不能使用信用卡支付
OpenID string // trade_type=JSAPI,此參數(shù)必傳,用戶在商戶appid下的唯一標(biāo)識
Receipt bool // 是否在支付成功消息和支付詳情頁中出現(xiàn)開票入口,注:需要在微信支付商戶平臺或微信公眾平臺開通電子發(fā)票功能
SceneInfo string // 該字段用于上報支付的場景信息
}
// 初始化實(shí)例
wxmch := gochat.NewWXMch(appid, apikey, cert)
r, err := wxmch.Order().Unify(order)
if err != nil {
// 錯誤處理...
}
if r["result_code"] != mch.ResultSuccess {
// 判斷微信的返回狀態(tài)碼,失敗處理...
}
// 成功邏輯處理...
// 拿到預(yù)支付的id
prepayID := r["prepay_id"]
// 獲取支付簽名的票據(jù),返回給前端和app就能拉取支付界面了
// APP
data := wxmch.APPAPI(prepayID)
// JS
data := wxmch.JSAPI(prepayID)
查詢訂單狀態(tài)
// RefundData 退款數(shù)據(jù)
type RefundData struct {
// 必填參數(shù)
OutRefundNO string // 商戶系統(tǒng)內(nèi)部的退款單號,商戶系統(tǒng)內(nèi)部唯一,同一退款單號多次請求只退一筆
TotalFee int // 訂單總金額,單位為分,只能為整數(shù),詳見支付金額
RefundFee int // 退款總金額,訂單總金額,單位為分,只能為整數(shù),詳見支付金額
// 選填參數(shù)
RefundFeeType string // 貨幣類型,符合ISO 4217標(biāo)準(zhǔn)的三位字母代碼,默認(rèn)人民幣:CNY,其他值列表詳見貨幣類型
RefundDesc string // 若商戶傳入,會在下發(fā)給用戶的退款消息中體現(xiàn)退款原因
RefundAccount string // 退款資金來源,僅針對老資金流商戶使用
NotifyURL string // 異步接收微信支付退款結(jié)果通知的回調(diào)地址,通知URL必須為外網(wǎng)可訪問的url,不允許帶參數(shù)
}
// 根據(jù)微信訂單號查詢
r, err := wxmch.Order().QueryByTransactionID(transactionID)
// 根據(jù)商戶訂單號查詢
r, err := wxmch.Order().QueryByOutTradeNO(transactionID)
// 關(guān)閉訂單
r, err := wxmch.Order().Close(outTradeNO)
退款
// 根據(jù)微信訂單號退款
r, err := wxmch.Refund().RefundByTransactionID(transactionID, refundData)
if err != nil {
// 錯誤處理...
}
if r["result_code"] != mch.ResultSuccess {
// 失敗處理...
}
// 成功邏輯處理...
// 根據(jù)商戶訂單號退款
r, err := wxmch.Refund().RefundByOutTradeNO(outTradeNO, refundData)
if err != nil {
// 錯誤處理...
}
if r["result_code"] != mch.ResultSuccess {
// 失敗處理...
}
// 成功邏輯處理...
小程序
登錄授權(quán)
import (
"github.com/iiinsomnia/gochat"
"github.com/iiinsomnia/gochat/mp"
"github.com/iiinsomnia/gochat/utils"
)// 初始化小程序?qū)嵗齱xmp := gochat.NewWXMP(appid, appsecret)// 授權(quán) session, err := wxmp.Sns().Code2Session(code)// 數(shù)據(jù)校驗(yàn)解密// 數(shù)據(jù)簽名校驗(yàn)if signature != utils.SHA1(rawData+sessionKey) {
return errors.New("簽名校驗(yàn)失敗")
}// 數(shù)據(jù)解密bizDataCrypt := wxmp.BizDataCrypt(encryptedData, sessionKey, iv)if err := bizDataCrypt.Decrypt(); err != nil {
return err
}// 解密后取用戶信息bizData, err := bizDataCrypt.GetUserData()if err != nil {
return err
}
獲取access_token
accessToken, err := wxmp.CgiBin().GetAccessToken()
if err != nil {
return err
}// TODO: 存儲 access_token ...
因 access_token 每日獲取次數(shù)有限且含有效期,故服務(wù)端應(yīng)妥善保存 access_token 并定時刷新
公眾號
// 獲取公眾號實(shí)例
pub := gochat.NewWXPub(accountid, appid, appsecret, signToken, encodingAESKey)
整個包看下來還是蠻簡單,使用方便。想要了解更多內(nèi)容可以去查看作者的源碼和使用說明。
地址: https://github.com/shenghui0779/gochat/wiki