最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

新版小程序登錄授權(quán)的方法

 更新時(shí)間:2018年12月12日 14:58:48   作者:江北晨  
這篇文章主要介紹了新版小程序登錄授權(quán)的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧

小程序自上線以來,官方一直在調(diào)整API,因此也出現(xiàn)了一批被廢棄的接口,作為程序員的我們,此時(shí)此刻千萬不能為這不斷的變化而感到頭疼,應(yīng)當(dāng)與時(shí)俱進(jìn),不斷的更新自己的知識儲備和應(yīng)用技能。

首先近期工作中需要做小程序框架升級,升級成美團(tuán)開源的mpvue框架;然后因?yàn)槲⑿判〕绦駻PI的改版,所以也順便將授權(quán)登錄的邏輯重新設(shè)計(jì)了。

新舊對比:

舊的方法:舊方法wx.getUserInfo按照用戶登錄時(shí),彈出需要授權(quán)的彈窗,用戶點(diǎn)擊授權(quán)后才能使用。

新方法:Open-data的靈活使用方法,不會讓你直接獲得用戶信息,而是小程序點(diǎn)擊登錄按鈕獲取用戶頭像,就是使用 button 組件,并將 open-type 指定為 getUserInfo 類型,獲取用戶基本信息。

授權(quán)登錄的邏輯參考了多個(gè)小程序,希望能找到最優(yōu)的模式。下面會配合代碼詳細(xì)講解整個(gè)流程。

模式概覽

由于微信小程序的改版導(dǎo)致直接彈出授權(quán)的登錄方式將逐漸不再支持,受影響的有wx.getUserInfo接口,以及wx.authorize接口傳入scope=”scope.userInfo”的情況。所以需要重新設(shè)計(jì)一套合適的登錄授權(quán)流程。整體流程如下圖:

主動登錄

由于APP中有些頁面默認(rèn)需要登錄的,如[個(gè)人中心]頁面,需要登錄獲取到用戶信息,才能繼續(xù)操作。這樣的頁面就需要在每次進(jìn)入頁面(onShow)時(shí)判斷是否授權(quán)了。

profile頁面

onShow () {
  login(() => {
    do something...
  })
}

關(guān)于登錄授權(quán)相關(guān)的邏輯都可以封裝在handleLogin.js

handleLogin.js

// 開始login
function login (callback) {
 wx.showLoading()
 wx.login({
  success (res) {
   if (res.code) {
    // 登錄成功,獲取用戶信息
    getUserInfo(res.code, callback)
   } else {
    // 否則彈窗顯示,showToast需要封裝
    showToast()
   }
  },
  fail () {
   showToast()
  }
 })
}

// 獲取用戶信息
function getUserInfo (code, callback) {
 wx.getUserInfo({
  // 獲取成功,全局存儲用戶信息,開發(fā)者服務(wù)器登錄
  success (res) {
   // 全局存儲用戶信息
   store.commit('storeUpdateWxUser', res.userInfo)
   postLogin(code, res.iv, res.encryptedData, callback)
  },
  // 獲取失敗,彈窗提示一鍵登錄
  fail () {
   wx.hideLoading()
   // 獲取用戶信息失敗,清楚全局存儲的登錄狀態(tài),彈窗提示一鍵登錄
   // 使用token管理登錄態(tài)的,清楚存儲全局的token
   // 使用cookie管理登錄態(tài)的,可以清楚全局登錄狀態(tài)管理的變量
   store.commit('storeUpdateToken', '')
   // 獲取不到用戶信息,說明用戶沒有授權(quán)或者取消授權(quán)。彈窗提示一鍵登錄,后續(xù)會講
   showLoginModal()
  }
 })
}

// 開發(fā)者服務(wù)端登錄
function postLogin (code, iv, encryptedData, callback) {
 let params = {
  code: code,
  iv: iv,
  encryptedData: encryptedData
 }
 request(apiUrl.postLogin, params, 'post').then((res) => {
  if (res.code == 1) {
   wx.hideLoading()
   // 登錄成功,
   // 使用token管理登錄態(tài)的,存儲全局token,用于當(dāng)做登錄態(tài)判斷,
   // 使用cookie管理登錄態(tài)的,可以存任意變量當(dāng)做已登錄狀態(tài)
   store.commit('storeUpdateToken', res.data.token)
   callback && callback()
  } else {
   showToast()
  }
 }).catch((err) => {
  showToast()
 })
}

