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 相关文章推荐
接收键盘指令的脚本
Jun 26 Javascript
类似GMAIL的Ajax信息反馈显示
Feb 16 Javascript
来自国外的30个基于jquery的Web下拉菜单
Jun 22 Javascript
js综合应用实例简单的表格统计
Sep 03 Javascript
AngularJS基础知识
Dec 21 Javascript
JS动态增删表格行的方法
Mar 03 Javascript
JavaScript接口的实现三种方式(推荐)
Jun 14 Javascript
jQuery实现页面点击后退弹出提示框的方法
Aug 24 Javascript
用js屏蔽被http劫持的浮动广告实现方法
Aug 10 Javascript
vue-cli 3.x 配置Axios(proxyTable)跨域代理方法
Sep 19 Javascript
优雅的在React项目中使用Redux的方法
Nov 10 Javascript
Vue formData实现图片上传
Aug 20 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
mayfish 数据入库验证代码
2010/04/30 PHP
PHP,ASP.JAVA,JAVA代码格式化工具整理
2010/06/15 PHP
PHP中的gzcompress、gzdeflate、gzencode函数详解
2014/07/29 PHP
深入剖析浏览器退出之后php还会继续执行么
2016/05/17 PHP
laravel自定义分页效果
2017/07/23 PHP
PHP 枚举类型的管理与设计知识点总结
2020/02/13 PHP
jQuery代码优化 选择符篇
2011/11/01 Javascript
浏览器解析js生成的html出现样式问题的解决方法
2012/04/16 Javascript
js判断子窗体是否关闭的方法
2015/08/11 Javascript
jquery跟随屏幕滚动效果的实现代码
2016/04/13 Javascript
AngularJS实现使用路由切换视图的方法
2017/01/24 Javascript
JS去除字符串中空格的方法
2017/02/14 Javascript
angular实现IM聊天图片发送实例
2017/05/08 Javascript
20行JS代码实现网页刮刮乐效果
2017/06/23 Javascript
Vue的土著指令和自定义指令实例详解
2018/02/04 Javascript
JS实现的合并多个数组去重算法示例
2018/04/11 Javascript
详解vue-cli中模拟数据的两种方法
2018/07/03 Javascript
Vue请求java服务端并返回数据代码实例
2019/11/28 Javascript
js回调函数原理与用法案例分析
2020/03/04 Javascript
基于JavaScript实现简单抽奖功能代码实例
2020/10/20 Javascript
基于vue与element实现创建试卷相关功能(实例代码)
2020/12/07 Vue.js
[04:05]TI9战队采访 - Natus Vincere
2019/08/22 DOTA
Python中解析JSON并同时进行自定义编码处理实例
2015/02/08 Python
Python的collections模块中的OrderedDict有序字典
2016/07/07 Python
总结python实现父类调用两种方法的不同
2017/01/15 Python
浅谈python 线程池threadpool之实现
2017/11/17 Python
Django重装mysql后启动报错:No module named ‘MySQLdb’的解决方法
2018/04/22 Python
python抓取需要扫微信登陆页面
2019/04/29 Python
python-视频分帧&多帧合成视频实例
2019/12/10 Python
extern在函数声明中是什么意思
2014/01/19 面试题
《风娃娃》教学反思
2016/02/18 职场文书
幽默导游词应该怎么写?
2019/08/26 职场文书
Nginx配置根据url参数重定向
2022/04/11 Servers
Windows Server 2008 修改远程登录端口以及配置防火墙
2022/04/28 Servers
科学家测试在太空中培育人造肉,用于未来太空旅行
2022/04/29 数码科技
代码复现python目标检测yolo3详解预测
2022/05/06 Python