最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解vue微信網(wǎng)頁授權(quán)最終解決方案

 更新時(shí)間:2019年06月16日 10:48:19   作者:乖摸摸頭  
這篇文章主要介紹了 詳解vue微信網(wǎng)頁授權(quán)最終解決方案,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧

vue微信網(wǎng)頁授權(quán),基于vue-cli3.0+webpack 4+vant ui + sass+ rem適配方案+axios,開發(fā)的微信授權(quán)方案。項(xiàng)目地址:vue-wechat-auth

參考了[vue-wechat-login],思路有些不同,本文基于進(jìn)入所有頁面都必須先授權(quán)的操作。

與之前寫的授權(quán)不同之處

這次的邏輯全部在router的beforeEach進(jìn)行,相較更加簡潔明。之前是在一個(gè)中間頁author.vue中,加上微信授權(quán)要跳轉(zhuǎn)很多次

在這里你能找到

微信網(wǎng)頁授權(quán)前端解決方案,官方文檔

如何使用Natapp(ngrok)進(jìn)行微信本地開發(fā)調(diào)試,官方文檔

如何配置微信開發(fā)測試賬號(hào)

關(guān)于測試賬號(hào)和本地開發(fā)設(shè)置

由于文章過長這里[微信測試賬號(hào)和本地開發(fā)調(diào)試]記得回來哦~

微信網(wǎng)頁授權(quán)

都設(shè)置好了那就開始微信網(wǎng)頁開發(fā)第一步也是最重要的一步,微信網(wǎng)頁授權(quán)

關(guān)于授權(quán)你首先要清楚的是,服務(wù)端要用到的是微信openid還是微信unionid,這兩者的區(qū)別是,如果你要的是unionid,那么你需要在[微信開放平臺(tái)]去綁定測試賬號(hào)。測試號(hào)的appId和appsecret在微信公眾平臺(tái)的測試號(hào)里找。微信公眾號(hào)后臺(tái)->開發(fā)者工具->公眾平臺(tái)測試帳號(hào)->進(jìn)入

如果你不需要unionid,那這個(gè)你就可以省略, 如果服務(wù)端是需要unionid的那不綁定的話授權(quán)會(huì)把報(bào)錯(cuò)的。記得問一下服務(wù)端開發(fā)人員哦。

開發(fā)

首先我們看下微信授權(quán)的流程圖,關(guān)于微信網(wǎng)頁授權(quán)

前端需要做的是

第一步:用戶同意授權(quán),獲取code,拼接微信授權(quán)地址,redirect_uri就是你的當(dāng)前地址,關(guān)于appid有些人是通過接口獲取的,我這里就直接寫在項(xiàng)目全局變量里了VUE_APP_WECHAT_APPID,用戶授權(quán)成功后微信會(huì)攜帶code和status跳回來

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傳給服務(wù)端,小哥哥進(jìn)行一系列的操作,通過code換取網(wǎng)頁授權(quán)access_token,拉取用戶信息(需scope為 snsapi_userinfo),返回是否登錄成功,成功后返回用戶信息和登錄令牌 token

在permission.js中路由攔截進(jìn)行這一系列操作,代碼注釋很詳細(xì)了

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)
 // 頁面標(biāo)題
 document.title = getPageTitle(to.meta.title)
 if (loginStatus === 0) {
 // 微信未授權(quán)登錄跳轉(zhuǎn)到授權(quán)登錄頁面
 const url = window.location.href
 // 解決重復(fù)登錄url添加重復(fù)的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
 }
 // 設(shè)置微信授權(quán)回調(diào)地址
 wechatAuth.redirect_uri = loginUrl
 // 無論拒絕還是授權(quán)都設(shè)置成1
 store.dispatch('user/setLoginStatus', 1)
 // 跳轉(zhuǎn)到微信授權(quán)頁面
 window.location.href = wechatAuth.authUrl
 } else if (loginStatus === 1) {
 // 用戶已授權(quán),獲取code
 try {
 // 通過回調(diào)鏈接設(shè)置code status
 wechatAuth.returnFromWechat(to.fullPath)
 } catch (err) {
 // 失敗,設(shè)置狀態(tài)未登錄,刷新頁面
 store.dispatch('user/setLoginStatus', 0)
 location.reload()
 }
 // 同意授權(quán) to.fullPath 攜帶code參數(shù),拒絕授權(quán)沒有code參數(shù)
 const code = wechatAuth.code
 if (code) {
 // 拿到code 訪問服務(wù)端的登錄接口
 store
 .dispatch('user/loginWechatAuth', code)
 .then(res => {
  // 成功設(shè)置已登錄狀態(tài)
  store.dispatch('user/setLoginStatus', 2)
  next()
 })
 .catch(() => {
  // 失敗,設(shè)置狀態(tài)未登錄,刷新頁面
  store.dispatch('user/setLoginStatus', 0)
  location.reload()
 })
 } else {
 store.dispatch('user/setLoginStatus', 0)
 location.reload()
 }
 } else {
 // 已登錄直接進(jìn)入
 next()
 }
})

登錄成功后存用戶信息,token。訪問所有的接口的時(shí)候都會(huì)在header攜帶token,如果token失效了,服務(wù)端會(huì)返回401,做退出操作,刪除登錄狀態(tài),用戶信息,token,刷新頁面重新進(jìn)入。

request.js

 // 登錄超時(shí),重新登錄 
 if (res.status === 401) { 
 store.dispatch('user/fedLogOut').then(() => { 
 location.reload() 
 }) 
} 

