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());

View File

@@ -13,6 +13,8 @@ public class MemberInformationDTO implements Serializable {
private String avatar;
private String mobile;
public String getOpenId() {
return openId;
}
@@ -36,4 +38,11 @@ public class MemberInformationDTO implements Serializable {
public void setAvatar(String 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
*/
@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.setMemberId(memberId);
// memberAuth.setMobile(mobile);
@@ -155,6 +155,21 @@ public class MemberAuthService extends BaseServiceImpl {
memberAuth.setAuthId(openId);
memberAuth.setPlatformId(platformId);
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);

View File

@@ -240,6 +240,28 @@ public class MemberService extends BaseServiceImpl {
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

@@ -63,7 +63,7 @@
<sql id="tableName">
sv_member
</sql>
<!-- 字段 -->
<sql id="Field">
id,
@@ -87,7 +87,7 @@
avatar_modify_count,
avatar_modify_year
</sql>
<!-- 字段值 -->
<sql id="FieldValue">
#{id, jdbcType=INTEGER},
@@ -140,15 +140,12 @@
WHERE
sm.deleted = 0
</select>
<!-- 新增-->
<insert id="insert" parameterType="com.sv.entity.Member" useGeneratedKeys="true" keyProperty="id">
INSERT INTO
<include refid="tableName"></include>
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="id != null">
id,
</if>
<if test="nickname != null">
nickname,
</if>
@@ -205,9 +202,6 @@
</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="id != null">
#{id},
</if>
<if test="nickname != null">
#{nickname},
</if>
@@ -264,7 +258,7 @@
</if>
</trim>
</insert>
<!-- 删除-->
<delete id="delete" parameterType="java.lang.Integer">
UPDATE
@@ -287,7 +281,7 @@
#{item}
</foreach>
</delete>
<!-- 更新记录 -->
<update id="update" parameterType="com.sv.entity.Member">
UPDATE
@@ -381,7 +375,7 @@
LEFT JOIN sv_member_face_info AS smfi ON sm.id = smfi.member_id
WHERE sm.id = #{id}
</select>
<!--api 通过编号查询 -->
<select id="findById" parameterType="java.lang.Integer" resultMap="MemberMap">
SELECT
@@ -495,4 +489,4 @@
SELECT count(0) from sv_member
WHERE money >= #{price} and id = #{memberId} and deleted = 0
</select>
</mapper>
</mapper>