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); throw new BusinessException(ReturnCodeEnum.CODE_OPEN_ID_IS_NULL_ERROR);
} }
// 查询手机号码是否注册过 String lockKey = CacheConstants.USER_APP_REGISTER + phoneNumber;
MemberBasicInfo memberBasicInfo = memberBasicInfoService.selectInfoByMobileNumber(phoneNumber, firstLevelMerchantId); String requestId = IdUtils.fastUUID();
if (Objects.isNull(memberBasicInfo)) { Boolean isLock = false;
// 不存在则新增数据 try {
String memberId = generateNewMemberId(); // 获取锁防止注册创建重复账户锁超时时间10秒
memberBasicInfo = new MemberBasicInfo(); isLock = redisCache.lock(lockKey, requestId, 10);
memberBasicInfo.setStatus(Constants.ONE); if (!isLock) {
memberBasicInfo.setMemberId(memberId); // 获取锁失败,说明有其他请求正在处理,提示用户稍候
memberBasicInfo.setNickName("会员" + memberId); log.warn("获取注册锁失败,可能有并发请求正在处理, phoneNumber:{}", phoneNumber);
memberBasicInfo.setMobileNumber(phoneNumber); throw new BusinessException(ReturnCodeEnum.CODE_MEMBER_REGISTER_AND_LOGIN_PROCESSING);
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); MemberBasicInfo memberBasicInfo = memberBasicInfoService.selectInfoByMobileNumber(phoneNumber, firstLevelMerchantId);
// 首次新建会员,同时新建会员钱包 if (Objects.isNull(memberBasicInfo)) {
if (MerchantUtils.isXiXiaoMerchant(firstLevelMerchantId)) { // 不存在则新增数据
MemberWalletInfo memberWalletInfo = MemberWalletInfo.builder() String memberId = generateNewMemberId();
.memberId(memberId) memberBasicInfo = new MemberBasicInfo();
.merchantId(MerchantUtils.XIXIAO_MERCHANT_ID) memberBasicInfo.setStatus(Constants.ONE);
.walletCode(memberBasicInfoService.generateWalletCode()) memberBasicInfo.setMemberId(memberId);
.build(); memberBasicInfo.setNickName("会员" + memberId);
memberTransactionDTO.setMemberWalletInfo(memberWalletInfo); 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); // 服务器生成token返给前端
} else { String memberToken = JWTUtils.createMemberToken(memberBasicInfo.getMemberId(), memberBasicInfo.getNickName());
boolean updateFlag = false; // log.info("memToken:{}", memberToken);
if (AdapayPayChannelEnum.WX_LITE.getValue().equals(dto.getRequestSource()) && !StringUtils.equals(memberBasicInfo.getOpenId(), openId)) { return memberToken;
// openId变化就更新 } finally {
memberBasicInfo.setOpenId(openId); // 释放锁
updateFlag = true; if (isLock) {
} try {
if (AdapayPayChannelEnum.ALIPAY_LITE.getValue().equals(dto.getRequestSource()) && !StringUtils.equals(memberBasicInfo.getBuyerId(), buyerId)) { Object lockValue = redisCache.getCacheObject(lockKey);
memberBasicInfo.setBuyerId(buyerId); if (lockValue != null && requestId.equals(lockValue.toString())) {
updateFlag = true; redisCache.unLock(lockKey);
} }
if (updateFlag) { } catch (Exception e) {
memberBasicInfoService.updateMemberBasicInfo(memberBasicInfo); 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() { private String generateNewMemberId() {

View File

@@ -420,4 +420,9 @@ public class CacheConstants {
// 保险退保 // 保险退保
public static final String REFUND_INSURANCE = "REFUND_INSURANCE:"; public static final String REFUND_INSURANCE = "REFUND_INSURANCE:";
/**
* 用户app注册
*/
public static final String USER_APP_REGISTER = "user_app_register:";
} }

View File

@@ -22,6 +22,8 @@ public enum ReturnCodeEnum {
CODE_MEMBER_REGISTER_AND_LOGIN_ERROR("00100007", "会员登录注册接口异常"), CODE_MEMBER_REGISTER_AND_LOGIN_ERROR("00100007", "会员登录注册接口异常"),
CODE_MEMBER_REGISTER_AND_LOGIN_PROCESSING("00100007_1", "正在登录/注册中,请稍候..."),
CODE_WECHAT_LOGIN_ERROR("00100008", "微信登录异常"), CODE_WECHAT_LOGIN_ERROR("00100008", "微信登录异常"),