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 相关文章推荐
dwr spring的集成实现代码
Mar 22 Javascript
javascript web页面刷新的方法收集
Jul 02 Javascript
jQuery 隔行换色 支持键盘上下键,按Enter选定值
Aug 02 Javascript
javascript 闭包详解
Feb 15 Javascript
浅析JavaScript事件和方法
Feb 28 Javascript
jQuery获得指定元素坐标的方法
Apr 14 Javascript
基于BootStrap Metronic开发框架经验小结【五】Bootstrap File Input文件上传插件的用法详解
May 12 Javascript
jQuery插件form-validation-engine正则表达式操作示例
Feb 09 Javascript
Vue实现选择城市功能
May 27 Javascript
如何基于js判断浏览器版本
Feb 20 Javascript
如何搭建一个完整的Vue3.0+ts的项目步骤
Oct 18 Javascript
vuex页面刷新导致数据丢失的解决方案
Dec 10 Vue.js
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
二次元帅气男生排行榜,只想悄悄收藏系列
2020/03/04 日漫
phpcms手机内容页面添加上一篇和下一篇
2015/06/05 PHP
PHP中通过trigger_error触发PHP错误示例
2015/06/23 PHP
php基于websocket搭建简易聊天室实践
2016/10/24 PHP
Django 标签筛选的实现代码(一对多、多对多)
2018/09/05 PHP
PHP ajax+jQuery 实现批量删除功能实例代码小结
2018/12/06 PHP
PHP错误提示It is not safe to rely on the system……的解决方法
2019/03/25 PHP
Javascript对象属性方法汇总
2013/11/21 Javascript
浅析js设置控件的readonly与enabled属性问题
2013/12/25 Javascript
JQuery中extend的用法实例分析
2015/02/08 Javascript
jquery实现未经美化的简洁TAB菜单效果
2015/08/28 Javascript
在javascript中使用com组件的简单实现方法
2016/08/17 Javascript
Angular2使用Guard和Resolve进行验证和权限控制
2017/04/24 Javascript
vue2.0使用swiper组件实现轮播效果
2017/11/27 Javascript
axios取消请求的实践记录分享
2018/09/26 Javascript
在vue中使用echarts图表实例代码详解
2018/10/22 Javascript
jquery图片预览插件实现方法详解
2019/07/18 jQuery
利用Python和OpenCV库将URL转换为OpenCV格式的方法
2015/03/27 Python
python实现kNN算法
2017/12/20 Python
利用python画出折线图
2018/07/26 Python
python打开文件的方式有哪些
2020/06/29 Python
使用CSS3中的calc()属性来以算式表达尺寸数值
2016/06/06 HTML / CSS
HTML5 visibilityState属性详细介绍和使用实例
2014/05/03 HTML / CSS
Quiksilver荷兰官方网站:冲浪和滑雪板
2019/11/16 全球购物
main 函数执行以前,还会执行什么代码
2013/04/17 面试题
家长对小学生的评语
2014/01/28 职场文书
幼儿教师师德承诺书
2014/05/23 职场文书
精神文明建设标语
2014/06/16 职场文书
企业员工爱岗敬业演讲稿
2014/08/26 职场文书
毕业横幅标语
2014/10/08 职场文书
预备党员群众路线思想汇报2014
2014/10/25 职场文书
2014年学校党建工作汇报材料
2014/11/02 职场文书
2014年音乐教师工作总结
2014/12/03 职场文书
2015年实习单位评语
2015/03/25 职场文书
网络研修随笔感言
2015/11/18 职场文书
500字作文之难忘的同学
2019/12/20 职场文书