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 相关文章推荐
jcarousellite.js 基于Jquery的图片无缝滚动插件
Dec 30 Javascript
js实现网站最上边可关闭的浮动广告条代码
Sep 04 Javascript
神奇!js+CSS+DIV实现文字颜色渐变效果
Mar 16 Javascript
基于jquery实现弹幕效果
Sep 29 Javascript
微信小程序 用户数据解密详细介绍
Jan 09 Javascript
Ajax跨域实现代码(后台jsp)
Jan 21 Javascript
详谈Ajax请求中的async:false/true的作用(ajax 在外部调用问题)
Feb 10 Javascript
EasyUI的TreeGrid的过滤功能的解决思路
Aug 08 Javascript
nvm、nrm、npm 安装和使用详解(小结)
Jan 17 Javascript
微信小程序云函数添加数据到数据库的方法
Mar 04 Javascript
JavaScript 实现轮播图特效的示例
Nov 05 Javascript
vue打包时去掉所有的console.log
Apr 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
简单谈谈 php 文件锁
2017/02/19 PHP
javascript使用activex控件的代码
2011/01/27 Javascript
精通Javascript系列之数据类型 字符串
2011/06/08 Javascript
Javascript图像处理—亮度对比度应用案例
2013/01/03 Javascript
Extjs3.0 checkboxGroup 动态添加item实现思路
2013/08/14 Javascript
wap浏览自动跳转到wap页面的js代码
2014/05/17 Javascript
node.js学习总结之调式代码的方法
2014/06/25 Javascript
jQuery提示效果代码分享
2014/11/20 Javascript
jQuery实现带动画效果的多级下拉菜单代码
2015/09/08 Javascript
jquery实现全屏滚动
2015/12/28 Javascript
纯js实现手风琴效果
2020/04/17 Javascript
JavaScript使用forEach()与jQuery使用each遍历数组时return false 的区别
2016/08/26 Javascript
详解Bootstrap各式各样的按钮(推荐)
2016/12/13 Javascript
nodejs爬虫遇到的乱码问题汇总
2017/04/07 NodeJs
JS实现仿饿了么在浏览器标签页失去焦点时网页Title改变
2017/06/01 Javascript
js实现鼠标拖拽多选功能示例
2017/08/01 Javascript
使用JavaScript保存文本文件到本地的两种方法
2019/01/22 Javascript
vue+django实现一对一聊天功能的实例代码
2019/07/17 Javascript
vue 自动化路由实现代码
2019/09/03 Javascript
用原生JS实现爱奇艺首页导航栏代码实例
2019/09/19 Javascript
使用Vue实现调用接口加载页面初始数据
2019/10/28 Javascript
Python程序设计入门(2)变量类型简介
2014/06/16 Python
简单介绍Python中利用生成器实现的并发编程
2015/05/04 Python
Python3.5面向对象程序设计之类的继承和多态详解
2019/04/24 Python
Django中的用户身份验证示例详解
2019/08/07 Python
Python树莓派学习笔记之UDP传输视频帧操作详解
2019/11/15 Python
Python中的X[:,0]、X[:,1]、X[:,:,0]、X[:,:,1]、X[:,m:n]和X[:,:,m:n]
2020/02/13 Python
Django 项目通过加载不同env文件来区分不同环境
2020/02/17 Python
如何利用Python写个坦克大战
2020/11/18 Python
pandas将list数据拆分成行或列的实现
2020/12/13 Python
银行财务部实习生的自我鉴定
2013/11/27 职场文书
护理专业毕业生自我鉴定总结
2014/03/24 职场文书
上海世博会志愿者口号
2014/06/17 职场文书
学校开学标语
2014/10/06 职场文书
离婚协议书范本(通用篇)
2014/11/30 职场文书
能用CSS实现的就不要麻烦JavaScript了
2021/10/05 HTML / CSS