feat(auth): 重构微信登录和手机号绑定功能
- 简化微信登录接口参数,移除昵称和头像参数 - 优化手机号绑定流程,直接通过openId获取用户信息 - 完善用户信息查询逻辑,从数据库获取真实用户数据 - 修复门禁系统异常处理,添加设备离线检查 - 更新会员信息服务,支持用户创建和信息完善 - 调整MyBatis映射文件,优化用户数据插入逻辑
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
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);
|
||||
}
|
||||
|
||||
/***
|
||||
* 修改用户图像
|
||||
*/
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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());
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
/**
|
||||
* 断言手机号码未使用
|
||||
*
|
||||
|
||||
@@ -146,9 +146,6 @@
|
||||
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>
|
||||
|
||||
Reference in New Issue
Block a user