扫码登录

This commit is contained in:
TinyAnts 2022-12-20 17:33:01 +08:00
parent 8fed83cd15
commit 670ac0208c
5 changed files with 98 additions and 9 deletions

View File

@ -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<LoginCodesVo>
*/
@GetMapping("/codeUrl")
public AjaxResult<LoginCodesVo> codeUrl(@RequestParam String url) {
public AjaxResult<LoginUrlsVo> 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<Map<String, String>>
* @return AjaxResult<LoginUrlsVo>
*/
@GetMapping("/getScanCode")
public AjaxResult<Map<String, String>> getScanCode(HttpSession session) {
public AjaxResult<LoginUrlsVo> getScanCode(HttpSession session) {
String qrcodeUrl = iLoginService.getScanCode(session);
Map<String, String> 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<Object>
*/
@PostMapping("/scanLogin")
public AjaxResult<Object> scanLogin(@Validated @RequestBody ScanLoginValidate scanLoginValidate, HttpSession session) {
iLoginService.scanLogin(scanLoginValidate, session);
return AjaxResult.success();
}
}

View File

@ -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);
}

View File

@ -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
*

View File

@ -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;
}

View File

@ -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;