用戶登錄后將token和用戶信息存入storage中,登錄狀態(tài)設(shè)置到cookie里,store user中主要是進(jìn)行用戶信息存貯獲取刪除的操作

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(), // 登錄狀態(tài)
 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 = {
 // 登錄相關(guān),通過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)
 })
 })
 },
 // 設(shè)置狀態(tài)
 setLoginStatus({ commit }, query) {
 if (query === 0 || query === 1) {
 // 上線打開注釋,本地調(diào)試注釋掉,保持信息最新
 removeToken()
 removeUserInfo()
 }
 // 設(shè)置不同的登錄狀態(tài)
 commit('SET_LOGIN_STATUS', saveLoginStatus(query))
 },
 // 登出
 fedLogOut() {
 // 刪除token,用戶信息,登陸狀態(tài)
 removeToken()
 removeUserInfo()
 removeLoginStatus()
 }
}

export default {
 namespaced: true,
 state,
 mutations,
 actions
}

在根目錄下.env開頭的三個(gè)文件中設(shè)置微信appID

VUE_APP_WECHAT_APPID='12345678'復(fù)制代碼

授權(quán)再也難不住我了,如果哪里有問題希望大家給我留言糾正,互相學(xué)習(xí)

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Vue項(xiàng)目中ESLint配置超全指南(VScode)

    Vue項(xiàng)目中ESLint配置超全指南(VScode)

    ESLint是一個(gè)代碼檢查工具,用來檢查你的代碼是否符合指定的規(guī)范,下面這篇文章主要給大家介紹了關(guān)于Vue項(xiàng)目中ESLint配置(VScode)的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-04-04
  • ElementUI級(jí)聯(lián)選擇器實(shí)現(xiàn)同一父級(jí)下最多只能選中一個(gè)子級(jí)

    ElementUI級(jí)聯(lián)選擇器實(shí)現(xiàn)同一父級(jí)下最多只能選中一個(gè)子級(jí)

    本文主要介紹了ElementUI級(jí)聯(lián)選擇器實(shí)現(xiàn)同一父級(jí)下最多只能選中一個(gè)子級(jí),同一父級(jí)下的子節(jié)點(diǎn)單選,又可以選擇多個(gè)不同父級(jí)下的節(jié)點(diǎn),具有一定參考價(jià)值,感興趣的可以了解一下
    2023-10-10
  • vue粘貼復(fù)制功能的實(shí)現(xiàn)過程記錄

    vue粘貼復(fù)制功能的實(shí)現(xiàn)過程記錄

    最近在項(xiàng)目中遇到點(diǎn)擊按鈕復(fù)制鏈接功能,所以這篇文章主要給大家介紹了關(guān)于vue粘貼復(fù)制功能的實(shí)現(xiàn)過程,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-03-03
  • VUE+Express+MongoDB前后端分離實(shí)現(xiàn)一個(gè)便簽墻

    VUE+Express+MongoDB前后端分離實(shí)現(xiàn)一個(gè)便簽墻

    這篇文章主要介紹了VUE+Express+MongoDB前后端分離實(shí)現(xiàn)一個(gè)便簽墻,需要的朋友可以參考下
    2021-04-04
  • vue實(shí)現(xiàn)按鈕的長按功能

    vue實(shí)現(xiàn)按鈕的長按功能

    這篇文章主要介紹了vue實(shí)現(xiàn)按鈕的長按功能,點(diǎn)擊按鈕實(shí)現(xiàn)長按,用戶需要按下按鈕幾秒鐘,然后觸發(fā)相應(yīng)的事件,本文通過實(shí)例代碼給大家分享實(shí)現(xiàn)思路,感興趣的朋友一起看看吧
    2022-01-01
  • Vue使用vue-draggable 插件在不同列表之間拖拽功能

    Vue使用vue-draggable 插件在不同列表之間拖拽功能

    這篇文章主要介紹了使用vue-draggable 插件在不同列表之間拖拽,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-03-03
  • 通過vue提供的keep-alive減少對服務(wù)器的請求次數(shù)

    通過vue提供的keep-alive減少對服務(wù)器的請求次數(shù)

    這篇文章主要介紹了通過vue提供的keep-alive減少對服務(wù)器的請求次數(shù),文中給大家補(bǔ)充介紹了vue路由開啟keep-alive時(shí)的注意點(diǎn),需要的朋友可以參考下
    2018-04-04
  • vue隨機(jī)驗(yàn)證碼組件的封裝實(shí)現(xiàn)

    vue隨機(jī)驗(yàn)證碼組件的封裝實(shí)現(xiàn)

    這篇文章主要為大家詳細(xì)介紹了如何封裝一個(gè)隨機(jī)驗(yàn)證碼的VUE組件,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-02-02
  • 基于vue-router 多級(jí)路由redirect 重定向的問題

    基于vue-router 多級(jí)路由redirect 重定向的問題

    今天小編就為大家分享一篇基于vue-router 多級(jí)路由redirect 重定向的問題,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-09-09
  • Vuex中狀態(tài)管理器的使用詳解

    Vuex中狀態(tài)管理器的使用詳解

    這篇文章主要介紹了Vuex狀態(tài)管理器的使用,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-06-06

最新評(píng)論

钦州市| 聂拉木县| 板桥市| 刚察县| 冕宁县| 惠水县| 尖扎县| 交城县| 博乐市| 綦江县| 隆子县| 拜城县| 仙桃市| 北票市| 上虞市| 彰化市| 定安县| 肃北| 墨江| 方正县| 开原市| 上思县| 特克斯县| 临潭县| 玛多县| 五河县| 甘洛县| 嫩江县| 新干县| 晴隆县| 开远市| 岳普湖县| 龙州县| 营山县| 峨眉山市| 大港区| 枣强县| 吉木乃县| 运城市| 枣庄市| 稷山县|