Bladeren bron

扫码登录流程

chao 4 jaren geleden
bovenliggende
commit
c253ee806e

+ 2 - 6
src/main/java/com/caimei365/user/components/NettyServer.java

@@ -14,7 +14,6 @@ import io.netty.handler.codec.http.websocketx.WebSocketServerProtocolHandler;
 import io.netty.handler.logging.LogLevel;
 import io.netty.handler.logging.LoggingHandler;
 import io.netty.handler.stream.ChunkedWriteHandler;
-import lombok.Value;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.ApplicationArguments;
@@ -22,9 +21,6 @@ import org.springframework.boot.ApplicationRunner;
 import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Component;
 
-import javax.annotation.PostConstruct;
-import java.time.LocalDateTime;
-
 /**
  * @author Aslee
  * @date 2021/3/10
@@ -95,7 +91,7 @@ public class NettyServer implements ApplicationRunner {
         protected void channelRead0(ChannelHandlerContext ctx, TextWebSocketFrame msg) throws Exception {
             log.info("收到登录请求,开始验证state:" + msg.text());
             // 收到登录请求,根据安全认证state调用登录验证方法
-            ResponseJson responseJson = loginService.checkScanAuthResult(msg.text());
+            ResponseJson responseJson = loginService.qrCodeAuthScanResult(msg.text());
             Integer count = 0;
             // 若验证返回码不为0且验证次数小于60次,重新调用验证
             while (responseJson.getCode() != 0 && count<60) {
@@ -104,7 +100,7 @@ public class NettyServer implements ApplicationRunner {
                 ctx.channel().writeAndFlush(new TextWebSocketFrame("验证结果:" + responseJson.getCode() + "-" + responseJson.getMsg()));
                 Thread.sleep(1000);
                 // 重新调用登录验证方法
-                responseJson = loginService.checkScanAuthResult(msg.text());
+                responseJson = loginService.qrCodeAuthScanResult(msg.text());
             }
             ctx.channel().writeAndFlush(new TextWebSocketFrame("验证结果:" + responseJson.getCode() + "-" + responseJson.getMsg()));
             // 关闭连接

+ 6 - 12
src/main/java/com/caimei365/user/controller/LoginApi.java

@@ -5,14 +5,9 @@ import com.caimei365.user.model.vo.UserLoginVo;
 import com.caimei365.user.service.LoginService;
 import lombok.RequiredArgsConstructor;
 import org.springframework.http.HttpHeaders;
-import org.springframework.http.MediaType;
 import org.springframework.web.bind.annotation.*;
-import reactor.core.publisher.Flux;
 
-import java.time.Duration;
 import java.util.Map;
-import java.util.concurrent.TimeUnit;
-import java.util.stream.IntStream;
 
 /**
  * 登录API
@@ -88,9 +83,8 @@ public class LoginApi {
      *   流程:1.前端页面中先引入JS文件(支持https):http://res.wx.qq.com/connect/zh_CN/htmledition/js/wxLogin.js
      *        2.后端提供接口(/user/login/auth/parameters)返回生成二维码的参数:appid,scope,redirect_uri,其余参数由前端自定义,详细参考微信文档:https://developers.weixin.qq.com/doc/oplatform/Website_App/WeChat_Login/Wechat_Login.html
      *        3.前端实例化JS对象(用于生成二维码): new WxLogin({self_redirect:true, id:"login_container", appid:"", scope:"", redirect_uri:"", state:"", style:"", href: ""});
-     *        4.前端生成二维码后订阅服务端SSE事件,等用户扫码完成后端通过SSE告诉前端。
-     *        5.用户扫码:用户使用微信扫码授权后,微信服务器回调:/user/login/auth/scan?code=CODE&state=STATE,后端接口根据code和state换取access_token,并通过access_token获取用户信息,并存入Redis.
-     *        6.前端通过监听SSE事件得到扫码完成的通知,发送登录请求(/user/login/auth/result)并获取用户数据(Redis取出)。
+     *        4.用户扫码:用户使用微信扫码授权后,微信服务器回调:/user/login/auth/scan?code=CODE&state=STATE,后端接口根据code和state换取access_token,并通过access_token获取用户信息,并存入Redis.
+     *        5.前端通过轮询(/user/login/auth/result)监听是否扫码完成,完成后获取用户数据(Redis取出)。
      */
 
     /**
@@ -119,16 +113,16 @@ public class LoginApi {
     }
 
     /**
-     * 校验扫码结果(长链接),用户数据存入Redis,key前缀:wxInfo:website:
+     * 校验扫码结果,用户数据存入Redis,key前缀:wxInfo:website:
      *
      * spi旧接口:/user/polling,小程序sessionKey(wxInfo)、PC端sessionKey(wxInfoMap)
      *
      * @param state   安全认证key(第一步获取参数时自定义生成的uuid)
      * @return UserLoginVo
      */
