Ver Fonte

添加手机号解析

lutong há 1 mês atrás
pai
commit
786ed10c48

+ 47 - 19
alien-dining/src/main/java/shop/alien/dining/service/impl/DiningUserServiceImpl.java

@@ -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;
+    }
 
     /**
      * 掩码字符串(用于日志脱敏)