From 82f75716124abf2d7cb9bd8178b992b4767ea0f5 Mon Sep 17 00:00:00 2001 From: shahaibo <1023316923@qq.com> Date: Wed, 11 Dec 2024 16:21:18 +0800 Subject: [PATCH] TASK:AiDA --- .../ai/da/controller/AccountController.java | 4 +- .../mapper/primary/entity/AccountExtend.java | 5 + .../com/ai/da/model/vo/AccountLoginVO.java | 4 + .../com/ai/da/service/AccountService.java | 4 +- .../da/service/impl/AccountServiceImpl.java | 116 ++++++++++++++---- 5 files changed, 107 insertions(+), 26 deletions(-) diff --git a/src/main/java/com/ai/da/controller/AccountController.java b/src/main/java/com/ai/da/controller/AccountController.java index 219d890f..5ec9754a 100644 --- a/src/main/java/com/ai/da/controller/AccountController.java +++ b/src/main/java/com/ai/da/controller/AccountController.java @@ -314,14 +314,14 @@ public class AccountController { @CrossOrigin @GetMapping("/bindGoogle") @ApiOperation(value = "绑定谷歌") - public Response bindGoogle(@RequestParam("credential") String credential) { + public Response bindGoogle(@RequestParam("credential") String credential) { return Response.success(accountService.bindGoogle(credential)); } @CrossOrigin @GetMapping("/bindWeChat") @ApiOperation(value = "绑定微信") - public Response bindWeChat(@RequestParam("code") String code) { + public Response bindWeChat(@RequestParam("code") String code) { return Response.success(accountService.bindWeChat(code)); } } diff --git a/src/main/java/com/ai/da/mapper/primary/entity/AccountExtend.java b/src/main/java/com/ai/da/mapper/primary/entity/AccountExtend.java index 5742f0ec..c5b612b1 100644 --- a/src/main/java/com/ai/da/mapper/primary/entity/AccountExtend.java +++ b/src/main/java/com/ai/da/mapper/primary/entity/AccountExtend.java @@ -1,5 +1,6 @@ package com.ai.da.mapper.primary.entity; +import com.ai.da.common.response.PageResponse; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; @@ -26,5 +27,9 @@ public class AccountExtend implements Serializable { private String authType; + private String headImgUrl; + + private String name; + private String auth; } diff --git a/src/main/java/com/ai/da/model/vo/AccountLoginVO.java b/src/main/java/com/ai/da/model/vo/AccountLoginVO.java index ab23b872..9a1f9b85 100644 --- a/src/main/java/com/ai/da/model/vo/AccountLoginVO.java +++ b/src/main/java/com/ai/da/model/vo/AccountLoginVO.java @@ -1,5 +1,6 @@ package com.ai.da.model.vo; +import com.ai.da.mapper.primary.entity.AccountExtend; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import io.swagger.models.auth.In; @@ -8,6 +9,7 @@ import lombok.Data; import lombok.NoArgsConstructor; import javax.validation.constraints.NotBlank; +import java.util.List; @AllArgsConstructor @NoArgsConstructor @@ -40,4 +42,6 @@ public class AccountLoginVO { private Long followerCount; + private List accountExtendList; + } diff --git a/src/main/java/com/ai/da/service/AccountService.java b/src/main/java/com/ai/da/service/AccountService.java index 6a5fd436..2f2f6ff3 100644 --- a/src/main/java/com/ai/da/service/AccountService.java +++ b/src/main/java/com/ai/da/service/AccountService.java @@ -209,7 +209,7 @@ public interface AccountService extends IService { AccountLoginVO getAccountDetail(); - AccountLoginVO bindGoogle(String credential); + Boolean bindGoogle(String credential); - AccountLoginVO bindWeChat(String code); + Boolean bindWeChat(String code); } diff --git a/src/main/java/com/ai/da/service/impl/AccountServiceImpl.java b/src/main/java/com/ai/da/service/impl/AccountServiceImpl.java index 20fff9b4..7fff9732 100644 --- a/src/main/java/com/ai/da/service/impl/AccountServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/AccountServiceImpl.java @@ -2179,6 +2179,7 @@ public class AccountServiceImpl extends ServiceImpl impl String userId = payload.getSubject(); String email = payload.getEmail(); String name = (String) payload.get("name"); + String pictureUrl = (String) payload.get("picture"); log.info(userId); log.info(email); log.info(name); @@ -2191,6 +2192,13 @@ public class AccountServiceImpl extends ServiceImpl impl if (CollectionUtil.isNotEmpty(accounts)) { account = accounts.get(0); } else { + + AccountExtend accountExtendInsert = new AccountExtend(); + accountExtendInsert.setAuth(userId); + accountExtendInsert.setAuthType("Google"); + accountExtendInsert.setHeadImgUrl(pictureUrl); + accountExtendInsert.setName(name); + // 用户不存在,创建新用户(自动注册) Account newUser = new Account(); newUser.setUserEmail(email); @@ -2206,6 +2214,9 @@ public class AccountServiceImpl extends ServiceImpl impl newUser.setSystemUser(3); accountMapper.insert(newUser); + accountExtendInsert.setAccountId(newUser.getId()); + accountExtendMapper.insert(accountExtendInsert); + account = newUser; } @@ -2264,6 +2275,7 @@ public class AccountServiceImpl extends ServiceImpl impl // 提取 unionid 和 nickname String unionId = userInfoResponse.getString("unionid"); String userName = userInfoResponse.getString("nickname"); + String headimgurl = userInfoResponse.getString("headimgurl"); if (unionId == null) { throw new IllegalArgumentException("无法获取 unionid,请检查微信开发平台配置"); } @@ -2278,6 +2290,8 @@ public class AccountServiceImpl extends ServiceImpl impl AccountExtend accountExtendInsert = new AccountExtend(); accountExtendInsert.setAuth(unionId); accountExtendInsert.setAuthType("WeChat"); + accountExtendInsert.setHeadImgUrl(headimgurl); + accountExtendInsert.setName(userName); // 用户不存在,创建新用户(自动注册) Account newUser = new Account(); @@ -2325,21 +2339,6 @@ public class AccountServiceImpl extends ServiceImpl impl response.setFolloweeCount(portfolioService.getFolloweeCount(account.getId())); response.setFollowerCount(portfolioService.getFollowerCount(account.getId())); return response; - -// // 2. 根据 unionid 检查用户是否存在 -// User user = userRepository.findByUnionid(unionid); -// if (user == null) { -// // 用户不存在,进行注册 -// user = new User(); -// user.setUnionid(unionid); -// user.setOpenid(weChatResponse.getString("openid")); -// user.setNickname(weChatResponse.getString("nickname")); -// user.setAvatar(weChatResponse.getString("headimgurl")); -// userRepository.save(user); -// } -// -// // 3. 返回 unionid -// return unionid; } private static final String WECHAT_USER_INFO_URL = "https://api.weixin.qq.com/sns/userinfo"; @@ -2410,21 +2409,94 @@ public class AccountServiceImpl extends ServiceImpl impl response.setAvatar(minioUtil.getPreSignedUrl(avatar, CommonConstant.MINIO_IMAGE_EXPIRE_TIME)); response.setFolloweeCount(portfolioService.getFolloweeCount(account.getId())); response.setFollowerCount(portfolioService.getFollowerCount(account.getId())); - response.setSystemUser(1); - //判断是否常用ip 不是则发邮件提示 -// calculateExceptionIp(RequestInfoUtil.getIpAddress(request), account); + QueryWrapper qw = new QueryWrapper<>(); + qw.lambda().eq(AccountExtend::getAccountId, response.getUserId()); + List accountExtends = accountExtendMapper.selectList(qw); + if (CollectionUtil.isNotEmpty(accountExtends)) { + response.setAccountExtendList(accountExtends); + } return response; } @Override - public AccountLoginVO bindGoogle(String credential) { - return null; + public Boolean bindGoogle(String credential) { + try { + // 配置 Google ID Token 验证器 + GoogleIdTokenVerifier verifier = new GoogleIdTokenVerifier.Builder( + new NetHttpTransport(), + JacksonFactory.getDefaultInstance()) + .setAudience(Collections.singletonList(CLIENT_ID)) + .build(); + + // 验证并解析 ID Token + GoogleIdToken idToken = verifier.verify(credential); + + + if (idToken != null) { + GoogleIdToken.Payload payload = idToken.getPayload(); + + // 提取用户信息 + String userId = payload.getSubject(); + String email = payload.getEmail(); + String name = (String) payload.get("name"); + String pictureUrl = (String) payload.get("picture"); + + + AccountExtend accountExtendInsert = new AccountExtend(); + accountExtendInsert.setAuth(userId); + accountExtendInsert.setAuthType("Google"); + accountExtendInsert.setHeadImgUrl(pictureUrl); + accountExtendInsert.setName(name); + + + AuthPrincipalVo authPrincipalVo = UserContext.getUserHolder(); + accountExtendInsert.setAccountId(authPrincipalVo.getId()); + accountExtendMapper.insert(accountExtendInsert); + + return Boolean.TRUE; + } else { + throw new IllegalArgumentException("Invalid ID token."); + } + + } catch (Exception e) { + e.printStackTrace(); + throw new RuntimeException("Failed to verify ID token: " + e.getMessage()); + } } @Override - public AccountLoginVO bindWeChat(String code) { - return null; + public Boolean bindWeChat(String code) { + // 1. 获取 access_token 和 openid + JSONObject accessTokenResponse = getAccessTokenFromWeChat(code); + String accessToken = accessTokenResponse.getString("access_token"); + String openId = accessTokenResponse.getString("openid"); + + if (StringUtils.isEmpty(accessToken) || StringUtils.isEmpty(openId)) { + throw new RuntimeException("微信接口返回数据缺失: " + accessTokenResponse.toJSONString()); + } + + // 2. 获取用户信息 + JSONObject userInfoResponse = getUserInfoFromWeChat(accessToken, openId); + + // 提取 unionid 和 nickname + String unionId = userInfoResponse.getString("unionid"); + String userName = userInfoResponse.getString("nickname"); + String headimgurl = userInfoResponse.getString("headimgurl"); + if (unionId == null) { + throw new IllegalArgumentException("无法获取 unionid,请检查微信开发平台配置"); + } + AccountExtend accountExtendInsert = new AccountExtend(); + accountExtendInsert.setAuth(unionId); + accountExtendInsert.setAuthType("WeChat"); + accountExtendInsert.setHeadImgUrl(headimgurl); + accountExtendInsert.setName(userName); + + AuthPrincipalVo authPrincipalVo = UserContext.getUserHolder(); + accountExtendInsert.setAccountId(authPrincipalVo.getId()); + accountExtendMapper.insert(accountExtendInsert); + + return Boolean.TRUE; } }