wechat-0052,微信公众号,第三方登录—扫码登录
声明:这边所谓的第三方登录,不是通过网页授权的方式,而是利用生成带参数的二维码,将微信号和平台账号绑定实现。如果你要做的是授权登录,请查看
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,微信公众号,第三方登录—扫码登录相关推荐
- JS_微信公众号开发调用扫码支付功能
需要在公众号里面切入扫码功能 前端代码: <!DOCTYPE html> <html> <head lang="en"><meta cha ...
- 利用公众号实现网页扫码登录
公众号因为有测试号,所以测试起来蛮方便的. 1.先熟悉微信公众号开发文档. 2.首先网页端需要生成临时二维码 例如:https://mp.weixin.qq.com/cgi-bin/showqrcod ...
- 微信公众号开发之扫码支付
此项目已开源欢迎Start.PR.发起Issues一起讨论交流共同进步 https://github.com/Javen205/IJPay http://git.oschina.net/javen20 ...
- 关于微信公众号开发中扫码关注和关注之后继续扫码的不同点
2019独角兽企业重金招聘Python工程师标准>>> 开发微信商城,当遇到需要绑定上下级关系的时候,会通过扫码的方式关注公众号,但是如果不想做这个人的下级,后台添加解绑功能,继续扫 ...
- 微信公众号调起扫码功能
偶然接触到了公众号开发.说需要调起微信扫一扫.便查看了公众号开发文档 看完文档后,发现js是相对简单的.唯一的难点是在java后台编写的秘钥生成代码. 也就是说.首先需要获取access_token, ...
- 微信公众号拉取扫码功能
点击扫码按钮拉取微信扫码 // 扫码添加设备goAddEquipment() {const wx = window.wxlet _this = this// wx.ready(function() { ...
- 以后的blog将转移到微信公众号,请扫码关注谢谢!
- 微信扫码登录,微信公众号生成二维码,关注登录nodejs+vue
微信公众号生成二维码,关注后扫码登录 技术栈为nodejs+vue 有不懂的可以加我微信yizheng369 1.效果 初始: 关注后: 2.源码 此项目为前后端分离项目,前后端代码都在这个仓库里, ...
- Django使用Social-Auth实现微信第三方网站扫码登录
前言 之前让网页公司制作新官网的时候规划有第三方账号的登录功能,但由于当时的一些开放平台申请步骤比较繁琐(尤其是微信开放平台),所以一直拖延着,到了最近只能自己添加相关的功能. 由于是刚接触Pytho ...
- Django实现微信第三方网站扫码登录
前言 之前让网页公司制作新官网的时候规划有第三方账号的登录功能,但由于当时的一些开放平台申请步骤比较繁琐(尤其是微信开放平台),所以一直拖延着,到了最近只能自己添加相关的功能. 由于是刚接触Pytho ...
最新文章
- 【目标检测】yolo系列:从yolov1到yolov5之YOLOv3详解及复现
- Python 字符串换行的几种方式
- tomcat服务器访问网址组成
- 为什么说神经网络可以逼近任意函数?
- 肝!分享这3个京东实战项目!(知识图谱拿走不谢)
- Cheatsheet: 2013 09.10 ~ 09.21
- log nginx 客户端请求大小_nginx log记录请求响应时间
- h5 右下角浮动按钮_意派Epub360丨国庆黄金周将至,分享9个H5互动营销思路
- Team Foundation Server 2010 安装、部署与配置(三):安装 .
- python爬虫模拟浏览器的两种方法_python爬虫模拟浏览器访问-User-Agent过程解析
- html5距离底部的距离代码,如何使距离为HTML5
- apt-get update : pulic key error
- 《OpenGL编程指南》一3.2 OpenGL缓存数据
- NIKE ZOOM ASTORIA SKY HI ACG (MUSTARD/TAN)
- 【好题分享】适合C++初学者(数组的定义与初始化)
- 微信小程序直播,腾讯云直播+微信小程序实现实时直播
- python爬虫代理ip_Python爬虫如何获取代理ip及ip验证?
- excel数据分析案例——电信运营商用户流失分析
- 小云路由器mysql地址_小云OS3.0,极简操作,让小白玩转离线下载和NAS(转发)
- 菜鸟爬取中关村手机详情页参数及报价
热门文章
- 电脑文件里哪里能用计算机,计算机管理怎么打开方法图解 计算机管理程序文件在哪里 电脑维修技术网...
- 遍历读取文件夹下的所有文件
- WhatsApp电脑版和WhatsApp网页版区别?
- seo是做什么-程绩
- vue3.0 + xlsx 实现纯前端生成excel表格
- unity 如何实现一个日志上报系统
- Java基础第一讲:Java的故事和Java编程环境搭建
- oracle vm 鼠标切换,VirtualBox的Linux虚拟机文本模式和图形模式的切换问题
- Scratch模拟题(二级)_1
- 文法与语言(笔记版)