vue移动端微信授权登录插件封装的实例


Posted in Javascript onAugust 28, 2018

1、新建wechatAuth.js文件

const queryString = require('query-string')
//应用授权作用域,snsapi_base (不弹出授权页面,直接跳转,只能获取用户openid),snsapi_userinfo (弹出授权页面,可通过openid拿到昵称、性别、所在地。并且,即使在未关注的情况下,只要用户授权,也能获取其信息)
const SCOPES = ['snsapi_base', 'snsapi_userinfo']


class VueWechatAuthPlugin {

 install(Vue, options) {
  let wechatAuth = this
  this.setAppId(options.appid)
  Vue.mixin({
   created: function () {
    this.$wechatAuth = wechatAuth
   }
  })

 }

 constructor() {
  this.appid = null
  this.redirect_uri = null
  this.scope = SCOPES[1]
  this._code = null
  this._redirect_uri = null
 }

 static makeState() {
  return Math.random().toString(36).substring(2, 15) + Math.random().toString(36).substring(2, 15)
 }

 setAppId(appid) {
  this.appid = appid
 }

 set redirect_uri(redirect_uri) {
  this._redirect_uri = encodeURIComponent(redirect_uri)
 }

 get redirect_uri() {
  return this._redirect_uri
 }

 get state() {
  return localStorage.getItem("wechat_auth:state")
 }

 set state(state) {
  localStorage.setItem("wechat_auth:state", state)
 }

 get authUrl() {
  if (this.appid === null) {
   throw "appid must not be null"
  }
  if (this.redirect_uri === null) {
   throw "redirect uri must not be null"
  }
  this.state = VueWechatAuthPlugin.makeState()
  return `https://open.weixin.qq.com/connect/oauth2/authorize?appid=${this.appid}&redirect_uri=${this.redirect_uri}&response_type=code&scope=${this.scope}&state=${this.state}#wechat_redirect`
 }

 returnFromWechat(redirect_uri) {
  let parsedUrl = queryString.parse(redirect_uri.split('?')[1])
  if (process.env.NODE_ENV === 'development') {
   // console.log('parsedUrl: ', parsedUrl)
   this.state = null
   this._code = parsedUrl.code
  } else {
   if (this.state === null) {
    throw "You did't set state"
   }
   if (parsedUrl.state === this.state) {
    this.state = null
    this._code = parsedUrl.code
   } else {
    this.state = null
    throw `Wrong state: ${parsedUrl.state}`
   }
  }
 }

 get code() {
  if (this._code === null) {
   throw "Not get the code from wechat server!"
  }
  // console.log(this)
  // console.log('this._code: ' + this._code)
  let code = this._code
  this._code = null
  // console.log('code: ' + code)
  return code
 }
}

const vueWechatAuthPlugin = new VueWechatAuthPlugin()

export default vueWechatAuthPlugin

2、main.js中导入

import wechatAuth from './plugins/wechatAuth'//微信登录插件
const queryString = require('query-string');

Vue.use(wechatAuth, {appid: XXXXXXXXX});

3、路由钩子中可以进行相关操作

router.beforeEach((to, from, next) => {
 if (store.state.loginStatus == 0) {
  //微信未授权登录跳转到授权登录页面
  let url = window.location.href;
  //解决重复登录url添加重复的code与state问题
  let parseUrl = queryString.parse(url.split('?')[1]);
  let loginUrl;
  if (parseUrl.code && parseUrl.state) {
   delete parseUrl.code;
   delete parseUrl.state;
   loginUrl = `${url.split('?')[0]}?${queryString.stringify(parseUrl)}`;
  } else {
   loginUrl = url;
  }
  wechatAuth.redirect_uri = loginUrl;
  store.dispatch('setLoginStatus', 1);
  window.location.href = wechatAuth.authUrl
 } else if (store.state.loginStatus == 1) {
  try {
   wechatAuth.returnFromWechat(to.fullPath);
  } catch (err) {
   store.dispatch('setLoginStatus', 0)
   next()
  }
  store.dispatch('loginWechatAuth', wechatAuth.code).then((res) => {
   if (res.status == 1) {
    store.dispatch('setLoginStatus', 2)
   } else {
    store.dispatch('setLoginStatus', 0)
   }
   next()
  }).catch((err) => {
   next()
  })
 }else {
  next()
 }
});

