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; return null;
} }
public static Integer getPlatFormValue () {
return 1;
}
public static void set(String key,Integer value){ public static void set(String key,Integer value){
PlatformDTO platformDTO = new PlatformDTO(); PlatformDTO platformDTO = new PlatformDTO();
platformDTO.setKey(key); platformDTO.setKey(key);

View File

@@ -71,15 +71,13 @@ public class LoginOrRegisterController extends BaseApiController {
*/ */
@RequestMapping(value = "/member/login/wx" , method = RequestMethod.POST) @RequestMapping(value = "/member/login/wx" , method = RequestMethod.POST)
@Deprecated @Deprecated
public ResponseDTO loginWx(@RequestParam("code") String code, @RequestParam("nickname") String nickname, public ResponseDTO loginWx(@RequestParam("code") String code){
@RequestParam("avatar") String avatar){ String openId = wechatService.getXcxOpenId(code); //查询openId:
// String openId = wechatService.getXcxOpenId(code); //查询openId: MemberTokenDTO memberTokenDTO = loginRegisterService.loginWithXcx(openId);
// MemberTokenDTO memberTokenDTO = loginRegisterService.loginWithXcx(openId,nickname,avatar);
// // memberTokenDTO为null则跳绑定手机页面
// // memberTokenDTO为null则跳绑定手机页面 return ResponseDTO.ok().addAttribute("authorization",memberTokenDTO)
// return ResponseDTO.ok().addAttribute("authorization",memberTokenDTO) .addAttribute("information",loginRegisterService.info(openId));
// .addAttribute("information",loginRegisterService.info(avatar,nickname,openId));
return null;
} }
/** /**
@@ -89,9 +87,11 @@ public class LoginOrRegisterController extends BaseApiController {
*/ */
@RequestMapping(value = "/member/login/wx/phone" , method = RequestMethod.POST) @RequestMapping(value = "/member/login/wx/phone" , method = RequestMethod.POST)
public ResponseDTO phone(BindMobileDTO bindMobileDTO){ 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() 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则跳绑定手机页面 // memberTokenDTO为null则跳绑定手机页面
return ResponseDTO.ok().addAttribute("authorization",memberTokenDTO) 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.Member;
import com.sv.entity.MemberAuth; import com.sv.entity.MemberAuth;
import com.sv.exception.api.ExceptionCodeTemplate; import com.sv.exception.api.ExceptionCodeTemplate;
import com.sv.api.util.OSSHelper;
import com.sv.api.service.impl.wechat.WechatService; import com.sv.api.service.impl.wechat.WechatService;
import com.sv.service.api.MemberAuthService; import com.sv.service.api.MemberAuthService;
import com.sv.service.api.MemberService; import com.sv.service.api.MemberService;
@@ -135,23 +134,23 @@ public class LoginRegisterServiceImpl extends BaseServiceImpl {
/** /**
* 微信快捷登录 * 微信快捷登录
*/ */
// @Deprecated public MemberTokenDTO loginWithXcx(String openId){
// public MemberTokenDTO loginWithXcx(String openId,String nickname, String avatar){ MemberTokenDTO memberTokenDTO = null;
// Integer platformId = PlatformContext.getPlatFormValue();
// MemberTokenDTO memberTokenDTO = null; synchronized (openId.intern()){
// synchronized (openId){ // 判断用户是否注册过,用微信登录过
// // 判断用户是否注册过,用微信登录过 MemberAuth memberAuth = memberAuthService.findByAuthId(openId);
// MemberAuth memberAuth = memberAuthService.findByAuthId(openId); // 登录过,则直接登录成功
// // 登录过,则直接登录成功 if (memberAuth == null){
// if (memberAuth != null){ // 先创建用户
// // 查询访问凭证,并强制更新 Member member = memberService.createUser(platformId);
// memberTokenDTO = memberTokenService.findDTOByMemberId(memberAuth.getMemberId(), Boolean.TRUE); // 创建用户登录认证
// // 修改用户图像 memberAuth = memberAuthService.createByOpenId( member.getId(), platformId, openId);
// updateInformation(memberAuth.getMemberId(),nickname,avatar); }
// } memberTokenDTO = memberTokenService.findDTOByMemberId(memberAuth.getMemberId(), Boolean.TRUE);
// } }
// return memberTokenDTO; return memberTokenDTO;
// } }
/** /**
* 已用手机号登录,支付,再跳转微信登录 * 已用手机号登录,支付,再跳转微信登录
@@ -166,7 +165,6 @@ public class LoginRegisterServiceImpl extends BaseServiceImpl {
if (memberId == null){ if (memberId == null){
throw new ServiceException("token过期"); throw new ServiceException("token过期");
} }
MemberTokenDTO memberTokenDTO = null; MemberTokenDTO memberTokenDTO = null;
synchronized (openId){ synchronized (openId){
// 1.根据openId,查找登录表,是否有记录,无,直接登录,插入信息到登录表 // 1.根据openId,查找登录表,是否有记录,无,直接登录,插入信息到登录表
@@ -213,11 +211,18 @@ public class LoginRegisterServiceImpl extends BaseServiceImpl {
* *
* 返回openId * 返回openId
*/ */
public MemberInformationDTO info(String avatar,String nickname,String openId){ public MemberInformationDTO info(String openId){
MemberInformationDTO informationDTO = new MemberInformationDTO(); MemberInformationDTO informationDTO = new MemberInformationDTO();
informationDTO.setAvatar(avatar); MemberAuth memberAuth = memberAuthService.findByAuthId(openId);
informationDTO.setNickname(nickname); 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); informationDTO.setOpenId(openId);
}
}
return informationDTO; return informationDTO;
} }
@@ -345,31 +350,33 @@ public class LoginRegisterServiceImpl extends BaseServiceImpl {
* 通过loginCode获取openId通过phoneCode获取手机号直接完成登录 * 通过loginCode获取openId通过phoneCode获取手机号直接完成登录
*/ */
@Transactional @Transactional
public MemberTokenDTO loginWithPhoneCode(BindMobileDTO bindMobileDTO){ public MemberTokenDTO loginWithPhoneCode(BindMobileDTO bindMobileDTO,String openId){
String loginCode = bindMobileDTO.getLoginCode();
String phoneCode = bindMobileDTO.getPhoneCode(); String phoneCode = bindMobileDTO.getPhoneCode();
if (StringUtils.isBlank(loginCode)) { if (StringUtils.isBlank(openId)) {
throw new ServiceException("loginCode不能为空"); throw new ServiceException("loginCode不能为空");
} }
if (StringUtils.isBlank(phoneCode)) { if (StringUtils.isBlank(phoneCode)) {
throw new ServiceException("phoneCode不能为空"); throw new ServiceException("phoneCode不能为空");
} }
Integer value = PlatformContext.getValue(); Integer value = PlatformContext.getPlatFormValue();
WechatLoginResult wechatResult = wechatService.getXcxOpenIdAndPhone(loginCode, phoneCode); WechatLoginResult wechatResult = wechatService.getXcxOpenIdAndPhone(openId, phoneCode);
String openId = wechatResult.getOpenId();
String mobile = wechatResult.getPhoneNumber(); String mobile = wechatResult.getPhoneNumber();
MemberTokenDTO memberTokenDTO = null; MemberTokenDTO memberTokenDTO = null;
synchronized (openId.intern()){ synchronized (openId.intern()){
Member member = memberService.findByMobile(mobile); Member member = memberService.findByMobile(mobile);
if (member == null) { if (member == null) {
member = memberService.createByMobile(mobile, value); MemberAuth memberAuth = memberAuthService.findByAuthId(openId);
MemberAuth memberAuth = memberAuthService.findByMobile(mobile);
if (memberAuth == null) { 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 { } else {
if (DeletedEnum.YES.value.equals(member.getDeleted())) { if (DeletedEnum.YES.value.equals(member.getDeleted())) {
throw new ServiceException(ExceptionCodeTemplate.NONE_MEMBER_INFORMATION); throw new ServiceException(ExceptionCodeTemplate.NONE_MEMBER_INFORMATION);
@@ -392,6 +399,14 @@ public class LoginRegisterServiceImpl extends BaseServiceImpl {
return memberTokenDTO; return memberTokenDTO;
} }
private void bindMobile(Integer memberId,String mobile) {
Member member = memberService.findById(memberId);
memberService.verify(member);
member.setMobile( mobile);
memberService.update(member);
}
/*** /***
* 修改用户图像 * 修改用户图像
*/ */

View File

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

View File

@@ -196,6 +196,10 @@ public class ServerMessageHandlerAdapter implements MessageService {
throw new ServiceException("二维码已经使用"); throw new ServiceException("二维码已经使用");
} }
Channel channel = getCurrentChannel(doorSn,venueBarCode.getVenueId()); Channel channel = getCurrentChannel(doorSn,venueBarCode.getVenueId());
if (channel == null) {
logger.error("门禁异常");
throw new ServiceException("门禁异常离线中");
}
Member member = memberService.findByMember(venueBarCode.getMemberId()); Member member = memberService.findByMember(venueBarCode.getMemberId());
if (member != null) { if (member != null) {
BarcodeOrderTime lastOrder = barcodeOrderTimeMapper.findLastOrder(member.getId(), venueBarCode.getVenueId()); BarcodeOrderTime lastOrder = barcodeOrderTimeMapper.findLastOrder(member.getId(), venueBarCode.getVenueId());
@@ -240,6 +244,10 @@ public class ServerMessageHandlerAdapter implements MessageService {
throw new ServiceException("二维码已经使用"); throw new ServiceException("二维码已经使用");
} }
Channel channel = getCurrentChannel(doorSn, venueBarCode.getVenueId()); Channel channel = getCurrentChannel(doorSn, venueBarCode.getVenueId());
if (channel == null) {
logger.error("门禁异常");
throw new ServiceException("门禁异常离线中");
}
Member member = memberService.findByMember(venueBarCode.getMemberId()); Member member = memberService.findByMember(venueBarCode.getMemberId());
if (member != null) { if (member != null) {
BarcodeOrderTime lastOrder = barcodeOrderTimeMapper.findLastOrder(member.getId(), venueBarCode.getVenueId()); BarcodeOrderTime lastOrder = barcodeOrderTimeMapper.findLastOrder(member.getId(), venueBarCode.getVenueId());

View File

@@ -13,6 +13,8 @@ public class MemberInformationDTO implements Serializable {
private String avatar; private String avatar;
private String mobile;
public String getOpenId() { public String getOpenId() {
return openId; return openId;
} }
@@ -36,4 +38,11 @@ public class MemberInformationDTO implements Serializable {
public void setAvatar(String avatar) { public void setAvatar(String avatar) {
this.avatar = avatar; this.avatar = avatar;
} }
public String getMobile() {
return mobile;
}
public void setMobile(String mobile) {
this.mobile = mobile;
}
} }

View File

@@ -147,7 +147,7 @@ public class MemberAuthService extends BaseServiceImpl {
* 创建登录认证存在openId * 创建登录认证存在openId
*/ */
@Transactional @Transactional
public MemberAuth createByMobileByOpenId(Integer memberId,Integer platformId, String mobile, String openId) { public MemberAuth createByOpenId(Integer memberId,Integer platformId, String openId) {
MemberAuth memberAuth = new MemberAuth(); MemberAuth memberAuth = new MemberAuth();
memberAuth.setMemberId(memberId); memberAuth.setMemberId(memberId);
// memberAuth.setMobile(mobile); // memberAuth.setMobile(mobile);
@@ -155,6 +155,21 @@ public class MemberAuthService extends BaseServiceImpl {
memberAuth.setAuthId(openId); memberAuth.setAuthId(openId);
memberAuth.setPlatformId(platformId); memberAuth.setPlatformId(platformId);
memberAuthMapper.insert(memberAuth); memberAuthMapper.insert(memberAuth);
return memberAuth;
}
/**
* 创建登录认证存在openId
*/
@Transactional
public MemberAuth createByMobileByOpenId(Integer memberId,Integer platformId, String mobile, String openId) {
MemberAuth memberAuth = new MemberAuth();
memberAuth.setMemberId(memberId);
// memberAuth.setMobile(mobile);
memberAuth.setType(MemberAuthTypeEnum.WEIXIN.value);
memberAuth.setAuthId(openId);
memberAuth.setPlatformId(platformId);
// memberAuthMapper.insert(memberAuth);
// 判断是否有用手机号登陆过 // 判断是否有用手机号登陆过
MemberAuth auth = memberAuthMapper.findByType(memberId); MemberAuth auth = memberAuthMapper.findByType(memberId);

View File

@@ -240,6 +240,28 @@ public class MemberService extends BaseServiceImpl {
return member; return member;
} }
@Transactional
public Member createUser(Integer platformId) {
// 创建用户
Member member = new Member();
member.setNickname("用户" + RandomStringUtils.randomNumeric(8));
String inviteCode = "";
Integer count = 1;
while (count == 1) {
inviteCode = RandomStringUtils.randomNumeric(10);
count = memberMapper.checkInviteCode(inviteCode);
}
member.setInviteCode(inviteCode);
member.setPlatformId(platformId);
// 初始化头像修改次数
member.setAvatarModifyCount(0);
member.setAvatarModifyYear(java.util.Calendar.getInstance().get(java.util.Calendar.YEAR));
memberMapper.insert(member);
return member;
}
/** /**
* 断言手机号码未使用 * 断言手机号码未使用
* *

View File

@@ -146,9 +146,6 @@
INSERT INTO INSERT INTO
<include refid="tableName"></include> <include refid="tableName"></include>
<trim prefix="(" suffix=")" suffixOverrides=","> <trim prefix="(" suffix=")" suffixOverrides=",">
<if test="id != null">
id,
</if>
<if test="nickname != null"> <if test="nickname != null">
nickname, nickname,
</if> </if>
@@ -205,9 +202,6 @@
</if> </if>
</trim> </trim>
<trim prefix="values (" suffix=")" suffixOverrides=","> <trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="id != null">
#{id},
</if>
<if test="nickname != null"> <if test="nickname != null">
#{nickname}, #{nickname},
</if> </if>