激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

node.js|vue.js|jquery|angularjs|React|json|js教程|

服務器之家 - 編程語言 - JavaScript - js教程 - 微信小程序授權登錄的優雅處理方式

微信小程序授權登錄的優雅處理方式

2022-02-15 20:01FTD止水 js教程

這篇文章主要給大家介紹了關于微信小程序授權登錄的優雅處理方式,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

前言

當微信小程序項目中涉及到獲取用戶信息并實現用戶登錄時,可以通過微信官方提供的登錄能力方便地獲取微信的用戶身份標識,快速建立小程序內的用戶體系。官方文檔只是提供如何去調用授權登錄,如果直接原封不動的照搬文檔來進行代碼編寫,這樣勢必會造成代碼的維護性差,所以本篇著重介紹如果更優雅的處理微信小程序的授權登錄。

授權登錄的基本流程

微信小程序授權登錄的優雅處理方式

上圖是微信小程序官網提供的授權登錄基本流程圖,這里我只從前端開發的角度來講解一下該流程。

  • 通過wx.login()獲取臨時登錄憑證code。
  • 通過調用服務端提供的接口把code傳遞給服務端,然后服務端會返回給前端openid和sesstion_key。這就代表已經成功完成授權登錄了,至于openid和sesstion_key的用途,后面再進行講解。

大體的登錄流程搞清楚之后,就可以進行代碼的編寫了。因為微信提供的api接口調用不利于代碼維護,所以我借助了promise進行封裝處理(不了解的可以看ES6文檔,里面有詳細介紹),這樣做的好處就是以后可以鏈式調用接口,也可以結合async/await(ES6語法)將異步接口進行同步處理。

get/post 接口的封裝處理

在根目錄中創建service文件夾,用于存放與接口相關的代碼,在service文件夾創建一個myRequest.js文件并對小程序的get/post請求進行封裝處理,代碼如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
//get請求封裝(跳頁判斷)
//通過全局函數getApp可以獲取全局變量,需要全局的數據可以在根目錄下的app.js進行設置
let app=getApp();
const myGet = (url, data)=>{
 return new Promise((resolve, reject)=>{
 wx.request({
  url: `${app.globalData.HTTP}${url}`,
  data:data,
  method:"GET",
  //這個authorization就是含有openid和sesstion_key信息的值
  header: { 'authorization': app.globalData.authorization},//獲取全局變量中的用戶信息,并放入到請求頭中
  success:(res)=>{
  if (res.data.code == 409) {
   //409代表用戶未進行登錄,強制跳到寫好的登錄頁
   wx.navigateTo({
   url: '../login/login'
   })
  } else{
   resolve(res.data);
  }
  },
  fail:(res)=>{
  reject();
  }
 })
 })
}
//post請求封裝(跳頁判斷)
const myPost = (url, data) => {
 return new Promise((resolve, reject) => {
 wx.request({
  url: `${app.globalData.HTTP}${url}`,
  data: data,
  method: "POST",
  header: { 'authorization': app.globalData.authorization},
  success: (res) => {
  if (res.data.code == 409){
   wx.navigateTo({
   url: '../login/login'
   })
  }else{
   resolve(res.data);
  }
  
  },
  fail: (res) => {
  reject();
  }
 })
 })
}
module.exports = {
 myGet,
 myPost,
}

全局變量配置app.js代碼如下(注意全局變量數據會在刷新頁面或是重新進入小程序之后初始化,并不能永久保存當前的數據狀態):

?
1
2
3
4
5
6
7
8
9
10
11
//app.js
App({
 onLaunch: function() {
 //這里可以根據項目實際需求寫一些項目初始化需要執行的代碼
 },
 globalData: {
 HTTP: "https://shop.yamecent.com/",
 //我們獲取openid和sesstion_key之后,會把它存放到小程序內存的authorization中,這樣數據不會丟失,除非刪除該小程序
 authorization: wx.getStorageSync('authorization') || "",//獲取存儲在小程序內存中的authorization
 }
})

授權登錄接口封裝