// 顯示toast彈窗
function showToast (content = '登錄失敗,請稍后再試') {
 wx.showToast({
  title: content,
  icon: 'none'
 })
}

到此為止,登錄就算完成了。不管使用token還是cookie都可以,都能有正常的登錄態(tài)了,可以執(zhí)行后續(xù)操作。

整個(gè)流程是 wx.login => wx.getUserInfo => 開發(fā)者服務(wù)器登錄postLogin。

調(diào)用接口

某些頁面默認(rèn)不需要登錄,但某些用戶操作事件是需要登錄狀態(tài)的,所以一者可以判斷全局存儲的登錄狀態(tài)管理的變量,如果為false,那么直接可以彈窗提示需要一鍵登錄。二者如果全局狀態(tài)為true,則調(diào)用接口看接口返回的code是否是未登錄狀態(tài)(此情況一般來說是登錄態(tài)過期),未登錄的話也彈窗提示需要一鍵登錄。

某頁面(需登錄的用戶操作)

getPlayer () {
  // 判斷全局是否有登錄狀態(tài),如果沒有直接彈窗提示一鍵登錄
  isLogin(() => {
    let params = {
      token: this.token
    }
    request(apiUrl.getPlayer, params).then((res) => {
      // TODO: 刪除打印
      if (res.code === 1) {
        store.commit('storeUpdateUser', res.data.player_info)
      } else {
        // 獲取失敗了,如果是code是未登錄,則去登錄,然后執(zhí)行回調(diào)函數(shù)this.getPlayer
        // 如果code不是未登錄,直接彈窗報(bào)錯(cuò)誤信息
        handleError(res, this.getPlayer)
      }
    }).catch((err) => {
      handleError(err)
    })
  })
}

handleLogin.js

// 判斷是否登錄
function isLogin (callback) {
 let token = store.state.token
 if (token) {
  // 如果有全局存儲的登錄態(tài),暫時(shí)認(rèn)為他是登錄狀態(tài)
  callback && callback()
 } else {
  // 如果沒有登錄態(tài),彈窗提示一鍵登錄
  showLoginModal()
 }
}

// 接口調(diào)用失敗處理,
function handleError (res, callback) {
 // 規(guī)定-3041和-3042分別代表未登錄和登錄態(tài)失效
 if (res.code == -3041 || res.code == -3042) {
  // 彈窗提示一鍵登錄
  showLoginModal()
 } else if (res.msg) {
  // 彈窗顯示錯(cuò)誤信息
  showToast(res.msg)
 }
}

到此為止,需要登錄的用戶操作就可以處理了。如果全局登錄狀態(tài)變量為true,先去調(diào)用接口,根據(jù)返回的信息是否是未登錄再處理。

彈窗提示

由于微信小程序授權(quán)的接口wx.getUserInfowx.authorize中scope 為 “scope.userInfo” ,新版中調(diào)用這兩個(gè)API是不會主動觸發(fā)彈出授權(quán)窗口的。需要使用<button open-type="getUserInfo"></button>方法。

上面代碼中多處出現(xiàn)的showLoginModal是用于顯示一鍵登錄的。如下:

handleLogin.js

// 顯示一鍵登錄的彈窗
function showLoginModal () {
 wx.showModal({
  title: '提示',
  content: '你還未登錄,登錄后可獲得完整體驗(yàn) ',
  confirmText: '一鍵登錄',
  success (res) {
   // 點(diǎn)擊一鍵登錄,去授權(quán)頁面
   if (res.confirm) {
    wx.navigateTo({
     url: '授權(quán)登錄頁面地址',
    })
   }
  }
 })
}

關(guān)于授權(quán)登錄,我們做了一個(gè)專門的頁面處理,此處的button<button type="primary" v-if="canIUse" open-type="getUserInfo" @getuserinfo="getUserInfo">微信登錄</button>。如下:

getUserInfo (e) {
  if (e.target.userInfo) {
    // 點(diǎn)擊Button彈窗授權(quán),如果授權(quán)了,執(zhí)行l(wèi)ogin
    // 因?yàn)長ogin流程中有wx.getUserInfo,此時(shí)就可以獲取到了
    login(() => {
      // 登錄成功后,返回
      wx.navigateBack()
    })
  }
}

