声明:这边所谓的第三方登录,不是通过网页授权的方式,而是利用生成带参数的二维码,将微信号和平台账号绑定实现。如果你要做的是授权登录,请查看

https://blog.csdn.net/wrongyao/article/details/80229986

紧接着0051扫码绑定之后,这边获取扫码登录操作

1、思路概括

注:用sessionid生成二维码,因为要区分不同终端的不同用户,所以需要带上他们的唯一标识sessionid

扫码以后,微信服务器会推送带有sessionid和openid的报文到我服务器,根据openid在关联关系表中找出userid,取出用户信息,放入缓存中,即为登录成功。

1、用同样的方式,获取带有sessionid的二维码

/*** 获取二维码** @param sceneStr* @return*/private String getQcode(String sceneStr) {String getTicketUrl = "https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=" + AccessToken.ACCESS_TOKEN + "";// 临时整形参数值String ticketParam = "{\"expire_seconds\": 120, \"action_name\": \"QR_STR_SCENE\", \"action_info\": {\"scene\": {\"scene_str\": \"" + sceneStr + "\"}}}";String ticketStr = HttpRequest.post(getTicketUrl, ticketParam, null, Constant.RequestType.APPLICATION_JSON);System.out.println(ticketStr);Map<String, String> ticketMap = GsonUtil.fromJson(ticketStr, Map.class);String ticket = ticketMap.get("ticket");return "https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=" + ticket;}@Overridepublic String getLoginQCode() {String sessionId = request.getSession().getId();return getQcode("login&" + sessionId);}

2、扫码登录

    @Overridepublic String userLogin(HashMap<String, String> requestMap, String sessionId) {String res;String openId = requestMap.get("FromUserName");SysUser sysUser = sysWechatMapper.selectSysUserByOpenId(openId);// 未绑定用户if (null == sysUser) {res = WechatUtil.replyTextMessage(openId, requestMap.get("ToUserName"), wechatMessage.getUserUnbindReplyMessage());} else { //登录操作// 登录操作LoginJson loginJson = new LoginJson();loginJson.setCode(Code.success.getIndex());loginJson.setSysUser(sysUser);redisService.set("loginJson&" + sessionId, GsonUtil.toJson(loginJson));res = WechatUtil.replyTextMessage(openId, requestMap.get("ToUserName"), wechatMessage.getLoginSusccessReplyMessage());}return res;}

注:根据openid找到用户,将用户信息放入缓存中,就是登录成功,这边解释为什么不用session做登入,我们在前台请求登录二维码(session1),扫码后首先会到微信服务器,微信服务器向我服务器推送报文(session2),如果用session做登录理论上是要session1的但是此时已经取不到这个session了。所以用nosql数据库,用带过来的sessionid做为可以即可。

3、登录成功跳转。

上述代码只是把用户取出来放到了缓存中,这个方法就返回了,那我们的服务器怎么知道登录成功了呢?

思路:1、登录成功后,我们服务器向客户端推送这个状态,不易实现

2、前端定时访问服务器,看是否登录成功,容易实现。

前端js

var time;// 获取登录二维码function getQcode() {var url = "/wechat/offical/account/getLoginQcode";$.ajax({url: url,type: "get",async: true,success: function (res) {$("#qrCode").attr("src", res);time = window.setInterval(isLogin, 1000);}});
}//轮询判断是否登录
function isLogin() {var url = "/sysuser/islogin";$.ajax({url: url,type: "get",async: true,success: function (res) {var resObj = JSON.parse(res);if (resObj.code == 0) {window.clearInterval(time);window.location.href = "/crafts/adminindex";} else if (resObj.code == 1) {window.clearInterval(time);}}});}

后端获取登录状态

/*** 判断是否登录,用于微信扫码后** @return*/@RequestMapping("/islogin")@ResponseBodypublic String isLogin() {Map<String, Object> resMap = new HashMap<>();String sessionId = request.getSession().getId();String loginJsonStr = redisService.get("loginJson&" + sessionId);LoginJson loginJson = GsonUtil.fromJson(loginJsonStr, LoginJson.class);// 未扫码if (null == loginJson) {resMap.put("code", -1);resMap.put("msg", "未扫码!");} else if (loginJson.getCode() == Code.success.getIndex()) {resMap.put("code", 0);resMap.put("msg", "成功");} else if (loginJson.getCode() == Code.fail.getIndex()) {resMap.put("code", 1);resMap.put("msg", "失败");}return GsonUtil.toJson(resMap);}

上述就是扫码登录的大致思路,如有不妥的地方,欢迎大家斧正,谢谢!

wechat-0052,微信公众号,第三方登录—扫码登录相关推荐

  1. JS_微信公众号开发调用扫码支付功能

    需要在公众号里面切入扫码功能 前端代码: <!DOCTYPE html> <html> <head lang="en"><meta cha ...

  2. 利用公众号实现网页扫码登录

    公众号因为有测试号,所以测试起来蛮方便的. 1.先熟悉微信公众号开发文档. 2.首先网页端需要生成临时二维码 例如:https://mp.weixin.qq.com/cgi-bin/showqrcod ...

  3. 微信公众号开发之扫码支付

    此项目已开源欢迎Start.PR.发起Issues一起讨论交流共同进步 https://github.com/Javen205/IJPay http://git.oschina.net/javen20 ...

  4. 关于微信公众号开发中扫码关注和关注之后继续扫码的不同点

    2019独角兽企业重金招聘Python工程师标准>>> 开发微信商城,当遇到需要绑定上下级关系的时候,会通过扫码的方式关注公众号,但是如果不想做这个人的下级,后台添加解绑功能,继续扫 ...

  5. 微信公众号调起扫码功能

    偶然接触到了公众号开发.说需要调起微信扫一扫.便查看了公众号开发文档 看完文档后,发现js是相对简单的.唯一的难点是在java后台编写的秘钥生成代码. 也就是说.首先需要获取access_token, ...

  6. 微信公众号拉取扫码功能

    点击扫码按钮拉取微信扫码 // 扫码添加设备goAddEquipment() {const wx = window.wxlet _this = this// wx.ready(function() { ...

  7. 以后的blog将转移到微信公众号,请扫码关注谢谢!

  8. 微信扫码登录,微信公众号生成二维码,关注登录nodejs+vue

    微信公众号生成二维码,关注后扫码登录 技术栈为nodejs+vue 有不懂的可以加我微信yizheng369 1.效果 初始: 关注后: 2.源码 此项目为前后端分离项目,前后端代码都在这个仓库里, ...

  9. Django使用Social-Auth实现微信第三方网站扫码登录

    前言 之前让网页公司制作新官网的时候规划有第三方账号的登录功能,但由于当时的一些开放平台申请步骤比较繁琐(尤其是微信开放平台),所以一直拖延着,到了最近只能自己添加相关的功能. 由于是刚接触Pytho ...

  10. Django实现微信第三方网站扫码登录

    前言 之前让网页公司制作新官网的时候规划有第三方账号的登录功能,但由于当时的一些开放平台申请步骤比较繁琐(尤其是微信开放平台),所以一直拖延着,到了最近只能自己添加相关的功能. 由于是刚接触Pytho ...

最新文章

  1. 【目标检测】yolo系列:从yolov1到yolov5之YOLOv3详解及复现
  2. Python 字符串换行的几种方式
  3. tomcat服务器访问网址组成
  4. 为什么说神经网络可以逼近任意函数?
  5. 肝!分享这3个京东实战项目!(知识图谱拿走不谢)
  6. Cheatsheet: 2013 09.10 ~ 09.21
  7. log nginx 客户端请求大小_nginx log记录请求响应时间
  8. h5 右下角浮动按钮_意派Epub360丨国庆黄金周将至,分享9个H5互动营销思路
  9. Team Foundation Server 2010 安装、部署与配置(三):安装 .
  10. python爬虫模拟浏览器的两种方法_python爬虫模拟浏览器访问-User-Agent过程解析
  11. html5距离底部的距离代码,如何使距离为HTML5
  12. apt-get update : pulic key error
  13. 《OpenGL编程指南》一3.2 OpenGL缓存数据
  14. NIKE ZOOM ASTORIA SKY HI ACG (MUSTARD/TAN)
  15. 【好题分享】适合C++初学者(数组的定义与初始化)
  16. 微信小程序直播,腾讯云直播+微信小程序实现实时直播
  17. python爬虫代理ip_Python爬虫如何获取代理ip及ip验证?
  18. excel数据分析案例——电信运营商用户流失分析
  19. 小云路由器mysql地址_小云OS3.0,极简操作,让小白玩转离线下载和NAS(转发)
  20. 菜鸟爬取中关村手机详情页参数及报价

热门文章

  1. 电脑文件里哪里能用计算机,计算机管理怎么打开方法图解 计算机管理程序文件在哪里 电脑维修技术网...
  2. 遍历读取文件夹下的所有文件
  3. WhatsApp电脑版和WhatsApp网页版区别?
  4. seo是做什么-程绩
  5. vue3.0 + xlsx 实现纯前端生成excel表格
  6. unity 如何实现一个日志上报系统
  7. Java基础第一讲:Java的故事和Java编程环境搭建
  8. oracle vm 鼠标切换,VirtualBox的Linux虚拟机文本模式和图形模式的切换问题
  9. Scratch模拟题(二级)_1
  10. 文法与语言(笔记版)