亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 課堂 > 小程序 > 正文

微信小程序非跳轉式組件授權登錄的方法示例

2020-03-21 15:55:35
字體:
來源:轉載
供稿:網友

首先附上官方文檔地址和授權流程

官方地址:https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/login.html

流程圖:

大致邏輯:授權 -> 發送code到服務器獲取session_key - > 保存在小程序緩存內 -> 調用wx.getUserInfo和session_key獲取用戶信息 -> 登錄成功返回訪問token -> 記錄登錄狀態 -> 執行登錄成功監聽(失敗則不監聽)

直接上代碼,一下均為小程序組件模式有興趣的可以看下官方文檔

創建components(自定義名稱)文件夾pages文件夾同級主要放置組件文件

創建 authorize (自定義名稱)文件夾 還是一樣的創建 對應的authorize.js ,authorize.wxml .authorize.wxss,authorize.json特別注意這里的 authorize.json 文件里面要定義當前頁面為組件

{"component": true}

到這里準備工作完成

authorize.js 換成組件的寫法,具體參考小程序官方文檔,這里展示我定義的

Component({  //組件的對外屬性 說的確實很官方,用過vue組件的就很容易理解這點  //父級向子級傳值這里就是接收值得地方 properties:{   //名稱要和父級綁定的名稱相同   //這里主要是控制自動授權彈框是否顯示 true=隱藏 false=顯示  iShidden:{   type:Boolean,//定義類型   value: true,//定義默認值  },  //是否自動登錄 這里主要用于沒有授權是否自動彈出授權提示框   //**用在不自動登錄頁面但是某些操作需要授權登錄**  isAuto:{   type: Boolean,   value: true,  }, }, //組件的內部數據,和 properties 一同用于組件的模板渲染 data:{  cloneIner:null }, //組件所在頁面的生命周期聲明對象 pageLifetimes:{   //頁面隱藏   hide:function(){   //關閉頁面時銷毀定時器   if(this.data.cloneIner) clearInterval(this.data.clearInterval);  },  //頁面打開  show:function(){   //打開頁面銷毀定時器   if (this.data.cloneIner) clearInterval(this.data.clearInterval);  }, }, //組件生命周期函數,在組件實例進入頁面節點樹時執行 attached(){    }, //組件的方法  methods:{  } });

注:以下的方法都需寫在 methods 內

第一步:未授權用戶判斷是否執行授權還是直接進行獲取用戶信息

//檢測登錄狀態并執行自動登錄  setAuthStatus(){   var that = this;   that.setErrorCount();   wx.getSetting({    success(res) {    //這里會檢測是否授權,如果授權了會直接調用自動登錄     if (!res.authSetting['scope.userInfo']) {      //沒有授權不會自動彈出登錄框      if (that.data.isAuto === false) return;       //自動彈出授權       that.setData({ iShidden: false });     } else {      //自動登錄      that.setData({ iShidden: true });      if (app.globalData.token) {      //這里是授權回調       that.triggerEvent('onLoadFun', app.globalData.token);       that.WatchIsLogin();      } else {       wx.showLoading({ title: '正在登錄中' });       //這里是已授權調用wx.getUserInfo       that.getUserInfoBydecryptCode();      }     }    }   })  }

第二步,沒有授權執行打開授權彈出框

//授權  setUserInfo(e){   var that = this, pdata={};   pdata.userInfo = e.detail.userInfo;   pdata.spid = app.globalData.spid;   wx.showLoading({ title: '正在登錄中' });   wx.login({    success: function (res) {     if (!res.code) return app.Tips({ title: '登錄失敗!' + res.errMsg});     //獲取session_key并緩存     that.getSessionKey(res.code, function () {      that.getUserInfoBydecryptCode();     });    },    fail() {     wx.hideLoading();    }   })  },  //從緩存中獲取session_key,如果沒有則請求服務器再次緩存  getSessionKey(code,successFn,errotFn){   var that=this;   wx.checkSession({    success: function (res){     if(wx.getStorageSync('session_key'))      successFn && successFn();     else      that.setCode(code, successFn, errotFn);    },    fail:function(){     that.setCode(code, successFn, errotFn);    }   });  },  //訪問服務器獲得session_key 并存入緩存中  setCode(code, successFn, errotFn){   var that = this;   app.basePost(app.U({ c: 'Login', a: 'setCode' }), { code: code }, function (res) {    wx.setStorageSync('session_key', res.data.session_key);    successFn && successFn(res);   }, function (res) {    if (errotFn) errotFn(res);    else return app.Tips({ title: '獲取session_key失敗' });   });  }

第三步:執行getUserInfoBydecryptCode 登錄獲取訪問權限

getUserInfoBydecryptCode: function () {   var that = this;   var session_key = wx.getStorageSync('session_key')   //沒有獲取到session_key,打開授權頁面   //這里必須的判斷存在緩存中的session_key是否存在,因為在第一步的時候,判斷了   //授權了將自動執行獲取用戶信息的方法   if (!session_key) {    wx.hideLoading();    if(that.data.isAuto) that.setData({ iShidden: false })    return false;   };   wx.getUserInfo({    lang: 'zh_CN',    success: function (res) {     var pdata = res;     pdata.userInfo = res.userInfo;     pdata.spid = app.globalData.spid;//獲取推廣人ID     pdata.code = app.globalData.code;//獲取推廣人分享二維碼ID     if (res.iv) {      pdata.iv = encodeURI(res.iv);      pdata.encryptedData = res.encryptedData;      pdata.session_key = session_key;      //獲取用戶信息生成訪問token      app.basePost(app.U({ c: 'login', a: 'index' }), { info: pdata},function(res){       if (res.data.status == 0) return app.Tips(        { title: '抱歉,您已被禁止登錄!' },         { tab: 4, url: '/pages/login-status/login-status' }        );       else if(res.data.status==410){        wx.removeStorage({ key:'session_key'});        wx.hideLoading();        if (that.data.iShidden == true) that.setData({ iShidden: false });        return false;       }       //取消登錄提示       wx.hideLoading();       //關閉登錄彈出窗口       that.setData({ iShidden: true, ErrorCount:0});       //保存token和記錄登錄狀態       app.globalData.token = res.data.token;       app.globalData.isLog = true;       //執行登錄完成回調       that.triggerEvent('onLoadFun', app.globalData.uid);       //監聽登錄狀態       that.WatchIsLogin();      },function(res){       wx.hideLoading();       return app.Tips({title:res.msg});      });     } else {      wx.hideLoading();      return app.Tips({ title: '用戶信息獲取失敗!'});     }    },    fail: function () {     wx.hideLoading();  that.setData({ iShidden: false });    },   })  }

第四步:監聽登錄狀態

再服務器無法獲取到token時,當前頁面會一直監聽token是否為空,防止無限獲取token設置錯誤次數,終止監聽

監聽token的用意為:token是服務器返回當前用戶的訪問憑證,憑證有過期的時候這時候所有的網絡請求將無法訪問,所以用了一個愚蠢的方法來監聽token

//監聽登錄狀態  WatchIsLogin:function(){   this.data.cloneIner=setInterval(function(){    //防止死循環,超過錯誤次數終止監聽    if (this.getErrorCount()) return clearInterval(this.data.clearInterval);    if (app.globalData.token == '') this.setAuthStatus();   }.bind(this),800);   this.setData({ cloneIner:this.data.cloneIner});  } /**   * 處理錯誤次數,防止死循環   *   */  setErrorCount:function(){   if (!this.data.ErrorCount) this.data.ErrorCount=1;   else this.data.ErrorCount++;   this.setData({ ErrorCount: this.data.ErrorCount});  },  /**   * 獲取錯誤次數,是否終止監聽   *   */  getErrorCount:function(){   return this.data.ErrorCount >= 10 ? true : false;  }

以上就是組件內全部的方法需要在組件生命周期函數內調用第一步的方法檢測授權,執行登錄

 attached(){  this.setAuthStatus(); }

注:在網絡請求中一定要處理token失效的操作,主要把 app.globalData.token和app.globalData.isLog 設置回空和false

這里附上沒有定義的一些app內公用的快捷方法以下的方法最好是寫在其他文件里面在app.js里面寫一個快捷調用的方法

/** post網絡請求 * @param string | object 請求地址* @param object data POST請求數組* @param callable successCallback 成功執行方法* @param callable errorCallback 失敗執行方法*/const basePost = function (url, data, successCallback, errorCallback, header) { if (typeof url == 'object') url = U(url); wx.request({  url: url,  data: data,  dataType : 'json',  method: 'POST',  header: header,  success: function (res) {   try{    if (res.data.code == 200) {     successCallback && successCallback(res.data);    } else {     if (res.data.code == 402) getApp().globalData.token = '', getApp().globalData.isLog = false;     //返回狀態為401時,用戶被禁止訪問 關閉當前所有頁面跳轉至用戶禁止登錄頁面     if (res.data.code == 401) return Tips({ title: res.data.msg}, { tab: 4, url:'/pages/login-status/login-status'});     errorCallback && errorCallback(res.data);    }   } catch (e) {    console.log(e);   }  }, fail: function (res) {   errorCallback && errorCallback(res);  },  complete: function (res) {  } });}/** 組裝URl*@param object opt */const U = function (opt, url) { var m = opt.m || 'routine_two', c = opt.c || 'auth_api', a = opt.a || 'index', q = opt.q || '',  p = opt.p || {}, params = '', gets = ''; if (url == undefined) url=getApp().globalData.url; params = Object.keys(p).map(function (key) {  return key + '/' + p[key]; }).join('/'); gets = Object.keys(q).map(function (key) {  return key + '=' + q[key]; }).join('&'); return url + '/' + m + '/' + c + '/' + a + (params == '' ? '' : '/' + params) +'.html'+ (gets == '' ? '' : '?' + gets);}

代碼量有點多,都是能用到的,望大神們多多指點

本小程序后臺框架由 http://github.crmeb.net/u/blue 提供 

TP5+EasyWeChat技術支持

如果對微信小程序授權不熟悉的可以用 EasyWeChat,確實好用;不是來吹這個EasyWeChat來了,只是個人覺得好用勿噴

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
奇米四色中文综合久久| 精品一区二区电影| 欧美一级免费视频| 成人444kkkk在线观看| 国产精品aaaa| 亚洲丝袜一区在线| 亚洲欧美在线第一页| 麻豆国产精品va在线观看不卡| 亚洲精品国产电影| 欧美极品少妇xxxxⅹ喷水| 国产亚洲欧洲高清| 欧美亚洲国产精品| 国内外成人免费激情在线视频网站| 国产美女久久精品香蕉69| 亚洲免费人成在线视频观看| 九九精品视频在线| 国产精品福利无圣光在线一区| 久久综合色88| 国产亚洲视频在线| 91在线视频免费| 久久影院资源站| 久久精品2019中文字幕| 亚洲成人免费网站| 精品福利免费观看| 亚洲剧情一区二区| 久久精品视频在线| 伊人男人综合视频网| 精品露脸国产偷人在视频| 成人激情春色网| 欧美激情中文网| 国产精品视频区1| 亚洲欧洲自拍偷拍| 在线看日韩av| 国产盗摄xxxx视频xxx69| 久久久噜噜噜久久| 91在线无精精品一区二区| 国模精品视频一区二区三区| 欧美一级大片在线观看| 亚洲第一福利网站| 成人免费在线视频网址| 中文字幕成人精品久久不卡| 亚洲最大av在线| 久久久亚洲网站| 亚洲欧美日韩精品久久奇米色影视| 日韩在线免费视频| 热99在线视频| 色老头一区二区三区在线观看| 欧美成年人网站| 国产成人久久久| 日韩av最新在线观看| 亚洲精品免费av| 欧美激情奇米色| 国产99在线|中文| 日韩高清电影免费观看完整| 久久精品国产成人精品| 精品国产一区久久久| 91精品国产91| 亚洲久久久久久久久久| 国产mv久久久| 国产视频精品自拍| 色综合视频网站| 精品国产91久久久| 日本亚洲欧美成人| 国产一区二区黄| 日韩精品免费电影| 日韩av免费看| 26uuu久久噜噜噜噜| 最近2019中文字幕在线高清| 亚洲一区二区久久| 少妇av一区二区三区| 欧美另类暴力丝袜| 九九热精品在线| 欧美极品欧美精品欧美视频| 精品magnet| 亚洲美女福利视频网站| 欧美成人午夜影院| 国产精品青青在线观看爽香蕉| 日韩中文在线视频| 日韩精品福利在线| 国内精品视频一区| 欧美日韩亚洲天堂| 粉嫩老牛aⅴ一区二区三区| 97精品视频在线| 国产精品1区2区在线观看| 视频在线观看一区二区| 97av在线视频免费播放| 亚洲国产日韩欧美在线图片| 国产免费一区视频观看免费| 亚洲国产日韩一区| 久久综合国产精品台湾中文娱乐网| 欧美精品成人91久久久久久久| 国产自产女人91一区在线观看| 国产成人av网| 欧美日韩在线视频观看| 欧美日韩国产页| 国产日韩视频在线观看| 国产福利精品视频| 精品久久久久久久久国产字幕| 日韩中文字幕免费看| 97国产精品视频人人做人人爱| 日韩av在线免播放器| 成人激情在线观看| 欧美尤物巨大精品爽| 国产伊人精品在线| 2020国产精品视频| 91高清免费在线观看| www欧美日韩| 日韩一区av在线| 国产一区欧美二区三区| 一区二区三区无码高清视频| 国产97在线亚洲| 亚洲аv电影天堂网| 国产在线视频不卡| 国产日韩欧美在线观看| 日韩精品在线免费观看| 国产亚洲视频在线观看| 91视频免费在线| 爽爽爽爽爽爽爽成人免费观看| 欧美在线视频观看| 欧美日韩国产91| 日韩高清电影免费观看完整版| 亚洲欧美一区二区激情| 精品视频偷偷看在线观看| 在线观看日韩欧美| 国产成人一区二区三区| 欧美日韩国产麻豆| 亚洲精品av在线播放| 日韩精品高清在线| 成人女保姆的销魂服务| 91精品久久久久久久久青青| 97视频在线观看免费| 欧美视频裸体精品| 欧美激情视频一区二区三区不卡| 日韩电影中文字幕| 亚洲欧美日韩国产成人| 久久躁狠狠躁夜夜爽| 亚洲视频在线免费看| 免费av在线一区| 欧美日韩国产区| 日韩精品免费在线视频观看| 亚洲国产精品专区久久| 韩剧1988在线观看免费完整版| 日韩精品高清视频| 欧美成人精品三级在线观看| 欧美日韩中文字幕日韩欧美| 国产精品久久精品| 欧美亚洲免费电影| 精品中文字幕在线| 欧美与黑人午夜性猛交久久久| 国产精品第三页| 日韩综合中文字幕| 精品色蜜蜜精品视频在线观看| 欧美高跟鞋交xxxxhd| 久久久久久久久久久国产| 98精品国产自产在线观看| 青青草成人在线| 欧美激情一区二区三级高清视频| 亚洲人精选亚洲人成在线| 欧美日韩美女视频| 亚洲最大av网| 精品国产自在精品国产浪潮| 日韩中文娱乐网| 日本最新高清不卡中文字幕| 亚洲欧美福利视频|