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

vue項(xiàng)目中微信登錄的實(shí)現(xiàn)操作

 更新時(shí)間:2020年09月08日 14:15:37   作者:my_web_advanced  
這篇文章主要介紹了vue項(xiàng)目中微信登錄的實(shí)現(xiàn)操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧

1、下載組件 wxlogin

npm install vue-wxlogin --save

2、引入組件,給組件傳參

3、重定向的url應(yīng)該是微信登錄官網(wǎng)中的微信授權(quán)作用域

4、如果url里面有端口號(hào),微信授權(quán)作用里面也要有

5、重定向的url:需要在http://tool.chinaz.com/tools/urlencode.aspx中轉(zhuǎn)碼

6、微信登錄成功后,會(huì)自動(dòng)重定向到新地址,此時(shí)的地址欄中就有code參數(shù)

7、如果報(bào)錯(cuò)說(shuō)不能從組件跳到頁(yè)面,那就找到wxlogin組件里面的iframe標(biāo)簽,加上這個(gè)屬性:sandbox=“allow-scripts allow-top-navigation allow-same-origin”

報(bào)錯(cuò)內(nèi)容:

qrconnect?scope=snsapi_login&redirect_uri=http%3a%2f%2f%2f&state=&login_type=jssdk&self_redirect=false&style=black&href=:84 Unsafe JavaScript attempt to initiate navigation for frame with origin 'http://localhost:9020' from frame with URL 'https://open.weixin.qq.com/connect/qrconnect?app&scope=snsapi_login&redirect_uri=http%3a%2f%2f&state=&login_type=jssdk&self_redirect=false&style=black&href='. The frame attempting navigation is targeting its top-level window, but is neither same-origin with its target nor has it received a user gesture. See https://www.chromestatus.com/features/5851021045661696.```

補(bǔ)充知識(shí):vue移動(dòng)端微信授權(quán)登錄插件封裝

1.新建wechatAuth.js文件

const qs = require('qs')
//應(yīng)用授權(quán)作用域,snsapi_base (不彈出授權(quán)頁(yè)面,直接跳轉(zhuǎn),只能獲取用戶openid),snsapi_userinfo (彈出授權(quán)頁(yè)面,可通過(guò)openid拿到昵稱、性別、所在地。并且,即使在未關(guān)注的情況下,只要用戶授權(quán),也能獲取其信息)
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

2.main.js中導(dǎo)入

import wechatAuth from './plugins/wechatAuth'//微信登錄插件
const qs= require('qs');
Vue.use(wechatAuth, {appid: XXXXXXXXX});

3.路由鉤子中可以進(jìn)行相關(guān)操作

router.beforeEach((to, from, next) => {
 if (store.state.loginStatus == 0) {
 //微信未授權(quán)登錄跳轉(zhuǎn)到授權(quán)登錄頁(yè)面
 let url = window.location.href;
 //解決重復(fù)登錄url添加重復(fù)的code與state問(wèn)題
 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()
 }
});

2018.8.31更新

更新微信授權(quán)登錄vue-cli 3.x與2.x的demo vue-wechat-login,查看對(duì)應(yīng)分支即可。

2019.7.23更新

代碼進(jìn)行了相關(guān)重構(gòu) vue-wechat-login

