vue移动端微信授权登录插件封装

新建wechatAuth.js文件

const qs = require('qs')
//应用授权作用域,snsapi_base (不弹出授权页面,直接跳转,只能获取用户openid),snsapi_userinfo (弹出授权页面,可通过openid拿到昵称、性别、所在地。并且,即使在未关注的情况下,只要用户授权,也能获取其信息)
const SCOPES = ['snsapi_base', 'snsapi_userinfo']

class VueWechatAuthPlugin {

  constructor () {
    this.appid = null
    this.redirect_uri = null
    this.scope = SCOPES[1]
    this._code = null
    this._redirect_uri = null
  }

  install (Vue, options) {
    let wechatAuth = this
    this.setAppId(options.appid)
    Vue.mixin({
      created: function () {
        this.$wechatAuth = wechatAuth
      },
    })

  }

  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 = qs.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()

if (typeof window !== 'undefined' && window.Vue) {
  window.Vue.use(VueWechatAuthPlugin)
}

export default vueWechatAuthPlugin

main.js中导入

import wechatAuth from './plugins/wechatAuth'//微信登录插件
const qs= require('qs');

Vue.use(wechatAuth, {appid: XXXXXXXXX});

路由钩子中可以进行相关操作

router.beforeEach((to, from, next) => {
  if (store.state.loginStatus == 0) {
   //微信未授权登录跳转到授权登录页面
    let url = window.location.href;
    //解决重复登录url添加重复的code与state问题
    let parseUrl = qs.parse(url.split('?')[1]);
    let loginUrl;
    if (parseUrl.code && parseUrl.state) {
      delete parseUrl.code;
      delete parseUrl.state;
      loginUrl = `${url.split('?')[0]}?${qs.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()
  }
});

GitHub地址:vue-wechat-login

  • 2020.11.07更新:代码进行vue 3.0 typescript重构。
  • 2021.03.15更新:新增vite版本。
  • 7
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 35
    评论
评论 35
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小黑ii

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值