1. 程式人生 > >小程式:使用者登入狀態檢查與更新例項

小程式:使用者登入狀態檢查與更新例項

這篇文章主要解決以下問題:使用者每次登入小程式(包括第一次使用)及點選小程式的每個頁面的時候,我們如何判斷他當前的登入狀態是否過期?如果過期,如何重新獲取使用者資訊併發送至開發者伺服器更新使用者資訊,以及設定新的使用者登入狀態?

將這個部分單獨作為一篇文章有兩個原因:

① wx.getUserInfo(OBJECT) 介面調整,廢棄了以前直接獲取使用者資訊的方法;

1. 程式碼邏輯分析

(1)使用者登入態過期時間如何設定?

在上篇文章中也有提到過,使用者登入態可以通過前端設定和後端設定兩種方式進行控制。這裡我們在前端進行控制,即利用wx.checkSession() 介面來判斷session_key 是否過期來作為使用者登入態是否過期的標誌。如果過期了,則跳轉到統一的登入頁面引導使用者點選按鈕重新授權登入

,重新登入之後session_key 會重新整理,相當於在獲取使用者最新資訊的同時重新設定了過期時間。

(2)onShow() 與onLoad()

小程式js 中有onShow 與onLoad 兩種事件。兩種事件的區別就在於onLoad 每次開啟小程式只加載一次,跳轉到其他頁面再回來的時候這個事件就不會再觸發。而onShow 則每次進入頁面都會觸發,所以我們在進入每個頁面檢查使用者登入態是否過期的程式碼需要放在onShow 中。

(3)重新登入過程分析

如果使用者登入態過期,則需要進行重新登入。登入過程在上篇文章中也有講過。這裡再簡單梳理一下:前端引導使用者點選按鈕觸發getUserInfo 獲取最新使用者資訊 -> 前端呼叫wx.login() 獲取code -> 前端將code 傳送給後端獲取openid 和seesion_key -> 後端寫session 並返回對應session 的唯一標誌 -> 前端儲存這個唯一標誌。

2. 程式碼例項

  • 在每個頁面的onShow 事件中新增以下程式碼來檢查當前使用者登入態是否過期:
wx.checkSession({
  success: function () {
    //session_key 未過期,並且在本生命週期一直有效
    return ;
  },
  fail: function () {
    // session_key 已經失效,需要重新執行登入流程
    wx.navigateTo({
      url: "/pages/authorize/index"
    })
  }
})
  • 因為進入每個頁面中都需要進行使用者登入態是否過期的檢查,所以需要有一個公共的授權頁面,當檢查不同過的時候,就跳轉到這個授權頁面引導使用者重新進行授權,授權頁面authorize 程式碼如下:

wxml

<view class="container">
    <view style='width:100%;padding-left:30rpx;font-size: 28rpx;margin-top:30rpx;'>1、同意當前小程式獲取我的微信頭像;</view>
    <view style='width:100%;padding-left:30rpx;font-size: 28rpx;margin-top:30rpx;'>2、同意當前小程式獲取我的微信暱稱等其他資訊;</view>
    <button open-type="getUserInfo" bindgetuserinfo="bindGetUserInfo" class="save-btn">授權登入</button>
</view>

wxss

page{
    height: 100%;
}
.container{
    background-color: #f5f5f9;
    justify-content: initial;
}
.save-btn{
    width: 690rpx;
    height: 80rpx;
    line-height: 80rpx;
    text-align: center;
    margin-top:30rpx; 
    border-radius: 6rpx;
    box-sizing: border-box;
    background-color: #e64340;
    color:#fff;
}

js