以上這篇vue項(xiàng)目中微信登錄的實(shí)現(xiàn)操作就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • iview實(shí)現(xiàn)動(dòng)態(tài)表單和自定義驗(yàn)證時(shí)間段重疊

    iview實(shí)現(xiàn)動(dòng)態(tài)表單和自定義驗(yàn)證時(shí)間段重疊

    這篇文章主要介紹了iview實(shí)現(xiàn)動(dòng)態(tài)表單和自定義驗(yàn)證時(shí)間段重疊,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • vue鼠標(biāo)移入添加class樣式,鼠標(biāo)移出去除樣式(active)實(shí)現(xiàn)方法

    vue鼠標(biāo)移入添加class樣式,鼠標(biāo)移出去除樣式(active)實(shí)現(xiàn)方法

    今天小編就為大家分享一篇vue鼠標(biāo)移入添加class樣式,鼠標(biāo)移出去除樣式(active)實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-08-08
  • Vue render函數(shù)實(shí)戰(zhàn)之實(shí)現(xiàn)tabs選項(xiàng)卡組件

    Vue render函數(shù)實(shí)戰(zhàn)之實(shí)現(xiàn)tabs選項(xiàng)卡組件

    這篇文章主要介紹了Vue render函數(shù)實(shí)戰(zhàn)之實(shí)現(xiàn)tabs選項(xiàng)卡組件的相關(guān)知識(shí),非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-04-04
  • 10個(gè)Vue3中的編程實(shí)用技巧分享

    10個(gè)Vue3中的編程實(shí)用技巧分享

    這篇文章主要為大家詳細(xì)介紹了10個(gè)Vue3中的編程實(shí)用技巧,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-03-03
  • Vue監(jiān)聽(tīng)數(shù)據(jù)渲染DOM完以后執(zhí)行某個(gè)函數(shù)詳解

    Vue監(jiān)聽(tīng)數(shù)據(jù)渲染DOM完以后執(zhí)行某個(gè)函數(shù)詳解

    今天小編就為大家分享一篇Vue監(jiān)聽(tīng)數(shù)據(jù)渲染DOM完以后執(zhí)行某個(gè)函數(shù)詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-09-09
  • Vue.js學(xué)習(xí)教程之列表渲染詳解

    Vue.js學(xué)習(xí)教程之列表渲染詳解

    這篇文章主要給大家介紹了關(guān)于Vue.js列表渲染的相關(guān)資料,文中介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧。
    2017-05-05
  • vue+canvas繪制時(shí)間軸的方法

    vue+canvas繪制時(shí)間軸的方法

    這篇文章主要為大家詳細(xì)介紹了vue+canvas繪制時(shí)間軸的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • Element Dropdown下拉菜單的使用方法

    Element Dropdown下拉菜單的使用方法

    這篇文章主要介紹了Element Dropdown下拉菜單的使用方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • 深入理解Vue3組合式API的實(shí)現(xiàn)

    深入理解Vue3組合式API的實(shí)現(xiàn)

    組合式API為Vue3帶來(lái)了更好的邏輯組織和復(fù)用性,支持TypeScript,提供靈活的響應(yīng)式系統(tǒng),它允許開(kāi)發(fā)者將相關(guān)邏輯組合在一起,通過(guò)composable函數(shù)實(shí)現(xiàn)邏輯復(fù)用,擺脫了mixin的缺點(diǎn),同時(shí),組合式API與TypeScript的集成更緊密,能夠提供更準(zhǔn)確的類型推斷
    2024-10-10
  • Vue表單驗(yàn)證?trigger:'blur'OR?trigger:'change'區(qū)別解析

    Vue表單驗(yàn)證?trigger:'blur'OR?trigger:'change&ap

    利用?elementUI?實(shí)現(xiàn)表單元素校驗(yàn)時(shí),出現(xiàn)下拉框內(nèi)容選中后校驗(yàn)不消失的異常校驗(yàn)情形,這篇文章主要介紹了Vue表單驗(yàn)證?trigger:‘blur‘?OR?trigger:‘change‘?區(qū)別,需要的朋友可以參考下
    2023-09-09

最新評(píng)論

怀来县| 鱼台县| 新平| 江安县| 察雅县| 包头市| 图们市| 于都县| 施秉县| 寻甸| 泽州县| 晋城| 富平县| 崇州市| 井研县| 夏邑县| 和林格尔县| 彝良县| 额敏县| 宝丰县| 香港| 罗江县| 丰顺县| 永州市| 丰镇市| 元江| 岚皋县| 浦城县| 红桥区| 罗山县| 高尔夫| 龙南县| 年辖:市辖区| 扶绥县| 屏东县| 林口县| 新龙县| 临夏县| 芜湖县| 铜陵市| 鹿邑县|