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 相关文章推荐
javascript字符串循环匹配实例分析
Jul 17 Javascript
Sublime Text 3常用插件及安装方法
Dec 16 Javascript
JavaScript控制浏览器全屏及各种浏览器全屏模式的方法、属性和事件
Dec 20 Javascript
Bootstrap每天必学之折叠(Collapse)插件
Apr 25 Javascript
AngularJS 模块化详解及实例代码
Sep 14 Javascript
Webpack中css-loader和less-loader的使用教程
Apr 27 Javascript
vue-router 实现导航守卫(路由卫士)的实例代码
Sep 02 Javascript
vue+moment实现倒计时效果
Aug 26 Javascript
快速解决layui弹窗按enter键不停弹窗的问题
Sep 18 Javascript
JS实现简单日历特效
Jan 03 Javascript
vue + node如何通过一个Txt文件批量生成MP3并压缩成Zip
Jun 02 Javascript
antd日期选择器禁止选择当天之前的时间操作
Oct 29 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 文章中的远程图片采集到本地的代码
2009/07/30 PHP
php中日期加减法运算实现代码
2011/12/08 PHP
php中的动态调用实例分析
2015/01/07 PHP
PHP获取当前系统时间的方法小结
2018/10/03 PHP
php桥接模式应用案例分析
2019/10/23 PHP
jQuery 1.0.2
2006/10/11 Javascript
javascript YUI 读码日记之 YAHOO.util.Dom - Part.4
2008/03/22 Javascript
jquery Moblie入门—hello world的示例代码学习
2013/01/08 Javascript
探讨在JQuery和Js中,如何让ajax执行完后再继续往下执行
2013/07/09 Javascript
jquery的map与get方法详解
2013/11/04 Javascript
详解JavaScript函数
2015/12/01 Javascript
第三篇Bootstrap网格基础
2016/06/21 Javascript
vue.js源代码core scedule.js学习笔记
2017/07/03 Javascript
for循环 + setTimeout 结合一些示例(前端面试题)
2017/08/30 Javascript
javascript原型链学习记录之继承实现方式分析
2019/05/01 Javascript
vue 引用自定义ttf、otf、在线字体的方法
2019/05/09 Javascript
JS实现动态添加外部js、css到head标签的方法
2019/06/05 Javascript
Vue Router 实现动态路由和常见问题及解决方法
2020/03/06 Javascript
JavaScript函数重载操作实例浅析
2020/05/02 Javascript
Vue项目中使用mock.js的完整步骤
2021/01/12 Vue.js
vue-cli 3如何使用vue-bootstrap-datetimepicker日期插件
2021/02/20 Vue.js
python 解析XML python模块xml.dom解析xml实例代码
2014/02/07 Python
用tensorflow实现弹性网络回归算法
2018/01/09 Python
Python实现iOS自动化打包详解步骤
2018/10/03 Python
python绘制已知点的坐标的直线实例
2019/07/04 Python
django组合搜索实现过程详解(附代码)
2019/08/06 Python
Python银行系统实战源码
2019/10/25 Python
django 实现手动存储文件到model的FileField
2020/03/30 Python
如何在pycharm中安装第三方包
2020/10/27 Python
pycharm 配置svn的图文教程(手把手教你)
2021/01/15 Python
python使用scapy模块实现ping扫描的过程详解
2021/01/21 Python
什么是重载?CTS、CLS和CLR分别做何解释
2012/05/06 面试题
工程类专业自荐信范文
2014/03/09 职场文书
合作合同协议书
2016/03/21 职场文书
如何利用pygame实现打飞机小游戏
2021/05/30 Python
uniapp引入支付宝原生扫码插件步骤详解
2022/07/23 Javascript