1. 程式人生 > >vue微信授權登入外掛封裝

vue微信授權登入外掛封裝

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'//微信登入外掛

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

3.路由鉤子中可以進行相關操作

router.beforeEach((to, from, next) => {
  if (store.state.loginStatus == 0) {
    //微信未授權登入跳轉到授權登入頁面
    wechatAuth.redirect_uri = window.location.href
    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()
  }
});