bugfix 注册加锁

This commit is contained in:
YAS\29473
2025-12-16 11:15:08 +08:00
parent 0e620019db
commit 0fac9a4415
3 changed files with 76 additions and 44 deletions

View File

@@ -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() {