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实现单继承和多继承的简单方法
Mar 29 Javascript
javascript 构建一个xmlhttp对象池合理创建和使用xmlhttp对象
Jan 15 Javascript
JS去掉第一个字符和最后一个字符的实现代码
Feb 20 Javascript
jquery实现倒计时代码分享
Jun 13 Javascript
Javascript实现单张图片浏览
Dec 18 Javascript
javascript模拟C#格式化字符串
Aug 26 Javascript
JavaScript数组操作函数汇总
Aug 05 Javascript
javascript与PHP动态往类中添加方法对比
Mar 21 Javascript
Vue.js最佳实践(五招助你成为vuejs大师)
May 04 Javascript
JavaScript数据结构与算法之二叉树插入节点、生成二叉树示例
Feb 21 Javascript
微信小程序 wx:for 与 wx:for-items 与 wx:key的正确用法
May 19 Javascript
addEventListener()和removeEventListener()追加事件和删除追加事件
Dec 04 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
收音机玩机评测 406 篇视频合集
2020/03/11 无线电
PHP5 面向对象程序设计
2008/02/13 PHP
ThinkPHP模板循环输出Volist标签用法实例详解
2016/03/23 PHP
浅析PHP中的i++与++i的区别及效率
2016/06/15 PHP
php+redis实现多台服务器内网存储session并读取示例
2017/01/12 PHP
js 处理URL实用技巧
2010/11/23 Javascript
jQuery.each()用法分享
2012/07/31 Javascript
js用正则表达式来验证表单(比较齐全的资源)
2013/11/17 Javascript
jquery自动将form表单封装成json的具体实现
2014/03/17 Javascript
jQuery1.9.1针对checkbox的调整方法(prop)
2014/05/01 Javascript
Javascript获取当前日期的农历日期代码
2014/10/08 Javascript
AngularJS中的Directive自定义一个表格
2016/01/25 Javascript
animate 实现滑动切换效果【实例代码】
2016/05/05 Javascript
基于jquery实现的鼠标悬停提示案例
2016/12/11 Javascript
Restify中接入Socket.io报Error:Can’t set headers的错误解决
2017/03/28 Javascript
bootstrap table插件动态加载表头
2019/07/19 Javascript
p5.js临摹旋转爱心
2019/10/23 Javascript
Vue 用Vant实现时间选择器的示例代码
2019/10/25 Javascript
jQuery操作动画完整实例分析
2020/01/10 jQuery
[00:34]DOTA2上海特级锦标赛 VG战队宣传片
2016/03/04 DOTA
利用信号如何监控Django模型对象字段值的变化详解
2017/11/27 Python
python3.6连接MySQL和表的创建与删除实例代码
2017/12/28 Python
浅谈flask中的before_request与after_request
2018/01/20 Python
python监控键盘输入实例代码
2018/02/09 Python
Python any()函数的使用方法
2019/10/28 Python
如何写python的配置文件
2020/06/07 Python
基于TensorFlow的CNN实现Mnist手写数字识别
2020/06/17 Python
解决运行出现'dict' object has no attribute 'has_key'问题
2020/07/15 Python
关于Python 解决Python3.9 pandas.read_excel(‘xxx.xlsx‘)报错的问题
2020/11/28 Python
浅谈pc和移动端的响应式的使用
2019/01/03 HTML / CSS
英国假睫毛购买网站:FalseEyelashes.co.uk
2018/05/23 全球购物
介绍一下XMLHttpRequest对象
2012/02/12 面试题
纺织工程专业个人求职信范文
2014/01/27 职场文书
大学生学期自我鉴定
2014/03/19 职场文书
走近毛泽东观后感
2015/06/04 职场文书
关于MySQL中的 like操作符详情
2021/11/17 MySQL