又又又一次來寫微信網頁受權,一年前寫過的 [vue 微信受權解決方案]。javascript
參考了[vue-wechat-login],思路有些不一樣,本文基於進入全部頁面都必須先受權的操做。前端
此次的邏輯所有在router的beforeEach進行,相較更加簡潔明。以前是在一箇中間頁author.vue中,加上微信受權要跳轉不少次vue
因爲文章過長這裏[微信測試帳號和本地開發調試]記得回來哦~java
都設置好了那就開始微信網頁開發第一步也是最重要的一步,微信網頁受權webpack
關於受權你首先要清楚的是,服務端要用到的是微信openid仍是微信unionid,這二者的區別是,若是你要的是unionid,那麼你須要在[微信開放平臺]去綁定測試帳號。測試號的appId和appsecret在微信公衆平臺的測試號裏找。微信公衆號後臺->開發者工具->公衆平臺測試賬號->進入ios
若是你不須要unionid,那這個你就能夠省略, 若是服務端是須要unionid的那不綁定的話受權會把報錯的。記得問一下服務端開發人員哦。git
首先咱們看下微信受權的流程圖,關於微信網頁受權github
前端須要作的是web
第一步:用戶贊成受權,獲取code,拼接微信受權地址,redirect_uri就是你的當前地址,關於appid有些人是經過接口獲取的,我這裏就直接寫在項目全局變量裏了VUE_APP_WECHAT_APPID,用戶受權成功後微信會攜帶code和status跳回來vue-cli
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複製代碼
第二步,訪問登陸接口,將code傳給服務端,小哥哥進行一系列的操做,經過code換取網頁受權access_token,拉取用戶信息(需scope爲 snsapi_userinfo),返回是否登陸成功,成功後返回用戶信息和登陸令牌 token
在permission.js中路由攔截進行這一系列操做,代碼註釋很詳細了
permission.js
import router from './router'
import store from './store'
import getPageTitle from '@/utils/get-page-title'
import wechatAuth from './plugins/wechatAuth' // 微信登陸插件
const qs = require('qs')
router.beforeEach((to, from, next) => {
const loginStatus = Number(store.getters.loginStatus)
console.log('loginStatus=' + loginStatus)
console.log('token=' + store.getters.token)
// 頁面標題
document.title = getPageTitle(to.meta.title)
if (loginStatus === 0) {
// 微信未受權登陸跳轉到受權登陸頁面
const url = window.location.href
// 解決重複登陸url添加劇復的code與state問題
const 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
// 不管拒絕仍是受權都設置成1
store.dispatch('user/setLoginStatus', 1)
// 跳轉到微信受權頁面
window.location.href = wechatAuth.authUrl
} else if (loginStatus === 1) {
// 用戶已受權,獲取code
try {
// 經過回調連接設置code status
wechatAuth.returnFromWechat(to.fullPath)
} catch (err) {
// 失敗,設置狀態未登陸,刷新頁面
store.dispatch('user/setLoginStatus', 0)
location.reload()
}
// 贊成受權 to.fullPath 攜帶code參數,拒絕受權沒有code參數
const code = wechatAuth.code
if (code) {
// 拿到code 訪問服務端的登陸接口
store
.dispatch('user/loginWechatAuth', code)
.then(res => {
// 成功設置已登陸狀態
store.dispatch('user/setLoginStatus', 2)
next()
})
.catch(() => {
// 失敗,設置狀態未登陸,刷新頁面
store.dispatch('user/setLoginStatus', 0)
location.reload()
})
} else {
store.dispatch('user/setLoginStatus', 0)
location.reload()
}
} else {
// 已登陸直接進入
next()
}
})
複製代碼
登陸成功後存用戶信息,token。訪問全部的接口的時候都會在header攜帶token,若是token失效了,服務端會返回401,作退出操做,刪除登陸狀態,用戶信息,token,刷新頁面從新進入。
request.js
// 登陸超時,從新登陸
if (res.status === 401) {
store.dispatch('user/fedLogOut').then(() => {
location.reload()
})
}
複製代碼
用戶登陸後將token和用戶信息存入storage中,登陸狀態設置到cookie裏,store user中主要是進行用戶信息存貯獲取刪除的操做
store/modules/user.js
import { loginByCode } from '@/api/user'
import {
saveToken,
saveLoginStatus,
saveUserInfo,
removeToken,
removeUserInfo,
removeLoginStatus,
loadLoginStatus,
loadToken,
loadUserInfo
} from '@/utils/cache'
const state = {
loginStatus: loadLoginStatus(), // 登陸狀態
token: loadToken(), // token
userInfo: loadUserInfo() // 用戶登陸信息
}
const mutations = {
SET_USERINFO: (state, userInfo) => {
state.userInfo = userInfo
},
SET_LOGIN_STATUS: (state, loginStatus) => {
state.loginStatus = loginStatus
},
SET_TOKEN: (state, token) => {
state.token = token
}
}
const actions = {
// 登陸相關,經過code獲取token和用戶信息
loginWechatAuth({ commit }, code) {
const data = {
code: code
}
return new Promise((resolve, reject) => {
loginByCode(data)
.then(res => {
// 存用戶信息,token
commit('SET_USERINFO', saveUserInfo(res.data.user))
commit('SET_TOKEN', saveToken(res.data.token))
resolve(res)
})
.catch(error => {
reject(error)
})
})
},
// 設置狀態
setLoginStatus({ commit }, query) {
if (query === 0 || query === 1) {
// 上線打開註釋,本地調試註釋掉,保持信息最新
removeToken()
removeUserInfo()
}
// 設置不一樣的登陸狀態
commit('SET_LOGIN_STATUS', saveLoginStatus(query))
},
// 登出
fedLogOut() {
// 刪除token,用戶信息,登錄狀態
removeToken()
removeUserInfo()
removeLoginStatus()
}
}
export default {
namespaced: true,
state,
mutations,
actions
}
複製代碼
在根目錄下.env開頭的三個文件中設置微信appID
VUE_APP_WECHAT_APPID='12345678'複製代碼
複製代碼
受權再也難不住我了,若是哪裏有問題但願你們給我留言糾正,互相學習
您能夠掃描添加下方的微信並備註 Sol 加前端交流羣,交流學習。
若是對你有幫助送我一顆小星星(づ ̄3 ̄)づ╭❤~