1. 程式人生 > 實用技巧 >使用Golang封裝微信第三方登入,小程式登入,小程式訂閱訊息傳送

使用Golang封裝微信第三方登入,小程式登入,小程式訂閱訊息傳送

微信開發相關

關於第三方服務對接,有些封裝是必備的,這樣老闆讓你完成一個需求的時候,你就不會抓瞎,當別人嫌棄老闆給的需求太難時,你已經在開發了,當別人在查文件,哼唧哼唧地開發了一個多月,老闆的臉已經黑了,你已經花了兩天時間就搞定了。

第三方服務常見的:

  1. 物件儲存:阿里雲,亞馬遜雲,騰訊雲。
  2. 發簡訊(各大服務商),發郵件(自建或使用私人或企業郵箱等)。
  3. 快遞,實名認證等。
  4. 支付:微信,支付寶,PayPal,Stripe等,分移動端支付,Web端支付,當面你掃我支付,我掃你支付,轉賬等。
  5. 社交登入:微信,支付寶,微博,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

https://open.weixin.qq.com/connect/qrconnect?appid=wx01fdsffsds&redirect_uri=http://127.0.0.1:9999&response_type=code&scope=snsapi_login,snsapi_userinfo&state=test#wechat_redirect

2.服務端收到回撥,會連續呼叫以下連結獲取到使用者資訊。

https://api.weixin.qq.com/sns/oauth2/access_token?appid=wx0189ce76eadccf91&secret=00cc512fc031aa0fba01c8a41f05b4b5&code=CODE&grant_type=authorization_code

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 並且 獲取使用者資訊 獲取 encryptedDataiv 並回傳到開發者伺服器。

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
	}