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 相关文章推荐
js实时监听文本框状态的方法
Apr 26 Javascript
关于jQuery object and DOM element
Apr 15 Javascript
document.execCommand()的用法小结
Jan 08 Javascript
jQuery实现在下拉列表选择时获取json数据的方法
Apr 16 Javascript
JS根据浏览器窗口大小实时动态改变网页文字大小的方法
Feb 25 Javascript
Three.js学习之文字形状及自定义形状
Aug 01 Javascript
浅谈Node.js:fs文件系统模块
Dec 08 Javascript
jQuery实现拖动剪裁图片作为头像
Dec 28 Javascript
js获取一组日期中最近连续的天数
May 25 Javascript
vue 不使用select实现下拉框功能(推荐)
May 17 Javascript
vue实现todolist基本功能以及数据存储功能实例详解
Apr 11 Javascript
解决Layui数据表格的宽高问题
Sep 28 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
PHP获取网站域名和地址的代码
2008/08/17 PHP
PHP遍历二维数组的代码
2011/04/22 PHP
解析php php_openssl.dll的作用
2013/07/01 PHP
浅谈PHP调用Webservice思路及源码分享
2014/06/04 PHP
ThinkPHP实现将SESSION存入MYSQL的方法
2014/07/22 PHP
php实现的Captcha验证码类实例
2014/09/22 PHP
PHP实现HTML页面静态化的方法
2015/11/04 PHP
PHP定时任务获取微信access_token的方法
2016/10/10 PHP
图片自动更新(说明)
2006/10/02 Javascript
javascript 短路法代码精简
2009/08/20 Javascript
THREE.JS入门教程(3)着色器-下
2013/01/24 Javascript
Js 获取Gridview选中行的内容操作步骤
2013/02/05 Javascript
DWZ刷新dialog解决方法
2013/03/03 Javascript
js继承call()和apply()方法总结
2014/12/08 Javascript
javascript面向对象之访问对象属性的两种方式分析
2015/01/13 Javascript
jquery动态导航插件dynamicNav用法实例分析
2015/09/06 Javascript
AngularJS模块学习之Anchor Scroll
2016/01/19 Javascript
JavaScript的Ext JS框架中的GridPanel组件使用指南
2016/05/21 Javascript
全面解析Bootstrap中form、navbar的使用方法
2016/05/30 Javascript
Vue 通过自定义指令回顾v-内置指令(小结)
2018/09/03 Javascript
简单了解小程序+node梳理登陆流程
2019/06/24 Javascript
Python编程图形库之Pillow使用方法讲解
2018/12/28 Python
Python使用pydub库对mp3与wav格式进行互转的方法
2019/01/10 Python
Python3分析处理声音数据的例子
2019/08/27 Python
Python统计学一数据的概括性度量详解
2020/03/03 Python
Django模型中字段属性choice使用说明
2020/03/30 Python
python基于exchange函数发送邮件过程详解
2020/11/06 Python
python中用Scrapy实现定时爬虫的实例讲解
2021/01/18 Python
HTML5 Canvas渐进填充与透明实现图像的Mask效果
2013/07/11 HTML / CSS
店长职务说明书
2014/02/04 职场文书
企业宣传策划方案
2014/05/29 职场文书
2015年学校图书室工作总结
2015/05/19 职场文书
大学校园餐饮创业计划书
2019/08/07 职场文书
python b站视频下载的五种版本
2021/05/27 Python
React Fragment介绍与使用详解
2021/11/11 Javascript
vue实现登陆页面开发实践
2022/05/30 Vue.js