wxApi-go基于 Go 設(shè)計(jì)的微信 API
wxApi-go
針對(duì)golang設(shè)計(jì)的微信 Api 接口,涵蓋公眾號(hào)、小程序、App、商戶。 支持下單、notify 驗(yàn)證、公對(duì)私打款至銀行卡等
根據(jù)微信的業(yè)務(wù)特征,分為兩部分:
- 應(yīng)用類賬號(hào)下的Api
- 商戶類賬號(hào)下的Api
安裝
go get github.com/blusewang/wxApi-go
應(yīng)用賬號(hào)API
訂閱號(hào)、服務(wù)號(hào)、小程序、App
- 支持連接不同的地區(qū)的微信服務(wù)器
- 支持一行代碼從被動(dòng)消息的 http.Request 中安全取出消息成
MessageData。內(nèi)部實(shí)現(xiàn)了識(shí)別并解密消息、校驗(yàn)請(qǐng)求的Query數(shù)據(jù)。 - 支持自動(dòng)填充
Query中的access_token數(shù)據(jù)。 - 鏈?zhǔn)秸{(diào)用,讓不同需求的業(yè)務(wù)能一氣和成!
時(shí)效性憑證安置方式約定
access_token、js_sdk_ticket 這類需要每7200秒刷新一次的,放到crontab中。
核心設(shè)計(jì)
算法
一個(gè)基礎(chǔ)賬號(hào)對(duì)象MpAccount,它有三個(gè)行為:
- 為微信H5的網(wǎng)址簽名
UrlSign(url string) - 讀取被動(dòng)消息通知
ReadMessage(req *http.Request) - 主動(dòng)發(fā)出請(qǐng)求
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
- 賬號(hào)管理:account.go
- 對(duì)話能力: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ī) } // 一個(gè)簡(jiǎn)單的只帶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) // 一個(gè)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) // 一個(gè)上傳媒體文件的API err = a.NewMpReq(mp_api.MessageCustomServiceKfAccountUploadHeadImg).Query(mp_api.MessageCustomServiceKfAccountUploadHeadImgQuery{ KfAccount: "1@1", }).Upload(resp.Body, "png") if err != nil { t.Error(err) }
商戶賬號(hào)API(V2版)
App、JSAPI、小程序下單 分賬 付款至微信零錢 付款至個(gè)人銀行卡 發(fā)紅包
- 自動(dòng)填充基礎(chǔ)信息
- 自動(dòng)簽名
- 私有證書HTTP客戶端自動(dòng)緩存
- 支持
MD5、HMAC-SHA256加密 - 支持付款至銀行卡時(shí),隱私信息加密
核心設(shè)計(jì)
算法
一個(gè)基礎(chǔ)賬號(hào)對(duì)象MchAccount,它有以下行為:
- 創(chuàng)建請(qǐng)求
NewMchReq(url string) - 將訂單簽名給App
OrderSign4App(or mch_api.PayUnifiedOrderRes) - 將訂單簽名給于H5、小程序
OrderSign(or mch_api.PayUnifiedOrderRes) - 驗(yàn)證支付成功通知
PayNotify(pn mch_api.PayNotify) - 付款至銀行卡時(shí),隱私信息項(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ù)需傳指針,以便自動(dòng)填充基礎(chǔ)信息和簽名 UseHMacSign(). // 指定使用HMAC-SHA256 UsePrivateCert(). // 指定使用私有證書通信 Bind(&data).Do() // 傳指針 log.Println(err) log.Println(data)
為微信業(yè)務(wù)數(shù)據(jù)提供的額外工具方法
-
NewRandStr生成符合微信要求隨機(jī)字符 -
LimitString限制長(zhǎng)度,并將微信不支持的字符替換成'x',能滿足公眾號(hào)App的字符要求 -
SafeString安全地限制長(zhǎng)度,并將微信不支持的字符替換成'x',能滿足商戶平臺(tái)的字符要求
評(píng)論
圖片
表情
