重要的事情說三遍:微信登錄能力優(yōu)化贸呢;微信登錄能力優(yōu)化;微信登錄能力優(yōu)化
昨天(4.24)下午微信發(fā)布了文章 微信登錄能力優(yōu)化拢军,此篇文章內(nèi)的登錄處理已經(jīng)不合適了楞陷,有空再改,先參考前半句的官方文檔茉唉。
需要發(fā)布的小程序基本都要用到openid固蛾,這里保存一下自己的代碼。
一種是不需要服務(wù)器的度陆,通過微信提供的接口簡單獲取openid魏铅;一種是有服務(wù)器的情況下,獲取openid和一些加密的信息坚芜,如unionid伸辟。
簡單獲取openid
經(jīng)大家吐槽豺总,了解之后,這里說明一下充坑,這里的簡單獲取,是指調(diào)試的時候可以使用稚配,正常的情況應(yīng)該是通過服務(wù)器來獲取
wx.login({
success: function (res) {
var code = res.code; // 復(fù)制給變量就可以打印了,醉了
if (res.code) {
wx.getUserInfo({
success: function (res) {
// userInfo 只存儲個人的基礎(chǔ)數(shù)據(jù)
wx.setStorageSync('userInfo', res.userInfo);
// 只獲取openid的話,自己就可以
that.getOpenid(code);
}
})
} else {
console.log('獲取用戶登錄態(tài)失旇颈省!' + res.errMsg)
}
}
})
// 自己獲取openid和session_key
// 微信提供的接口糕非,其中appid和secret都是放在globalData中的
getOpenid: function (code) {
var that = this;
wx.request({
url: 'https://api.weixin.qq.com/sns/jscode2session?appid=' + that.globalData.appid + '&secret=' + that.globalData.secret + '&js_code=' + code + '&grant_type=authorization_code',
data: {},
method: 'GET',
success: function (res) {
var obj = {};
obj.openid = res.data.openid;
obj.expires_in = Date.now() + res.data.expires_in;
obj.session_key = res.data.session_key;
wx.setStorageSync('openid', obj.openid);// 存儲openid
}
});
},
通過服務(wù)器獲取openid和unionid
wx.login({
success: function (res) {
var code = res.code; // 復(fù)制給變量就可以打印了蒙具,醉了
if (res.code) {
wx.getUserInfo({
success: function (res) {
// userInfo 只存儲個人的基礎(chǔ)數(shù)據(jù)
wx.setStorageSync('userInfo', res.userInfo);
// 請求自己的服務(wù)器,解密用戶信息 獲取unionId等加密信息
wx.request({
url: url.host + '/decodeUserInfo',//自己的服務(wù)接口地址
method: 'POST',
header: {
'content-type': 'application/x-www-form-urlencoded'
},
data: {
encryptedData: res.encryptedData,
iv: res.iv,
code: code,
},
success: function (data) {
//4.解密成功后 獲取自己服務(wù)器返回的結(jié)果
if (data.data.code == 200) {
console.log('解密成功');
var encryptInfo = data.data.data;
wx.setStorageSync('openid', encryptInfo.openId); // 單獨存儲openid
wx.setStorageSync('encryptInfo', encryptInfo); // 存儲解密之后的數(shù)據(jù)
} else {
console.log('解密失敗')
}
}
},
fail: function (res) {
console.log(res);
console.log('請求錯誤')
}
})
} else {
console.log('獲取用戶登錄態(tài)失斝喾省禁筏!' + res.errMsg)
}
}
})
最后,可以把這個方法給暴露出來衡招,讓其他界面調(diào)用
// 給其他界面調(diào)用篱昔,用來獲取用戶信息,防止沒有獲取成功
getUserInfo: function () {
var that = this
var userInfo = wx.getStorageSync('userInfo') || {};
var openid = wx.getStorageSync('openid') || null;
if (!userInfo.nickName || !openid) {
that.getData(); // 將wx.login({}) 方法放入其中
}
},
其實獲取unionid的方法主要在后臺實現(xiàn)始腾,需要根據(jù)微信提供的方法去解密州刽,具體的解密文檔可以參考以下內(nèi)容: 微信小程序獲取用戶openid 與 微信小程序聯(lián)盟:微信小程序之獲取并解密用戶數(shù)據(jù)(獲取openId、unionId)
在這之前可以先看一下微信的官方文檔浪箭,了解一下邏輯結(jié)構(gòu):微信官方文檔