feat(auth): 重构微信登录和手机号绑定功能

- 简化微信登录接口参数,移除昵称和头像参数
- 优化手机号绑定流程,直接通过openId获取用户信息
- 完善用户信息查询逻辑,从数据库获取真实用户数据
- 修复门禁系统异常处理,添加设备离线检查
- 更新会员信息服务,支持用户创建和信息完善
- 调整MyBatis映射文件,优化用户数据插入逻辑
This commit is contained in:
2026-04-18 18:36:56 +08:00
parent 03a556fe76
commit 81120e1794
9 changed files with 132 additions and 66 deletions

View File

@@ -33,6 +33,10 @@ public class PlatformContext {
return null;
}
public static Integer getPlatFormValue () {
return 1;
}
public static void set(String key,Integer value){
PlatformDTO platformDTO = new PlatformDTO();
platformDTO.setKey(key);

View File

@@ -71,15 +71,13 @@ public class LoginOrRegisterController extends BaseApiController {
*/
@RequestMapping(value = "/member/login/wx" , method = RequestMethod.POST)
@Deprecated
public ResponseDTO loginWx(@RequestParam("code") String code, @RequestParam("nickname") String nickname,
@RequestParam("avatar") String avatar){
// String openId = wechatService.getXcxOpenId(code); //查询openId:
// MemberTokenDTO memberTokenDTO = loginRegisterService.loginWithXcx(openId,nickname,avatar);
//
// // memberTokenDTO为null则跳绑定手机页面
// return ResponseDTO.ok().addAttribute("authorization",memberTokenDTO)
// .addAttribute("information",loginRegisterService.info(avatar,nickname,openId));
return null;
public ResponseDTO loginWx(@RequestParam("code") String code){
String openId = wechatService.getXcxOpenId(code); //查询openId:
MemberTokenDTO memberTokenDTO = loginRegisterService.loginWithXcx(openId);
// memberTokenDTO为null则跳绑定手机页面
return ResponseDTO.ok().addAttribute("authorization",memberTokenDTO)
.addAttribute("information",loginRegisterService.info(openId));
}
/**
@@ -89,9 +87,11 @@ public class LoginOrRegisterController extends BaseApiController {
*/
@RequestMapping(value = "/member/login/wx/phone" , method = RequestMethod.POST)
public ResponseDTO phone(BindMobileDTO bindMobileDTO){
MemberTokenDTO memberTokenDTO = loginRegisterService.loginWithPhoneCode(bindMobileDTO);
String openId = wechatService.getXcxOpenId(bindMobileDTO.getLoginCode()); //查询openId:
MemberTokenDTO memberTokenDTO = loginRegisterService.loginWithPhoneCode(bindMobileDTO,openId);
return ResponseDTO.ok()
.addAttribute("authorization",memberTokenDTO);
.addAttribute("authorization",memberTokenDTO)
.addAttribute("information",loginRegisterService.info(openId));
}
/**
@@ -115,6 +115,6 @@ public class LoginOrRegisterController extends BaseApiController {
// memberTokenDTO为null则跳绑定手机页面
return ResponseDTO.ok().addAttribute("authorization",memberTokenDTO)
.addAttribute("information",loginRegisterService.info(avatar,nickname,openId));
.addAttribute("information",loginRegisterService.info(openId));
}
}

View File

@@ -11,7 +11,6 @@ import com.sv.dto.api.wechat.WechatLoginResult;
import com.sv.entity.Member;
import com.sv.entity.MemberAuth;
import com.sv.exception.api.ExceptionCodeTemplate;
import com.sv.api.util.OSSHelper;
import com.sv.api.service.impl.wechat.WechatService;
import com.sv.service.api.MemberAuthService;
import com.sv.service.api.MemberService;
@@ -135,23 +134,23 @@ public class LoginRegisterServiceImpl extends BaseServiceImpl {
/**
* 微信快捷登录
*/
// @Deprecated
// public MemberTokenDTO loginWithXcx(String openId,String nickname, String avatar){
//
// MemberTokenDTO memberTokenDTO = null;
// synchronized (openId){
// // 判断用户是否注册过,用微信登录过
// MemberAuth memberAuth = memberAuthService.findByAuthId(openId);
// // 登录过,则直接登录成功
// if (memberAuth != null){
// // 查询访问凭证,并强制更新
// memberTokenDTO = memberTokenService.findDTOByMemberId(memberAuth.getMemberId(), Boolean.TRUE);
// // 修改用户图像
// updateInformation(memberAuth.getMemberId(),nickname,avatar);
// }
// }
// return memberTokenDTO;
// }
public MemberTokenDTO loginWithXcx(String openId){
MemberTokenDTO memberTokenDTO = null;
Integer platformId = PlatformContext.getPlatFormValue();
synchronized (openId.intern()){
// 判断用户是否注册过,用微信登录过
MemberAuth memberAuth = memberAuthService.findByAuthId(openId);
// 登录过,则直接登录成功
if (memberAuth == null){
// 先创建用户
Member member = memberService.createUser(platformId);
// 创建用户登录认证
memberAuth = memberAuthService.createByOpenId( member.getId(), platformId, openId);
}
memberTokenDTO = memberTokenService.findDTOByMemberId(memberAuth.getMemberId(), Boolean.TRUE);
}
return memberTokenDTO;
}
/**
* 已用手机号登录,支付,再跳转微信登录
@@ -166,7 +165,6 @@ public class LoginRegisterServiceImpl extends BaseServiceImpl {
if (memberId == null){
throw new ServiceException("token过期");
}
MemberTokenDTO memberTokenDTO = null;
synchronized (openId){
// 1.根据openId,查找登录表,是否有记录,无,直接登录,插入信息到登录表
@@ -213,11 +211,18 @@ public class LoginRegisterServiceImpl extends BaseServiceImpl {
*
* 返回openId
*/
public MemberInformationDTO info(String avatar,String nickname,String openId){
public MemberInformationDTO info(String openId){
MemberInformationDTO informationDTO = new MemberInformationDTO();
informationDTO.setAvatar(avatar);
informationDTO.setNickname(nickname);
informationDTO.setOpenId(openId);
MemberAuth memberAuth = memberAuthService.findByAuthId(openId);
if (memberAuth != null) {
Member byId = memberService.findById(memberAuth.getMemberId());
if (byId != null) {
informationDTO.setAvatar(byId.getAvatar());
informationDTO.setNickname(byId.getNickname());
informationDTO.setMobile(byId.getMobile());
informationDTO.setOpenId(openId);
}
}
return informationDTO;
}
@@ -345,31 +350,33 @@ public class LoginRegisterServiceImpl extends BaseServiceImpl {
* 通过loginCode获取openId通过phoneCode获取手机号直接完成登录
*/
@Transactional
public MemberTokenDTO loginWithPhoneCode(BindMobileDTO bindMobileDTO){
String loginCode = bindMobileDTO.getLoginCode();
public MemberTokenDTO loginWithPhoneCode(BindMobileDTO bindMobileDTO,String openId){
String phoneCode = bindMobileDTO.getPhoneCode();
if (StringUtils.isBlank(loginCode)) {
if (StringUtils.isBlank(openId)) {
throw new ServiceException("loginCode不能为空");
}
if (StringUtils.isBlank(phoneCode)) {
throw new ServiceException("phoneCode不能为空");
}
Integer value = PlatformContext.getValue();
WechatLoginResult wechatResult = wechatService.getXcxOpenIdAndPhone(loginCode, phoneCode);
String openId = wechatResult.getOpenId();
Integer value = PlatformContext.getPlatFormValue();
WechatLoginResult wechatResult = wechatService.getXcxOpenIdAndPhone(openId, phoneCode);
String mobile = wechatResult.getPhoneNumber();
MemberTokenDTO memberTokenDTO = null;
synchronized (openId.intern()){
Member member = memberService.findByMobile(mobile);
if (member == null) {
member = memberService.createByMobile(mobile, value);
MemberAuth memberAuth = memberAuthService.findByMobile(mobile);
MemberAuth memberAuth = memberAuthService.findByAuthId(openId);
if (memberAuth == null) {
memberAuth = memberAuthService.createByMobileByOpenId(member.getId(), member.getPlatformId(), mobile, openId);
member = memberService.createByMobile(mobile, value);
}
memberTokenDTO = memberTokenService.findDTOByMemberId(memberAuth.getMemberId(), Boolean.TRUE);
MemberAuth memberAuthMobile = memberAuthService.findByMobile(mobile);
if (memberAuthMobile == null) {
memberAuthMobile = memberAuthService.createByMobileByOpenId(memberAuth.getMemberId(), value, mobile, openId);
}
bindMobile(memberAuth.getMemberId(),mobile);
memberTokenDTO = memberTokenService.findDTOByMemberId(memberAuthMobile.getMemberId(), Boolean.TRUE);
} else {
if (DeletedEnum.YES.value.equals(member.getDeleted())) {
throw new ServiceException(ExceptionCodeTemplate.NONE_MEMBER_INFORMATION);
@@ -392,6 +399,14 @@ public class LoginRegisterServiceImpl extends BaseServiceImpl {
return memberTokenDTO;
}
private void bindMobile(Integer memberId,String mobile) {
Member member = memberService.findById(memberId);
memberService.verify(member);
member.setMobile( mobile);
memberService.update(member);
}
/***
* 修改用户图像
*/
@@ -404,13 +419,13 @@ public class LoginRegisterServiceImpl extends BaseServiceImpl {
if (nickname != null){
member.setNickname(nickname);
}
// 如果更新了头像,增加修改次数
if (avatar != null && !avatar.equals(member.getAvatar())) {
int currentYear = java.util.Calendar.getInstance().get(java.util.Calendar.YEAR);
Integer modifyCount = member.getAvatarModifyCount();
Integer modifyYear = member.getAvatarModifyYear();
if (modifyYear == null || modifyYear != currentYear) {
member.setAvatarModifyCount(1);
member.setAvatarModifyYear(currentYear);
@@ -418,7 +433,7 @@ public class LoginRegisterServiceImpl extends BaseServiceImpl {
member.setAvatarModifyCount((modifyCount == null ? 0 : modifyCount) + 1);
}
}
member.setAvatar(avatar);
memberService.update(member);
}

View File

@@ -50,14 +50,13 @@ public class WechatService extends BaseServiceImpl {
return response.getOpenid();
}
public WechatLoginResult getXcxOpenIdAndPhone(String loginCode, String phoneCode) {
public WechatLoginResult getXcxOpenIdAndPhone(String openId, String phoneCode) {
Platform platform = platformServiceImpl.findById(PLATFORM_ID);
if (platform == null) {
logger.error("平台信息不存在platformId: " + PLATFORM_ID);
throw new ServiceException(ExceptionCodeTemplate.SERVICE_EXCEPTION);
}
String openId = getXcxOpenId(loginCode);
String accessToken = getAccessToken(platform);
String phoneNumber = getPhoneNumber(phoneCode, accessToken);

View File

@@ -88,7 +88,7 @@ public class ServerMessageHandlerAdapter implements MessageService {
logger.info("=========" + JsonUtils.encode(heartBeat) + clientId);
String deviceName = heartBeat.getDeviceName();
Integer venueId = heartBeat.getVenueId();
Channel oldChannel = getCurrentChannel(deviceName, venueId);
if (oldChannel == null) {
Venue thisVenue = venueService.findById(venueId);
@@ -196,6 +196,10 @@ public class ServerMessageHandlerAdapter implements MessageService {
throw new ServiceException("二维码已经使用");
}
Channel channel = getCurrentChannel(doorSn,venueBarCode.getVenueId());
if (channel == null) {
logger.error("门禁异常");
throw new ServiceException("门禁异常离线中");
}
Member member = memberService.findByMember(venueBarCode.getMemberId());
if (member != null) {
BarcodeOrderTime lastOrder = barcodeOrderTimeMapper.findLastOrder(member.getId(), venueBarCode.getVenueId());
@@ -240,6 +244,10 @@ public class ServerMessageHandlerAdapter implements MessageService {
throw new ServiceException("二维码已经使用");
}
Channel channel = getCurrentChannel(doorSn, venueBarCode.getVenueId());
if (channel == null) {
logger.error("门禁异常");
throw new ServiceException("门禁异常离线中");
}
Member member = memberService.findByMember(venueBarCode.getMemberId());
if (member != null) {
BarcodeOrderTime lastOrder = barcodeOrderTimeMapper.findLastOrder(member.getId(), venueBarCode.getVenueId());