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 一段左右两边随屏滚动的代码
Jun 18 Javascript
jquery div 居中技巧应用介绍
Nov 24 Javascript
js arguments对象应用介绍
Nov 28 Javascript
js数字转换为float,取N位小数
Feb 08 Javascript
Enter回车切换输入焦点实现思路与代码兼容各大浏览器
Sep 01 Javascript
点击按钮出现60秒倒计时的简单js代码(推荐)
Jun 07 Javascript
微信小程序实现移动端滑动分页效果(ajax)
Jun 13 Javascript
vue+iview 兼容IE11浏览器的实现方法
Jan 07 Javascript
JS中实现浅拷贝和深拷贝的代码详解
Jun 05 Javascript
微信小程序吸底区域适配iPhoneX的实现
Apr 09 Javascript
微信小程序实现左滑删除效果
Nov 18 Javascript
vue使用lodop打印控件实现浏览器兼容打印的方法
Feb 07 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的fsockopen、pfsockopen函数被主机商禁用的解决办法
2014/07/08 PHP
php版微信公众平台入门教程之开发者认证的方法
2016/09/26 PHP
jQuery 方法大全方便学习参考
2010/02/25 Javascript
js的压缩及jquery压缩探讨(提高页面加载性能/保护劳动成果)
2013/01/29 Javascript
JQUERY实现左侧TIPS滑进滑出效果示例
2013/06/27 Javascript
js检测浏览器版本、核心、是否移动端示例
2014/04/24 Javascript
JS兼容浏览器的导出Excel(CSV)文件的方法
2014/05/03 Javascript
jQuery遍历对象、数组、集合实例
2014/11/08 Javascript
JQuery实现动态适时改变字体颜色的方法
2015/03/10 Javascript
jQuery实现渐变下拉菜单的简单方法
2015/03/11 Javascript
Javascript中的数据类型之旅
2015/10/18 Javascript
深入浅析Node.js 事件循环
2015/12/20 Javascript
JavaScript禁止用户多次提交的两种方法
2016/07/24 Javascript
老生常谈JavaScript 函数表达式
2016/09/01 Javascript
限时抢购-倒计时的完整实例(分享)
2017/09/17 Javascript
vue.js父子组件通信动态绑定的实例
2018/09/28 Javascript
Node.js+Express+Mysql 实现增删改查
2019/04/03 Javascript
如何使用JavaScript实现栈与队列
2019/06/24 Javascript
vue-simple-uploader上传成功之后的response获取代码
2020/09/07 Javascript
js实现头像上传并且可预览提交
2020/12/25 Javascript
python类型强制转换long to int的代码
2013/02/10 Python
优化Python代码使其加快作用域内的查找
2015/03/30 Python
详解Python中的元组与逻辑运算符
2015/10/13 Python
Python中模块pymysql查询结果后如何获取字段列表
2017/06/05 Python
python对离散变量的one-hot编码方法
2018/07/11 Python
详解PyTorch中Tensor的高阶操作
2019/08/18 Python
python如何支持并发方法详解
2020/07/25 Python
Python如何把字典写入到CSV文件的方法示例
2020/08/23 Python
Python3中FuzzyWuzzy库实例用法
2020/11/18 Python
利用CSS3的transition属性实现滑动效果
2015/08/05 HTML / CSS
介绍一下Transact-SQL中SPACE函数的用法
2015/09/01 面试题
函授本科毕业生自我鉴定
2013/10/16 职场文书
法学专业求职信
2014/07/15 职场文书
在职证明范本
2015/06/15 职场文书
六年级数学教学反思
2016/02/16 职场文书
OpenCV-Python实现人脸磨皮算法
2021/06/07 Python