skyline 1 mēnesi atpakaļ
vecāks
revīzija
19455f8e9b

+ 23 - 45
haha-miniapp/src/main/java/com/haha/miniapp/controller/LoginController.java

@@ -23,49 +23,8 @@ public class LoginController {
     @Autowired
     private LoginService loginService;
     
-    @PostMapping("/password")
-    public Result<LoginVO> loginByPassword(@RequestBody Map<String, String> params) {
-        String phone = params.get("phone");
-        String password = params.get("password");
-        
-        log.info("[登录] 账号密码登录请求 - phone: {}", maskPhone(phone));
-        
-        if (phone == null || phone.isEmpty()) {
-            log.warn("[登录] 账号密码登录失败 - 手机号为空");
-            return Result.error(400, "手机号不能为空");
-        }
-        if (password == null || password.isEmpty()) {
-            log.warn("[登录] 账号密码登录失败 - 密码为空, phone: {}", maskPhone(phone));
-            return Result.error(400, "密码不能为空");
-        }
-        
-        Result<LoginVO> result = loginService.loginByPassword(phone, password);
-        
-        return result;
-    }
-    
-    @PostMapping("/wechat-phone")
-    public Result<LoginVO> wechatPhoneLogin(@RequestBody Map<String, String> params) {
-        String code = params.get("code");
-        String encryptedData = params.get("encryptedData");
-        String iv = params.get("iv");
-        
-        log.info("[登录] 微信手机号快捷登录请求 - code: {}, hasEncryptedData: {}, hasIv: {}", 
-                code != null ? code.substring(0, Math.min(8, code.length())) + "..." : "null",
-                encryptedData != null, iv != null);
-        
-        if (code == null || code.isEmpty()) {
-            log.warn("[登录] 微信手机号登录失败 - code为空");
-            return Result.error(400, "登录凭证不能为空");
-        }
-        
-        Result<LoginVO> result = loginService.wechatPhoneLogin(code, encryptedData, iv);
-            
-        return result;
-    }
-    
     /**
-     * 微信小程序手机号快速登录(新版)
+     * 微信小程序手机号快速登录
      * 使用button open-type="getPhoneNumber"获取手机号
      */
     @PostMapping("/miniapp-phone")
@@ -86,9 +45,28 @@ public class LoginController {
             return Result.error(400, "手机号凭证不能为空");
         }
         
-        Result<LoginVO> result = loginService.wechatMiniappPhoneLogin(code, phoneCode);
-            
-        return result;
+        try {
+            Result<LoginVO> result = loginService.wechatMiniappPhoneLogin(code, phoneCode);
+            return result;
+        } catch (Exception e) {
+            log.error("[登录] 登录异常", e);
+            return Result.error(500, "登录异常:" + e.getMessage());
+        }
+    }
+    
+    /**
+     * 测试接口:检查微信配置是否正确
+     */
+    @PostMapping("/test-wechat-config")
+    public Result<Map<String, Object>> testWechatConfig() {
+        try {
+            log.info("[登录] 测试微信配置");
+            // 这里可以添加测试逻辑,比如尝试获取access_token
+            return Result.success("配置检查完成", null);
+        } catch (Exception e) {
+            log.error("[登录] 测试微信配置异常", e);
+            return Result.error(500, "配置检查失败:" + e.getMessage());
+        }
     }
     
     @PostMapping("/logout")

+ 1 - 18
haha-service/src/main/java/com/haha/service/LoginService.java