到此為止,整個(gè)授權(quán)和登錄流程就算走完了。可以回過頭梳理一下最開始的流程圖,應(yīng)該就能理清整個(gè)邏輯了。

相關(guān)文章

  • JavaScript折半查找(二分查找)算法原理與實(shí)現(xiàn)方法示例

    JavaScript折半查找(二分查找)算法原理與實(shí)現(xiàn)方法示例

    這篇文章主要介紹了JavaScript折半查找(二分查找)算法原理與實(shí)現(xiàn)方法,結(jié)合具體問題描述了折半查找算法的原理、實(shí)現(xiàn)方法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下
    2018-08-08
  • javascript bind綁定函數(shù)代碼

    javascript bind綁定函數(shù)代碼

    bind函數(shù),顧名思義,用于為調(diào)用函數(shù)綁定一個(gè)作用域,因?yàn)閠his很容易跟丟它原來所在的作用域,直接指向頂層的window對象。
    2010-01-01
  • postMessage的兩種使用方式

    postMessage的兩種使用方式

    這篇文章主要介紹了使用postMessage實(shí)現(xiàn)iframe跨域通信,第一種使用postMessage在irfame中實(shí)現(xiàn)跨域數(shù)據(jù)傳遞,第二種使用postMessage在window.open()中的使用,本文結(jié)合示例代碼給大家詳細(xì)講解,需要的朋友跟隨小編一起看看吧
    2022-03-03
  • JS獲取及設(shè)置TextArea或input文本框選擇文本位置的方法

    JS獲取及設(shè)置TextArea或input文本框選擇文本位置的方法

    這篇文章主要介紹了JS獲取及設(shè)置TextArea或input文本框選擇文本位置的方法,涉及TextArea及input文本操作技巧,需要的朋友可以參考下
    2015-03-03
  • 關(guān)于JavaScript 數(shù)組你應(yīng)該知道的事情(推薦)

    關(guān)于JavaScript 數(shù)組你應(yīng)該知道的事情(推薦)

    這篇文章主要介紹了JavaScript 數(shù)組,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • 微信小程序使用WxJava獲取用戶手機(jī)號步驟

    微信小程序使用WxJava獲取用戶手機(jī)號步驟

    這篇文章主要介紹了微信小程序使用WxJava獲取用戶手機(jī)號的相關(guān)資料,還詳細(xì)講解了WxMpService接口的主要功能和常用方法,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-12-12
  • js模式化窗口問題![window.dialogArguments]

    js模式化窗口問題![window.dialogArguments]

    這篇文章主要介紹了js模式化窗口問題![window.dialogArguments],需要的朋友可以參考下
    2016-10-10
  • js父頁面與子頁面不同時(shí)顯示的方法

    js父頁面與子頁面不同時(shí)顯示的方法

    這篇文章主要介紹了js父頁面與子頁面不同時(shí)顯示的方法,打開一個(gè)頁面后,父頁面DISABLE,在子頁面關(guān)閉后,父頁面ENABLE,是比較實(shí)用的技巧,需要的朋友可以參考下
    2014-10-10
  • TypeScript工具類 Partial 和 Required 的場景分析

    TypeScript工具類 Partial 和 Required 的場景分析

    這篇文章主要介紹了TypeScript工具類 Partial 和 Required 的詳細(xì)講解,本文通過場景描述給大家詳細(xì)講解工具類的使用,結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-09-09
  • JavaScript Uploadify文件上傳實(shí)例

    JavaScript Uploadify文件上傳實(shí)例

    這篇文章主要為大家詳細(xì)介紹了Uploadify文件上傳小實(shí)例,一個(gè)簡單的jsp上傳小功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-02-02

最新評論

长乐市| 桃园市| 河北区| 自贡市| 静安区| 金沙县| 砀山县| 巴楚县| 黄梅县| 丰原市| 阿坝县| 托里县| 天气| 扬州市| 民权县| 确山县| 潼南县| 饶平县| 三台县| 德保县| 怀化市| 高安市| 湖北省| 厦门市| 昭觉县| 绥阳县| 石首市| 贡觉县| 荣成市| 西峡县| 广水市| 波密县| 资源县| 牡丹江市| 延津县| 友谊县| 彰化县| 广德县| 万全县| 内江市| 兴文县|