// pages/authorize/index.js
var app = getApp();
let Domain = app.globalData.domain;
Page({

  /**
   * 頁面的初始資料
   */
  data: { },

  /**
   * 生命週期函式--監聽頁面載入
   */
  onLoad: function (options) { },

  /**
   * 生命週期函式--監聽頁面初次渲染完成
   */
  onReady: function () { },

  /**
   * 生命週期函式--監聽頁面顯示
   */
  onShow: function () { },

  /**
   * 生命週期函式--監聽頁面隱藏
   */
  onHide: function () { },

  /**
   * 生命週期函式--監聽頁面解除安裝
   */
  onUnload: function () { },

  /**
   * 頁面相關事件處理函式--監聽使用者下拉動作
   */
  onPullDownRefresh: function () { },

  /**
   * 頁面上拉觸底事件的處理函式
   */
  onReachBottom: function () { },

  /**
   * 使用者點選右上角分享
   */
  onShareAppMessage: function () { },
  bindGetUserInfo: function (e) {
    // 獲得最新的使用者資訊
    if (!e.detail.userInfo){
      return;
    }
    wx.setStorageSync('userInfo', e.detail.userInfo)
    this.checkSessionAndLogin();
  },
  /* 
    這裡使用openid 作為與後端session 連線的標誌
    檢查是否存在openid,即之前是否登入過
      如果登入過,檢查session_key 是否過期
        如果過期了,remove openid 重新執行login 並將使用者資訊傳送到伺服器端更新
        如果沒過期則返回
      如果沒登入過則執行login 並將使用者資訊傳送到伺服器更新
  */
  checkSessionAndLogin: function () {
    let that = this;
    let thisOpenId = wx.getStorageSync('openid');

    // 已經進行了登入,檢查登入是否過期
    if (thisOpenId) {
      console.log('have openid')
      wx.checkSession({
        success: function () {
          //session_key 未過期,並且在本生命週期一直有效
          wx.navigateBack({});
        },
        fail: function () {
          console.log('but session_key expired');
          // session_key 已經失效,需要重新執行登入流程
          wx.removeStorageSync('openid');
          that.checkSessionAndLogin();
        }
      })
    } else {
      // 沒有進行登入則先進行登入操作
      console.log('do not have openid');
      that.loginAndGetOpenid();
    }
  },
  // 執行登入操作並獲取使用者openId
  loginAndGetOpenid: function () {
    console.log('do login and get openid');
    let that = this;
    wx.login({
      success: function (res) {
        if (res.code) {
          wx.request({
            url: Domain + '/user/wx_login',
            data: {
              code: res.code
            },
            success: function (res) {
              res = res.data;
              console.log(res)
              // 儲存openId,並將使用者資訊傳送給後端
              if (res.code === 0) {
                wx.showModal({
                  title: 'set openid',
                  content: res.data,
                })
                wx.setStorageSync('openid', res.data);
                that.sendUserInfoToServer();
              } else {
                wx.showModal({
                  title: 'Sorry',
                  content: '使用者登入失敗~',
                })
              }
            }
          })
        }
      }
    })
  },
  sendUserInfoToServer: function () {
    
    console.log('now send user info to server');
    let userInfo = wx.getStorageSync('userInfo');
    let thisOpenId = wx.getStorageSync('openid');

    userInfo.openid =thisOpenId;

    wx.request({
      url: Domain + '/user/updateUser',
      method: 'POST',
      dataType: 'json',
      data: userInfo,
      success: function (res) {
        res = res.data;
        if (res.code === 0) {
          wx.navigateBack({});
        } else {
          wx.showModal({
            title: 'Sorry',
            content: '同步資訊出錯~',
          })
        }
      }
    })
  }
})

相關推薦

程式使用者登入狀態檢查更新例項

這篇文章主要解決以下問題:使用者每次登入小程式(包括第一次使用)及點選小程式的每個頁面的時候,我們如何判斷他當前的登入狀態是否過期?如果過期,如何重新獲取使用者資訊併發送至開發者伺服器更新使用者資訊,以及設定新的使用者登入狀態? 將這個部分單獨作為一篇文章有兩個原因: ①

微信程式text文字的展開收起