這部分封裝會用到async/await,將異步接口進行同步處理,不了解的可以參看ES6文檔說明,在service文件夾下創建login.js代碼如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
const myRequest = require('./myRequest.js');
const app = getApp();
const HTTP = app.globalData.HTTP;
//微信login接口獲取code封裝
const myLogin=()=>{
 return new Promise((resolve, reject)=>{
 wx.login({
  success:(res)=>{
  resolve(res.code);
  },
  fail:(res)=>{
  reject(res.errMsg);
  console.log("微信登錄獲取code失敗");
  }
 })
 })
}
//獲取openid和session_key接口封裝
const getUserMsg=(myUrl,myData)=>{
 return new Promise((resolve,reject)=>{
 wx.request({
  url: myUrl,
  method: "POST",
  data: myData,
  success:(res)=>{
  if(res.data.code==500){
   //獲取失敗
   wx.showToast({
   title: res.data.msg,
   icon: 'none',
   duration: 2000,
   mask:true,
   })
   resolve(500);//失敗是返回500  
  }else{
   resolve(res.data.data);
  
  },
  fail:(res)=>{
  reject(res.data.msg);
  console.log("獲取openid和session_key接口失敗"); 
  }
 })
 })
}
 
//封裝存儲(注意:這里的存儲過程是異步的)
const mySetStorage=(key,val)=>{
 return new Promise((resolve, reject) => {
 wx.setStorage({
  key: key,
  data: val,
  success: () => {
  resolve(true);
  },
  fail: () => {
  reject(false);
  }
 })
 })
}
 
//封裝獲取存儲
const myGetStorage=(key)=>{
 return new Promise((resolve,reject)=>{
 wx.getStorage({
  key: 'key',
  success: (res)=>{
  resolve(res.data);
  },
  fail:()=>{
  reject("獲取存儲失敗");
  }
 })
 })
}
 
 
//授權方法封裝
//sendData是通過授權按鈕獲取到的用戶信息,這里要作為參數傳遞給后臺來保存用戶的信息
//cb是授權登錄成功之后所要執行的函數,具體是什么功能的函數,要根據項目需求而定,也可能不需要
const myAuthorize = (sendData,cb="") => {
 async function accredit() {
 wx.showLoading({
  title: '認證中',
  mask:true
 })
 let code = await myLogin();//微信登陸獲取code接口
 sendData.code=code;
 let author = await getUserMsg(`${HTTP}auth`, sendData);//獲取后臺openid sesstion_key接口
 wx.hideLoading();
 if(author==500){
  return;
 }
 await mySetStorage("authorization", author.Authorization);//存到內存中,進入小程序中獲取并存入app.globalData中
 app.globalData.authorization = author.Authorization;
 typeof cb == "function" && cb(author);//回調所需要用的登陸狀態參數
 //這里可以補充一下其它業務邏輯,如tabbar用戶購物車數量等邏輯
 wx.showToast({
  title: '成功授權',
  icon: 'success',
  duration: 2000,
  mask: true
 });   
 
 
 }
 accredit();
}
 
module.exports = {
 myAuthorize,
 mySetStorage,
 myGetStorage
}

授權登錄封裝好了之后再看看如何在項目中如何使用,由于微信小程序授權只能通過button來觸發,所以使用 button 組件,并將 open-type 指定為 getUserInfo 類型,獲取用戶基本信息。login.wxml代碼如下:

?
1
<button class='btn' open-type="getUserInfo" bindgetuserinfo='gotoLogin'>立即登錄</button>

login.js代碼如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
// pages/login/login.js
const myRequest = require('../../common/script/myRequest.js');
const login = require('../../common/script/login.js');
const app = getApp();
const HTTP = app.globalData.HTTP;
Page({
 
 /**
 * 頁面的初始數據
 */
 data: {
 
 },
 gotoLogin: function (e) {
 let sendOjb={};//用于存放用戶信息
 if (e.detail.errMsg =="getUserInfo:ok"){
  sendOjb = { avatar: e.detail.userInfo.avatarUrl,
     nickname: e.detail.userInfo.nickName,
     sex: e.detail.userInfo.gender,
     province: e.detail.userInfo.province,
     city: e.detail.userInfo.city};
  login.myAuthorize(sendOjb,()=>{
  wx.navigateBack();//成功之后返回之前的頁面,也可以根據項目需求寫一些其它的邏輯
  })
 }else{
  
 }
 },
 /**
 * 生命周期函數--監聽頁面加載
 */
 onLoad: function (options) {
 
 },
})

結束語

以上代碼復制粘貼到自己的微信小程序項目中就能夠正常運行,如有錯誤或需要改進的地方還請與我聯系,我將及時進行改正。

到此這篇關于微信小程序授權登錄的優雅處理方式的文章就介紹到這了,更多相關微信小程序授權登錄內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://juejin.cn/post/6920072471022567431

延伸 · 閱讀

精彩推薦
  • js教程JavaScript 中的六種循環方法

    JavaScript 中的六種循環方法

    這篇文章主要介紹了JavaScript 中的六種循環方法,幫助大家更好的理解和使用JavaScript,感興趣的朋友可以了解下...

    Saku8752021-12-27
  • js教程JavaScript中展開運算符及應用的實例代碼

    JavaScript中展開運算符及應用的實例代碼

    這篇文章主要介紹了JavaScript中展開運算符及應用的實例代碼,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以...

    banana peel9632021-12-31
  • js教程代碼塊高亮可復制顯示js插件highlight.js+clipboard.js整合

    代碼塊高亮可復制顯示js插件highlight.js+clipboard.js整合

    最近有個需求是將jsp頁面上的某一段代碼塊格式化成類似CSDN的代碼塊的樣式,而且很多平臺都使用了這樣的功能,下面就為大家簡單分享一下...

    我是小H呀3812022-01-20
  • js教程50行代碼實現Webpack組件使用次數統計

    50行代碼實現Webpack組件使用次數統計

    這篇文章主要介紹了50行代碼實現Webpack組件使用次數統計,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友...

    又在吃魚8652022-02-12
  • js教程three.js顯示中文字體與tween應用詳析

    three.js顯示中文字體與tween應用詳析

    這篇文章主要給大家介紹了關于three.js顯示中文字體與tween應用的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習...

    郭志強10002021-12-24
  • js教程javascript實現隨機抽獎功能

    javascript實現隨機抽獎功能

    這篇文章主要為大家詳細介紹了javascript實現隨機抽獎功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    彴兗7142021-12-23
  • js教程原生js實現2048小游戲

    原生js實現2048小游戲

    這篇文章主要為大家詳細介紹了原生js實現2048小游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    一個21歲的老同志5402022-02-13
  • js教程js+html+css實現手動輪播和自動輪播

    js+html+css實現手動輪播和自動輪播

    這篇文章主要為大家詳細介紹了js+html+css實現手動輪播和自動輪播效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考...

    南柯Seven9422021-12-22
主站蜘蛛池模板: 日产精品久久久一区二区福利 | 免费看毛片网站 | 久国产精品 | 午夜精品久久久久久中宇 | 天天草天天干天天 | 成人一级免费视频 | 久久影片 | 欧美日本免费一区二区三区 | 中国国语毛片免费观看视频 | 欧美一级全黄 | www.54271.com | 亚洲精品aaaaa | xnxx18日本| 黄色va视频| 久久国产精品电影 | 一区二区三区日韩 | 日本黄色一级视频 | 99麻豆久久久国产精品免费 | 亚洲视频精选 | 亚洲一级电影在线观看 | 亚洲午夜免费电影 | 欧美性生交zzzzzxxxxx | 国产欧美在线观看不卡一 | 成年免费视频黄网站在线观看 | 92看片淫黄大片欧美看国产片 | 成年人在线免费 | 网站激情 | 久久毛片免费观看 | 中文日韩 | 看毛片的网址 | 久草在线资源视频 | 日本欧美一区二区三区在线观看 | 亚洲一区二区免费视频 | 视频一区二区视频 | 欧美一级特级 | 性欧美暴力猛交69hd | 成人三区四区 | 久久99深爱久久99精品 | 久久99网 | 久久久久久久久亚洲精品 | 久操福利视频 |