mirror of
https://codeup.aliyun.com/67c68d4e484ca2f0a13ac3c1/ydc/jsowell-charger-web.git
synced 2026-04-20 02:55:04 +08:00
bugfix 注册加锁
This commit is contained in:
@@ -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() {
|
||||||
|
|||||||
@@ -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:";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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", "微信登录异常"),
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user