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 相关文章推荐
jquery聚焦文本框与扩展文本框聚焦方法
Oct 12 Javascript
document.compatMode的CSS1compat使用介绍
Apr 03 Javascript
基于BootStrap Metronic开发框架经验小结【六】对话框及提示框的处理和优化
May 12 Javascript
Javascript函数中的arguments.callee用法实例分析
Sep 16 Javascript
jQueryUI 拖放排序遇到滚动条时有可能无法执行排序的小bug及解决方案
Dec 19 Javascript
webpack 2.x配置reactjs基本开发环境详解
Aug 08 Javascript
Angular2里获取(input file)上传文件的内容的方法
Sep 05 Javascript
VUE-Table上绑定Input通过render实现双向绑定数据的示例
Aug 27 Javascript
详解mpvue中小程序自定义导航组件开发指南
Feb 11 Javascript
微信小程序授权登陆及每次检查是否授权实例代码
Sep 18 Javascript
vue新建项目并配置标准路由过程解析
Dec 09 Javascript
解决vue里a标签值解析变量,跳转页面,前面加默认域名端口的问题
Jul 22 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
Laravel基础_关于view共享数据的示例讲解
2019/10/14 PHP
用js判断页面刷新或关闭的方法(onbeforeunload与onunload事件)
2012/06/22 Javascript
JS常用正则表达式总结
2013/11/12 Javascript
ff下JQuery无法监听input的keyup事件的解决方法
2013/12/12 Javascript
JS 屏蔽按键效果与改变按键效果的示例代码
2013/12/24 Javascript
JavaScript function函数种类详解
2016/02/22 Javascript
深入理解jQuery之事件移除
2016/06/02 Javascript
loading动画特效小结
2017/01/22 Javascript
JavaScript中的this陷阱的最全收集并整理(没有之一)
2017/02/21 Javascript
从零开始学习Node.js系列教程二:文本提交与显示方法
2017/04/13 Javascript
VueJS如何引入css或者less文件的一些坑
2017/04/25 Javascript
js断点调试心得分享(必看篇)
2017/12/08 Javascript
微信小程序实现带参数的分享功能(两种方法)
2019/05/17 Javascript
简述pm2常用命令集合及配置文件说明
2019/05/30 Javascript
编写一个javascript元循环求值器的方法
2020/04/14 Javascript
vue的$http的get请求要加上params操作
2020/11/12 Javascript
使用Python的Twisted框架构建非阻塞下载程序的实例教程
2016/05/25 Python
python urllib爬取百度云连接的实例代码
2017/06/19 Python
python求最大连续子数组的和
2018/07/07 Python
用于业余项目的8个优秀Python库
2018/09/21 Python
Python基础之文件读取的讲解
2019/02/16 Python
pytorch查看torch.Tensor和model是否在CUDA上的实例
2020/01/03 Python
Python面向对象编程基础实例分析
2020/01/17 Python
Python之关于类变量的两种赋值区别详解
2020/03/12 Python
Python执行时间的几种计算方法
2020/07/31 Python
python pymysql库的常用操作
2020/10/16 Python
欧舒丹澳洲版:L’OCCITANE
2017/07/17 全球购物
求职简历中自我评价
2014/01/28 职场文书
大学生毕业自我鉴定范文
2014/02/03 职场文书
同学会主持词
2014/03/18 职场文书
公司员工违纪检讨书
2015/05/05 职场文书
趣味运动会简讯
2015/07/20 职场文书
党章党规党纪学习心得体会
2016/01/14 职场文书
2016年学校“3.12”植树节活动总结
2016/03/16 职场文书
Python基础之pandas数据合并
2021/04/27 Python
我们认为中短波广播场强仪的最佳组合
2022/04/05 无线电