@@ -8,24 +8,7 @@ import java.util.Map;
 public interface LoginService {
     
     /**
-     * 账号密码登录(临时方案)
-     * @param phone 手机号
-     * @param password 密码
-     * @return 登录结果,包含token和用户信息
-     */
-    Result<LoginVO> loginByPassword(String phone, String password);
-    
-    /**
-     * 微信手机号快捷登录
-     * @param code 微信登录凭证code
-     * @param encryptedData 加密的手机号数据
-     * @param iv 加密算法的初始向量
-     * @return 登录结果,包含token和用户信息
-     */
-    Result<LoginVO> wechatPhoneLogin(String code, String encryptedData, String iv);
-    
-    /**
-     * 微信小程序手机号快速登录(新版)
+     * 微信小程序手机号快速登录
      * 使用button open-type="getPhoneNumber"获取手机号
      * @param code 微信登录凭证code(用于获取openid)
      * @param phoneCode 手机号获取凭证(用于获取手机号)

+ 80 - 123
haha-service/src/main/java/com/haha/service/impl/LoginServiceImpl.java

@@ -36,101 +36,6 @@ public class LoginServiceImpl implements LoginService {
     @Value("${wechat.miniapp.secret}")
     private String miniappSecret;
     
-    @Override
-    public Result<LoginVO> loginByPassword(String phone, String password) {
-        try {
-            log.debug("[登录服务] 账号密码登录 - phone: {}", maskPhone(phone));
-            
-            final String TEST_PHONE = "13018061579";
-            final String TEST_PASSWORD = "abc123";
-            
-            if (!TEST_PHONE.equals(phone) || !TEST_PASSWORD.equals(password)) {
-                log.warn("[登录服务] 账号密码验证失败 - phone: {}", maskPhone(phone));
-                return Result.error(401, "手机号或密码错误");
-            }
-            
-            User user = userService.getUserByPhone(phone);
-            if (user == null) {
-                user = new User();
-                user.setPhone(phone);
-                user.setNickname("用户" + phone.substring(7));
-                userService.save(user);
-                log.info("[登录服务] 创建新用户 - userId: {}, phone: {}", user.getId(), maskPhone(phone));
-            }
-            
-            StpUtil.login(user.getId());
-            String token = StpUtil.getTokenValue();
-            
-            log.info("[登录服务] 登录成功 - userId: {}, phone: {}", user.getId(), maskPhone(phone));
-            
-            UserVO userVO = UserVO.builder()
-                    .id(user.getId())
-                    .phone(user.getPhone())
-                    .nickname(user.getNickname())
-                    .build();
-            
-            LoginVO loginVO = LoginVO.builder()
-                    .token(token)
-                    .userInfo(userVO)
-                    .build();
-            
-            return Result.success("登录成功", loginVO);
-            
-        } catch (Exception e) {
-            log.error("[登录服务] 账号密码登录异常 - phone: {}", maskPhone(phone), e);
-            return Result.error(500, "登录失败:" + e.getMessage());
-        }
-    }
-    
-    @Override
-    public Result<LoginVO> wechatPhoneLogin(String code, String encryptedData, String iv) {
-        try {
-            log.debug("[登录服务] 微信手机号登录 - code: {}", 
-                    code != null ? code.substring(0, Math.min(8, code.length())) + "..." : "null");
-            
-            String phoneNumber = "13800138000";
-            String openid = "mock_openid_" + System.currentTimeMillis();
-            
-            User user = userService.getUserByPhone(phoneNumber);
-            if (user == null) {
-                user = new User();
-                user.setPhone(phoneNumber);
-                user.setOpenid(openid);
-                user.setNickname("用户" + phoneNumber.substring(7));
-                userService.save(user);
-                log.info("[登录服务] 微信登录创建新用户 - userId: {}, openid: {}", user.getId(), openid);
-            } else {
-                if (!openid.equals(user.getOpenid())) {
-                    user.setOpenid(openid);
-                    userService.updateById(user);
-                    log.info("[登录服务] 更新用户openid - userId: {}", user.getId());
-                }
-            }
-            
-            StpUtil.login(user.getId());
-            String token = StpUtil.getTokenValue();
-            
-            log.info("[登录服务] 微信手机号登录成功 - userId: {}", user.getId());
-            
-            UserVO userVO = UserVO.builder()
-                    .id(user.getId())
-                    .phone(user.getPhone())
-                    .nickname(user.getNickname())
-                    .build();
-            
-            LoginVO loginVO = LoginVO.builder()
-                    .token(token)
-                    .userInfo(userVO)
-                    .build();
-            
-            return Result.success("登录成功", loginVO);
-            
-        } catch (Exception e) {
-            log.error("[登录服务] 微信手机号登录异常", e);
-            return Result.error(500, "登录失败:" + e.getMessage());
-        }
-    }
-    
     @Override
     public Result<LoginVO> wechatMiniappPhoneLogin(String code, String phoneCode) {
         try {
@@ -222,20 +127,48 @@ public class LoginServiceImpl implements LoginService {
      */
     private String getOpenidByCode(String code) {
         try {
+            log.info("[微信API] 开始获取openid - appid: {}, code: {}", 
+                    miniappAppId, 
+                    code != null ? code.substring(0, Math.min(10, code.length())) + "..." : "null");
+            
             String url = String.format(
                 "https://api.weixin.qq.com/sns/jscode2session?appid=%s&secret=%s&js_code=%s&grant_type=authorization_code",
                 miniappAppId, miniappSecret, code
             );
             
-            ResponseEntity<Map> response = restTemplate.getForEntity(url, Map.class);
-            Map<String, Object> result = response.getBody();
-            
-            if (result != null && result.containsKey("openid")) {
-                return (String) result.get("openid");
-            } else {
-                log.error("[微信API] 获取openid失败 - response: {}", result);
-                return null;
+            log.debug("[微信API] 请求URL: {}", url.replace(miniappSecret, "***"));
+            
+            // 使用getForObject并手动解析JSON,避免Content-Type问题
+            String response = restTemplate.getForObject(url, String.class);
+            log.info("[微信API] 获取openid响应 - response: {}", response);
+            
+            if (response != null && !response.isEmpty()) {
+                // 手动解析JSON
+                try {
+                    com.fasterxml.jackson.databind.ObjectMapper objectMapper = new com.fasterxml.jackson.databind.ObjectMapper();
+                    Map<String, Object> result = objectMapper.readValue(response, Map.class);
+                    
+                    // 检查是否有错误
+                    if (result.containsKey("errcode")) {
+                        Integer errcode = (Integer) result.get("errcode");
+                        String errmsg = (String) result.get("errmsg");
+                        log.error("[微信API] 获取openid失败 - errcode: {}, errmsg: {}", errcode, errmsg);
+                        return null;
+                    }
+                    
+                    if (result.containsKey("openid")) {
+                        String openid = (String) result.get("openid");
+                        log.info("[微信API] 获取openid成功 - openid: {}", 
+                                openid != null ? openid.substring(0, Math.min(10, openid.length())) + "..." : "null");
+                        return openid;
+                    }
+                } catch (Exception parseEx) {
+                    log.error("[微信API] 解析响应JSON失败", parseEx);
+                }
             }
+            
+            log.error("[微信API] 获取openid失败 - response: {}", response);
+            return null;
         } catch (Exception e) {
             log.error("[微信API] 调用jscode2session异常", e);
             return null;
@@ -267,19 +200,30 @@ public class LoginServiceImpl implements LoginService {
             headers.set("Content-Type", "application/json");
             HttpEntity<Map<String, String>> entity = new HttpEntity<>(requestBody, headers);
             
-            ResponseEntity<Map> response = restTemplate.postForEntity(url, entity, Map.class);
-            Map<String, Object> result = response.getBody();
-            
-            if (result != null) {
-                Integer errcode = (Integer) result.get("errcode");
-                if (errcode != null && errcode == 0) {
-                    Map<String, Object> phoneInfo = (Map<String, Object>) result.get("phone_info");
-                    if (phoneInfo != null) {
-                        return (String) phoneInfo.get("phoneNumber");
+            // 使用postForObject并手动解析JSON,避免Content-Type问题
+            String response = restTemplate.postForObject(url, entity, String.class);
+            log.info("[微信API] 获取手机号响应 - response: {}", response);
+            
+            if (response != null && !response.isEmpty()) {
+                try {
+                    com.fasterxml.jackson.databind.ObjectMapper objectMapper = new com.fasterxml.jackson.databind.ObjectMapper();
+                    Map<String, Object> result = objectMapper.readValue(response, Map.class);
+                    
+                    Integer errcode = (Integer) result.get("errcode");
+                    if (errcode != null && errcode == 0) {
+                        Map<String, Object> phoneInfo = (Map<String, Object>) result.get("phone_info");
+                        if (phoneInfo != null) {
+                            String phoneNumber = (String) phoneInfo.get("phoneNumber");
+                            log.info("[微信API] 获取手机号成功 - phone: {}", 
+                                    phoneNumber != null ? phoneNumber.substring(0, 3) + "****" + phoneNumber.substring(7) : "null");
+                            return phoneNumber;
+                        }
+                    } else {
+                        log.error("[微信API] 获取手机号失败 - errcode: {}, errmsg: {}", 
+                                result.get("errcode"), result.get("errmsg"));
                     }
-                } else {
-                    log.error("[微信API] 获取手机号失败 - errcode: {}, errmsg: {}", 
-                            result.get("errcode"), result.get("errmsg"));
+                } catch (Exception parseEx) {
+                    log.error("[微信API] 解析响应JSON失败", parseEx);
                 }
             }
             
@@ -300,15 +244,28 @@ public class LoginServiceImpl implements LoginService {
                 miniappAppId, miniappSecret
             );
             
-            ResponseEntity<Map> response = restTemplate.getForEntity(url, Map.class);
-            Map<String, Object> result = response.getBody();
-            
-            if (result != null && result.containsKey("access_token")) {
-                return (String) result.get("access_token");
-            } else {
-                log.error("[微信API] 获取access_token失败 - response: {}", result);
-                return null;
+            // 使用getForObject并手动解析JSON,避免Content-Type问题
+            String response = restTemplate.getForObject(url, String.class);
+            log.debug("[微信API] 获取access_token响应 - response: {}", response);
+            
+            if (response != null && !response.isEmpty()) {
+                try {
+                    com.fasterxml.jackson.databind.ObjectMapper objectMapper = new com.fasterxml.jackson.databind.ObjectMapper();
+                    Map<String, Object> result = objectMapper.readValue(response, Map.class);
+                    
+                    if (result.containsKey("access_token")) {
+                        String accessToken = (String) result.get("access_token");
+                        log.debug("[微信API] 获取access_token成功");
+                        return accessToken;
+                    } else {
+                        log.error("[微信API] 获取access_token失败 - response: {}", result);
+                    }
+                } catch (Exception parseEx) {
+                    log.error("[微信API] 解析access_token响应JSON失败", parseEx);
+                }
             }
+            
+            return null;
         } catch (Exception e) {
             log.error("[微信API] 调用获取access_token异常", e);
             return null;