一、前置知識
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
微信掃一掃
支付寶掃一掃