vue專案中微信登入的實現操作
1、下載元件 wxlogin
npm install vue-wxlogin --save
2、引入元件,給元件傳參
3、重定向的url應該是微信登入官網中的微信授權作用域
4、如果url裡面有埠號,微信授權作用裡面也要有
5、重定向的url:需要在http://tool.chinaz.com/tools/urlencode.aspx中轉碼
6、微信登入成功後,會自動重定向到新地址,此時的位址列中就有code引數
7、如果報錯說不能從元件跳到頁面,那就找到wxlogin元件裡面的iframe標籤,加上這個屬性:sandbox=“allow-scripts allow-top-navigation allow-same-origin”
報錯內容:
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.```
補充知識:vue移動端微信授權登入外掛封裝
1.新建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
2.main.js中匯入
import wechatAuth from './plugins/wechatAuth'//微信登入外掛 const qs= require('qs'); Vue.use(wechatAuth,{appid: XXXXXXXXX});
3.路由鉤子中可以進行相關操作
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() } });
2018.8.31更新
更新微信授權登入vue-cli 3.x與2.x的demo vue-wechat-login,檢視對應分支即可。
2019.7.23更新
程式碼進行了相關重構 vue-wechat-login
以上這篇vue專案中微信登入的實現操作就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。