間隔了幾個月,又被拉來做小程式了~~~ 頁面中有一段說明文字,要求預設收起,只展示3行;點選按鈕可以檢視完整內容。看了下微信文件,沒發現有控制元件滿足要求,於是決定通過js實現 先看看佈局檔案,關鍵在與{{ellipsis?‘ellipsis’:‘unellipsis

微信程式text文字的展開收起(二)

之前寫過一篇《微信小程式:text文字的展開與收起》,通過css控制最大顯示行數,後來不少人私信問如果不足三行如何自動隱藏“展開/收起”按鈕;我接觸這個時間比較短,也不太熟悉,暫時只能想到改為js控制文字長度來處理。

一個彙編程式使用者登入驗證程式

這是我們學彙編時,要求做的一個小實驗,感覺挺有趣的,就想發到部落格上來的。初學組合語言的同學,也可以借鑑參考一下。 實驗要求: 程式執行後,給出操作提示,請使用者鍵入使用者名稱和密碼;使用者在鍵入密碼時,程式不回顯鍵入字元,只有當用戶鍵入的使用者名稱、密碼字串和程式內定的字

微信程式拍照上傳

拍照與上傳 問題:上傳失敗,檔案不存在。 uploadFile:fail createUploadTask:fail file not found 原因:檔名賦值的時候使用了錯誤的變數,或者賦值為空了。(<--我的問題) filePath: '',//should be path,

(六)微信程式image元件的4種縮放模式9種裁剪模式, 和靜態多文章列表

4種縮放模式 scaleToFill 不保持縱橫比例縮放圖片,使圖片的高度完全拉伸至填滿image元素         此模式是縮放的預設模式,預設時,小程式以此模式來縮放圖片 aspectFit 保持縱橫比縮放圖片,使圖片的長邊能完全顯示出來&nbs

微信程式最新微信登入授權並獲取openid等資訊

簡介 為優化使用者體驗,使用 wx.getUserInfo 介面直接彈出授權框的開發方式將逐步不再支援。從2018年4月30日開始,小程式與小遊戲的體驗版、開發版呼叫 wx.getUserInfo 介面,將無法彈出授權詢問框,預設呼叫失敗。 小程式使用 button 元件,並

程式授權、登入、session_key、unionId

微信應用的一個很大的優勢就在於使用過程中是不需要進行註冊和顯式登入的,大部分問題基本上可以一鍵解決。但是在授權、登入和獲取使用者資訊的過程中都發生了哪些事情,今天我們就來討論一下。這篇文章主要分析以下幾個問題:授權和登入的意義session_key 的作用unionId 的作

tipsJS之淺拷貝深拷貝

obj fault tps all function spa html 存在 || 淺拷貝: function extendCopy(p) {  var c = {};  for (var i in p) {    c[i] = p[i];  }  retu

servlet程式

java部分: import java.io.IOException;import java.io.PrintWriter; import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import

程式的多列表的展示隱藏

專案下載: 1.https://download.csdn.net/download/mo3408/10727141 2.下載:https://www.lanzous.com/i24jlvc  密碼:eng4 3.連結:https://share.weiyun.com/5tKP

程式 頁面跳轉方式

一. 頁面的跳轉方式 1.  使用元件  <navigator>  -- 類似於 a標籤        示例:   <navigator  url='../index/index

程式 右上角的分享

1. 頁面 js 中: 只有添加了  onShareAppMessage( ),該頁面才能被分享   2. onShareAppMessage( )中的設定: 需要return { } onShareAppMessage: function

微信程式API-裝置- 網路狀態

wx.getNetworkType(OBJECT) 獲取網路型別。 OBJECT引數說明: 引數 型別 必填 說明 success Function 是 介面呼叫成功

程式 域名配置

1. 問題     在小程式中,如果我們沒有在微信公眾平臺: 配置 https開頭的、備案過的域名話,呼叫該域名下的介面,就會報錯     當然: 如果只是簡單的學習下小程式使用的話,可以不校驗域名 — 微信開發者工具中: 詳情 — 打鉤: 不校驗合法域名、web-

程式 新建專案、基礎配置

1.  新建專案       微信開發者工具  --  + 新建專案   2.  在app.json中進行應用程式配置       注意: json檔案類似於文字文件txt,不能在裡面寫註釋

程式 配置合法域名

1. 配置合法域名——執行時,如果傳送了請求,未配置域名的情況下: 會提示非法域名 登入微信公眾平臺 — 設定 — 開發設定 — 伺服器域名 — 配置http開頭的、備案過的域名  如果只是簡單的練習小程式,可以不配置: 信開發者工具 -- 詳情 -- 前面打鉤 --

程式 下拉選單

1. wxml部分 <!-- 篩選 --> <view class="page"> <!-- 一級 --> <view class="nav"> <!-- 年齡 --> &l

微信程式map元件

        其實前些天,吳哥就說讓我加上一個定位,我說我還沒看文件,還沒學,暫時沒加。今天上午終於開始接受map元件的挑戰,我不滴不說我真的是很懶,好吧,也有點會拒絕困難,但如果真的需要,我也可以去學習去解決,大概我的身邊缺少一個讓我有動力的吧,別問我

微信程式bindtap方法傳參

微信小程式:bindtap方法傳參 1、wxml <view bindtap="pay_again" data-name="{{orderList.jid}}" data-fee="{{orderList.act_fee}}" data-mobile="{{orderList.p_ph