摘要:優(yōu)雅解決微信小程序授權(quán)登錄需要觸發(fā)聊一聊最近的一個(gè)項(xiàng)目,這個(gè)項(xiàng)目是一個(gè)收書售書的小程序,有商城專欄信息發(fā)布論壇等功能。微信不會(huì)把的有效期告知開發(fā)者。
優(yōu)雅解決微信小程序授權(quán)登錄需要button觸發(fā)
聊一聊最近的一個(gè)項(xiàng)目,這個(gè)項(xiàng)目是一個(gè)收書、售書的小程序,有商城、專欄、信息發(fā)布論壇等功能。雖然不是面向所有用戶,但要求無論用戶是否授權(quán)都皆可使用,但同時(shí)也要求部分功能對(duì)不授權(quán)的用戶限制開放。
問題總結(jié)如下首先是小程序不授權(quán)也可以使用,但是只有部分功能可用,比如瀏覽
第二問題是在用戶想進(jìn)一步使用小程序時(shí)需要獲取用戶授權(quán)
獲取到用戶授權(quán)的時(shí)候該如何處理跳轉(zhuǎn)
解決方案 1.首先用戶進(jìn)入小程序的時(shí)候會(huì)在app.js中的onLaunch發(fā)起登陸微信小程序文檔這樣說
調(diào)用 wx.login() 獲取 臨時(shí)登錄憑證code ,并回傳到開發(fā)者服務(wù)器。
調(diào)用 code2Session 接口,換取 用戶唯一標(biāo)識(shí) OpenID 和 會(huì)話密鑰 session_key。
之后開發(fā)者服務(wù)器可以根據(jù)用戶標(biāo)識(shí)來生成自定義登錄態(tài),用于后續(xù)業(yè)務(wù)邏輯中前后端交互時(shí)識(shí)別用戶身份。
也就是說服務(wù)器可以返回一個(gè)自定義的session,緩存后用于后續(xù)業(yè)務(wù)邏輯中前后端交互時(shí)識(shí)別用戶身份
同時(shí)微信小程序文檔也說了
1.wx.login 調(diào)用時(shí),用戶的 session_key 可能會(huì)被更新而致使舊 session_key 失效(刷新機(jī)制存在最短周期,如果同一個(gè)用戶短時(shí)間內(nèi)多次調(diào)用 wx.login,并非每次調(diào)用都導(dǎo)致 session_key 刷新)。開發(fā)者應(yīng)該在明確需要重新登錄時(shí)才調(diào)用 wx.login,及時(shí)通過 code2Session 接口更新服務(wù)器存儲(chǔ)的 session_key。
2.微信不會(huì)把 session_key 的有效期告知開發(fā)者。我們會(huì)根據(jù)用戶使用小程序的行為對(duì) session_key 進(jìn)行續(xù)期。用戶越頻繁使用小程序,session_key 有效期越長(zhǎng)。
3.開發(fā)者在 session_key 失效時(shí),可以通過重新執(zhí)行登錄流程獲取有效的 session_key。使用接口 wx.checkSession可以校驗(yàn) session_key 是否有效,從而避免小程序反復(fù)執(zhí)行登錄流程。
當(dāng)開發(fā)者在實(shí)現(xiàn)自定義登錄態(tài)時(shí),可以考慮以 session_key 有效期作為自身登錄態(tài)有效期,也可以實(shí)現(xiàn)自定義的時(shí)效性策略。
意思說沒必要每次啟動(dòng)小程序都要登錄,我這里使用的是每次啟動(dòng)都要登錄
onLaunch: function () { wx.login({ success: res => { if (res.code) { // 發(fā)送 res.code 到后臺(tái)換取 openId, sessionKey }else{ console.log("獲取用戶登錄態(tài)失敗:" + res.errMsg) } } })2.然后再通過wx.getSetting判斷用戶是否已經(jīng)授權(quán)過了,如果授權(quán)過了則可以直接調(diào)用 getUserInfo 獲取頭像昵稱,不會(huì)彈框,存入globalData,那么該用戶可以進(jìn)行所有的操作。同時(shí)可以將 res 發(fā)送給后臺(tái)解碼出 unionId。
wx.getSetting({ success: res => { if (res.authSetting["scope.userInfo"]) { // 已經(jīng)授權(quán),可以直接調(diào)用 getUserInfo 獲取頭像昵稱,不會(huì)彈框 wx.getUserInfo({ success: res => { // 可以將 res 發(fā)送給后臺(tái)解碼出 unionId this.globalData.userInfo = res.userInfo // 由于 getUserInfo 是網(wǎng)絡(luò)請(qǐng)求,可能會(huì)在 Page.onLoad 之后才返回 // 所以此處加入 callback 以防止這種情況 if (this.userInfoReadyCallback) { this.userInfoReadyCallback(res) } } }) } } })3.當(dāng)小程序啟動(dòng)后,用戶之前沒有授權(quán)過的話,在使用發(fā)布信息、購(gòu)物車、我的、論壇等功能的時(shí)候則跳轉(zhuǎn)至提示用戶授權(quán)頁(yè)面或者使用彈窗提示用戶授權(quán),這個(gè)項(xiàng)目用的是頁(yè)面。
注意: 因?yàn)橛脩羰跈?quán)之后要跳轉(zhuǎn)到用戶要使用的功能頁(yè)面,所以要在重定向之前記錄好用戶當(dāng)前的路徑信息、要使用的功能的頁(yè)面的路徑信息,存儲(chǔ)在globalData中,在獲取授權(quán)后再重定向至該頁(yè)面。 如果用戶點(diǎn)擊拒絕則返回原來頁(yè)面
貼上部分代碼
/** * oldPath = getApp().globalData.oldPath * 用戶要用的功能頁(yè)面 * newPath = getApp().globalData.goToPath */ const oldPath = getApp().globalData.oldPath const newPath = getApp().globalData.goToPath if (app.globalData.userInfo) { goNewPath(newPath) } else if (this.data.canIUse) { // 由于 getUserInfo 是網(wǎng)絡(luò)請(qǐng)求,可能會(huì)在 Page.onLoad 之后才返回 // 所以此處加入 callback 以防止這種情況 app.userInfoReadyCallback = res => { if (e.detail.userInfo != void 0){ app.globalData.userInfo = res.userInfo goNewPath(newPath) }else{ goOldPath(oldPath) } } } else { // 在沒有 open-type=getUserInfo 版本的兼容處理 wx.getUserInfo({ success: res => { if (e.detail.userInfo != void 0){ app.globalData.userInfo = res.userInfo goNewPath(newPath) }else{ goOldPath(oldPath) } } }) } }, bindGetUserInfo: function (e) { if (e.detail.userInfo != void 0){ app.globalData.userInfo = e.detail.userInfo wx.switchTab({ url: "../bookcity/bookcity", success: function (res) { }, fail: function (res) { }, complete: function (res) { }, }) }else{ // 授權(quán)失敗 goOldPath(oldPath) } }, goNewPath: function(path){ // isTab()判斷路徑是否是Tab if(isTab(path)){ wx.switchTab({ url: path, success: function(res) {}, fail: function(res) {}, complete: function(res) {}, }) }else{ wx.reLaunch({ url: path , }) } }, goOldPath: function(path){ wx.navigateBack({ delta: 1, }) }, isTab: function(path){ }
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/102423.html
摘要:注沒有在微信開放平臺(tái)做開發(fā)者資質(zhì)認(rèn)證的就不要浪費(fèi)時(shí)間了,沒認(rèn)證無法獲取,認(rèn)證費(fèi)用元年,微信授權(quán)登錄流程第一步獲取用戶臨時(shí)登錄憑證第二步獲取加密過的數(shù)據(jù)和解密參數(shù)第三步把步驟一二中的傳到開發(fā)者自己服務(wù)端第三步服務(wù)端獲取到之后用方法請(qǐng)求如下微信 注:沒有在微信開放平臺(tái)做開發(fā)者資質(zhì)認(rèn)證的就不要浪費(fèi)時(shí)間了,沒認(rèn)證無法獲取unionId,認(rèn)證費(fèi)用300元/年,emmmm.... 微信授權(quán)登錄流程...
摘要:傳統(tǒng)的網(wǎng)頁(yè)編程采用的三劍客來實(shí)現(xiàn),在微信小程序中同樣有三劍客。觀察者模式不難實(shí)現(xiàn),重點(diǎn)是如何在微信小程序中搭配其特有的生命周期來使用。交互事件傳統(tǒng)的事件傳遞類型有冒泡型與捕獲型,微信小程序中自然也有。 本文由作者鄒永勝授權(quán)網(wǎng)易云社區(qū)發(fā)布。 簡(jiǎn)介為了更好的展示我們即時(shí)通訊SDK強(qiáng)悍的能力,網(wǎng)易云信IM SDK微信小程序DEMO的開發(fā)就提上了日程。用產(chǎn)品的話說就是: 云信 IM 小程序 S...
摘要:解決方法用組件替換組件,用微信小程序的實(shí)現(xiàn)點(diǎn)擊切換效果除此之外,在中也不能使用組件。接口更改問題微信小程序最近被吐槽最多的一個(gè)更改,就是用戶使用開發(fā)和體驗(yàn)版時(shí)不會(huì)彈出授權(quán),正式版不受影響。 最近專門做小程序開發(fā)中,跟大家分享下遇到那些不得不處理的小坑,歡迎指正 1.小程序用 WxParse 在手機(jī)上不能正確解析 html 代碼并顯示 解決辦法: 這個(gè)是 wxparse 代碼的一個(gè)...
摘要:解決方法用組件替換組件,用微信小程序的實(shí)現(xiàn)點(diǎn)擊切換效果除此之外,在中也不能使用組件。接口更改問題微信小程序最近被吐槽最多的一個(gè)更改,就是用戶使用開發(fā)和體驗(yàn)版時(shí)不會(huì)彈出授權(quán),正式版不受影響。 最近專門做小程序開發(fā)中,跟大家分享下遇到那些不得不處理的小坑,歡迎指正 1.小程序用 WxParse 在手機(jī)上不能正確解析 html 代碼并顯示 解決辦法: 這個(gè)是 wxparse 代碼的一個(gè)...
摘要:解決方法用組件替換組件,用微信小程序的實(shí)現(xiàn)點(diǎn)擊切換效果除此之外,在中也不能使用組件。接口更改問題微信小程序最近被吐槽最多的一個(gè)更改,就是用戶使用開發(fā)和體驗(yàn)版時(shí)不會(huì)彈出授權(quán),正式版不受影響。 最近專門做小程序開發(fā)中,跟大家分享下遇到那些不得不處理的小坑,歡迎指正 1.小程序用 WxParse 在手機(jī)上不能正確解析 html 代碼并顯示 解決辦法: 這個(gè)是 wxparse 代碼的一個(gè)...
閱讀 1364·2023-04-26 00:10
閱讀 2462·2021-09-22 15:38
閱讀 3938·2021-09-22 15:13
閱讀 3552·2019-08-30 13:11
閱讀 672·2019-08-30 11:01
閱讀 3069·2019-08-29 14:20
閱讀 3236·2019-08-29 13:27
閱讀 1753·2019-08-29 11:33