vue项目中微信登录的实现操作


Posted in Javascript onSeptember 08, 2020

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项目中微信登录的实现操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
input 和 textarea 输入框最大文字限制的jquery插件
Oct 27 Javascript
JavaScript中操作字符串之localeCompare()方法的使用
Jun 06 Javascript
js实现超酷的照片墙展示效果图附源码下载
Oct 08 Javascript
深入浅析javascript中的作用域(推荐)
Jul 19 Javascript
JS 动态判断PC和手机浏览器实现代码
Sep 21 Javascript
js如何判断是否在iframe中及防止网页被别站用iframe嵌套
Jan 11 Javascript
基于javascript的异步编程实例详解
Apr 10 Javascript
详解Vue微信授权登录前后端分离较为优雅的解决方案
Jun 29 Javascript
js中innerText/textContent和innerHTML与target和currentTarget的区别
Jan 21 Javascript
使用koa2创建web项目的方法步骤
Mar 12 Javascript
JS实现拖拽元素时与另一元素碰撞检测
Aug 27 Javascript
vue实现禁止浏览器记住密码功能的示例代码
Feb 03 Vue.js
关于element-ui表单中限制输入纯数字的解决方式
Sep 08 #Javascript
快速解决element的autofocus失效问题
Sep 08 #Javascript
vue axios请求成功却进入catch的原因分析
Sep 08 #Javascript
JavaScript数组类型Array相关的属性与方法详解
Sep 08 #Javascript
vue中后端做Excel导出功能返回数据流前端的处理操作
Sep 08 #Javascript
vue等两个接口都返回结果再执行下一步的实例
Sep 08 #Javascript
基于postman获取动态数据过程详解
Sep 08 #Javascript
You might like
在IIS7.0下面配置PHP 5.3.2运行环境的方法
2010/04/13 PHP
提高php运行速度的一些小技巧分享
2012/07/03 PHP
laravel框架模型和数据库基础操作实例详解
2020/01/25 PHP
利用javascript移动div层-javascript 拖动层
2009/03/22 Javascript
JavaScript 格式字符串的应用
2010/03/29 Javascript
使用js解决由border属性引起的div宽度问题
2013/11/26 Javascript
jQuery表格插件datatables用法总结
2014/09/05 Javascript
基于BootStrap与jQuery.validate实现表单提交校验功能
2016/12/22 Javascript
详解Vuejs2.0之异步跨域请求
2017/04/20 Javascript
Vue Socket.io源码解读
2018/02/07 Javascript
vue translate peoject实现在线翻译功能【新手必看】
2018/06/07 Javascript
使用JavaScript实现node.js中的path.join方法
2018/08/12 Javascript
[45:52]2018DOTA2亚洲邀请赛 4.1小组赛 A组加赛 LGD vs Liquid
2018/04/02 DOTA
python实现的守护进程(Daemon)用法实例
2015/06/02 Python
python3 与python2 异常处理的区别与联系
2016/06/19 Python
通过5个知识点轻松搞定Python的作用域
2016/09/09 Python
通过实例了解python property属性
2019/11/01 Python
python基于plotly实现画饼状图代码实例
2019/12/16 Python
keras 特征图可视化实例(中间层)
2020/01/24 Python
PyQt5事件处理之定时在控件上显示信息的代码
2020/03/25 Python
Jupyter notebook设置背景主题,字体大小及自动补全代码的操作
2020/04/13 Python
解决jupyter运行pyqt代码内核重启的问题
2020/04/16 Python
Python yield生成器和return对比代码实例
2020/04/20 Python
浅谈keras保存模型中的save()和save_weights()区别
2020/05/21 Python
不拖欠农民工工资承诺书
2014/03/31 职场文书
银行竞聘演讲稿范文
2014/04/23 职场文书
小学关爱留守儿童活动方案
2014/08/25 职场文书
2015驻村干部工作总结
2015/04/07 职场文书
余世维讲座观后感
2015/06/11 职场文书
2016党员干部反腐倡廉心得体会
2016/01/13 职场文书
Python绘制分类图的方法
2021/04/20 Python
浅谈mysql增加索引不生效的几种情况
2021/06/23 MySQL
SQL实现LeetCode(176.第二高薪水)
2021/08/04 MySQL
Mysql数据库手动及定时备份步骤
2021/11/07 MySQL
「海贼王」112.9万粉丝纪念图标公布
2022/03/21 日漫
MySQL数据库查询进阶之多表查询详解
2022/04/08 MySQL