|
@@ -36,101 +36,6 @@ public class LoginServiceImpl implements LoginService {
|
|
|
@Value("${wechat.miniapp.secret}")
|
|
@Value("${wechat.miniapp.secret}")
|
|
|
private String miniappSecret;
|
|
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
|
|
@Override
|
|
|
public Result<LoginVO> wechatMiniappPhoneLogin(String code, String phoneCode) {
|
|
public Result<LoginVO> wechatMiniappPhoneLogin(String code, String phoneCode) {
|
|
|
try {
|
|
try {
|
|
@@ -222,20 +127,48 @@ public class LoginServiceImpl implements LoginService {
|
|
|
*/
|
|
*/
|
|
|
private String getOpenidByCode(String code) {
|
|
private String getOpenidByCode(String code) {
|
|
|
try {
|
|
try {
|
|
|
|
|
+ log.info("[微信API] 开始获取openid - appid: {}, code: {}",
|
|
|
|
|
+ miniappAppId,
|
|
|
|
|
+ code != null ? code.substring(0, Math.min(10, code.length())) + "..." : "null");
|
|
|
|
|
+
|
|
|
String url = String.format(
|
|
String url = String.format(
|
|
|
"https://api.weixin.qq.com/sns/jscode2session?appid=%s&secret=%s&js_code=%s&grant_type=authorization_code",
|
|
"https://api.weixin.qq.com/sns/jscode2session?appid=%s&secret=%s&js_code=%s&grant_type=authorization_code",
|
|
|
miniappAppId, miniappSecret, 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) {
|
|
} catch (Exception e) {
|
|
|
log.error("[微信API] 调用jscode2session异常", e);
|
|
log.error("[微信API] 调用jscode2session异常", e);
|
|
|
return null;
|
|
return null;
|
|
@@ -267,19 +200,30 @@ public class LoginServiceImpl implements LoginService {
|
|
|
headers.set("Content-Type", "application/json");
|
|
headers.set("Content-Type", "application/json");
|
|
|
HttpEntity<Map<String, String>> entity = new HttpEntity<>(requestBody, headers);
|
|
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
|
|
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) {
|
|
} catch (Exception e) {
|
|
|
log.error("[微信API] 调用获取access_token异常", e);
|
|
log.error("[微信API] 调用获取access_token异常", e);
|
|
|
return null;
|
|
return null;
|