二维码扫码登录
获取二维码
自己公司要做的扫码登录,又用不了微信官方扫码,逻辑较为简单,就自己写呗,哈哈哈哈哈,第一篇博客,不是分享
获取二维码,生成uuid
@ApiOperation(value = "获取登录二维码", notes = "获取登录二维码")
@ApiImplicitParams({
@ApiImplicitParam(name = "uuid", value = "uuid"),
})
@GetMapping("getQrCode")
public Msg getQrCode(String uuid, HttpServletResponse response) {
QrCode qrCode = new QrCode().setCode(QrCode.S_THREE)
.setTime(new Date());
stringRedisTemplate.opsForValue()
.set(QrCode.S_CAN_CODE + uuid, JSONUtil.toJsonStr(qrCode), S_CAN_TIME, TimeUnit.SECONDS);
createQrCode(response,uuid);
return success("操作成功");
}
二维码客户端实时回调
获二维码客户端实时回调
@ApiOperation(value = "客户端实时获取登录状态", notes = "客户端实时获取登录状态")
@ApiImplicitParams({
@ApiImplicitParam(name = "uuid", value = "uuid", paramType = "_query"),
})
@GetMapping("pcQrCodeLoginState")
public Msg pcQrCodeLoginState(@NotNull(message = "唯一标识不可为空") String uuid) {
String value = stringRedisTemplate.opsForValue()
.get(QrCode.S_CAN_CODE + uuid);
if (ObjectUtil.isEmpty(value)) {
return new Msg<>(S_SIX, "二维码已过期");
}
QrCode qrCode = JSONUtil.toBean(value, QrCode.class);
//如果状态为已过期,直接返回
String code = qrCode.getCode();
if (ObjectUtil.isEmpty(code) || code.equals(S_SIX)) {
return new Msg<>(S_SIX, "二维码已过期");
}
//如果状态为登录成功
if (ObjectUtil.isEmpty(code) || S_ONE.equals(code)) {
TeacherDto teacherDto = qrCode.getTeacherDto();
if (ObjectUtil.isEmpty(teacherDto)) {
stringRedisTemplate.opsForValue()
.set(S_CAN_CODE + uuid, JSONUtil.toJsonStr(qrCode.setCode(S_TWO)), S_CAN_TIME, TimeUnit.SECONDS);
return new Msg<>(S_TWO, "登录失败");
}
return new Msg<>(S_ONE, teacherDto, "登录成功");
}
//没有过期就重新设置二维码过期时间
stringRedisTemplate.opsForValue()
.set(S_CAN_CODE + uuid, JSONUtil.toJsonStr(qrCode), S_CAN_TIME, TimeUnit.SECONDS);
return new Msg<>(qrCode.getCode(), "操作成功");
}
客户端和微信端取消扫码
客户端和微信端取消扫码,另一端回调自动取消
/**
* @param uuid 唯一标识
* @return com.amdox.common.vo.Msg
* @author huboxin
* @description: TODO 取消扫码登录
* @date 14:07 2020/5/14
**/
@ApiOperation(value = "取消扫码登录", notes = "取消扫码登录")
@ApiImplicitParams({
@ApiImplicitParam(name = "uuid", value = "唯一标识", paramType = "_query"),
})
@GetMapping("cancelCodeLogin")
public Msg cancelCodeLogin(@NotNull(message = "唯一标识不可为空") String uuid) {
String value = stringRedisTemplate.opsForValue()
.get(S_CAN_CODE + uuid);
if (ObjectUtil.isEmpty(value)) {
return new Msg(S_SIX, "二维码已过期");
}
QrCode qrCode = JSONUtil.toBean(value, QrCode.class);
stringRedisTemplate.opsForValue()
.set(S_CAN_CODE + uuid, JSONUtil.toJsonStr(qrCode.setCode(S_FIVE)), S_CAN_TIME, TimeUnit.SECONDS);
return success("取消成功");
}
扫码端实时获取二维码状态
扫码端实时获取二维码状态
@ApiOperation(value = "微信实时扫码端获取二维码状态", notes = "微信实时扫码端获取二维码状态")
@ApiImplicitParams({
@ApiImplicitParam(name = "uuid", value = "uuid", paramType = "_query"),
})
@GetMapping("wxQrCodeLoginState")
public Msg wxQrCodeLoginState(@NotNull(message = "唯一标识不可为空") String uuid) {
String value = stringRedisTemplate.opsForValue()
.get(S_CAN_CODE + uuid);
if (ObjectUtil.isEmpty(value)) {
return new Msg(S_SIX, "二维码已过期");
}
QrCode qrCode = JSONUtil.toBean(value, QrCode.class);
Date time = qrCode.getTime();
//如果二维码创建时间,超过2分钟 ,修改二维码状态为已过期,返回过期
if (ObjectUtil.isEmpty(time) || DateUtil.compare(time, DateUtil.offsetMinute(new Date(), -2)) < 0) {
stringRedisTemplate.opsForValue()
.set(QrCode.S_CAN_CODE + uuid, JSONUtil.toJsonStr(qrCode.setCode(S_SIX)), S_CAN_TIME, TimeUnit.SECONDS);
return new Msg<>(S_SIX, "二维码已过期");
}
return new Msg(qrCode.getCode(), "获取成功");
}
扫码
微信端扫码,获取openid,判断是否绑定,未绑定则跳转绑定
@ApiOperation(value = "扫码之后调用", notes = "扫码之后调用")
@ApiImplicitParams({
@ApiImplicitParam(name = "uuid", value = "uuid", paramType = "_query"),
@ApiImplicitParam(name = "code", value = "授权后的code", paramType = "_query"),
})
@PostMapping("scanCode")
public Msg scanCode(@NotNull(message = "唯一标识不可为空") String uuid, @NotNull(message = "授权信息不可为空") String code) {
String value = stringRedisTemplate.opsForValue()
.get(S_CAN_CODE + uuid);
if (ObjectUtil.isEmpty(value)) {
return new Msg<>(S_SIX, "二维码已过期");
}
String getOpenUrl = UriComponentsBuilder.fromHttpUrl(uri)
.queryParam("appid", appId)
.queryParam("secret", secret)
.queryParam("code", code)
.queryParam("grant_type", "authorization_code")
.build()
.toUriString();
// Map wx = JSONUtil.toBean(HttpUtil.get(getOpenUrl), Map.class);
// HttpUtil.get(getOpenUrl);
// if (ObjectUtil.isEmpty(wx)) {
// return fail("获取用户信息失败,请稍后重试");
// }
// Object openid = wx.get("openid");
Object openid = "oxSg0wVk7FWV7jZy1DDjWtQeOc";
if (ObjectUtil.isEmpty(openid)) {
return new Msg<>(S_TWO, "登录失败");
}
//拿openId查询数据,有则登录,无则绑定用户
String url = ServicePath.SERVICE_PUBLIC_API_LOGIN + "lanclazzLoginByOpenId";
url = UriComponentsBuilder.fromHttpUrl(url)
.queryParam("openId", openid)
.build()
.toUriString();
QrCode qrCode = JSONUtil.toBean(value, QrCode.class);
if (ObjectUtil.isEmpty(qrCode)) {
return new Msg<>(S_SIX, "二维码已过期");
}
qrCode.setOpenId(openid.toString())
.setCode(S_FOUR);
//修改状态为已扫码
stringRedisTemplate.opsForValue()
.set(S_CAN_CODE + uuid, JSONUtil.toJsonStr(qrCode), S_CAN_TIME, TimeUnit.SECONDS);
Msg msg = restTemplate.postForObject(url, null, Msg.class);
if (!Msg.isSuccess(msg)) {
return new Msg<>(S_SEVEN, "未绑定用户");
}
TeacherDto teacherDto = Msg.toObjectMsg(msg, TeacherDto.class);
if (teacherDto == null || ObjectUtil.isEmpty(teacherDto.getTeacherId())) {
return new Msg<>(S_SEVEN, "未绑定用户");
}
qrCode.setTeacherDto(teacherDto.setPassword(""));
//修改状态为已扫码
stringRedisTemplate.opsForValue()
.set(S_CAN_CODE + uuid, JSONUtil.toJsonStr(qrCode), S_CAN_TIME, TimeUnit.SECONDS);
return success("操作成功");
}
确认登录
用户手动确认登录
@ApiOperation(value = "确定登录", notes = "确定登录")
@ApiImplicitParams({
@ApiImplicitParam(name = "uuid", value = "uuid", paramType = "_query"),
})
@PostMapping("affirmLogin")
public Msg affirmLogin(@NotNull(message = "唯一标识不可为空") String uuid) {
String value = stringRedisTemplate.opsForValue()
.get(S_CAN_CODE + uuid);
if (ObjectUtil.isEmpty(value)) {
return fail("二维码已过期");
}
QrCode qrCode = JSONUtil.toBean(value, QrCode.class);
if (ObjectUtil.isEmpty(qrCode)) {
return fail("二维码已过期");
}
if (S_FIVE.equals(qrCode.getCode())) {
return fail("扫码已取消");
}
TeacherDto teacherDto = qrCode.getTeacherDto();
if (ObjectUtil.isEmpty(teacherDto) || ObjectUtil.isEmpty(teacherDto.getTeacherId())) {
return fail("登录失败,请稍后重试");
}
stringRedisTemplate.opsForValue()
.set(S_CAN_CODE + uuid, JSONUtil.toJsonStr(qrCode.setCode(S_ONE)), S_CAN_TIME, TimeUnit.SECONDS);
return success("登录成功");
}
用户绑定openid
用户绑定openid,自动登录
@ApiOperation(value = "微信openid 绑定教师", notes = "微信openid 绑定教师")
@ApiImplicitParams({
@ApiImplicitParam(name = "telephone", value = "手机号", paramType = "_query"),
@ApiImplicitParam(name = "password", value = "密码", paramType = "_query"),
@ApiImplicitParam(name = "uuid", value = "uuid", paramType = "_query"),
})
@PostMapping("bindingTeacherLogin")
public Msg bindingTeacherLogin(@NotNull(message = "手机号不可为空") String telephone,
@NotNull(message = "密码不可为空") String password,
@NotNull(message = "唯一标识不可为空") String uuid) {
String value = stringRedisTemplate.opsForValue()
.get(S_CAN_CODE + uuid);
if (ObjectUtil.isEmpty(value)) {
return fail("二维码已过期");
}
QrCode qrCode = JSONUtil.toBean(value, QrCode.class);
if (S_FIVE.equals(qrCode.getCode())) {
return fail("扫码已取消");
}
String openId = qrCode.getOpenId();
if (ObjectUtil.isEmpty(openId)) {
return fail("用户信息不存在,请重新扫描二维码");
}
String url = ServicePath.SERVICE_PUBLIC_API_CLAZZ_TEACHER_V1 + "login";
MultiValueMap<String, String> map = new LinkedMultiValueMap<>();
map.set("telephone", telephone);
map.set("password", MD5Utils.getMD5String(password));
Msg forObject = restTemplate.postForObject(url, map, Msg.class);
if (!Msg.isSuccess(forObject)) {
return fail("请确认手机号或密码是否正确");
}
Map tokenMap = Msg.toObjectMsg(forObject, Map.class);
TeacherDto teacherDto = JSONUtil.toBean(JSONUtil.toJsonStr(tokenMap.get("teacher")), TeacherDto.class);
if (ObjectUtil.isEmpty(teacherDto) || ObjectUtil.isEmpty(teacherDto.getTeacherId())) {
return fail("绑定失败,请稍后重试");
}
String bindUrl = ServicePath.SERVICE_COMMON_LONGIN + "addWechatTeacherLoginWay";
String bindReqUrl = UriComponentsBuilder.fromHttpUrl(bindUrl)
.queryParam("teacherId", teacherDto.getTeacherId())
.queryParam("openId", openId)
.build()
.toUriString();
Msg msg = restTemplate.postForObject(bindReqUrl, null, Msg.class);
if (ObjectUtil.isEmpty(msg)) {
return fail("绑定失败,请稍后重试");
}
if (!Msg.isSuccess(msg)) {
return fail("绑定失败,请稍后重试");
}
qrCode.setCode(S_ONE);
qrCode.setTeacherDto(teacherDto.setPassword(""));
//修改状态为登录
stringRedisTemplate.opsForValue()
.set(S_CAN_CODE + uuid, JSONUtil.toJsonStr(qrCode), S_CAN_TIME, TimeUnit.SECONDS);
return success("登录成功");
}
生成二维码
生成二维码
/**
* 生成二维码
* @param response response
* @param uuid uuid
*/
private void createQrCode(HttpServletResponse response,String uuid){
// Set to expire far in the past.
response.setDateHeader("Expires", 0);
// Set standard HTTP/1.1 no-cache headers.
response.setHeader("Cache-Control", "no-store, no-cache, must-revalidate");
// Set IE extended HTTP/1.1 no-cache headers (use addHeader).
response.addHeader("Cache-Control", "post-check=0, pre-check=0");
// Set standard HTTP/1.0 no-cache header.
response.setHeader("Pragma", "no-cache");
// return a jpeg
response.setContentType("image/jpeg");
ServletOutputStream outputStream = null;
try {
outputStream = response.getOutputStream();
} catch (IOException e) {
System.out.println(1);
}
QrCodeUtil.generate(//
"http://192.168.5.148:8081/?uuid=" + uuid + "&code=123456",
QrConfig.create()
.setImg("C:/Users/15290/Desktop/测试文件/download.jpg"),
"jpg", Objects.requireNonNull(outputStream)
);
try {
outputStream.close();
} catch (IOException ignored) {
System.out.println(1);
}
}
二维码扫码登录
获取二维码
获取二维码,生成uuid
@ApiOperation(value = "获取登录二维码", notes = "获取登录二维码")
@ApiImplicitParams({
@ApiImplicitParam(name = "uuid", value = "uuid"),
})
@GetMapping("getQrCode")
public Msg getQrCode(String uuid, HttpServletResponse response) {
QrCode qrCode = new QrCode().setCode(QrCode.S_THREE)
.setTime(new Date());
stringRedisTemplate.opsForValue()
.set(QrCode.S_CAN_CODE + uuid, JSONUtil.toJsonStr(qrCode), S_CAN_TIME, TimeUnit.SECONDS);
createQrCode(response,uuid);
CronUtil.start(false);
CronUtil.setMatchSecond(true);
CronUtil.schedule("0/2 * * * * ? ", (Task) () -> {
Msg msg = pcQrCodeLoginState(uuid);
System.out.println(msg);
});
return success("操作成功");
}
二维码客户端实时回调
获二维码客户端实时回调
@ApiOperation(value = "客户端实时获取登录状态", notes = "客户端实时获取登录状态")
@ApiImplicitParams({
@ApiImplicitParam(name = "uuid", value = "uuid", paramType = "_query"),
})
@GetMapping("pcQrCodeLoginState")
public Msg pcQrCodeLoginState(@NotNull(message = "唯一标识不可为空") String uuid) {
String value = stringRedisTemplate.opsForValue()
.get(QrCode.S_CAN_CODE + uuid);
if (ObjectUtil.isEmpty(value)) {
return new Msg<>(S_SIX, "二维码已过期");
}
QrCode qrCode = JSONUtil.toBean(value, QrCode.class);
//如果状态为已过期,直接返回
String code = qrCode.getCode();
if (ObjectUtil.isEmpty(code) || code.equals(S_SIX)) {
return new Msg<>(S_SIX, "二维码已过期");
}
//如果状态为登录成功
if (ObjectUtil.isEmpty(code) || S_ONE.equals(code)) {
TeacherDto teacherDto = qrCode.getTeacherDto();
if (ObjectUtil.isEmpty(teacherDto)) {
stringRedisTemplate.opsForValue()
.set(S_CAN_CODE + uuid, JSONUtil.toJsonStr(qrCode.setCode(S_TWO)), S_CAN_TIME, TimeUnit.SECONDS);
return new Msg<>(S_TWO, "登录失败");
}
return new Msg<>(S_ONE, teacherDto, "登录成功");
}
//没有过期就重新设置二维码过期时间
stringRedisTemplate.opsForValue()
.set(S_CAN_CODE + uuid, JSONUtil.toJsonStr(qrCode), S_CAN_TIME, TimeUnit.SECONDS);
return new Msg<>(qrCode.getCode(), "操作成功");
}
客户端和微信端取消扫码
客户端和微信端取消扫码,另一端回调自动取消
/**
* @param uuid 唯一标识
* @return com.amdox.common.vo.Msg
* @author huboxin
* @description: TODO 取消扫码登录
* @date 14:07 2020/5/14
**/
@ApiOperation(value = "取消扫码登录", notes = "取消扫码登录")
@ApiImplicitParams({
@ApiImplicitParam(name = "uuid", value = "唯一标识", paramType = "_query"),
})
@GetMapping("cancelCodeLogin")
public Msg cancelCodeLogin(@NotNull(message = "唯一标识不可为空") String uuid) {
String value = stringRedisTemplate.opsForValue()
.get(S_CAN_CODE + uuid);
if (ObjectUtil.isEmpty(value)) {
return new Msg(S_SIX, "二维码已过期");
}
QrCode qrCode = JSONUtil.toBean(value, QrCode.class);
stringRedisTemplate.opsForValue()
.set(S_CAN_CODE + uuid, JSONUtil.toJsonStr(qrCode.setCode(S_FIVE)), S_CAN_TIME, TimeUnit.SECONDS);
return success("取消成功");
}
扫码端实时获取二维码状态
扫码端实时获取二维码状态
@ApiOperation(value = "微信实时扫码端获取二维码状态", notes = "微信实时扫码端获取二维码状态")
@ApiImplicitParams({
@ApiImplicitParam(name = "uuid", value = "uuid", paramType = "_query"),
})
@GetMapping("wxQrCodeLoginState")
public Msg wxQrCodeLoginState(@NotNull(message = "唯一标识不可为空") String uuid) {
String value = stringRedisTemplate.opsForValue()
.get(S_CAN_CODE + uuid);
if (ObjectUtil.isEmpty(value)) {
return new Msg(S_SIX, "二维码已过期");
}
QrCode qrCode = JSONUtil.toBean(value, QrCode.class);
Date time = qrCode.getTime();
//如果二维码创建时间,超过2分钟 ,修改二维码状态为已过期,返回过期
if (ObjectUtil.isEmpty(time) || DateUtil.compare(time, DateUtil.offsetMinute(new Date(), -2)) < 0) {
stringRedisTemplate.opsForValue()
.set(QrCode.S_CAN_CODE + uuid, JSONUtil.toJsonStr(qrCode.setCode(S_SIX)), S_CAN_TIME, TimeUnit.SECONDS);
return new Msg<>(S_SIX, "二维码已过期");
}
return new Msg(qrCode.getCode(), "获取成功");
}
扫码
微信端扫码,获取openid,判断是否绑定,未绑定则跳转绑定
@ApiOperation(value = "扫码之后调用", notes = "扫码之后调用")
@ApiImplicitParams({
@ApiImplicitParam(name = "uuid", value = "uuid", paramType = "_query"),
@ApiImplicitParam(name = "code", value = "授权后的code", paramType = "_query"),
})
@PostMapping("scanCode")
public Msg scanCode(@NotNull(message = "唯一标识不可为空") String uuid, @NotNull(message = "授权信息不可为空") String code) {
String value = stringRedisTemplate.opsForValue()
.get(S_CAN_CODE + uuid);
if (ObjectUtil.isEmpty(value)) {
return new Msg<>(S_SIX, "二维码已过期");
}
String getOpenUrl = UriComponentsBuilder.fromHttpUrl(uri)
.queryParam("appid", appId)
.queryParam("secret", secret)
.queryParam("code", code)
.queryParam("grant_type", "authorization_code")
.build()
.toUriString();
// Map wx = JSONUtil.toBean(HttpUtil.get(getOpenUrl), Map.class);
// HttpUtil.get(getOpenUrl);
// if (ObjectUtil.isEmpty(wx)) {
// return fail("获取用户信息失败,请稍后重试");
// }
// Object openid = wx.get("openid");
Object openid = "oxSg0wVk7FWV7jZy1DDjWtQeOc";
if (ObjectUtil.isEmpty(openid)) {
return new Msg<>(S_TWO, "登录失败");
}
//拿openId查询数据,有则登录,无则绑定用户
String url = ServicePath.SERVICE_PUBLIC_API_LOGIN + "lanclazzLoginByOpenId";
url = UriComponentsBuilder.fromHttpUrl(url)
.queryParam("openId", openid)
.build()
.toUriString();
QrCode qrCode = JSONUtil.toBean(value, QrCode.class);
if (ObjectUtil.isEmpty(qrCode)) {
return new Msg<>(S_SIX, "二维码已过期");
}
qrCode.setOpenId(openid.toString())
.setCode(S_FOUR);
//修改状态为已扫码
stringRedisTemplate.opsForValue()
.set(S_CAN_CODE + uuid, JSONUtil.toJsonStr(qrCode), S_CAN_TIME, TimeUnit.SECONDS);
Msg msg = restTemplate.postForObject(url, null, Msg.class);
if (!Msg.isSuccess(msg)) {
return new Msg<>(S_SEVEN, "未绑定用户");
}
TeacherDto teacherDto = Msg.toObjectMsg(msg, TeacherDto.class);
if (teacherDto == null || ObjectUtil.isEmpty(teacherDto.getTeacherId())) {
return new Msg<>(S_SEVEN, "未绑定用户");
}
qrCode.setTeacherDto(teacherDto.setPassword(""));
//修改状态为已扫码
stringRedisTemplate.opsForValue()
.set(S_CAN_CODE + uuid, JSONUtil.toJsonStr(qrCode), S_CAN_TIME, TimeUnit.SECONDS);
return success("操作成功");
}
确认登录
用户手动确认登录
@ApiOperation(value = "确定登录", notes = "确定登录")
@ApiImplicitParams({
@ApiImplicitParam(name = "uuid", value = "uuid", paramType = "_query"),
})
@PostMapping("affirmLogin")
public Msg affirmLogin(@NotNull(message = "唯一标识不可为空") String uuid) {
String value = stringRedisTemplate.opsForValue()
.get(S_CAN_CODE + uuid);
if (ObjectUtil.isEmpty(value)) {
return fail("二维码已过期");
}
QrCode qrCode = JSONUtil.toBean(value, QrCode.class);
if (ObjectUtil.isEmpty(qrCode)) {
return fail("二维码已过期");
}
if (S_FIVE.equals(qrCode.getCode())) {
return fail("扫码已取消");
}
TeacherDto teacherDto = qrCode.getTeacherDto();
if (ObjectUtil.isEmpty(teacherDto) || ObjectUtil.isEmpty(teacherDto.getTeacherId())) {
return fail("登录失败,请稍后重试");
}
stringRedisTemplate.opsForValue()
.set(S_CAN_CODE + uuid, JSONUtil.toJsonStr(qrCode.setCode(S_ONE)), S_CAN_TIME, TimeUnit.SECONDS);
return success("登录成功");
}
用户绑定openid
用户绑定openid,自动登录
@ApiOperation(value = "微信openid 绑定教师", notes = "微信openid 绑定教师")
@ApiImplicitParams({
@ApiImplicitParam(name = "telephone", value = "手机号", paramType = "_query"),
@ApiImplicitParam(name = "password", value = "密码", paramType = "_query"),
@ApiImplicitParam(name = "uuid", value = "uuid", paramType = "_query"),
})
@PostMapping("bindingTeacherLogin")
public Msg bindingTeacherLogin(@NotNull(message = "手机号不可为空") String telephone,
@NotNull(message = "密码不可为空") String password,
@NotNull(message = "唯一标识不可为空") String uuid) {
String value = stringRedisTemplate.opsForValue()
.get(S_CAN_CODE + uuid);
if (ObjectUtil.isEmpty(value)) {
return fail("二维码已过期");
}
QrCode qrCode = JSONUtil.toBean(value, QrCode.class);
if (S_FIVE.equals(qrCode.getCode())) {
return fail("扫码已取消");
}
String openId = qrCode.getOpenId();
if (ObjectUtil.isEmpty(openId)) {
return fail("用户信息不存在,请重新扫描二维码");
}
String url = ServicePath.SERVICE_PUBLIC_API_CLAZZ_TEACHER_V1 + "login";
MultiValueMap<String, String> map = new LinkedMultiValueMap<>();
map.set("telephone", telephone);
map.set("password", MD5Utils.getMD5String(password));
Msg forObject = restTemplate.postForObject(url, map, Msg.class);
if (!Msg.isSuccess(forObject)) {
return fail("请确认手机号或密码是否正确");
}
Map tokenMap = Msg.toObjectMsg(forObject, Map.class);
TeacherDto teacherDto = JSONUtil.toBean(JSONUtil.toJsonStr(tokenMap.get("teacher")), TeacherDto.class);
if (ObjectUtil.isEmpty(teacherDto) || ObjectUtil.isEmpty(teacherDto.getTeacherId())) {
return fail("绑定失败,请稍后重试");
}
String bindUrl = ServicePath.SERVICE_COMMON_LONGIN + "addWechatTeacherLoginWay";
String bindReqUrl = UriComponentsBuilder.fromHttpUrl(bindUrl)
.queryParam("teacherId", teacherDto.getTeacherId())
.queryParam("openId", openId)
.build()
.toUriString();
Msg msg = restTemplate.postForObject(bindReqUrl, null, Msg.class);
if (ObjectUtil.isEmpty(msg)) {
return fail("绑定失败,请稍后重试");
}
if (!Msg.isSuccess(msg)) {
return fail("绑定失败,请稍后重试");
}
qrCode.setCode(S_ONE);
qrCode.setTeacherDto(teacherDto.setPassword(""));
//修改状态为登录
stringRedisTemplate.opsForValue()
.set(S_CAN_CODE + uuid, JSONUtil.toJsonStr(qrCode), S_CAN_TIME, TimeUnit.SECONDS);
return success("登录成功");
}
生成二维码
生成二维码
/**
* 生成二维码
* @param response response
* @param uuid uuid
*/
private void createQrCode(HttpServletResponse response,String uuid){
// Set to expire far in the past.
response.setDateHeader("Expires", 0);
// Set standard HTTP/1.1 no-cache headers.
response.setHeader("Cache-Control", "no-store, no-cache, must-revalidate");
// Set IE extended HTTP/1.1 no-cache headers (use addHeader).
response.addHeader("Cache-Control", "post-check=0, pre-check=0");
// Set standard HTTP/1.0 no-cache header.
response.setHeader("Pragma", "no-cache");
// return a jpeg
response.setContentType("image/jpeg");
ServletOutputStream outputStream = null;
try {
outputStream = response.getOutputStream();
} catch (IOException e) {
System.out.println(1);
}
QrCodeUtil.generate(//
"http://192.168.5.148:8081/?uuid=" + uuid + "&code=123456",
QrConfig.create()
.setImg("C:/Users/15290/Desktop/测试文件/download.jpg"),
"jpg", Objects.requireNonNull(outputStream)
);
try {
outputStream.close();
} catch (IOException ignored) {
System.out.println(1);
}
}
二维码实体类
二维码实体类
@Data
@Accessors(chain = true)
public class QrCode implements Serializable {
/**
* redis前缀
*/
public static String S_CAN_CODE = "scan_qr_code::";
/**
* 二维码redis过期时间 分钟
*/
public static Integer S_CAN_TIME = 5;
/**
* 1登录成功
*/
public static String S_ONE = "1";
/**
* 2登录失败
*/
public static String S_TWO = "2";
/**
* 未扫码
*/
public static String S_THREE = "3";
/**
* 4已扫码
*/
public static String S_FOUR = "4";
/**
* 已取消
*/
public static String S_FIVE = "5";
/**
* 二维码过期
*/
public static String S_SIX = "6";
/**
* 未绑定用户
*/
public static String S_SEVEN = "7";
/**
* 状态码
*/
private String code;
/**
* 登录教师
*/
private TeacherDto teacherDto;
/**
* 生成二维码时间
*/
private Date time;
/**
* openId
*/
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd hh:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd hh:mm:ss")
private String openId;
/**
* 唯一标识
*/
private String uuid;
}