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 显示当前系统时间代码
Dec 28 Javascript
初识javascript 文档碎片
Jul 13 Javascript
Js组件的一些写法
Sep 10 Javascript
JS定时关闭窗口的实例
May 22 Javascript
使用js+jquery实现无限极联动
May 23 Javascript
限制复选框最多选择项的实现代码
May 30 Javascript
Bootstrap零基础学习第一课之模板
Jul 18 Javascript
jQuery的Cookie封装,与PHP交互的简单实现
Oct 05 Javascript
Angular 4.x+Ionic3踩坑之Ionic3.x pop反向传值详解
Mar 13 Javascript
ES6 中可以提升幸福度的小功能
Aug 06 Javascript
vue中使用vue-cli接入融云实现即时通信
Apr 19 Javascript
四十九个javascript小知识实用技巧
Nov 20 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
利用文件属性结合Session实现在线人数统计
2006/10/09 PHP
php 获取远程网页内容的函数
2009/09/08 PHP
设置php页面编码的两种方法示例介绍
2014/03/03 PHP
PHP include任意文件或URL介绍
2014/04/29 PHP
php使用timthumb生成缩略图的方法
2016/01/22 PHP
Laravel 集成 Geetest验证码的方法
2018/05/14 PHP
在IE下:float属性会影响offsetTop的取值
2006/12/22 Javascript
浅谈javascript属性onresize
2015/04/20 Javascript
js中scrollTop()方法和scroll()方法用法示例
2016/10/03 Javascript
Bootstrap的基本应用要点浅析
2016/12/19 Javascript
JavaScript字符串对象
2017/01/14 Javascript
JavaScript编写九九乘法表(两种任选)
2017/02/04 Javascript
weex里Vuex state使用storage持久化详解
2017/09/09 Javascript
react router 4.0以上的路由应用详解
2017/09/21 Javascript
微信小程序实现获取自己所处位置的经纬度坐标功能示例
2017/11/30 Javascript
把vue-router和express项目部署到服务器的方法
2018/02/21 Javascript
详解node.js的http模块实例演示
2018/07/12 Javascript
使用JavaScript破解web
2018/09/28 Javascript
Vue3.0 响应式系统源码逐行分析讲解
2019/10/14 Javascript
js实现自动播放匀速轮播图
2020/02/06 Javascript
JavaScript setTimeout()基本用法有哪些
2020/11/04 Javascript
[05:11]TI9战队采访——VIRTUSPRO
2019/08/22 DOTA
python读取浮点数和读取文本文件示例
2014/05/06 Python
python 和c++实现旋转矩阵到欧拉角的变换方式
2019/12/04 Python
德国购买健身器材:AsVIVA
2017/08/09 全球购物
Laura Mercier官网:彩妆大师罗拉玛斯亚的化妆品牌
2018/01/04 全球购物
MIXIT官网:俄罗斯最大的化妆品公司之一
2020/01/25 全球购物
人事档案接收函
2014/01/12 职场文书
新郎婚宴答谢词
2014/01/19 职场文书
行政副总岗位职责
2014/02/23 职场文书
促销活动总结报告
2014/04/26 职场文书
环境卫生工作汇报材料
2014/10/28 职场文书
2015年清明节扫墓演讲稿
2015/03/18 职场文书
奖励通知
2015/04/22 职场文书
综治目标管理责任书
2015/05/11 职场文书
mysql外连接与内连接查询的不同之处
2021/06/03 MySQL