一、前置知識
1、微信公眾平台後台配置相關參數
在微信公眾平台後台,「開發」->「開發設置」下,「開放平台帳號」的AppID即為小程序開發者工具內自動生成的「此小程序的 AppID」,「開發者ID」為「小程序原始ID」。此處需要配置小程序「伺服器域名」和「業務域名」,包括登錄授權域名,如wx.login,wx.checkSession,wx.getUserInfo。(此處需自行備案域名)。
2、小程序登錄時的基本原理
小程序中的登錄流程主要分為兩步驟,先通過wx.login()獲取到臨時登錄憑證code,再將code發送到後端伺服器的介面,使用AppID和AppSecret等參數換取access_token,從而獲取openid等用戶基礎信息。但是access_token只能獲取到用戶的基本信息,若想獲取用戶詳細信息或UnionID,則需要在前面的基礎上,進一步調用相關API,如wx.getUserInfo、wx.checkSession並且獲取session_key和UnionID以及通過session_key解密encryptedData。
二、實現步驟
接下來我們將介紹在小程序中獲取UnionID的具體步驟:
1、獲取用戶信息
小程序中的第一步操作,必須先調用wx.getUserInfo()獲取用戶基礎信息(頭像、昵稱等),後面獲取UnionID的具體操作都是基於此步驟之上的。這裡需要注意的是,若用戶未授權,則不能獲取到用戶信息。此處建議在用戶授權時將信息保存到本地,同時調用wx.login()獲取臨時登錄憑證code,發送到您的伺服器後台調用微信開放介面獲取session_key,再通過session_key解密encryptedData和iv,最終獲取到UnionID。
//步驟1:獲取用戶信息 wx.getUserInfo({ success: function(res) { var userInfo = res.userInfo; var nickName = userInfo.nickName; var avatarUrl = userInfo.avatarUrl; var gender = userInfo.gender; //性別 0:未知、1:男、2:女 var province = userInfo.province; var city = userInfo.city; var country = userInfo.country; }, fail:function(err){ console.log(err) } })
2、獲取code並發送到伺服器
在前一步獲取用戶信息的同時,使用wx.login()獲取臨時登錄憑證code,並將code發送到伺服器,進一步獲取session_key和openid信息,用於後續獲取UnionID。
//步驟2:獲取code wx.login({ success: function(res) { if (res.code) { //發起網路請求 wx.request({ url: 'https://yourdomain.com/api/getOpenid', data: { code: res.code }, success: function(innerRes) { console.log(innerRes.data) } }) } else { console.log('登錄失敗!' + res.errMsg) } } })
3、後端介面實現
在後端伺服器中,將收到的code等參數,使用微信開放介面的API換取session_key並解密encryptedData,最終獲取到UnionID。根據伺服器開發語言的不同,具體方法可能會有所不同。
//步驟3:後端伺服器API實現 const https = require('https'); const qs = require('querystring'); exports.getOpenid = (event, context, callback) => { let code = event.code; let appid = 'yourAppId'; let secret = 'yourAppSecret'; let grant_type = 'authorization_code'; let url = `https://api.weixin.qq.com/sns/jscode2session?appid=${appid}&secret=${secret}&js_code=${code}&grant_type=${grant_type}`; https.get(url, (res) => { res.on('data', (d) => { let result = JSON.parse(d); if (result.unionid){ //TODO:save session_key in redis or other database callback(null, { "code":200,"openid":result.openid,"unionid":result.unionid }); }else{ callback(null, { "code":200,"openid":result.openid,"session_key":result.session_key }); } }); }).on('error', (e) => { console.error(e); }); };
三、總結
通過以上步驟,我們可以輕鬆地獲取到微信小程序用戶的UnionID。當然,具體實現方式可能有所不同,但基本流程是相同的。在開發過程中,建議通過測試工具或日誌等手段對流程各個步驟進行監控和調試,以保證獲取到UnionID的有效性和正確性。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/238480.html