uni-app微信小程序登錄流程詳解

文章目錄

  • uni-app微信小程序登錄流程實戰詳解
    • 微信小程序登錄流程概述
    • 1. 獲取登錄憑證(code)
    • 2. 發送登錄請求
    • 3. 保存登錄態
    • 4. 登錄狀態管理
    • 5. 應用登錄狀態
      • 請求攔截器中添加 token
      • 自動登錄
      • 頁面路由守衛
    • 使用 Vuex 集中管理登錄狀態
    • 登錄組件示例
    • 登錄流程最佳實踐
    • 總結

uni-app微信小程序登錄流程實戰詳解

作為前端開發者,理解微信小程序的登錄流程對構建用戶認證系統至關重要。本文將從前端開發角度,詳細介紹如何在uni-app框架下實現微信小程序的登錄流程,包括獲取登錄憑證、發送登錄請求、管理登錄狀態等關鍵環節。

微信小程序登錄流程概述

微信小程序的前端登錄流程主要包括以下幾個步驟:

  1. 調用 uni.login() 獲取登錄憑證(code)
  2. 將 code 發送到自己的業務服務器
  3. 接收服務器返回的登錄態(token)
  4. 保存并管理登錄態
  5. 在后續請求中使用登錄態

接下來,我們將詳細解析每個步驟的實現。

1. 獲取登錄憑證(code)

在小程序啟動時,我們首先需要調用 uni.login() 方法獲取登錄憑證(code):

// 獲取微信登錄憑證
function getWxLoginCode() {return new Promise((resolve, reject) => {uni.login({provider: 'weixin',success: (res) => {if (res.code) {console.log('登錄憑證獲取成功');resolve(res.code);} else {console.error('登錄憑證獲取失敗:', res.errMsg);reject(new Error(res.errMsg));}},fail: (err) => {console.error('登錄接口調用失敗:', err);reject(err);}});});
}

這段代碼封裝了 uni.login() 方法,返回一個 Promise 對象,便于我們使用 async/await 語法處理異步流程。

2. 發送登錄請求

獲取到 code 后,我們需要將其發送到自己的業務服務器,以換取自定義登錄態:

// 發送登錄請求
async function login() {try {// 顯示加載提示uni.showLoading({title: '登錄中...'});// 獲取微信登錄憑證const code = await getWxLoginCode();// 發送登錄請求const result = await request({url: '/api/user/login',method: 'POST',data: { code }});// 處理登錄結果if (result.code === 0 && result.data) {// 登錄成功,保存登錄態saveLoginState(result.data);return result.data;} else {// 登錄失敗uni.showToast({title: result.msg || '登錄失敗',icon: 'none'});return null;}} catch (error) {// 處理錯誤console.error('登錄過程發生錯誤:', error);uni.showToast({title: '登錄失敗,請重試',icon: 'none'});return null;} finally {// 隱藏加載提示uni.hideLoading();}
}

這段代碼完成了以下工作:

  • 調用 getWxLoginCode() 獲取登錄憑證
  • 將 code 發送到業務服務器
  • 處理服務器返回的登錄結果
  • 提供用戶友好的反饋(加載提示、錯誤提示)

3. 保存登錄態

當服務器返回登錄態(通常是 token)后,我們需要將其保存起來:

// 保存登錄狀態
function saveLoginState(loginData) {// 保存 token 到本地存儲uni.setStorageSync('token', loginData.token);// 保存用戶信息if (loginData.userInfo) {uni.setStorageSync('userInfo', loginData.userInfo);}// 記錄登錄時間uni.setStorageSync('loginTime', Date.now());console.log('登錄狀態已保存');
}

在這里,我們使用 uni-app 提供的存儲 API 保存了 token、用戶信息和登錄時間。這些信息將在后續的請求和頁面中使用。

4. 登錄狀態管理

為了有效管理登錄狀態,我們需要提供一套完整的工具函數:

// 檢查是否已登錄
function isLoggedIn() {return !!uni.getStorageSync('token');
}// 獲取當前token
function getToken() {return uni.getStorageSync('token') || '';
}// 獲取用戶信息
function getUserInfo() {return uni.getStorageSync('userInfo') || null;
}// 清除登錄狀態
function clearLoginState() {uni.removeStorageSync('token');uni.removeStorageSync('userInfo');uni.removeStorageSync('loginTime');
}// 檢查登錄是否過期
function isLoginExpired() {const loginTime = uni.getStorageSync('loginTime') || 0;const currentTime = Date.now();// 假設登錄有效期為7天const expiresIn = 7 * 24 * 60 * 60 * 1000;return currentTime - loginTime > expiresIn;
}// 刷新登錄狀態
async function refreshLogin() {if (isLoginExpired()) {clearLoginState();return await login();}return true;
}

這組函數提供了:

  • 檢查用戶是否已登錄
  • 獲取 token 和用戶信息
  • 清除登錄狀態
  • 檢查登錄是否過期
  • 刷新登錄狀態

5. 應用登錄狀態

有了上述工具函數,我們需要在應用中合理使用它們:

請求攔截器中添加 token

// 請求攔截器
const request = (options) => {// 克隆原始選項const requestOptions = {...options,header: options.header || {}};// 添加 token 到請求頭const token = getToken();if (token) {requestOptions.header.Authorization = `Bearer ${token}`;}// 發送請求return new Promise((resolve, reject) => {uni.request({...requestOptions,success: (res) => {// 檢查響應狀態if (res.statusCode === 200) {resolve(res.data);} else if (res.statusCode === 401) {// token 無效或過期handleUnauthorized();reject(new Error('未授權'));} else {reject(res);}},fail: (err) => {reject(err);}});});
};// 處理未授權情況
function handleUnauthorized() {// 清除登錄狀態clearLoginState();// 提示用戶uni.showToast({title: '登錄已過期,請重新登錄',icon: 'none'});// 跳轉到登錄頁setTimeout(() => {uni.navigateTo({url: '/pages/login/login'});}, 1500);
}

這個請求攔截器確保了:

  • 每個請求都帶上 token
  • 處理 401 未授權響應
  • 在 token 無效時引導用戶重新登錄

自動登錄

在應用啟動時,我們可以實現自動登錄功能:

// App.vue 的 onLaunch 鉤子
export default {async onLaunch() {// 檢查本地是否有登錄態if (isLoggedIn()) {// 檢查登錄是否過期if (isLoginExpired()) {console.log('登錄已過期,嘗試重新登錄');await login();} else {console.log('已登錄狀態');}} else {console.log('未登錄狀態');await login();}}
}

這段代碼在應用啟動時檢查登錄狀態,并在必要時進行自動登錄。

頁面路由守衛

在需要登錄才能訪問的頁面,我們可以添加路由守衛:

// 需要登錄的頁面
export default {onLoad() {this.checkLogin();},methods: {checkLogin() {if (!isLoggedIn()) {uni.showToast({title: '請先登錄',icon: 'none'});// 跳轉到登錄頁setTimeout(() => {uni.navigateTo({url: '/pages/login/login'});}, 1500);return false;}return true;}}
}

使用 Vuex 集中管理登錄狀態

為了更好地管理狀態,我們可以使用 Vuex:

// store/modules/user.js
const state = {token: uni.getStorageSync('token') || '',userInfo: uni.getStorageSync('userInfo') || null
};const mutations = {SET_TOKEN(state, token) {state.token = token;uni.setStorageSync('token', token);},SET_USER_INFO(state, userInfo) {state.userInfo = userInfo;uni.setStorageSync('userInfo', userInfo);},CLEAR_USER(state) {state.token = '';state.userInfo = null;uni.removeStorageSync('token');uni.removeStorageSync('userInfo');uni.removeStorageSync('loginTime');}
};const actions = {// 登錄async login({ commit }) {try {uni.showLoading({ title: '登錄中...' });// 獲取微信登錄憑證const code = await getWxLoginCode();// 發送登錄請求const result = await request({url: '/api/user/login',method: 'POST',data: { code }});if (result.code === 0 && result.data) {// 保存登錄狀態commit('SET_TOKEN', result.data.token);commit('SET_USER_INFO', result.data.userInfo);uni.setStorageSync('loginTime', Date.now());return result.data;} else {uni.showToast({title: result.msg || '登錄失敗',icon: 'none'});return null;}} catch (error) {console.error('登錄失敗', error);uni.showToast({title: '登錄失敗,請重試',icon: 'none'});return null;} finally {uni.hideLoading();}},// 登出logout({ commit }) {commit('CLEAR_USER');uni.reLaunch({url: '/pages/login/login'});},// 檢查登錄狀態checkLogin({ state, dispatch }) {if (!state.token) {return false;}const loginTime = uni.getStorageSync('loginTime') || 0;const currentTime = Date.now();const expiresIn = 7 * 24 * 60 * 60 * 1000;if (currentTime - loginTime > expiresIn) {// 登錄過期,重新登錄return dispatch('login');}return true;}
};export default {namespaced: true,state,mutations,actions
};

使用 Vuex 管理登錄狀態有以下優勢:

  • 集中管理狀態
  • 狀態變化更加可預測
  • 方便組件之間共享狀態
  • 提供統一的 API 接口

登錄組件示例

最后,我們來看一個完整的登錄組件示例:

<!-- pages/login/login.vue -->
<template><view class="login-container"><image class="logo" src="/static/logo.png"></image><view class="welcome">歡迎使用向明天小程序</view><button class="login-btn" type="primary" :loading="loading"@click="handleLogin">微信一鍵登錄</button><view class="tips">登錄后即可使用完整功能</view></view>
</template><script>
import { mapActions } from 'vuex';export default {data() {return {loading: false};},methods: {...mapActions('user', ['login']),async handleLogin() {this.loading = true;try {const result = await this.login();if (result) {uni.showToast({title: '登錄成功',icon: 'success'});// 登錄成功后跳轉setTimeout(() => {const redirectUrl = uni.getStorageSync('redirectUrl') || '/pages/index/index';uni.reLaunch({url: redirectUrl});uni.removeStorageSync('redirectUrl');}, 1500);}} catch (error) {console.error('登錄操作失敗', error);} finally {this.loading = false;}}}
};
</script><style>
.login-container {display: flex;flex-direction: column;align-items: center;justify-content: center;padding: 60rpx;height: 100vh;background-color: #f8f8f8;
}.logo {width: 200rpx;height: 200rpx;margin-bottom: 40rpx;
}.welcome {font-size: 36rpx;font-weight: bold;margin-bottom: 80rpx;color: #333;
}.login-btn {width: 80%;height: 88rpx;line-height: 88rpx;border-radius: 44rpx;font-size: 32rpx;background-color: #07c160;
}.tips {margin-top: 40rpx;font-size: 28rpx;color: #999;
}
</style>

登錄流程最佳實踐

  1. 靜默登錄:在用戶無感知的情況下完成登錄流程,提升用戶體驗。

  2. 登錄狀態檢查:在應用啟動和頁面切換時檢查登錄狀態,確保用戶處于登錄狀態。

  3. 錯誤處理:提供友好的錯誤提示,引導用戶成功完成登錄。

  4. 登錄重試:在登錄失敗時提供重試機制。

  5. 登錄過期處理:及時處理登錄過期情況,引導用戶重新登錄。

  6. 登錄態持久化:使用適當的存儲方式保存登錄態,確保用戶下次打開應用時能夠保持登錄狀態。

  7. 登錄態安全:不在前端存儲敏感信息,設置合理的 token 過期時間。

總結

作為前端開發者,實現微信小程序登錄流程需要關注以下關鍵點:

  1. 正確調用 uni.login() 獲取登錄憑證
  2. 將登錄憑證發送到業務服務器換取登錄態
  3. 安全地保存和管理登錄態
  4. 在網絡請求中使用登錄態
  5. 處理登錄過期和未授權情況
  6. 優化用戶登錄體驗

通過本文介紹的方法和最佳實踐,你應該能夠在 uni-app 項目中實現一個完整、安全、用戶友好的微信小程序登錄流程。

希望這篇文章對你實現微信小程序登錄功能有所幫助!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/80885.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/80885.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/80885.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

GUC并發編程和SpringCloud,二者之間的關系

一.提問 我認為&#xff0c;Java開發中&#xff0c;如果項目的每一個小模塊需要不同人員并行開發時&#xff0c;就需要使用SpringCloud&#xff1b;如果要解決系統用戶激增&#xff0c;就是用GUC并發編程。 這個說法對么&#xff1f; 二.解答 你的理解部分正確&#xff0c;但不…

在 Vue 3 中使用 canvas-confetti 插件

&#x1f389; 在 Vue 3 中使用 canvas-confetti 插件 canvas-confetti 是一個輕量、無依賴的 JavaScript 動畫庫&#xff0c;用于在網頁上展示彩帶、慶祝動畫。非常適合用于抽獎、支付成功、活動慶祝等場景。 本教程將指導你如何在 Vue 3 項目中集成并使用該插件。 &#x1…

深入解析Spring Boot項目目錄結構:從新手到規范實踐

一、標準項目結構全景圖 典型的Spring Boot項目&#xff08;Maven構建&#xff09;目錄結構如下&#xff1a; my-spring-project/ ├── src/ │ ├── main/ │ │ ├── java/ # 核心代碼 │ │ │ └── com/ │ │ │ └── exa…

【C語言】宏經典練習題,交換奇偶位

交換奇偶位 寫一個宏&#xff0c;可以將一個整數的二進制位的奇數位和偶數位交換。 #define Swap(x) x(((x&0x55555555)<<1)((x&0xaaaaaaaa)>>1)) int main() {int a 10;Swap(a);printf("%d\n", a);return 0; } 寫宏的思路&#xff1a; 假設…

VSCode-插件:codegeex:ai coding assistant / 清華智普 AI 插件

一、官網 https://codegeex.cn/ 二、vscode 安裝插件 點擊安裝即可&#xff0c;無需復雜操作&#xff0c;國內軟件&#xff0c;無需科學上網&#xff0c;非常友好 三、智能注釋 輸入 // 或者 空格---后邊自動出現注釋信息&#xff0c;&#xff0c;按下 Tab 鍵&#xff0c;進…

FFmpeg 與 C++ 構建音視頻處理全鏈路實戰(三)—— FFmpeg 內存模型

經過前面文章的 FFmpeg 編程實踐&#xff0c;相信你已經對AVPacket和AVFrame這兩個核心結構體不再陌生。當我們編寫代碼時&#xff0c;頻繁調用unref系列 API 釋放內存的操作&#xff0c;或許讓你心生疑惑&#xff1a;這些函數究竟是如何實現內存釋放的&#xff1f;又該在何時準…

c 中的哈希表

哈希是一種可以接受各種類型、大小的輸入&#xff0c;輸出一個固定長度整數的過程。你可以將哈希理解成一種特殊的映射&#xff0c;哈希映射&#xff0c;將一個理論無限的集合A映射到有限整數集合B上。 哈希函數&#xff1a;哈希函數是哈希過程的核心&#xff0c;它決定了哈希映…

【一次成功!】Ubuntu22.04安裝cartographer

之前在ubuntu20.04上成功安裝cartographer&#xff0c;但是翻遍全網都沒找到官方的22.04安裝教程&#xff0c;然后找到小魚的&#xff0c;試了一下&#xff0c;一次成功&#xff0c;連接如下&#xff1a; gd2l-ros2/docs/humble/chapt10/get_started/2.Carto介紹及安裝.md at …

【WPF】Opacity 屬性的使用

在WPF&#xff08;Windows Presentation Foundation&#xff09;中&#xff0c;Opacity 屬性是定義一個元素透明度的屬性&#xff0c;其值范圍是從 0.0&#xff08;完全透明&#xff09;到 1.0&#xff08;完全不透明&#xff09;。由于 Opacity 是在 UIElement 類中定義的&…

8天Python從入門到精通【itheima】-6~10

目錄 7節-開發出第一個Python程序: 1.在cmd窗口寫下第一個最簡單的程序:Hello World!!! 9節: 1.如何卸載python: 2.報錯:不是可運行的程序 ?編輯 3.報錯:無法初始化設備PRN: 4.報錯:語法錯誤——非法的字符 10節-python解釋器: 1.python解釋器的原理: 2.解…

Mac 3大好用的復制粘貼管理工具對比

剪貼板管理器是查看復制粘貼歷史記錄的工具&#xff0c;幾乎是每個蘋果電腦用戶必備工具。市面上的工具很多&#xff0c;我結合了功能豐富、設計簡潔、交互便利整理了目前3款頭部剪貼板應用 Paste、PasteNow、PasteMe。 Paste 優勢&#xff1a;老牌剪切板應用&#xff0c;功能…

2025年全國青少年信息素養大賽初賽模擬測試網站崩了的原因及應對比賽流程

2025年全國青少年信息素養大賽初賽模擬測試昨天開始&#xff0c;由于同一時間涌入太多的人&#xff0c;導致網站的服務器奔了&#xff0c;出現了各種狀況&#xff0c;導致很多人沒有模擬上&#xff0c;大家今天可以刷新或者提前打開網頁。 有的是一直“轉圈圈”&#xff0c;有的…

02 | 大模型微調 | 從0學習到實戰微調 | 從數學概率到千億參數大模型

一、導讀 作為非AI專業技術開發者&#xff08;我是小小爬蟲開發工程師&#x1f60b;&#xff09; 本系列文章將圍繞《大模型微調》進行學習&#xff08;也是我個人學習的筆記&#xff0c;所以會持續更新&#xff09;&#xff0c;最后以上手實操模型微調的目的。 &#xff08;…

十四、繼承與組合(Inheritance Composition)

十四、繼承與組合&#xff08;Inheritance & Composition&#xff09; 引言 C最引人注目的特性之一是代碼復用。組合&#xff1a;在新類中創建已有類的對象。繼承&#xff1a;將新類作為已有類的一個類型來創建。 14.1 組合的語法 Useful.h //C14:Useful.h #ifndef US…

2025年5月-信息系統項目管理師高級-軟考高項一般計算題

決策樹和期望貨幣值 加權算法 自制和外購分析 溝通渠道 三點估算PERT 當其他條件一樣時&#xff0c;npv越大越好

OpenJDK 17 中線程啟動的完整流程用C++ 源碼詳解

1. 線程創建入口&#xff08;JNI 層&#xff09; 當 Java 層調用 Thread.start() 時&#xff0c;JVM 通過 JNI 進入 JVM_StartThread 函數&#xff1a; JVM_ENTRY(void, JVM_StartThread(JNIEnv* env, jobject jthread))// 1. 檢查線程狀態&#xff0c;防止重復啟動if (java_…

Spring MVC參數傳遞

本內容采用最新SpringBoot3框架版本,視頻觀看地址:B站視頻播放 1. Postman基礎 Postman是一個接口測試工具,Postman相當于一個客戶端,可以模擬用戶發起的各類HTTP請求,將請求數據發送至服務端,獲取對應的響應結果。 2. Spring MVC相關注解 3. Spring MVC參數傳遞 Spri…

Python面向對象編程(OOP)深度解析:從封裝到繼承的多維度實踐

引言 面向對象編程(Object-Oriented Programming, OOP)是Python開發中的核心范式&#xff0c;其三大特性——??封裝、繼承、多態??——為構建模塊化、可維護的代碼提供了堅實基礎。本文將通過代碼實例與理論結合的方式&#xff0c;系統解析Python OOP的實現機制與高級特性…

0.66kV0.69kV接地電阻柜常規配置單

0.66kV/0.69kV接地電阻柜是變壓器中性點接地電阻柜中的特殊存在&#xff0c;主要應用于低壓柴油發電機組220V、火力發電廠380V、煤炭企業660V/690V等電力系統或電力用戶1000V的低壓系統中。 我們來看看0.66kV0.69kV接地電阻柜配置單&#xff1a; 配置特點如下&#xff1a; 1…

矩陣短劇系統:如何用1個后臺管理100+小程序?深度解析多端綁定技術

短劇行業效率革命&#xff01;一套系統實現多平臺內容分發、數據統管與流量聚合 在短劇行業爆發式增長的今天&#xff0c;內容方和運營者面臨兩大核心痛點&#xff1a;多平臺運營成本高與流量分散難聚合。傳統模式下&#xff0c;每個小程序需獨立開發后臺&#xff0c;導致人力…