|
|
@@ -71,22 +71,33 @@ public class DiningUserServiceImpl implements DiningUserService {
|
|
|
return null;
|
|
|
}
|
|
|
|
|
|
- // 2. 查找或创建用户
|
|
|
- LifeUser user = findOrCreateUser(openid, phoneCode);
|
|
|
+ // 2. 如果提供了 phoneCode,先解析手机号(用于返回给前端和更新用户)
|
|
|
+ String parsedPhone = null;
|
|
|
+ if (StringUtils.isNotBlank(phoneCode)) {
|
|
|
+ parsedPhone = weChatMiniProgramUtil.getPhoneNumberByCode(phoneCode);
|
|
|
+ if (StringUtils.isNotBlank(parsedPhone)) {
|
|
|
+ log.info("成功解析手机号: {}", maskString(parsedPhone, 7));
|
|
|
+ } else {
|
|
|
+ log.warn("解析手机号失败,phoneCode可能已过期或无效");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 3. 查找或创建用户(传入解析后的手机号,避免重复解析)
|
|
|
+ LifeUser user = findOrCreateUser(openid, parsedPhone);
|
|
|
if (user == null) {
|
|
|
return null;
|
|
|
}
|
|
|
|
|
|
- // 3. 检查用户状态(提前检查,避免不必要的操作)
|
|
|
+ // 4. 检查用户状态(提前检查,避免不必要的操作)
|
|
|
if (!isUserValid(user)) {
|
|
|
return null;
|
|
|
}
|
|
|
|
|
|
- // 4. 生成并存储 token
|
|
|
+ // 5. 生成并存储 token
|
|
|
String token = generateAndStoreToken(openid, user);
|
|
|
|
|
|
- // 5. 构建返回对象
|
|
|
- return buildDiningUserVo(user, token, openid);
|
|
|
+ // 6. 构建返回对象,优先使用解析后的手机号返回给前端
|
|
|
+ return buildDiningUserVo(user, token, openid, parsedPhone);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
@@ -112,22 +123,20 @@ public class DiningUserServiceImpl implements DiningUserService {
|
|
|
|
|
|
/**
|
|
|
* 查找或创建用户
|
|
|
+ *
|
|
|
+ * @param openid 微信OpenID
|
|
|
+ * @param phone 解析后的手机号(如果为null,说明没有提供phoneCode或解析失败)
|
|
|
*/
|
|
|
- private LifeUser findOrCreateUser(String openid, String phoneCode) {
|
|
|
+ private LifeUser findOrCreateUser(String openid, String phone) {
|
|
|
// 1. 通过 openid 查找用户(从 Redis 映射)
|
|
|
LifeUser user = findUserByOpenid(openid);
|
|
|
|
|
|
- // 2. 如果找不到,尝试通过手机号查找
|
|
|
- String phone = null;
|
|
|
- if (user == null && StringUtils.isNotBlank(phoneCode)) {
|
|
|
- phone = weChatMiniProgramUtil.getPhoneNumberByCode(phoneCode);
|
|
|
- if (StringUtils.isNotBlank(phone)) {
|
|
|
- log.info("成功获取手机号: {}", maskString(phone, 7));
|
|
|
- user = findUserByPhone(phone);
|
|
|
- if (user != null) {
|
|
|
- // 建立 openid 和 userId 的映射关系
|
|
|
- saveOpenidMapping(openid, user.getId());
|
|
|
- }
|
|
|
+ // 2. 如果找不到用户,尝试通过手机号查找
|
|
|
+ if (user == null && StringUtils.isNotBlank(phone)) {
|
|
|
+ user = findUserByPhone(phone);
|
|
|
+ if (user != null) {
|
|
|
+ // 建立 openid 和 userId 的映射关系
|
|
|
+ saveOpenidMapping(openid, user.getId());
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -138,9 +147,15 @@ public class DiningUserServiceImpl implements DiningUserService {
|
|
|
saveOpenidMapping(openid, user.getId());
|
|
|
}
|
|
|
} else {
|
|
|
- // 4. 如果用户存在但没有手机号,且提供了 phoneCode,则更新手机号
|
|
|
+ // 4. 如果用户存在但没有手机号,且提供了解析后的手机号,则更新手机号
|
|
|
if (StringUtils.isBlank(user.getUserPhone()) && StringUtils.isNotBlank(phone)) {
|
|
|
updateUserPhone(user, phone);
|
|
|
+ } else if (StringUtils.isNotBlank(user.getUserPhone()) && StringUtils.isNotBlank(phone)
|
|
|
+ && !user.getUserPhone().equals(phone)) {
|
|
|
+ // 5. 如果用户已有手机号,但新解析的手机号不同,也更新(可选,根据业务需求决定)
|
|
|
+ log.info("检测到手机号变更,更新手机号: userId={}, oldPhone={}, newPhone={}",
|
|
|
+ user.getId(), maskString(user.getUserPhone(), 7), maskString(phone, 7));
|
|
|
+ updateUserPhone(user, phone);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -290,6 +305,7 @@ public class DiningUserServiceImpl implements DiningUserService {
|
|
|
private DiningUserVo buildDiningUserVo(LifeUser user, String token, String openid) {
|
|
|
DiningUserVo diningUserVo = new DiningUserVo();
|
|
|
diningUserVo.setId(user.getId().longValue());
|
|
|
+ // 优先使用 user 对象中的手机号(如果通过 phoneCode 解析并更新了,这里会是最新的)
|
|
|
diningUserVo.setPhone(user.getUserPhone());
|
|
|
diningUserVo.setNickName(user.getUserName());
|
|
|
diningUserVo.setAvatarUrl(user.getUserImage());
|
|
|
@@ -299,6 +315,18 @@ public class DiningUserServiceImpl implements DiningUserService {
|
|
|
diningUserVo.setOpenId(openid);
|
|
|
return diningUserVo;
|
|
|
}
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 构建返回对象(带解析后的手机号)
|
|
|
+ */
|
|
|
+ private DiningUserVo buildDiningUserVo(LifeUser user, String token, String openid, String parsedPhone) {
|
|
|
+ DiningUserVo diningUserVo = buildDiningUserVo(user, token, openid);
|
|
|
+ // 如果解析到了手机号,优先使用解析后的手机号返回给前端
|
|
|
+ if (StringUtils.isNotBlank(parsedPhone)) {
|
|
|
+ diningUserVo.setPhone(parsedPhone);
|
|
|
+ }
|
|
|
+ return diningUserVo;
|
|
|
+ }
|
|
|
|
|
|
/**
|
|
|
* 掩码字符串(用于日志脱敏)
|