diff --git a/jsowell-admin/src/main/java/com/jsowell/service/MemberService.java b/jsowell-admin/src/main/java/com/jsowell/service/MemberService.java index 764a6d83e..c8e14f756 100644 --- a/jsowell-admin/src/main/java/com/jsowell/service/MemberService.java +++ b/jsowell-admin/src/main/java/com/jsowell/service/MemberService.java @@ -185,55 +185,80 @@ public class MemberService { throw new BusinessException(ReturnCodeEnum.CODE_OPEN_ID_IS_NULL_ERROR); } - // 查询手机号码是否注册过 - MemberBasicInfo memberBasicInfo = memberBasicInfoService.selectInfoByMobileNumber(phoneNumber, firstLevelMerchantId); - if (Objects.isNull(memberBasicInfo)) { - // 不存在则新增数据 - String memberId = generateNewMemberId(); - memberBasicInfo = new MemberBasicInfo(); - memberBasicInfo.setStatus(Constants.ONE); - memberBasicInfo.setMemberId(memberId); - memberBasicInfo.setNickName("会员" + memberId); - memberBasicInfo.setMobileNumber(phoneNumber); - memberBasicInfo.setMerchantId(Long.valueOf(firstLevelMerchantId)); - if (AdapayPayChannelEnum.WX_LITE.getValue().equals(dto.getRequestSource()) && StringUtils.isNotBlank(openId)) { - memberBasicInfo.setOpenId(openId); - } - if (AdapayPayChannelEnum.ALIPAY_LITE.getValue().equals(dto.getRequestSource()) && StringUtils.isNotBlank(buyerId)) { - memberBasicInfo.setBuyerId(buyerId); + String lockKey = CacheConstants.USER_APP_REGISTER + phoneNumber; + String requestId = IdUtils.fastUUID(); + Boolean isLock = false; + try { + // 获取锁,防止注册创建重复账户,锁超时时间10秒 + isLock = redisCache.lock(lockKey, requestId, 10); + if (!isLock) { + // 获取锁失败,说明有其他请求正在处理,提示用户稍候 + log.warn("获取注册锁失败,可能有并发请求正在处理, phoneNumber:{}", phoneNumber); + throw new BusinessException(ReturnCodeEnum.CODE_MEMBER_REGISTER_AND_LOGIN_PROCESSING); } - MemberTransactionDTO memberTransactionDTO = new MemberTransactionDTO(); - memberTransactionDTO.setMemberBasicInfo(memberBasicInfo); - // 首次新建会员,同时新建会员钱包 - if (MerchantUtils.isXiXiaoMerchant(firstLevelMerchantId)) { - MemberWalletInfo memberWalletInfo = MemberWalletInfo.builder() - .memberId(memberId) - .merchantId(MerchantUtils.XIXIAO_MERCHANT_ID) - .walletCode(memberBasicInfoService.generateWalletCode()) - .build(); - memberTransactionDTO.setMemberWalletInfo(memberWalletInfo); + // 查询手机号码是否注册过 + MemberBasicInfo memberBasicInfo = memberBasicInfoService.selectInfoByMobileNumber(phoneNumber, firstLevelMerchantId); + if (Objects.isNull(memberBasicInfo)) { + // 不存在则新增数据 + String memberId = generateNewMemberId(); + memberBasicInfo = new MemberBasicInfo(); + memberBasicInfo.setStatus(Constants.ONE); + memberBasicInfo.setMemberId(memberId); + memberBasicInfo.setNickName("会员" + memberId); + memberBasicInfo.setMobileNumber(phoneNumber); + memberBasicInfo.setMerchantId(Long.valueOf(firstLevelMerchantId)); + if (AdapayPayChannelEnum.WX_LITE.getValue().equals(dto.getRequestSource()) && StringUtils.isNotBlank(openId)) { + memberBasicInfo.setOpenId(openId); + } + if (AdapayPayChannelEnum.ALIPAY_LITE.getValue().equals(dto.getRequestSource()) && StringUtils.isNotBlank(buyerId)) { + memberBasicInfo.setBuyerId(buyerId); + } + + MemberTransactionDTO memberTransactionDTO = new MemberTransactionDTO(); + memberTransactionDTO.setMemberBasicInfo(memberBasicInfo); + // 首次新建会员,同时新建会员钱包 + if (MerchantUtils.isXiXiaoMerchant(firstLevelMerchantId)) { + MemberWalletInfo memberWalletInfo = MemberWalletInfo.builder() + .memberId(memberId) + .merchantId(MerchantUtils.XIXIAO_MERCHANT_ID) + .walletCode(memberBasicInfoService.generateWalletCode()) + .build(); + memberTransactionDTO.setMemberWalletInfo(memberWalletInfo); + } + transactionService.createMember(memberTransactionDTO); + } else { + boolean updateFlag = false; + if (AdapayPayChannelEnum.WX_LITE.getValue().equals(dto.getRequestSource()) && !StringUtils.equals(memberBasicInfo.getOpenId(), openId)) { + // openId变化就更新 + memberBasicInfo.setOpenId(openId); + updateFlag = true; + } + if (AdapayPayChannelEnum.ALIPAY_LITE.getValue().equals(dto.getRequestSource()) && !StringUtils.equals(memberBasicInfo.getBuyerId(), buyerId)) { + memberBasicInfo.setBuyerId(buyerId); + updateFlag = true; + } + if (updateFlag) { + memberBasicInfoService.updateMemberBasicInfo(memberBasicInfo); + } } - transactionService.createMember(memberTransactionDTO); - } else { - boolean updateFlag = false; - if (AdapayPayChannelEnum.WX_LITE.getValue().equals(dto.getRequestSource()) && !StringUtils.equals(memberBasicInfo.getOpenId(), openId)) { - // openId变化就更新 - memberBasicInfo.setOpenId(openId); - updateFlag = true; - } - if (AdapayPayChannelEnum.ALIPAY_LITE.getValue().equals(dto.getRequestSource()) && !StringUtils.equals(memberBasicInfo.getBuyerId(), buyerId)) { - memberBasicInfo.setBuyerId(buyerId); - updateFlag = true; - } - if (updateFlag) { - memberBasicInfoService.updateMemberBasicInfo(memberBasicInfo); + // 服务器生成token返给前端 + String memberToken = JWTUtils.createMemberToken(memberBasicInfo.getMemberId(), memberBasicInfo.getNickName()); + // log.info("memToken:{}", memberToken); + return memberToken; + } finally { + // 释放锁 + if (isLock) { + try { + Object lockValue = redisCache.getCacheObject(lockKey); + if (lockValue != null && requestId.equals(lockValue.toString())) { + redisCache.unLock(lockKey); + } + } catch (Exception e) { + log.error("释放注册锁失败, phoneNumber:{}, error:{}", phoneNumber, e.getMessage()); + } } } - // 服务器生成token返给前端 - String memberToken = JWTUtils.createMemberToken(memberBasicInfo.getMemberId(), memberBasicInfo.getNickName()); - // log.info("memToken:{}", memberToken); - return memberToken; } private String generateNewMemberId() { diff --git a/jsowell-common/src/main/java/com/jsowell/common/constant/CacheConstants.java b/jsowell-common/src/main/java/com/jsowell/common/constant/CacheConstants.java index fbe897279..efc2c6011 100644 --- a/jsowell-common/src/main/java/com/jsowell/common/constant/CacheConstants.java +++ b/jsowell-common/src/main/java/com/jsowell/common/constant/CacheConstants.java @@ -420,4 +420,9 @@ public class CacheConstants { // 保险退保 public static final String REFUND_INSURANCE = "REFUND_INSURANCE:"; + + /** + * 用户app注册 + */ + public static final String USER_APP_REGISTER = "user_app_register:"; } diff --git a/jsowell-common/src/main/java/com/jsowell/common/enums/ykc/ReturnCodeEnum.java b/jsowell-common/src/main/java/com/jsowell/common/enums/ykc/ReturnCodeEnum.java index e50545b62..fb119a112 100644 --- a/jsowell-common/src/main/java/com/jsowell/common/enums/ykc/ReturnCodeEnum.java +++ b/jsowell-common/src/main/java/com/jsowell/common/enums/ykc/ReturnCodeEnum.java @@ -22,6 +22,8 @@ public enum ReturnCodeEnum { CODE_MEMBER_REGISTER_AND_LOGIN_ERROR("00100007", "会员登录注册接口异常"), + CODE_MEMBER_REGISTER_AND_LOGIN_PROCESSING("00100007_1", "正在登录/注册中,请稍候..."), + CODE_WECHAT_LOGIN_ERROR("00100008", "微信登录异常"),