以上这篇vue移动端微信授权登录插件封装的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
用正则表达式 动态创建/增加css style script 兼容IE firefox
Mar 10 Javascript
js TextArea的选中区域处理
Dec 28 Javascript
jquery连缀语法如何实现
Nov 29 Javascript
javascript闭包的高级使用方法实例
Jul 04 Javascript
canvas实现粒子时钟效果
Feb 06 Javascript
基于jquery实现多级菜单效果
Jul 25 jQuery
微信小程序 动画的简单实例
Oct 12 Javascript
浅谈angularJS2中的界面跳转方法
Aug 31 Javascript
微信小程序云开发如何使用npm安装依赖
May 18 Javascript
vue+elementUi图片上传组件使用详解
Aug 20 Javascript
VUE 动态组件的应用案例分析
Dec 02 Javascript
vue2.0 解决抽取公用js的问题
Jul 31 Javascript
Vue 应用中结合vux使用微信 jssdk的方法
Aug 28 #Javascript
对vux点击事件的优化详解
Aug 28 #Javascript
使用D3.js构建实时图形的示例代码
Aug 28 #Javascript
微信小程序手机号码验证功能的实例代码
Aug 28 #Javascript
AngularJS 事件发布机制
Aug 28 #Javascript
vue.js 添加 fastclick的支持方法
Aug 28 #Javascript
深入理解JavaScript 中的匿名函数((function() {})();)与变量的作用域
Aug 28 #Javascript
You might like
木翼下载系统中说明的PHP安全配置方法
2007/06/16 PHP
php urlencode()与urldecode()函数字符编码原理详解
2011/12/06 PHP
thinkphp5.1框架中容器(Container)和门面(Facade)的实现方法分析
2019/08/05 PHP
Laravel 关联模型-关联新增和关联更新的方法
2019/10/10 PHP
收集的网上用的ajax之chat.js文件
2007/04/08 Javascript
Google排名中的10个最著名的 JavaScript库
2010/04/27 Javascript
ASP.NET jQuery 实例12 通过使用jQuery validation插件简单实现用户注册页面验证功能
2012/02/03 Javascript
Js实现手机发送验证码时按钮延迟操作
2014/06/20 Javascript
JavaScript插件化开发教程 (四)
2015/01/27 Javascript
jquery实现简单手风琴菜单效果实例
2015/06/13 Javascript
js console.log打印对像与数组用法详解
2016/01/21 Javascript
TypeScript Type Innference(类型判断)
2016/03/10 Javascript
jQuery插件编写步骤详解
2016/06/03 Javascript
微信小程序实现指定显示行数多余文字去掉用省略号代替
2018/07/25 Javascript
小程序实现自定义导航栏适配完美版
2019/04/02 Javascript
微信小程序实现拍照画布指定区域生成图片
2019/07/18 Javascript
微信小程序事件 bindtap bindinput代码实例
2019/08/26 Javascript
jQuery实现全选、反选和不选功能的方法详解
2019/12/04 jQuery
scrapy spider的几种爬取方式实例代码
2018/01/25 Python
tensorflow入门之训练简单的神经网络方法
2018/02/26 Python
解决Python selenium get页面很慢时的问题
2019/01/30 Python
python里 super类的工作原理详解
2019/06/19 Python
HTML5 File API改善网页上传功能
2009/08/19 HTML / CSS
Levi’s美国官网:美国著名的牛仔裤品牌
2016/08/19 全球购物
米兰必去买手店排行榜首位:Antonioli
2016/09/11 全球购物
匡威俄罗斯官网:Converse俄罗斯
2020/05/09 全球购物
教师自我鉴定
2013/12/13 职场文书
财会自我鉴定范文
2013/12/27 职场文书
商务英语广告词大全
2014/03/18 职场文书
党性锻炼的心得体会
2014/09/03 职场文书
项目战略合作意向书
2015/05/08 职场文书
幼儿园小班开学寄语
2015/05/27 职场文书
后天观后感
2015/06/08 职场文书
创业计划书之宠物店
2019/09/19 职场文书
Python实现Telnet自动连接检测密码的示例
2021/04/16 Python
JavaScript实现贪吃蛇游戏
2021/06/16 Javascript