背景

微信登陆作为比较常用的第三方登陆,实际应用比较多,比如小程序,微信公众号必不可少缺少 但是发现有一些初级人员还是不容易理解这当中的一个思路,故分享下当前微信登录的一个实现原理以及实战代码

原理

基本步骤 :

  1. 客户端判断token是否存在,token不存在则请求后端获取微信登陆地址

  2. 服务器返回相关的微信登陆地址(这个地方其实也可以由前端自己拼接 具体看自己情况 )

  3. 前端将获取到的微信地址(或者自己前端写好的地址也可以)做跳转

  4. 用户进行微信公众号确认(或者扫码登陆)此时会跳转到微信的地址。

  5. 微信则会返回到之前设置的回调登录地址上做处理(该回调地址为微信请求地址上带的redirect_uri)

  6. 服务器端验证信息的真实性以后将该用户的信息生成对应的token 通过做跳转到前端指定的页面比如 login/token/123

  7. 前端通过login/token/123 获取到对应的token信息 并保存在本地缓存,接下来请求接口带着这个token即可

具体流程图如下

实现

前端VUE部分

在路由里面做判断是否有token(判断是否登录操作) 没有则跳转到login页面

/src/view/Login.vue

created() {try {document.title = "登陆中...";let ua = window.navigator.userAgent.toLowerCase();if (ua.match(/MicroMessenger/i) == "micromessenger") {this.$axios.get("/api/weixin/get_weixin_login_url", []).then((res) => {//alert("跳转到微信授权页面", res.data.url);window.location.href = res.data.url;});} else {this.cli = true;}} catch (e) {}
}

同时也检测是否在login 下面是否有token给到前端(登录成功部分操做)

/src/router/index.js

router.beforeEach((to, from, next) => {var params = to.fullPath.split('/');var token = localStorage.getItem('token');//alert(to.fullPath);//如果token不存在就跳转登录if (!token && params[1] !== "login") {//alert('如果token不存在就跳转登录', to.fullPath);localStorage.setItem("beforeUrl", to.fullPath);next("/login");return false;}//保存用户的token信息//并跳转到之前的地址if (params[1] == "login" && params[2] == 'token') {localStorage.setItem('token', params[3]);var url = localStorage.getItem("beforeUrl");//alert(url);var urlParam = "/";if (url) {urlParam = url.split('/');}if (url == '' || url == null || urlParam[1] == "login") {url = '/';}next(url);return false;}next();
});

后端代码

获取微信登陆页面地址

$redirect_uri = urlencode("http://" .你的域名 . "/api/weixin/callback");
$url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=" . $appId . "&redirect_uri=" . $redirect_uri . "&response_type=code&scope=snsapi_userinfo&state=STATE";
return json(['code' => 200, 'msg' => 'success', 'data' => ['url' => $url]]);

微信回调返回

//当前使用的为easywechat
$app = new Application(self::get_weixin_config());
$oauth = $app->oauth;
// 获取 OAuth 授权结果用户信息
$user = $oauth->user();
$info = Db::name('vote_user')->where('wx_id',$user['original']['openid'])->find();
if(empty($info)){$add = ['wx_id' => $user['original']['openid'],'avatar' => $user['avatar'],'name' => $user['name'],'nickname' => $user['nickname'],'wx_content' => json_encode($user),'createtime' => time(),'updatetime' => time(),];Db::name('vote_user')->insert($add);$info = Db::name('user')->where('wx_id',$user['original']['openid'])->find();
}
$token = sha1($info['name'].$info['wx_id'].$info['updatetime']);
header('location:'. '/#login/token/'.$token); // 跳转到 user/profile

到此整个微信登陆流程结束

vue 实现微信登陆 你学会了吗相关推荐

  1. vue获取微信登陆权限_vue 微信授权登录解决方案

    背景 vue前后端分离开发微信授权 场景 app将商品分享到微信朋友圈或者分享给微信好友,用户点击页面时进行微信授权登陆,获取用户信息. 问题:没有固定的h5应用首页.授权后重定向url带参数并且很长 ...

  2. vue获取微信登陆权限_Vue获取微信JSSDK授权,以及微信分享

    场景 Vue获取JSSDK授权以便在微信浏览器,或者嵌在小程序里面做些小事情,如朋友/朋友圈分享,微信支付,图片上传下载等 步骤一 配置安全域名: 在微信公众平台对应的公众号设置里面配上相应的JS接口 ...

  3. vue获取微信登陆权限_vue 授权获取微信openId操作

    1.获取url中参数code: 根据code 获取openId:调用后台接口获取openId . function getUrlKey(name){//获取url 参数 return decodeUR ...

  4. AbpVnext 扩展企业微信扫码登录(钉钉登陆、短信登陆、微信登陆等)Vue框架

    目录 1.开始开发准备 1.1 企业微信扫码登陆接入流程 1.2 开启网页授权登陆 1.3 构造独立窗口登陆二维码 1.4 构造内嵌登陆二维码 @@登陆顺序: 1. 发现文档配置 2. 获取token ...

  5. Java实现扫码微信登陆(获取登陆成功的用户信息 + 包含使用vue怎么显示登陆二维码)

    实现于springboot中 依据b站视频写出的: 点击此处进行观看 然后记录于此处. 首先微信登陆的流程为: (可以去微信开发者平台看) 第一步:请求CODE 若提示"该链接无法访问&qu ...

  6. vue php企业站案例,vue 开发企业微信整合案例分析

    本文实例讲述了vue 开发企业微信整合.分享给大家供大家参考,具体如下: 概述 手机端程序可以和企业微信进行整合,我们也可以使用企业微信JSSDK功能,实现一些原生的功能. 整合步骤 在整合之前需要阅 ...

  7. 微信有电脑客户端吗_一台电脑如何开多个微信?你学会了吗?

    越来越注重隐私的我们,通常个人微信和工作微信是分开的. 那么,电脑上如何同时开两个微信号呢? 今天雷哥分享2种方法哈 方法一:bat法 step1:新建一个txt文档 step2:找到微信的路径 st ...

  8. vue实现微信网页授权登录

    附:微信官方文档 前言:在用vue做微信公众号网页项目的授权登录中踩过不少坑,在这里记录一下.首先在选择由后端做登陆还是前端传token登录的方式上产生了分歧.两种方式在不同的公司里都用过,后端做登陆 ...

  9. 微信h5登录php,vue实现微信授权登录步骤详解

    这次给大家带来vue实现微信授权登录步骤详解,vue实现微信授权登录的注意事项有哪些,下面就是实战案例,一起来看一下. 背景 vue前后端分离开发微信授权 场景 app将商品分享到微信朋友圈或者分享给 ...

最新文章

  1. [WUST2017]一组简单一点的题目(三) A - Calculate S(n)
  2. php js统计链接点击次数,JS实现在线统计一个页面内鼠标点击次数的方法
  3. android中DatePickerTimePicker的应用
  4. 安装Openface,实现人脸比对
  5. ibatis查询CHAR类型的字段
  6. Java压缩技术(五) GZIP相关——浏览器解析
  7. Linux 命令之 rpmbuild -- 用于创建 rpm 格式的二进制软件包和源码软件包
  8. linux缓存文件用户权限错误,Laravel运行缓存权限问题
  9. 1660用哪个驱动稳定_PDF转word怎么转?哪个PDF转换器最好用?-PDF ——快科技(驱动之家旗下媒体)-...
  10. 数组重复次数最多的元素递归_使用递归计算链接列表中元素的出现次数
  11. 机器视觉——单目相机模型(坐标标定以及去畸变)
  12. 103.二叉树的锯齿形层次遍历:DFS解法
  13. memcached系列之二
  14. 报表性能优化方案之行引擎执行层式报表
  15. Huffman树概念及理解
  16. 小米路由器显示网络未连接到服务器,小米路由器异常排查的常见问题与使用技巧...
  17. 大数据在高校的应用场景_大数据在高校教育信息化的应用
  18. aiml的中文适配aiml_cn
  19. supervisor+cesi多服务器进程集中管理
  20. 【BP靶场portswigger-服务端1】SQL注入-17个实验(全)

热门文章

  1. EXCEL双击文件打开是空白的
  2. 自己写的C盘清理工具 Ver1.0.0
  3. Svchost.exe占用内存过大解决
  4. 消息队列应用与原理剖析
  5. JavaWeb开发 前端语言:jQuery(一) jQuery核心函数、jQuery对象、jQuery选择器、以及jQuery元素筛选
  6. 项目管理:PMP和IPMP哪个更值得考?两个证书的区别在于哪里?
  7. 上市不到一年,京东物流CFO马越“跑了”,市值累计蒸发1300亿元
  8. 航模电池-LiPo锂聚合物电池(未完待续)
  9. 我为什么不喜欢用异或做两数值的交换
  10. Nvidia Summer Camp Day34 个人心得