wechat-gogolang 版本微信 SDK
wechat-go 是一個簡潔、高效的 golang 版本微信 SDK,支持微信應(yīng)用和商戶。
設(shè)計(jì)目標(biāo)
在概念清晰的基礎(chǔ)上追求更少的編碼、更開放、靈活的結(jié)構(gòu)。
本庫不是在微信官方API基礎(chǔ)上進(jìn)一步封裝,造出一個新的框架級的重體量SDK。而是努力成為微信官方文檔的Golang版快速工具箱。
努力讓開發(fā)者在學(xué)習(xí)微信官方文檔后,不再有新的學(xué)習(xí)曲線(另學(xué)一套)!
所以本庫目標(biāo)是:極致、簡單!不創(chuàng)另行發(fā)明新理念、不另行創(chuàng)造新架構(gòu)!
概述
根據(jù)微信的文檔,微信的業(yè)務(wù)有兩個不同的領(lǐng)域:
- 應(yīng)用類賬號下的Api
- 商戶類賬號下的Api
安裝
go get github.com/blusewang/wechat
應(yīng)用賬號API
訂閱號、服務(wù)號、小程序、App
- 支持連接不同的地區(qū)的微信服務(wù)器
- 支持一行代碼從被動消息的 http.Request 中安全取出消息成
MessageData。內(nèi)部實(shí)現(xiàn)了識別并解密消息、校驗(yàn)請求的Query數(shù)據(jù)。 - 支持自動填充
Query中的access_token數(shù)據(jù)。 - 鏈?zhǔn)秸{(diào)用,讓不同需求的業(yè)務(wù)能一氣和成!
時效性憑證安置方式約定
access_token、js_sdk_ticket 這類需要每7200秒刷新一次的,放到crontab中。
對此不滿的,完全可以在使用本庫的基礎(chǔ)上,采用自己熟悉的方式、甚至自己設(shè)計(jì)方案來替代crontab。
核心設(shè)計(jì)
算法
一個基礎(chǔ)賬號對象MpAccount,它有三個行為:
- 為微信H5的網(wǎng)址簽名
UrlSign(url string) - 讀取被動消息通知
ReadMessage(req *http.Request) - 主動發(fā)出請求
NewMpReq(path mp_api.MpApi) *mpReq
數(shù)據(jù)結(jié)構(gòu)
- 常量:constant.go
- 基礎(chǔ)信息:basic_information.go
- 自定義菜單:custom_menus.go
- 消息:message.go
- 媒體文件上傳:media.go
- 微信網(wǎng)頁開發(fā):oa_web_apps.go
- 用戶管理:user.go
- 賬號管理:account.go
- 對話能力:guide.go
- 小程序:mini_program.go
只實(shí)現(xiàn)了很有限的數(shù)據(jù)。若需要使用本庫自帶的數(shù)據(jù)結(jié)構(gòu)之外的API。完全可以參考本庫的數(shù)據(jù)結(jié)構(gòu)寫法,自行另起書寫(注意不同業(yè)務(wù)的tag名稱不同)。 并能得到一樣的兼容體驗(yàn)!
舉例
a := MpAccount{ AppId: "your_app_id", AccessToken: "38_XtyPcVUODHd8q3TNYPVGAZ2WNRx_nW4gnclObbv78tsEa1Y_bwdkLALDMEb4372wYqcC_CanjU9O0Zw4MqHiqxrIukk_G4ElAUxyv_ASOb0V2y8647cbxbYU-G8CbtnPdLNub8NrqtUVrSTnWAPaAGALPE", // ... ServerHost: mp_api.ServerHostShangHai, // 選擇離自己最近的服務(wù)主機(jī) } // 一個簡單的只帶access_token的GET API var list mp_api.MessageCustomServiceKfListRes if err := a.NewMpReq(mp_api.MessageCustomServiceKfList).Bind(&list).Do(); err != nil { t.Error(err) } log.Println(list) // 一個POST API var rs mp_api.AccountShortUrlRes err = a.NewMpReq(mp_api.AccountShortUrl).SendData(mp_api.AccountShortUrlData{ Action: mp_api.ShortUrlAction, LongUrl: "https://developers.weixin.qq.com/doc/offiaccount/Account_Management/URL_Shortener.html", }).Bind(&rs).Do() if err != nil { t.Error(err) } log.Println(rs) // 一個上傳媒體文件的API err = a.NewMpReq(mp_api.MessageCustomServiceKfAccountUploadHeadImg).Query(mp_api.MessageCustomServiceKfAccountUploadHeadImgQuery{ KfAccount: "1@1", }).Upload(resp.Body, "png") if err != nil { t.Error(err) }
商戶賬號API(V2版)
App、JSAPI、小程序下單 分賬 付款至微信零錢 付款至個人銀行卡 發(fā)紅包
- 自動填充基礎(chǔ)信息
- 自動簽名
- 私有證書HTTP客戶端自動緩存
- 支持
MD5、HMAC-SHA256加密 - 支持付款至銀行卡時,隱私信息加密
核心設(shè)計(jì)
算法
一個基礎(chǔ)賬號對象MchAccount,它有以下行為:
- 創(chuàng)建請求
NewMchReq(url string) - 將訂單簽名給App
OrderSign4App(or mch_api.PayUnifiedOrderRes) - 將訂單簽名給于H5、小程序
OrderSign(or mch_api.PayUnifiedOrderRes) - 驗(yàn)證支付成功通知
PayNotify(pn mch_api.PayNotify) - 付款至銀行卡時,隱私信息項(xiàng)加密
RsaEncrypt(plain string)
數(shù)據(jù)結(jié)構(gòu)
- 常量:constant.go
- 數(shù)據(jù)結(jié)構(gòu):structs.go
只實(shí)現(xiàn)了很有限的數(shù)據(jù)。若需要使用本庫自帶的數(shù)據(jù)結(jié)構(gòu)之外的API。完全可以參考本庫的數(shù)據(jù)結(jié)構(gòu)寫法,自行另起書寫(建議參考structs.go中的方式書寫)。 能得到一樣的兼容體驗(yàn)!
舉例
mch := MchAccount{}
var data mch_api.PayProfitSharingRes
var body = mch_api.PayProfitSharingData{
TransactionId: "4200000531202004307536721907",
OutOrderNo: "TSF_216144_1065_ye7DvHdSed",
}
_ = body.SerReceivers([]mch_api.PayProfitSharingReceiver{
{
Type: "",
Account: "",
Amount: 10,
Description: "",
},
})
err := mch.NewMchReq(mch_api.PayProfitSharing).
Send(&body). // 注意:發(fā)送的數(shù)據(jù)需傳指針,以便自動填充基礎(chǔ)信息和簽名
UseHMacSign(). // 指定使用HMAC-SHA256
UsePrivateCert(). // 指定使用私有證書通信
Bind(&data).Do() // 傳指針
log.Println(err)
log.Println(data)
為微信業(yè)務(wù)數(shù)據(jù)提供的額外工具方法
-
NewRandStr生成符合微信要求隨機(jī)字符 -
LimitString限制長度,并將微信不支持的字符替換成'x',能滿足公眾號App的字符要求 -
SafeString安全地限制長度,并將微信不支持的字符替換成'x',能滿足商戶平臺的字符要求
