摘要:由于微信小程序沒有一套身份驗(yàn)證管理的框架,只提供等幾個(gè),所以對(duì)于我這種初學(xué)者來(lái)說(shuō),小程序登陸狀態(tài)管理就顯得很麻煩。按照個(gè)人的理解,需要攜帶。總之,和只要其中之一不存在,都要把登陸狀態(tài)標(biāo)記為未登陸。不然用戶不清楚不確定是否登陸成功。
業(yè)余水平第一次做小程序,進(jìn)度非常慢,每天下班后也只有零碎的1到2小時(shí),一個(gè)小問題可以難倒我?guī)讉€(gè)晚上的時(shí)間。
由于微信小程序沒有一套身份驗(yàn)證管理的框架,只提供wx.login
、wx.getUserProfile
等幾個(gè)api
,所以對(duì)于我這種初學(xué)者來(lái)說(shuō),小程序登陸狀態(tài)管理就顯得很麻煩。經(jīng)過(guò)這段時(shí)間的實(shí)踐,終于摸到了點(diǎn)門檻。先梳理幾個(gè)重要的信息。
小程序打開時(shí),只會(huì)有兩種狀態(tài)
那,當(dāng)小程序載入時(shí),依靠什么來(lái)判斷狀態(tài)呢?結(jié)合官方的文檔和實(shí)踐,我采用以下的邏輯判斷登陸狀態(tài)的設(shè)定:
1、sessionKey
是否過(guò)期,
2、本地是否有userInfo
經(jīng)過(guò)實(shí)踐,以上兩項(xiàng),只要有一項(xiàng)不滿足,都必須顯性地標(biāo)識(shí)為未登陸
。sessionKey
都過(guò)期了,說(shuō)明這個(gè)用戶很久沒登陸小程序了,有必要走一套登陸的流程,或者,本地連userInfo
都沒來(lái),即便標(biāo)識(shí)為登陸
,也沒用,沒有基礎(chǔ)的用戶數(shù)據(jù)的話,你顯示個(gè)毛線。
用戶為兩種狀態(tài)
需要考慮以下情況
openid
,然后簽發(fā)token;token過(guò)期時(shí)通知小程序客戶端重新執(zhí)行登陸操作code
iv
encryptedData
。按照個(gè)人的理解,需要攜帶。即wx.login(提供code)
和getUserInfo(提供iv和encryptedData)
配合使用,可以隨時(shí)做openid
校驗(yàn)和解密encryptedData
信息。1、小程序客戶端使用sessionKey
或 userInfo緩存
來(lái)決定用戶在小程序的登陸狀態(tài);
而且,都可以在全局進(jìn)行判斷,即項(xiàng)目根目錄的app.js
App({ wx.checkSession({ success: (res) => {//返回:有效期內(nèi)的提示}, fail: (res) => {//返回:過(guò)期的提示}, complete: (res) => {}, }); let u = wx.getStorageSync("userInfo") console.log(u) //如果不存在,返回的是空字符 })
上面并非業(yè)務(wù)代碼,只是做簡(jiǎn)單的展示,實(shí)踐中可以考慮使用promise封裝起來(lái)。
總之,sessionKey
和userInfo
只要其中之一不存在,都要把登陸狀態(tài)標(biāo)記為未登陸
。
2、需要把登陸邏輯多帶帶封裝,方便在需要的時(shí)候使用。
export const wxGetUserProfile = () => { return new Promise((resolve, reject) => { // 登陸中提示 wx.showLoading({ title: "登陸中...", mask: true, }) wx.getUserProfile({ desc: "授權(quán)以提供進(jìn)一步服務(wù)", lang: "zh_CN", success: (result) => { resolve(result) }, fail: (err) => { reject(err) }, complete: (res) => { wx.hideLoading({}) }, }) })}export const wxLogin = () => { return new Promise((resolve, reject) => { wx.login({ success: (result) => { resolve(result) }, fail: (err) => { reject(err) }, complete: (res) => { }, }) })}
使用Promise
分別封裝wx.login
和wx.getUserProfile
,使用時(shí)要在使用的js中引入封裝的方法)
tapToLogin(e) { let p1 = wxLogin() let p2 = wxGetUserProfile() p1.then(code => { return code }).then(code => { return new Promise((resolve, reject) => { p2.then(res => { console.log("profile", res.userInfo); this.setData({ userInfo: res.userInfo }) wx.setStorageSync("userInfo", res.userInfo) resolve({ code: code.code, iv: res.iv, encryptedData: res.encryptedData, userInfo: res.userInfo }) }).catch(err => { reject(err) }) }) }).then(res => { // 使用封裝的request if (!wx.getStorageSync("token")) { request({ url: HOST_API.menberLogin, method: "POST", data: { code: res.code, iv: res.iv, encryptedData: res.encryptedData } }) .then(result => { wx.setStorageSync("token", result.data.context.token); this.setData({ hasUserInfo: true, isLogin: result.data.context.is_login, isVip: result.data.context.is_vip, collection: result.data.context.collection, integration: result.data.context.integration, views: result.data.context.views }) console.log("無(wú)頭的返回:", result); }) } else { request({ url: HOST_API.menberLogin, method: "POST" }) .then((result) => { console.log("有token的返回:", result); this.setData({ hasUserInfo: true, isLogin: result.data.context.is_login, isVip: result.data.context.is_vip, collection: result.data.context.collection, integration: result.data.context.integration, views: result.data.context.views }) }) } }) },
未登陸狀態(tài)
登陸狀態(tài)
當(dāng)然,在使用時(shí)還是存在邏輯上不清晰的情況。
3、設(shè)置的問題
isLogin bool
設(shè)置為全局變量,注意這個(gè)不能設(shè)置為緩存。wx.checkSession
和wx.getStorageSync("userInfo")
封裝好,可以在全局調(diào)用,可以在需要的環(huán)節(jié)進(jìn)行調(diào)用,并且,必須相應(yīng)地改更全局變量isLogin
的值。token
和userInfo
要寫到緩存中文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/121117.html
摘要:個(gè)人中心如何加載數(shù)據(jù)截圖中,顯性的數(shù)據(jù)有登陸我的積分瀏覽歷史我的收藏年會(huì)會(huì)員成為會(huì)員時(shí)則顯示會(huì)員到期時(shí)間以上幾個(gè)數(shù)據(jù)都是顯性的,即登陸后就要立刻顯示的。那么這個(gè)頁(yè)面數(shù)據(jù)的加載應(yīng)這樣設(shè)計(jì)。 ...
摘要:在舒伯的生涯階段里有個(gè)確立階段,歲歲。知識(shí)技術(shù)安卓程序員需要掌握編程語(yǔ)言應(yīng)用框架開發(fā)工具等這些具體的知識(shí)和技術(shù)。技術(shù)能力與閱歷對(duì)安卓程序員來(lái)講,知識(shí)技術(shù)是一方面,是容易習(xí)得的,是較淺的層面。 大齡程序員的界定 老早網(wǎng)上有人說(shuō),安卓開發(fā)干不過(guò)30歲,后來(lái)又有人說(shuō)干不過(guò)35歲,后來(lái)又有人說(shuō)干不過(guò)...
摘要:教程看到這里,你已經(jīng)學(xué)會(huì)如下內(nèi)容搭建開發(fā)環(huán)境博文管理用戶管理發(fā)表評(píng)論若干小功能搭建簡(jiǎn)單的小博客,以上的功能夠用了。教程為了起步平緩,沒有展開這方面的內(nèi)容。陌生人,祝你學(xué)業(yè)進(jìn)步事業(yè)有成歡迎常到杜賽的個(gè)人網(wǎng)站做客 教程看到這里,你已經(jīng)學(xué)會(huì)如下內(nèi)容: 搭建開發(fā)環(huán)境 博文管理 用戶管理 發(fā)表評(píng)論 若干小功能 搭建簡(jiǎn)單的小博客,以上的功能夠用了。 相信你的志向不止于此。畢竟程序員面試個(gè)個(gè)造火...
摘要:寫在前面年月日,我只身一人來(lái)到北京,開始人生中的第一份工作,在一家國(guó)企從事軟件開發(fā)工作。因?yàn)楝F(xiàn)在晚飯都是在公司吃,如果不是刷朋友圈,我是不知道北京哪天的夕陽(yáng)又刷屏了的,因此錯(cuò)過(guò)了很多美麗的瞬間,也算一點(diǎn)遺憾吧。 ...
摘要:行業(yè)現(xiàn)狀與未來(lái)年終大盤點(diǎn)大幅動(dòng)蕩后,即將進(jìn)入平穩(wěn)期前端,在年及以前,一直處于一種萌芽期的狀態(tài)當(dāng)中,直至年才進(jìn)入行業(yè)的成長(zhǎng)期。 HTML5行業(yè)現(xiàn)狀與未來(lái) - 2016年終大盤點(diǎn) 1. 大幅動(dòng)蕩后,即將進(jìn)入平穩(wěn)期 HTML5(WEB前端),在2012年及以前,一直處于一種萌芽期的狀態(tài)當(dāng)中,直至2013年才進(jìn)入行業(yè)的成長(zhǎng)期。HTML5(WEB前端)在2013和2014年,隨著行業(yè)的推動(dòng)慢慢的...
閱讀 1895·2021-11-15 11:46
閱讀 1091·2021-10-26 09:49
閱讀 1825·2021-10-14 09:42
閱讀 3384·2021-09-26 09:55
閱讀 838·2019-08-30 13:58
閱讀 1039·2019-08-29 16:40
閱讀 3474·2019-08-26 10:27
閱讀 610·2019-08-23 18:18