Zhangbw 3 miesięcy temu
rodzic
commit
ea44420879

+ 23 - 14
src/main/java/com/yingpai/gupiao/service/impl/AuthServiceImpl.java

@@ -21,11 +21,14 @@ import java.time.LocalDateTime;
 
 /**
  * 认证服务实现类
+ * 用于处理微信小程序登录认证
  * 
  * 完整登录流程:
- * 1. wxSilentLogin - 检查是否为老用户(根据openid)
- * 2. wxPhoneCheck - 验证手机号(解密获取手机号)
- * 3. wxCompleteUserInfo - 完善用户信息(创建新用户)
+ * 1. 静默登录:wx.login() -> POST /v1/auth/wx/silent-login(老用户直接返回token)
+ * 2. 新用户获取头像昵称:前端弹窗选择头像和输入昵称
+ * 3. 手机号授权:getPhoneNumber -> POST /v1/auth/wx/phone-verify(已注册用户返回token,未注册返回openid等信息)
+ * 4. 完善用户信息:头像+昵称+手机号 -> POST /v1/auth/wx/register(创建新用户,返回token)
+ * 5. 获取用户信息:token -> GET /v1/user/info
  */
 @Slf4j
 @Service
@@ -43,9 +46,11 @@ public class AuthServiceImpl implements AuthService {
     private static final int INITIAL_POINTS = 10;
     
     /**
-     * 第一步:微信静默登录(检查是否为老用户)
+     * 第一步:微信静默登录
+     * 小程序调用 wx.login() 获取 code,发送到后端检查是否为老用户
+     * 
      * @param loginCode 微信登录code
-     * @return 老用户返回token,新用户返回isSign=false
+     * @return 老用户返回 isSign=true + token,新用户返回 isSign=false
      */
     @Override
     public WxLoginCheckVO wxSilentLogin(String loginCode) {
@@ -84,7 +89,7 @@ public class AuthServiceImpl implements AuthService {
             }
             
             // 5. 老用户,生成token并返回
-            String token = jwtUtil.generateToken(user.getId(), user.getPhone());
+            String token = jwtUtil.generateToken(user.getId());
             log.info("老用户登录成功,userId: {}, token已生成", user.getId());
             
             return WxLoginCheckVO.builder()
@@ -99,9 +104,11 @@ public class AuthServiceImpl implements AuthService {
     }
     
     /**
-     * 第二步:手机号授权验证
-     * @param dto 包含loginCode、phoneCode、encryptedData、iv
-     * @return 已注册返回token,未注册返回用户信息
+     * 第二步(新用户):手机号授权验证
+     * 小程序调用 getPhoneNumber 获取加密手机号,发送到后端解密验证
+     * 
+     * @param dto 包含 loginCode、encryptedData、iv
+     * @return 已注册用户返回 isSign=true + token,未注册返回 isSign=false + openid/unionid/phoneNumber
      */
     @Override
     public WxLoginCheckVO wxPhoneCheck(WxPhoneLoginDTO dto) {
@@ -167,7 +174,7 @@ public class AuthServiceImpl implements AuthService {
             }
             
             // 6. 生成token并返回
-            String token = jwtUtil.generateToken(user.getId(), user.getPhone());
+            String token = jwtUtil.generateToken(user.getId());
             log.info("已注册用户登录成功,userId: {}, token已生成", user.getId());
             
             return WxLoginCheckVO.builder()
@@ -182,9 +189,11 @@ public class AuthServiceImpl implements AuthService {
     }
     
     /**
-     * 第三步:完善用户信息(首次登录)
-     * @param dto 包含完整用户信息
-     * @return 返回token
+     * 第三步(新用户):完善用户信息并注册
+     * 小程序提交完整的用户信息(头像+昵称+手机号+openid等)完成注册
+     * 
+     * @param dto 包含 openid、unionid、phoneNumber、nickname、avatarUrl
+     * @return 返回 token
      */
     @Override
     @Transactional(rollbackFor = Exception.class)
@@ -234,7 +243,7 @@ public class AuthServiceImpl implements AuthService {
             log.info("用户积分初始化完成,userId: {}, 赠送初始积分: {}", newUser.getId(), INITIAL_POINTS);
             
             // 5. 生成token
-            String token = jwtUtil.generateToken(newUser.getId(), newUser.getPhone());
+            String token = jwtUtil.generateToken(newUser.getId());
             
             // 6. 返回token
             return LoginVO.builder()

+ 5 - 23
src/main/java/com/yingpai/gupiao/util/JwtUtil.java

@@ -9,8 +9,6 @@ import org.springframework.stereotype.Component;
 import javax.crypto.SecretKey;
 import java.nio.charset.StandardCharsets;
 import java.util.Date;
-import java.util.HashMap;
-import java.util.Map;
 
 /**
  * JWT工具类
@@ -22,7 +20,7 @@ public class JwtUtil {
     /**
      * JWT密钥(生产环境应该从配置文件读取)
      */
-    private static final String SECRET_KEY = "gupiao-secret-key-for-jwt-token-generation-2024";
+    private static final String SECRET_KEY = "gupiao";
     
     /**
      * token有效期:7天(毫秒)
@@ -37,16 +35,10 @@ public class JwtUtil {
     /**
      * 生成JWT token
      * @param userId 用户ID
-     * @param phone 手机号
      * @return JWT token字符串
      */
-    public String generateToken(Long userId, String phone) {
-        Map<String, Object> claims = new HashMap<>();
-        claims.put("userId", userId);
-        claims.put("phone", phone);
-        
+    public String generateToken(Long userId) {
         return Jwts.builder()
-                .setClaims(claims)
                 .setSubject(userId.toString())
                 .setIssuedAt(new Date())
                 .setExpiration(new Date(System.currentTimeMillis() + EXPIRATION_TIME))
@@ -55,9 +47,9 @@ public class JwtUtil {
     }
     
     /**
-     * 从token中解析Claims
+     * 从token中解析出数据
      * @param token JWT token
-     * @return Claims对象
+     * @return 对象
      */
     public Claims parseToken(String token) {
         return Jwts.parserBuilder()
@@ -74,17 +66,7 @@ public class JwtUtil {
      */
     public Long getUserIdFromToken(String token) {
         Claims claims = parseToken(token);
-        return claims.get("userId", Long.class);
-    }
-    
-    /**
-     * 从token中获取手机号
-     * @param token JWT token
-     * @return 手机号
-     */
-    public String getPhoneFromToken(String token) {
-        Claims claims = parseToken(token);
-        return claims.get("phone", String.class);
+        return Long.parseLong(claims.getSubject());
     }
     
     /**