精华内容
下载资源
问答
  • 二维码扫码登陆流程

    2020-07-01 10:51:32
    二维码扫码登陆流程有web端和APP端,App扫码登陆web端扫码登陆流程请求keyAPP客户端扫码轮询查状态登录流程 有web端和APP端,App扫码登陆web端 扫码登陆流程 请求key 生成一个uuid的key返回前端 同时存入redis并...

    最近做完扫码登陆,记录一下流程;需求:有web端和APP端完整账号登陆,App扫码登陆web端

    扫码登陆流程

    在这里插入图片描述

    请求key

    生成一个uuid的key返回前端 同时存入redis并初始状态为 0 ,失效时间为三分钟
    value 逗号分隔 前面表示状态 (0-未扫码,1-已扫码,2-已登陆)
    逗号后面随便放个值,等确认登陆后存用户账号 (手机号)

    @ApiOperation(value = "获取二维码登陆初始key")
    	@PostMapping("/getQrKey")
    	public R getQrKey() {
    		log.info("获取二维码登陆初始key");
    		try {
    			ValueOperations<String, String> opsForValue = strRedisTemplate.opsForValue();
    			String key = IdUtil.simpleUUID();
    			//key - value      value  逗号分隔  前面表示状态 (0-未扫码,1-已扫码,2-已登陆) 后面表示userId
    			opsForValue.set(CommonConstants.QR_REDIS_HEAR + ":" + key, "0,0", 180, TimeUnit.SECONDS);
    			QrCodeResultVo build = QrCodeResultVo.builder().type("0").key(key).build();
    			return new R(build);
    		} catch (Exception e) {
    			log.error("获取二维码登陆初始key失败", e);
    			return R.error("获取二维码登陆初始key失败", e);
    		}
    	}
    

    APP客户端扫码

    APP客户端扫码后,修改对应key的状态
    如果状态要修改为2 则在redis存入value时 将用户的账号(手机号)拼接在后面

    	@ApiOperation(value = "更新key的状态")
    	@ApiImplicitParams({
    		@ApiImplicitParam(paramType = "query", name = "key", dataType = "String", required = true, value = "key"),
    		@ApiImplicitParam(paramType = "query", name = "status", dataType = "String", required = true, value = "status")
    	})
    	@PostMapping("/updateQrStatus")
    	public R updateQrStatus(@RequestParam(name = "key", required = false) String key,
    							@RequestParam(name = "status", required = false) String status) {
    		log.info("更新key的状态,key = {} ,status = {}", key, status);
    		try {
    			VillcloudUser user = SecurityUtils.getUser();
    			ValueOperations<String, String> opsForValue = strRedisTemplate.opsForValue();
    			//key - value      value  逗号分隔  前面表示状态 (0-未扫码,1-已扫码,2-已登陆,3-已过期) 后面表示phone
    			String value = opsForValue.get(CommonConstants.QR_REDIS_HEAR + ":" + key);
    			HashMap<String, String> map = new HashMap<>();
    			if (StrUtil.isBlank(value)) {
    				//不存在表示已超时
    				map.put("status", "3");
    				return new R(map);
    			} else {
    				//存在  则修改对应的状态
    				String[] split = value.split(",");
    				if ("1".equals(status)) {
    					opsForValue.set(CommonConstants.QR_REDIS_HEAR + ":" + key, status + "," + split[1], 180, TimeUnit.SECONDS);
    				} else if ("2".equals(status)) {
    					opsForValue.set(CommonConstants.QR_REDIS_HEAR + ":" + key, status + "," + user.getPhone(), 180, TimeUnit.SECONDS);
    				}
    				map.put("status", status);
    			}
    			return new R(map);
    		} catch (Exception e) {
    			log.error("更新key的状态失败", e);
    			return R.error("更新key的状态失败", e);
    		}
    	}
    

    轮询查状态

    前端拿到key之后 转换成二维码 同时定时轮询向后台请求 key对应的状态 不停刷新 直到状态为 2 (已登录)或者 3(已过期)

    	@ApiOperation(value = "获取扫码状态")
    	@ApiImplicitParams({
    		@ApiImplicitParam(paramType = "query", name = "key", dataType = "String", required = true, value = "key")
    	})
    	@PostMapping("/getQrStatus")
    	public R getQrStatus(@RequestParam(name = "key", required = false) String key) {
    		log.info("获取key的状态,key = {}", key);
    		try {
    			VillcloudUser user = SecurityUtils.getUser();
    			ValueOperations<String, String> opsForValue = strRedisTemplate.opsForValue();
    			//key - value      value  逗号分隔  前面表示状态 (0-未扫码,1-已扫码,2-已登陆,3-已过期) 后面表示phone
    			String value = opsForValue.get(CommonConstants.QR_REDIS_HEAR + ":" + key);
    			HashMap<String, String> map = new HashMap<>();
    			if (StrUtil.isBlank(value)) {
    				//不存在表示已超时
    				map.put("status", "3");
    				return new R(map);
    			} else {
    				//存在  则返回对应的状态和token
    				String[] split = value.split(",");
    				map.put("status", split[0]);
    			}
    			return new R(map);
    		} catch (Exception e) {
    			log.error("获取扫码登录扫码状态失败", e);
    			return R.error("获取扫码登录扫码状态失败", e);
    		}
    	}
    

    登录流程

    如果返回的状态为2 则走登录流程

    在这里插入图片描述

    在这里插入图片描述

    展开全文
  • 流程图 网页端生成随机code,携带code去请求一张二维码图片; 网页端轮询code是否登录成功状态; APP端扫描二维码,获取二维码内容; APP端验证二维码是否过期/无效; 如果二维码有效,展示确认登录/取消按钮; APP端携带...

    流程图

    二维码登录流程

    • 网页端生成随机code,携带code去请求一张二维码图片;
    • 网页端轮询code是否登录成功状态;
    • APP端扫描二维码,获取二维码内容;
    • APP端验证二维码是否过期/无效;
    • 如果二维码有效,展示确认登录/取消按钮;
    • APP端携带登录信息token确认登陆;
    • 后端为code绑定登录信息(token,userName),网页端轮询获得登录成功信息.
    展开全文
  • 主要介绍了详解基于Koa2开发微信二维码扫码支付相关流程,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
  • 二维码扫码登录原理

    千次阅读 2020-05-04 18:10:57
    简要明了,步步深入,图文并茂地解析二维码扫码登录原理,让你在相同或相似的业务场景中安全可靠的实现二维码扫码登录。

     

     

    简介


    二维码扫码登录这个操作,在我们的日常生活和工作中频频出现。

    这种操作主要发生于:在手机设备已经登录的情况下,需要在电脑PC端应用或者网页应用也登录,这时,如果该应用支持扫码登录,我们就可以用手机端的应用来扫描PC端生成的一个二维码,进而进行登录。如下图所示:

     

    比如我们每个人几乎都会接触过的:

    微信扫码登录、QQ扫码登录、网易云音乐扫码登录、百度网盘扫码登录等等。

     

    首先,我们来简单描述一下扫码登录这个流程,用微信登录进行举例:

    假设:手机端已经登录了微信,这时需要在PC端登录

    (1)PC端生成一个二维码,等待扫描

    (2)使用手机端微信的扫一扫功能扫码二维码

    (3)手机端解析二维码并弹出确认登录弹窗,此时PC端的二维码状态显示为:已扫描,等待确认

      (4) 手机端点击确认登录,这时PC端的微信完成登录

     

    分析


    以上几个大体步骤就是我们进行扫码登录的一个基本流程。那么,我们要如何去设计这么一个功能呢?

    在开始设计之前,我们需要思考明白一下几个关键点:

    • 在手机端进行确认登录的时候,为什么PC端就能直接登录?

    • 在扫码登录整个过程中,手机端和PC端是否需要有数据传输(如用户ID或者用户名+密码)?

    • 如何保证扫码登录的过程是安全的,非信息暴露泄漏的?

    • PC端是如何检测到二维码的状态的(已扫描、已取消、已确认等)?

     

    首先,前两个问题我们一起综合分析:

    在扫码登录过程中,需要明确的是,手机端和PC端是肯定有数据交互的,不然PC端是无法登录得了的。那双端交互的这个数据会是用户ID或者用户名密码吗?

    先排除后者,传输用户名密码最大的缺点就是用户敏感信息可能会造成泄漏,其次是,我们平常输入用户名密码登录,是客户端传输数据到服务器,然后在服务器进行校验并存储。但是这里如果传输用户名密码,就是从服务器传到PC客户端,然后PC客户端拿到后又原样不变地发送给服务器进行登录,这很明显逻辑奇怪并且流程冗余,会造成一定的服务器资源浪费;

    那会是传输用户ID吗?在理解不传输用户名密码的第二个原因后,那么也很容易明白,显然也不能或者不会传输用户ID。PC客户端虽然可以使用服务器返回的用户ID进行用户信息状态查询、同步等操作,但是直接拿用户ID进行一个“登录操作”,相当于跳过了token机制,那么以后在PC端的登录状态就没有过时的说法了,用户ID是一直不变的,只要客户端保存着这个ID,就可已拿这个ID进行登录验证,这显然不合理也不安全的。因此,也不可能是传输用户的ID。

     

    那到底是什么数据在进行交互呢?

    答案是:一种仅用于扫码登录的临时token令牌数据

    PC端在选择使用二维码登录的时候,服务器会生成一个二维码,并且这个二维码绑定着一个ID(二维码ID),当手机设备扫描二维码后,会解析二维码并拿到这个ID;然后当手机端点击确认登录后,手机端会带着这个ID,以及手机端上已经登录了的用户身份信息token,一起发送给服务器,服务器接收到后,新生成一个专门给PC端使用且绑定了用户身份的token,然后返回给PC端,这样PC端就相当于登录了,之后PC端的用户检验就是用这个token进行。当然,这里已经忽略了很多细节过程,下文会更加详细地流程描述。

    其实这里,已经回答了第三个问题:如何保证扫码登录的过程是安全的,非信息暴露泄漏的?

    在整个扫码登录过程中,手机端与PC端涉及的数据交互,仅仅是由服务器管理控制的一个二维码ID、手机端上的用户身份token(有时效性)、服务器新生成给PC端的用户身份token(有时效性),没有敏感信息交互,也就不存在敏感信息的泄漏;服务器给PC端生成一个新的token,从另一个角度上看,就跟用户输入用户名密码登录的本质是一样的,都是基于带时效性的token校验机制,只不过扫码登录的方式少了输入用户名密码这一个步骤。因此,这样的一个扫码登录流程是安全的。

     

    最后一个问题,PC端是如何检测到二维码的状态的呢?

    其实这里应该很容易就能想到了,无非两种:socket和轮询

     

    socket方式:

    PC端保持着与服务器的长连接,当手机端扫描二维码后,带着解析得到的二维码ID第一次发送给服务器,当服务器收到这个请求后,代表用户已经扫描了二维码,这时服务器就可以通过socket告知PC端二维码已被扫描,等待确认;之后手机端不论是取消登录还是确认登录,都会相应的请求服务器,服务器收到请求会根据相应的逻辑处理,进而通知PC端更新相应的状态,流程图如下:

     

    轮询方式:

    轮询方式即在PC端创建一个定时器,每隔一段时间请求服务器查询状态的更新情况,然后更新网页的显示信息。当时这个定时器得控制好启动时机和生命周期,因为PC端的二维码有可能一直没有被扫描,或者扫描之后没有下一步操作了,这时,如果没有控制好这个定时器,PC端就会一直地请求服务器查询,造成资源浪费和一定的性能损耗。

    轮询的流程如下图所示:

     

    至此,二维码扫码登录的分析我们已经基本了解了,接下来我们用时序图来描述二维码扫码登录的详细流程:

    当然,这里还有一些其他细节处理没有在时序图中标注出来,比如说当用户不是点击确认而是点击了取消,那么服务器也要做相应的处理,如将所有临时数据清除,并告知PC端二维码状态。这种时候,PC端那边的二维码就已经无效了,此时如果要重新进行二维码登录,则要重新进行上述时序图的操作。

     

    本文到这里就结束啦~欢迎各位读者伙伴们的点评和提供意见哦!

     

     

    展开全文
  • 本文对接工行聚合支付二维码扫码支付接口,实现二维码生成(用户扫二维码支付)、二维码被扫(商户扫用户付款码)、支付查询、退款、退款查询、冲正的代码实现,首先下载工行聚合支付API文档,见链接“工行聚合支付...
  • Java实现二维码扫码授权登陆

    万次阅读 2018-05-11 17:20:44
    Java实现二维码扫码授权登陆
  • 二维码扫码登陆原理

    2021-04-15 14:21:03
    二维码扫码登陆的原理 在日常生活中,二维码出现在很多场景,比如超市支付、系统登录、应用下载等等。了解二维码的原理,可以为技术人员在技术选型时提供新的思路。对于非技术人员呢,除了解惑,还可以引导他更好地...
  • 二维码扫码登录开放平台源码,可接于任何二维码实现扫码登录,采用session,token机制安全性不容质疑.完全模拟微信扫码登录
  • 二维码扫码支付原理

    千次阅读 2019-09-26 18:28:29
    线下扫码支付大大的提高了我们付款的效率,今天就主要谈一谈扫码支付的实现流程,让我们享受快捷的同时,也了解其中的原理。 二维码——信息的载体 说起扫码支付,就不得不提二维码。线下所有的扫码支付都是以扫...
  • 二维码扫码登录

    万次阅读 2018-07-05 10:31:14
    项目结构模块介绍流程1pc端:1:打开二维码登录网页index.html2:index.html调用GetQrCodeServlet3:GetQrCodeServlet干2件事 a:生成随机的uuid,是一个唯一标识,该标识贯穿整个流程 b:生成二维码图片,二维码信息:...
  • 前段时间在开发一个功能,要求是通过微信二维码进行扫码支付。这个情景我们屡见不鲜了,各种电子商城、线下的自动贩卖机等等都会有这个功能。平时只是使用者,如今变为开发者,也是有不小的坑。所以特此写一篇博客...
  • 二维码扫码登录是什么原理 在日常生活中,二维码出现在很多场景,比如超市支付、系统登录、应用下载等等。了解二维码的原理,可以为技术人员在技术选型时提供新的思路。对于非技术人员呢,除了解惑,还可以引导他更...
  • 现如今:银币、再到纸币,演变到“钱”变得越来越轻薄。在现在这个移动支付市场中,互联网技术的支撑下,刷手机乘公交、刷支付宝买菜购物、缴水电费……日常生活中使用...   当“二维码扫码支付”成为主流,采...
  • 二维码登录现在比较常见,比如微信、支付宝等 PC 端登录,并且越来越多的APP支持扫码登录,其中原理如何呢? PC端Cookie + Session 登录 HTTP 是一种无状态的协议,客户端每次发送请求时,首先要和服务器端...
  • js调用微信利用二维码扫码登录

    千次阅读 2020-09-11 11:11:36
    js调用微信利用二维码扫码登录 准备工作 网站应用微信登录是基于OAuth2.0协议标准构建的微信OAuth2.0授权登录系统。 在进行微信OAuth2.0授权登录接入之前,在微信开放平台注册开发者帐号,并拥有一个已审核通过的...
  • 作者:大古同学链接:https://juejin.cn/post/6940976355097985032二维码扫码登录是什么原理前几天看了极客时间一个二维码的视频,写的不错,这里总结下在日...
  • 记录一下微信扫码支付。仅仅是支付 <!-- 微信sdk支付 --> <dependency> <groupId>com.github.wxpay</groupId> <artifactId>wxpay-sdk</artifactId> ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 12,064
精华内容 4,825
关键字:

二维码扫码流程