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 相关文章推荐
解决AJAX中跨域访问出现'没有权限'的错误
Aug 20 Javascript
一个简单的网站访问JS计数器 刷新1次加1次访问
Sep 20 Javascript
JQuery实现动态适时改变字体颜色的方法
Mar 10 Javascript
jQuery实现简单二级下拉菜单
Apr 12 Javascript
详解Javacript和AngularJS中的Promises
Feb 09 Javascript
JavaScript随机打乱数组顺序之随机洗牌算法
Aug 02 Javascript
详细讲解JavaScript中的this绑定
Oct 10 Javascript
Vue.js:使用Vue-Router 2实现路由功能介绍
Feb 22 Javascript
JavaScript中附件预览功能实现详解(推荐)
Aug 15 Javascript
vuejs选中当前样式active的实例
Aug 22 Javascript
vue无限轮播插件代码实例
May 10 Javascript
JS遍历树层级关系实现原理解析
Aug 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获取指定月份第一天和最后一天的方法
2015/07/18 PHP
thinkphp跨库操作的简单代码实例
2016/09/22 PHP
php版阿里云OSS图片上传类详解
2016/12/01 PHP
PHP封装的多文件上传类实例与用法详解
2017/02/07 PHP
centos7上编译安装php7以php-fpm方式连接apache
2018/11/08 PHP
Laravel jwt 多表(多用户端)验证隔离的实现
2019/12/18 PHP
php经典趣味算法实例代码
2020/01/21 PHP
js资料toString 方法
2007/03/13 Javascript
Jquery Ajax学习实例6 向WebService发出请求,返回DataSet(XML) 异步调用
2010/03/18 Javascript
jquery.bgiframe.js在IE9下提示INVALID_CHARACTER_ERR错误
2013/01/11 Javascript
JQuery的自定义事件代码,触发,绑定简单实例
2013/08/01 Javascript
js浮点数精确计算(加、减、乘、除)
2013/12/26 Javascript
jQuery判断当前点击的是第几个li的代码
2014/09/26 Javascript
深入探讨JavaScript String对象
2015/03/09 Javascript
JavaScript实现梯形乘法表的方法
2015/04/25 Javascript
vue主动刷新页面及列表数据删除后的刷新实例
2018/09/16 Javascript
VUE实现可随意拖动的弹窗组件
2018/09/25 Javascript
Node.js动手撸一个静态资源服务器的方法
2019/03/09 Javascript
ES6入门教程之Array.from()方法
2019/03/23 Javascript
基于vue写一个全局Message组件的实现
2019/08/15 Javascript
[02:32]DOTA2英雄基础教程 美杜莎
2014/01/07 DOTA
[34:41]夜魇凡尔赛茶话会 第二期02:你画我猜
2021/03/11 DOTA
解决python3运行selenium下HTMLTestRunner报错的问题
2018/12/27 Python
python处理“
2019/06/10 Python
Python全栈之列表数据类型详解
2019/10/01 Python
python创建学生成绩管理系统
2019/11/22 Python
python ftplib模块使用代码实例
2019/12/31 Python
pytorch中的上采样以及各种反操作,求逆操作详解
2020/01/03 Python
python对execl 处理操作代码
2020/06/22 Python
iphoneX 适配客户端H5页面的方法教程
2017/12/08 HTML / CSS
MediaMarkt比利时:欧洲最大电器连锁店
2020/12/21 全球购物
数控技术应用个人求职信范文
2014/02/03 职场文书
博士生专家推荐信
2014/09/26 职场文书
终止劳动合同证明书样本
2014/11/19 职场文书
2015年质量月活动总结报告
2015/03/27 职场文书
2019个人半年工作总结
2019/06/21 职场文书