From 670ac0208c24e5c86085b741b422a006922569a3 Mon Sep 17 00:00:00 2001 From: TinyAnts Date: Tue, 20 Dec 2022 17:33:01 +0800 Subject: [PATCH] =?UTF-8?q?=E6=89=AB=E7=A0=81=E7=99=BB=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mdd/front/controller/LoginController.java | 30 ++++++++++---- .../com/mdd/front/service/ILoginService.java | 14 +++++++ .../front/service/impl/LoginServiceImpl.java | 39 +++++++++++++++++++ .../validate/login/ScanLoginValidate.java | 22 +++++++++++ .../{LoginCodesVo.java => LoginUrlsVo.java} | 2 +- 5 files changed, 98 insertions(+), 9 deletions(-) create mode 100644 server/like-front/src/main/java/com/mdd/front/validate/login/ScanLoginValidate.java rename server/like-front/src/main/java/com/mdd/front/vo/{LoginCodesVo.java => LoginUrlsVo.java} (79%) diff --git a/server/like-front/src/main/java/com/mdd/front/controller/LoginController.java b/server/like-front/src/main/java/com/mdd/front/controller/LoginController.java index a336be35..cc8a22de 100644 --- a/server/like-front/src/main/java/com/mdd/front/controller/LoginController.java +++ b/server/like-front/src/main/java/com/mdd/front/controller/LoginController.java @@ -8,7 +8,8 @@ import com.mdd.front.service.ILoginService; import com.mdd.front.validate.login.RegisterValidate; import com.mdd.front.validate.login.ForgetPwdValidate; import com.mdd.front.validate.login.OaLoginValidate; -import com.mdd.front.vo.LoginCodesVo; +import com.mdd.front.validate.login.ScanLoginValidate; +import com.mdd.front.vo.LoginUrlsVo; import com.mdd.front.vo.LoginTokenVo; import lombok.extern.slf4j.Slf4j; import org.springframework.validation.annotation.Validated; @@ -99,10 +100,10 @@ public class LoginController { * @return AjaxResult */ @GetMapping("/codeUrl") - public AjaxResult codeUrl(@RequestParam String url) { + public AjaxResult codeUrl(@RequestParam String url) { Assert.notNull(url, "url参数不能为空"); - LoginCodesVo vo = new LoginCodesVo(); + LoginUrlsVo vo = new LoginUrlsVo(); vo.setUrl(iLoginService.codeUrl(url)); return AjaxResult.success(vo); } @@ -125,14 +126,27 @@ public class LoginController { * * @author fzr * @param session session - * @return AjaxResult> + * @return AjaxResult */ @GetMapping("/getScanCode") - public AjaxResult> getScanCode(HttpSession session) { + public AjaxResult getScanCode(HttpSession session) { String qrcodeUrl = iLoginService.getScanCode(session); - Map map = new LinkedHashMap<>(); - map.put("url", qrcodeUrl); - return AjaxResult.success(map); + LoginUrlsVo vo = new LoginUrlsVo(); + vo.setUrl(qrcodeUrl); + return AjaxResult.success(vo); + } + + /** + * 扫码登录 + * + * @author fzr + * @param scanLoginValidate 参数 + * @return AjaxResult + */ + @PostMapping("/scanLogin") + public AjaxResult scanLogin(@Validated @RequestBody ScanLoginValidate scanLoginValidate, HttpSession session) { + iLoginService.scanLogin(scanLoginValidate, session); + return AjaxResult.success(); } } diff --git a/server/like-front/src/main/java/com/mdd/front/service/ILoginService.java b/server/like-front/src/main/java/com/mdd/front/service/ILoginService.java index 97e31dfb..2cc2fd61 100644 --- a/server/like-front/src/main/java/com/mdd/front/service/ILoginService.java +++ b/server/like-front/src/main/java/com/mdd/front/service/ILoginService.java @@ -2,6 +2,7 @@ package com.mdd.front.service; import com.mdd.front.validate.login.RegisterValidate; import com.mdd.front.validate.login.ForgetPwdValidate; +import com.mdd.front.validate.login.ScanLoginValidate; import com.mdd.front.vo.LoginTokenVo; import javax.servlet.http.HttpSession; @@ -75,5 +76,18 @@ public interface ILoginService { */ void forgotPassword(ForgetPwdValidate forgetPwdValidate); + /** + * 扫码链接 + * + * @author fzr + * @param session session + * @return String + */ String getScanCode(HttpSession session); + + /** + * 扫码登录 + */ + void scanLogin(ScanLoginValidate scanLoginValidate, HttpSession session); + } diff --git a/server/like-front/src/main/java/com/mdd/front/service/impl/LoginServiceImpl.java b/server/like-front/src/main/java/com/mdd/front/service/impl/LoginServiceImpl.java index 7217b369..20bbe98b 100644 --- a/server/like-front/src/main/java/com/mdd/front/service/impl/LoginServiceImpl.java +++ b/server/like-front/src/main/java/com/mdd/front/service/impl/LoginServiceImpl.java @@ -17,6 +17,7 @@ import com.mdd.front.config.FrontConfig; import com.mdd.front.service.ILoginService; import com.mdd.front.validate.login.RegisterValidate; import com.mdd.front.validate.login.ForgetPwdValidate; +import com.mdd.front.validate.login.ScanLoginValidate; import com.mdd.front.vo.LoginTokenVo; import lombok.extern.slf4j.Slf4j; import me.chanjar.weixin.common.api.WxConsts; @@ -405,6 +406,44 @@ public class LoginServiceImpl implements ILoginService { return String.format(baseUrl, appId, redirectUrl, state); } + /** + * 扫码登录 + * + * @author fzr + * @param scanLoginValidate 参数 + */ + @Override + public void scanLogin(ScanLoginValidate scanLoginValidate, HttpSession session) { + Object o = RedisUtils.get("wechat-open-state-"+session.getId()); + if (StringUtils.isNull(o) || !o.toString().equals(scanLoginValidate.getState())) { + throw new OperateException("二维码已失效或不存在,请重新操作"); + } + + // 得到配置和授权临时票据code + String code = scanLoginValidate.getCode(); + String appId = ConfigUtils.get("op_channel", "appId", ""); + String appSecret = ConfigUtils.get("op_channel", "appSecret", ""); + + //向认证服务器发送请求换取access_token + String baseAccessTokenUrl = "https://api.weixin.qq.com/sns/oauth2/access_token" + + "?appid=%s" + + "&secret=%s" + + "&code=%s" + + "&grant_type=authorization_code"; + + String result = null; + try { + String accessTokenUrl = String.format(baseAccessTokenUrl, appId, appSecret, code); + result = HttpUtils.sendGet(accessTokenUrl); + } catch (Exception e) { + throw new OperateException("获取access_token失败:"+e.getMessage()); + } + + // 2、获取微信用户信息 + + // 3、存在则更新否则创建用户 + } + /** * 生成登录Token * diff --git a/server/like-front/src/main/java/com/mdd/front/validate/login/ScanLoginValidate.java b/server/like-front/src/main/java/com/mdd/front/validate/login/ScanLoginValidate.java new file mode 100644 index 00000000..064990e9 --- /dev/null +++ b/server/like-front/src/main/java/com/mdd/front/validate/login/ScanLoginValidate.java @@ -0,0 +1,22 @@ +package com.mdd.front.validate.login; + +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.io.Serializable; + +/** + * 网站扫码登录验证 + */ +@Data +public class ScanLoginValidate implements Serializable { + + private static final long serialVersionUID = 1L; + + @NotNull(message = "code参数缺失") + private String code; + + @NotNull(message = "state参数缺失") + private String state; + +} diff --git a/server/like-front/src/main/java/com/mdd/front/vo/LoginCodesVo.java b/server/like-front/src/main/java/com/mdd/front/vo/LoginUrlsVo.java similarity index 79% rename from server/like-front/src/main/java/com/mdd/front/vo/LoginCodesVo.java rename to server/like-front/src/main/java/com/mdd/front/vo/LoginUrlsVo.java index f9492ef6..041c09a2 100644 --- a/server/like-front/src/main/java/com/mdd/front/vo/LoginCodesVo.java +++ b/server/like-front/src/main/java/com/mdd/front/vo/LoginUrlsVo.java @@ -8,7 +8,7 @@ import java.io.Serializable; * 公众号跳转url */ @Data -public class LoginCodesVo implements Serializable { +public class LoginUrlsVo implements Serializable { private static final long serialVersionUID = 1L;