使用Golang封裝微信第三方登入,小程式登入,小程式訂閱訊息傳送
阿新 • • 發佈:2020-12-29
微信開發相關
關於第三方服務對接,有些封裝是必備的,這樣老闆讓你完成一個需求的時候,你就不會抓瞎,當別人嫌棄老闆給的需求太難時,你已經在開發了,當別人在查文件,哼唧哼唧地開發了一個多月,老闆的臉已經黑了,你已經花了兩天時間就搞定了。
第三方服務常見的:
- 物件儲存:阿里雲,亞馬遜雲,騰訊雲。
- 發簡訊(各大服務商),發郵件(自建或使用私人或企業郵箱等)。
- 快遞,實名認證等。
- 支付:微信,支付寶,PayPal,Stripe等,分移動端支付,Web端支付,當面你掃我支付,我掃你支付,轉賬等。
- 社交登入:微信,支付寶,微博,QQ,一鍵登入(各種閃驗),Twitter等。
多年積累的武器庫已經有很多了,某些非常常見的,比如微信登入,現在寫成文章分享出來:
SDK
封裝在:https://github.com/hunterhug/marmot/tree/master/tool/wx
如何下載:
go get -v github.com/hunterhug/marmot/tool/wx
或者 go.mod
新增:
github.com/hunterhug/marmot v1.0.4
你只需參考以下介紹就可以了。
微信第三方登入
適用於網頁端,移動端APP的微信登入。參考官方文件。
需要客戶端和服務端聯調。
邏輯如下:
1.客戶端先呼叫以下介面,微信使用者允許授權第三方應用後,微信將會攜帶 CODE
並且回撥服務端 http://127.0.0.1:9999
:
2.服務端收到回撥,會連續呼叫以下連結獲取到使用者資訊。
https://api.weixin.qq.com/sns/userinfo?access_token=accessToken&openid=openid&lang=zh_CN
你只需使用該 SDK
實現登入即可:
appId := "" appSecret := "" code := "xxx" // 客戶端傳給你的,客戶端可以是Web前端,IOS,Android info, err := Login(appId, appSecret, code) if err != nil { fmt.Println(err.Error()) return } fmt.Println(info)
小程式開發
小程式微信登入
小程式登入區別於網頁登入。
需要客戶端和服務端聯調。
邏輯如下:
1.客戶端先呼叫 wx.login()
獲取臨時登入憑證 code
並且 獲取使用者資訊 獲取 encryptedData
和 iv
並回傳到開發者伺服器。
2.服務端使用該 code
呼叫 auth.code2Session
獲取解密金鑰,然後解密使用者資訊。
你只需使用該 SDK
實現登入即可:
appId := ""
appSecret := ""
code := "xxx" // 小程式前端傳給你的
encryptedData := "afqaf" // 小程式前端傳給你的
iv := "ssss" // 小程式前端傳給你的
info, err := MiniLogin(appId, appSecret, code, encryptedData, iv)
if err != nil {
fmt.Println(err.Error())
return
}
fmt.Println(info)
小程式傳送 訊息訂閱。
完全在服務端執行,不需要客戶端參與。
1.先獲取全域性 token
:
appId := ""
appSecret := ""
token, err := GlobalToken(appId, appSecret)
if err != nil {
fmt.Println(err.Error())
return
}
fmt.Println("token is:", token)
2.傳送訂閱訊息:
token, _ := GlobalToken(appId, appSecret)
openId := "sss" // 接收者(使用者)的 openid
templateId := "" // 所需下發的訂閱模板id
page := "" // 點選模板卡片後的跳轉頁面,僅限本小程式內的頁面。支援帶引數,(示例index?foo=bar)。該欄位不填則模板無跳轉。
data := map[string]string{"thing1": "2222", "thing7": "sss", "thing3": "dddd"}
state := wxStateFormal // 跳轉小程式型別:developer為開發版;trial為體驗版;formal為正式版;預設為正式版
err = SendMessage(token, openId, templateId, page, data, state)
if err != nil {
fmt.Println("send err:", err.Error())
return
}