Commit d1dbd353 by 郑云飞

小程序静默登录获取openid

小程序获取手机号
parent a5825c86
package com.yongqi.web.controller.system; package com.yongqi.web.controller.system;
import cn.dev33.satoken.annotation.SaIgnore; import cn.dev33.satoken.annotation.SaIgnore;
import cn.dev33.satoken.context.SaHolder;
import com.yongqi.common.constant.Constants; import com.yongqi.common.constant.Constants;
import com.yongqi.common.core.domain.R; import com.yongqi.common.core.domain.R;
import com.yongqi.common.core.domain.entity.SysMenu; import com.yongqi.common.core.domain.entity.SysMenu;
...@@ -85,7 +86,7 @@ public class SysLoginController { ...@@ -85,7 +86,7 @@ public class SysLoginController {
Map<String, Object> ajax = new HashMap<>(); Map<String, Object> ajax = new HashMap<>();
// 生成令牌 // 生成令牌
String token = loginService.xcxLogin(xcxCode); String token = loginService.xcxLogin(xcxCode);
ajax.put("openId", token); ajax.put(Constants.TOKEN, token);
return R.ok(ajax); return R.ok(ajax);
} }
...@@ -97,13 +98,9 @@ public class SysLoginController { ...@@ -97,13 +98,9 @@ public class SysLoginController {
*/ */
@SaIgnore @SaIgnore
@PostMapping("/xcxPhoneLogin") @PostMapping("/xcxPhoneLogin")
public R<Map<String, Object>> xcxPhoneLogin(@NotBlank(message = "{xcx.code.not.blank}") String xcxCode public R<Map<String, Object>> xcxPhoneLogin(@NotBlank(message = "{xcx.code.not.blank}") String xcxCode) {
, @NotBlank(message = "{xcx.code.not.blank}") String openId) { LoginUser loginUser = LoginHelper.getLoginUser();
Map<String, Object> ajax = new HashMap<>(); return loginService.xcxPhoneLogin(xcxCode, loginUser);
// 生成令牌
String token = loginService.xcxPhoneLogin(xcxCode, openId);
ajax.put(Constants.TOKEN, token);
return R.ok(ajax);
} }
/** /**
......
...@@ -142,7 +142,6 @@ security: ...@@ -142,7 +142,6 @@ security:
- /captchaImage - /captchaImage
- /smsLogin - /smsLogin
- /xcxLogin - /xcxLogin
- /xcxPhoneLogin
# MyBatisPlus配置 # MyBatisPlus配置
# https://baomidou.com/config/ # https://baomidou.com/config/
......
...@@ -154,6 +154,12 @@ ...@@ -154,6 +154,12 @@
<artifactId>lock4j-redisson-spring-boot-starter</artifactId> <artifactId>lock4j-redisson-spring-boot-starter</artifactId>
</dependency> </dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.83</version>
</dependency>
<!-- 微信小程序 --> <!-- 微信小程序 -->
<dependency> <dependency>
<groupId>com.github.binarywang</groupId> <groupId>com.github.binarywang</groupId>
......
...@@ -102,6 +102,11 @@ public class LoginUser implements Serializable { ...@@ -102,6 +102,11 @@ public class LoginUser implements Serializable {
private Long roleId; private Long roleId;
/** /**
* 用户openId
*/
private String openId;
/**
* 获取登录id * 获取登录id
*/ */
public String getLoginId() { public String getLoginId() {
......
...@@ -8,10 +8,12 @@ import cn.dev33.satoken.secure.BCrypt; ...@@ -8,10 +8,12 @@ import cn.dev33.satoken.secure.BCrypt;
import cn.dev33.satoken.stp.StpUtil; import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.yongqi.common.constant.CacheConstants; import com.yongqi.common.constant.CacheConstants;
import com.yongqi.common.constant.Constants; import com.yongqi.common.constant.Constants;
import com.yongqi.common.core.domain.R;
import com.yongqi.common.core.domain.event.LogininforEvent; import com.yongqi.common.core.domain.event.LogininforEvent;
import com.yongqi.common.core.domain.dto.RoleDTO; import com.yongqi.common.core.domain.dto.RoleDTO;
import com.yongqi.common.core.domain.entity.SysUser; import com.yongqi.common.core.domain.entity.SysUser;
...@@ -45,6 +47,7 @@ import javax.servlet.http.HttpServletRequest; ...@@ -45,6 +47,7 @@ import javax.servlet.http.HttpServletRequest;
import java.rmi.ServerException; import java.rmi.ServerException;
import java.time.Duration; import java.time.Duration;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.function.Supplier; import java.util.function.Supplier;
/** /**
...@@ -116,8 +119,6 @@ public class SysLoginService { ...@@ -116,8 +119,6 @@ public class SysLoginService {
public String xcxLogin(String xcxCode) { public String xcxLogin(String xcxCode) {
// xcxCode 为 小程序调用 wx.login 授权后获取
// todo 以下自行实现
// 校验 appid + appsrcret + xcxCode 调用登录凭证校验接口 获取 session_key 与 openid // 校验 appid + appsrcret + xcxCode 调用登录凭证校验接口 获取 session_key 与 openid
WxMaJscode2SessionResult sessionInfo = null; WxMaJscode2SessionResult sessionInfo = null;
try { try {
...@@ -130,13 +131,24 @@ public class SysLoginService { ...@@ -130,13 +131,24 @@ public class SysLoginService {
throw new RuntimeException("获取微信信息失败"); throw new RuntimeException("获取微信信息失败");
} }
DbWxUser user = loadUserByOpenid(sessionInfo, null); DbWxUser user = loadUserByOpenid(sessionInfo, null);
return user.getOpenId(); // 此处可根据登录用户的数据不同 自行创建 loginUser
XcxLoginUser loginUser = new XcxLoginUser();
loginUser.setUserId(user.getId());
loginUser.setUsername(user.getNickname());
loginUser.setUserType(DeviceType.XCX.getDevice());
loginUser.setOpenid(sessionInfo.getOpenid());
// 生成token
LoginHelper.loginByDevice(loginUser, DeviceType.XCX);
recordLogininfor(user.getNickname(), Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success"));
recordLoginInfo(user.getId(), user.getNickname());
return StpUtil.getTokenValue();
} }
public String xcxPhoneLogin(String xcxCode, String openId) { public R<Map<String, Object>> xcxPhoneLogin(String xcxCode, LoginUser loginUser) {
// xcxCode 为 小程序调用 wx.login 授权后获取 log.info("登录用户:{}", JSON.toJSONString(loginUser));
// todo 以下自行实现 String openId = loginUser.getOpenId();
// 校验 appid + appsrcret + xcxCode 调用登录凭证校验接口 获取 session_key 与 openid // 校验 appid + appsrcret + xcxCode 调用获取手机号接口
WxMaPhoneNumberInfo newPhoneNoInfo = null; WxMaPhoneNumberInfo newPhoneNoInfo = null;
try { try {
newPhoneNoInfo = wxMaService.getUserService().getNewPhoneNoInfo(xcxCode); newPhoneNoInfo = wxMaService.getUserService().getNewPhoneNoInfo(xcxCode);
...@@ -150,18 +162,7 @@ public class SysLoginService { ...@@ -150,18 +162,7 @@ public class SysLoginService {
WxMaJscode2SessionResult sessionInfo = new WxMaJscode2SessionResult(); WxMaJscode2SessionResult sessionInfo = new WxMaJscode2SessionResult();
sessionInfo.setOpenid(openId); sessionInfo.setOpenid(openId);
DbWxUser user = loadUserByOpenid(sessionInfo, newPhoneNoInfo.getPhoneNumber()); DbWxUser user = loadUserByOpenid(sessionInfo, newPhoneNoInfo.getPhoneNumber());
// 此处可根据登录用户的数据不同 自行创建 loginUser return R.ok();
XcxLoginUser loginUser = new XcxLoginUser();
loginUser.setUserId(user.getId());
loginUser.setUsername(user.getNickname());
loginUser.setUserType(DeviceType.XCX.getDevice());
loginUser.setOpenid(sessionInfo.getOpenid());
// 生成token
LoginHelper.loginByDevice(loginUser, DeviceType.XCX);
recordLogininfor(user.getNickname(), Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success"));
recordLoginInfo(user.getId(), user.getNickname());
return StpUtil.getTokenValue();
} }
/** /**
...@@ -267,7 +268,7 @@ public class SysLoginService { ...@@ -267,7 +268,7 @@ public class SysLoginService {
} else if (DeleteStatusEnum.DELETED.getCode().equals(user.getDeleteFlag())) { } else if (DeleteStatusEnum.DELETED.getCode().equals(user.getDeleteFlag())) {
log.info("登录用户:{} 已被停用.", sessionInfo.getOpenid()); log.info("登录用户:{} 已被停用.", sessionInfo.getOpenid());
throw new RuntimeException("当前用户已停用,请联系管理员"); throw new RuntimeException("当前用户已停用,请联系管理员");
} else if (StringUtils.isNotEmpty(phone) && StringUtils.isNotEmpty(user.getMobile())) { } else if (StringUtils.isNotEmpty(phone)) {
user.setMobile(phone); user.setMobile(phone);
user.setAuthMobile(phone); user.setAuthMobile(phone);
wxUserMapper.updateById(user); wxUserMapper.updateById(user);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment