Răsfoiți Sursa

fix 绑定微信

zoujiajian 2 luni în urmă
părinte
comite
808177cd3b

+ 19 - 0
netflix-service/src/main/java/com/cyksj/service/corp/impl/CorpUserServiceImpl.java

@@ -18,6 +18,7 @@ import com.cyksj.model.kf.CorpKfUserInfo;
 import com.cyksj.model.request.corp.CorpCommonReq;
 import com.cyksj.model.request.corp.CorpXmlMessage;
 import com.cyksj.model.views.YHLXUserDetailView;
+import com.cyksj.redis.RedisService;
 import com.cyksj.service.corp.CorpUserService;
 import com.cyksj.service.corp.WxCorpOps;
 import com.cyksj.service.corp.msg.CorpEventActionService;
@@ -77,6 +78,8 @@ public class CorpUserServiceImpl implements CorpUserService {
 
 	private final PhoneCodeMapper phoneCodeMapper;
 
+	private final RedisService redisService;
+
 	@Override
 	public YHLXUserDetailView getUserDetailView(String externalUserid, String corpId) throws Exception {
 		CorpUser corpUser = getExternalUserId(corpId, externalUserid);
@@ -149,6 +152,11 @@ public class CorpUserServiceImpl implements CorpUserService {
 		if (StrUtil.isEmpty(orderNo)) {
 			throw BusinessRuntimeException.getInstance("用户订单号不为空");
 		}
+		String bindLockValue = StrUtil.blankToDefault(orderNo, externalUserid);
+		String bindLockKey = RedisService.key.USER_BIND_ACCOUNT_INFO_KEY.getName() + bindLockValue;
+		if (!redisService.setNx(bindLockKey, bindLockValue, RedisService.key.USER_BIND_ACCOUNT_INFO_KEY.getTimeout())) {
+			throw BusinessRuntimeException.getInstance("account binding, please retry later");
+		}
 		CorpUser corpUser = getExternalUserId(corpId, externalUserid);
 		if (corpUser == null) {
 			throw BusinessRuntimeException.getInstance("添加用户不存在");
@@ -174,6 +182,17 @@ public class CorpUserServiceImpl implements CorpUserService {
 			throw BusinessRuntimeException.getInstance("该订单号对应的用户已绑定微信");
 		}
 		User user = userMapper.selectOne(Wrappers.lambdaQuery(User.class).eq(User::getUnionid, corpUser.getUnionid()).last("limit 1"));
+		if (user == null) {
+			if (!redisService.setNx(RedisService.key.REPEAT_USER_KEY.getNameFormat(corpUser.getUnionid()), corpUser.getUnionid(), RedisService.key.REPEAT_USER_KEY.getTimeout())) {
+				user = userMapper.selectOne(Wrappers.lambdaQuery(User.class).eq(User::getUnionid, corpUser.getUnionid()).last("limit 1"));
+				if (user == null) {
+					throw BusinessRuntimeException.getInstance("account binding, please retry later");
+				}
+			}
+		}
+		if (user == null) {
+			user = userMapper.selectOne(Wrappers.lambdaQuery(User.class).eq(User::getUnionid, corpUser.getUnionid()).last("limit 1"));
+		}
 		if (user == null) {
 			user = new User();
 			user.setNickname(corpUser.getName());

+ 39 - 0
netflix-service/src/main/java/com/cyksj/service/gzh/factory/EventMsgService.java

@@ -22,6 +22,7 @@ import com.cyksj.mapper.manage.coupon.CouponDistributePopularizeMapper;
 import com.cyksj.mapper.manage.coupon.CouponRecommendMapper;
 import com.cyksj.mapper.manage.cps.UserDistributePopularizeMapper;
 import com.cyksj.mapper.manage.distribute.UserDistributeMapper;
+import com.cyksj.mapper.market.task.UserBindDetailMapper;
 import com.cyksj.mapper.nano.NanoUserTrialReceiveRecordMapper;
 import com.cyksj.mapper.station.CollegeStudentStationUserRelateMapper;
 import com.cyksj.model.dto.*;
@@ -102,6 +103,8 @@ public class EventMsgService implements GzhMsgService {
 
 	private final GoodsDonSkuMapper goodsDonSkuMapper;
 
+    private final UserBindDetailMapper userBindDetailMapper;
+
 	private static final GlobalThreadPoolTaskExecutor TASK_POOL = GlobalThreadPoolTaskExecutor.getInstance();
 
 	@Override
@@ -170,6 +173,23 @@ public class EventMsgService implements GzhMsgService {
 			}
 		}
 		Boolean isNewUser = false;
+		if (gzhDto != null) {
+			String bindAccount = StrUtil.blankToDefault(gzhDto.getLoginPhone(), gzhDto.getLoginEmail());
+			if (StrUtil.isNotBlank(bindAccount)) {
+				UserBindDetail bindDetail = getWxBindDetail(gzhDto.getLoginPhone(), gzhDto.getLoginEmail());
+				if (bindDetail != null && bindDetail.getUserId() != null) {
+					user = userMapper.selectById(bindDetail.getUserId());
+				} else {
+					if (!redisService.setNx(RedisService.key.USER_BIND_ACCOUNT_INFO_KEY.getName() + bindAccount, bindAccount, RedisService.key.USER_BIND_ACCOUNT_INFO_KEY.getTimeout())) {
+						return false;
+					}
+					bindDetail = getWxBindDetail(gzhDto.getLoginPhone(), gzhDto.getLoginEmail());
+					if (bindDetail != null && bindDetail.getUserId() != null) {
+						user = userMapper.selectById(bindDetail.getUserId());
+					}
+				}
+			}
+		}
 		if (user == null) {
 			isNewUser = true;
 			user = new User();
@@ -347,6 +367,25 @@ public class EventMsgService implements GzhMsgService {
 		}
 	}
 
+	private UserBindDetail getWxBindDetail(String loginPhone, String loginEmail) {
+		if (StrUtil.isNotBlank(loginPhone)) {
+			UserBindDetail bindDetail = userBindDetailMapper.selectOne(Wrappers.lambdaQuery(UserBindDetail.class)
+					.eq(UserBindDetail::getPhone, loginPhone)
+					.isNotNull(UserBindDetail::getUserId)
+					.last("limit 1"));
+			if (bindDetail != null) {
+				return bindDetail;
+			}
+		}
+		if (StrUtil.isNotBlank(loginEmail)) {
+			return userBindDetailMapper.selectOne(Wrappers.lambdaQuery(UserBindDetail.class)
+					.eq(UserBindDetail::getEmail, loginEmail)
+					.isNotNull(UserBindDetail::getUserId)
+					.last("limit 1"));
+		}
+		return null;
+	}
+
 	public UserSharedDto getUserShredDtoByDsCode(String dsCode) {
 		Long sharedId = 0l;
 		Long dsPopularizeId = 0l;

+ 35 - 3
netflix-service/src/main/java/com/cyksj/service/user/impl/UserServiceImpl.java

@@ -630,14 +630,27 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
 		// 转跳参数
 		String json = Codec.DoBase64.custom().setData(state).decodeAsText();
 		AuthRedirect re = Jsons.parseObject(json, AuthRedirect.class);
+		String loginPhone = re.getLp();
+		String loginEmail = re.getLe();
+		String bindAccount = StrUtil.blankToDefault(loginPhone, loginEmail);
+		if (StrUtil.isNotBlank(bindAccount)) {
+			UserBindDetail bindDetail = getWxBindDetail(loginPhone, loginEmail);
+			if (bindDetail != null && bindDetail.getUserId() != null) {
+				return redisService.getStr(re.getMappingId().toString());
+			}
+			if (!redisService.setNx(RedisService.key.USER_BIND_ACCOUNT_INFO_KEY.getName() + bindAccount, bindAccount, RedisService.key.USER_BIND_ACCOUNT_INFO_KEY.getTimeout())) {
+				throw BusinessRuntimeException.getInstance("account binding, please retry later");
+			}
+			bindDetail = getWxBindDetail(loginPhone, loginEmail);
+			if (bindDetail != null && bindDetail.getUserId() != null) {
+				return redisService.getStr(re.getMappingId().toString());
+			}
+		}
 		//保存用户信息
 		User user = saveAuth(userinfo, re, User.RegisterEnv.pc);
 		if (user == null) {
 			throw BusinessRuntimeException.getInstance("系统错误,请重新授权");
 		}
-		String loginPhone = re.getLp();
-		String loginEmail = re.getLe();
-
 		if (StrUtil.isNotBlank(loginPhone)) {
 			log.info("手机号phone:{}登录用户,微信扫描网页授权二维码进行用户信息绑定", loginPhone);
 			try {
@@ -658,6 +671,25 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
 		return redisService.getStr(re.getMappingId().toString());
 	}
 
+	private UserBindDetail getWxBindDetail(String loginPhone, String loginEmail) {
+		if (StrUtil.isNotBlank(loginPhone)) {
+			UserBindDetail bindDetail = userBindDetailMapper.selectOne(Wrappers.lambdaQuery(UserBindDetail.class)
+					.eq(UserBindDetail::getPhone, loginPhone)
+					.isNotNull(UserBindDetail::getUserId)
+					.last("limit 1"));
+			if (bindDetail != null) {
+				return bindDetail;
+			}
+		}
+		if (StrUtil.isNotBlank(loginEmail)) {
+			return userBindDetailMapper.selectOne(Wrappers.lambdaQuery(UserBindDetail.class)
+					.eq(UserBindDetail::getEmail, loginEmail)
+					.isNotNull(UserBindDetail::getUserId)
+					.last("limit 1"));
+		}
+		return null;
+	}
+
 	@Override
 	@Transactional(rollbackFor = Throwable.class)
 	public void receiveGiftCardByRc(Long userId, String code, Long relationId) {