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 相关文章推荐
ExtJs使用总结(非常详细)
Mar 22 Javascript
通过jQuery源码学习javascript(一)
Dec 27 Javascript
JQuery验证jsp页面属性是否为空(实例代码)
Nov 08 Javascript
设为首页和收藏的Javascript代码(亲测兼容IE,Firefox,chrome等浏览器)
Nov 18 Javascript
node.js中的fs.truncateSync方法使用说明
Dec 15 Javascript
使用javascript实现Iframe自适应高度
Dec 24 Javascript
浅析JavaScript中的array数组类型系统
Jul 18 Javascript
js导出excel文件的简洁方法(推荐)
Nov 02 Javascript
vue + vuex todolist的实现示例代码
Mar 09 Javascript
jquery.onoff实现简单的开关按钮功能(推荐)
May 24 jQuery
微信小程序点击滚动到指定位置的实现
May 22 Javascript
在vue中实现清除echarts上次保留的数据(亲测有效)
Sep 09 Javascript
关于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
PHP求最大子序列和的算法实现
2011/06/24 PHP
PHP中return 和 exit 、break和contiue 区别与用法
2012/04/09 PHP
获取DOM对象的几种扩展及简写
2006/10/09 Javascript
javascript 兼容所有浏览器的DOM扩展功能
2012/08/01 Javascript
String.prototype实现的一些javascript函数介绍
2013/11/22 Javascript
对Web开发中前端框架与前端类库的一些思考
2015/03/27 Javascript
js读取并解析JSON类型数据的方法
2015/11/14 Javascript
如何使用Vuex+Vue.js构建单页应用
2016/10/27 Javascript
js制作可以延时消失的菜单
2017/01/13 Javascript
关于iframe跨域POST提交的方法示例
2017/01/15 Javascript
JS常见算法详解
2017/02/28 Javascript
浅谈regExp的test方法取得的值变化的原因及处理方法
2017/03/01 Javascript
浅谈react性能优化的方法
2018/09/05 Javascript
在node中使用jwt签发与验证token的方法
2019/04/03 Javascript
Cordova(ionic)项目实现双击返回键退出应用
2019/09/17 Javascript
vue ssr服务端渲染(小白解惑)
2019/11/10 Javascript
小程序自定义弹框效果
2020/11/16 Javascript
vue实现验证用户名是否可用
2021/01/20 Vue.js
[01:02:46]VGJ.S vs NB 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
[40:12]Liquid vs Chaos 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
Python库urllib与urllib2主要区别分析
2014/07/13 Python
微信跳一跳小游戏python脚本
2018/01/05 Python
python-docx修改已存在的Word文档的表格的字体格式方法
2018/05/08 Python
学习python的前途 python挣钱
2019/02/27 Python
通过PYTHON来实现图像分割详解
2019/06/26 Python
浅谈python累加求和+奇偶数求和_break_continue
2020/02/25 Python
北承题目(C++)
2012/05/16 面试题
JSP&Servlet技术面试题
2015/05/21 面试题
3分钟英语演讲稿
2014/04/29 职场文书
工地安全生产标语
2014/06/06 职场文书
群众路线组织生活会发言材料
2014/10/17 职场文书
2014年个人工作总结范文
2014/11/07 职场文书
2014年司法所工作总结
2014/11/22 职场文书
公务员学习中国梦心得体会
2016/01/05 职场文书
2019大学生预备党员转正思想汇报
2019/06/21 职场文书
pandas提升计算效率的一些方法汇总
2021/05/30 Python