-    @GetMapping("/auth/scan/check")
-    public ResponseJson<UserLoginVo> checkScanAuthResult(String state){
-        return loginService.checkScanAuthResult(state);
+    @GetMapping("/auth/scan/result")
+    public ResponseJson<UserLoginVo> qrCodeAuthScanResult(String state){
+        return loginService.qrCodeAuthScanResult(state);
     }
 
 }

+ 2 - 2
src/main/java/com/caimei365/user/service/LoginService.java

@@ -69,11 +69,11 @@ public interface LoginService {
     void qrCodeAuthScan(String code, String state);
 
     /**
-     * 校验扫码结果(长链接)
+     * 校验扫码结果
      *
      * @param state   安全认证key(第一步获取参数时自定义生成的uuid)
      * @return UserLoginVo
      */
-    ResponseJson<UserLoginVo> checkScanAuthResult(String state);
+    ResponseJson<UserLoginVo> qrCodeAuthScanResult(String state);
 
 }

+ 1 - 1
src/main/java/com/caimei365/user/service/impl/BaseServiceImpl.java

@@ -78,7 +78,7 @@ public class BaseServiceImpl implements BaseService {
         }
         String captchaKey = ImageCaptchaUtil.getCaptchaKey(token, platformType);
         String captchaCode = (String) redisService.get(captchaKey);
-        if (StringUtils.isNotBlank(captchaCode) && StringUtils.equalsIgnoreCase(imgCode, captchaCode)) {
+        if (StringUtils.isNotEmpty(captchaCode) && StringUtils.equalsIgnoreCase(imgCode, captchaCode)) {
             // 校验成功
             return true;
         }

+ 4 - 4
src/main/java/com/caimei365/user/service/impl/LoginServiceImpl.java

@@ -298,19 +298,19 @@ public class LoginServiceImpl implements LoginService {
     }
 
     /**
-     * 校验扫码结果(长链接)
+     * 校验扫码结果
      *
      * @param state   安全认证key(第一步获取参数时自定义生成的uuid)
      * @return UserLoginVo
      */
     @Override
-    public ResponseJson<UserLoginVo> checkScanAuthResult(String state) {
+    public ResponseJson<UserLoginVo> qrCodeAuthScanResult(String state) {
         if (StringUtils.isBlank(state)) {
             return ResponseJson.error("参数异常", null);
         }
         String errorMsg = (String) redisService.get("error:" + state);
-        if (StringUtils.isNotBlank(errorMsg) || !"null".equals(errorMsg)) {
-            return ResponseJson.error("errorMsg", null);
+        if (StringUtils.isNotEmpty(errorMsg) && !"null".equals(errorMsg)) {
+            return ResponseJson.error(errorMsg, null);
         }
         Map<Object, Object> infoData = redisService.getEntries("scan:" + state);
         if (null == infoData || infoData.size() == 0) {

+ 3 - 3
src/main/java/com/caimei365/user/service/impl/RegisterServiceImpl.java

@@ -185,7 +185,7 @@ public class RegisterServiceImpl implements RegisterService {
         /*
             绑定微信,成为机构运营人员
          */
-        if (StringUtils.isNotBlank(clubRegisterDto.getNickName())) {
+        if (StringUtils.isNotEmpty(clubRegisterDto.getNickName())) {
             OperationPo operation = new OperationPo();
             // 用户Id
             operation.setUserId(user.getUserId());
@@ -410,7 +410,7 @@ public class RegisterServiceImpl implements RegisterService {
         if (!redisSmsCode.equals(smsCode)) {
             return ResponseJson.error("手机验证码错误", null);
         }
-        if (StringUtils.isNotBlank(shopRegisterDto.getEmail())) {
+        if (StringUtils.isNotEmpty(shopRegisterDto.getEmail())) {
             dbUserId = baseMapper.getUserIdByEmail(shopRegisterDto.getEmail());
             if (null != dbUserId && dbUserId > 0) {
                 return ResponseJson.error("该邮箱已被使用", null);
@@ -569,7 +569,7 @@ public class RegisterServiceImpl implements RegisterService {
             if (StringUtils.isBlank(shopRegisterDto.getName()) || StringUtils.isBlank(shopRegisterDto.getLinkMan())) {
                 return ResponseJson.error("参数异常", null);
             }
-            if (StringUtils.isNotBlank(shopRegisterDto.getEmail())) {
+            if (StringUtils.isNotEmpty(shopRegisterDto.getEmail())) {
                 // 查找用户表是否存在相同邮箱
                 Integer dbUserId = baseMapper.getUserIdByEmail(shopRegisterDto.getEmail());
                 if (null != dbUserId && dbUserId > 0) {