diff --git a/src/main/java/com/northtecom/visatrack/api/controller/auth/WeChatController.java b/src/main/java/com/northtecom/visatrack/api/controller/auth/WeChatController.java index 3357efc..0bbe75c 100644 --- a/src/main/java/com/northtecom/visatrack/api/controller/auth/WeChatController.java +++ b/src/main/java/com/northtecom/visatrack/api/controller/auth/WeChatController.java @@ -2,11 +2,10 @@ package com.northtecom.visatrack.api.controller.auth; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; -import com.northtecom.visatrack.api.controller.vo.ForgotPasswordRequest; -import com.northtecom.visatrack.api.controller.vo.UserChangePasswordResponse; -import com.northtecom.visatrack.api.data.entity.UserChangePassword; +import com.northtecom.visatrack.api.model.entity.wechat.WeChatUser; import com.northtecom.visatrack.api.model.request.auth.WeChatTokenizeRequest; import com.northtecom.visatrack.api.service.impl.UserService; +import com.northtecom.visatrack.api.service.impl.WeChatService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.extern.slf4j.Slf4j; @@ -43,13 +42,15 @@ public class WeChatController { private final ObjectMapper objectMapper; private final UserService userService; + private final WeChatService weChatService; private final AuthenticationManager authenticationManager; @Autowired - public WeChatController(ObjectMapper objectMapper, UserService userService, AuthenticationManager authenticationManager, BCryptPasswordEncoder encoder) { + public WeChatController(ObjectMapper objectMapper, UserService userService, AuthenticationManager authenticationManager, BCryptPasswordEncoder encoder, WeChatService weChatService) { this.objectMapper = objectMapper; this.userService = userService; this.authenticationManager = authenticationManager; + this.weChatService = weChatService; } @@ -73,29 +74,9 @@ public class WeChatController { @PostMapping("/tokenize") @ResponseBody @Operation(summary = "用户忘记密码接口", description = "用户忘记密码接口,用户忘记密码以后,通过该接口输入一个邮件地址,系统会给用户发送一封邮件,邮件中包含了重置密码的链接,用户点击以后,可以重置密码") - public String getWeChatAccessToken(@RequestBody @Valid WeChatTokenizeRequest weChatTokenizeRequest) throws IOException { - OkHttpClient client = new OkHttpClient(); - - String weChatAppId = "wx26e01c2be46730f3"; - String weChatSecret = "1eef340a999bc71b431dda85e9bffd3a"; - String weChatCode = weChatTokenizeRequest.getWeChatCode(); - String weChatState = weChatTokenizeRequest.getWeChatState(); - - HttpUrl.Builder urlBuilder = HttpUrl.parse("https://api.weixin.qq.com/sns/oauth2/access_token").newBuilder(); - urlBuilder.addQueryParameter("appid", weChatAppId); - urlBuilder.addQueryParameter("secret", weChatSecret); - urlBuilder.addQueryParameter("code", weChatCode); - urlBuilder.addQueryParameter("grant_type", "authorization_code"); - - String url = urlBuilder.build().toString(); - - Request request = new Request.Builder().url(url).build(); - Call call = client.newCall(request); - - Response response = call.execute(); - - - return url; + public WeChatUser getWeChatAccessToken(@RequestBody @Valid WeChatTokenizeRequest weChatTokenizeRequest) throws IOException { + WeChatUser weChatUser = weChatService.getWeChatUserInfo(weChatTokenizeRequest); + return weChatUser; } } diff --git a/src/main/java/com/northtecom/visatrack/api/model/entity/wechat/WeChatAccessToken.java b/src/main/java/com/northtecom/visatrack/api/model/entity/wechat/WeChatAccessToken.java new file mode 100644 index 0000000..c455361 --- /dev/null +++ b/src/main/java/com/northtecom/visatrack/api/model/entity/wechat/WeChatAccessToken.java @@ -0,0 +1,16 @@ +package com.northtecom.visatrack.api.model.entity.wechat; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +@Data +public class WeChatAccessToken { + @JsonProperty(value = "access_token", required = true) + private String accessToken; + + @JsonProperty(value = "openid", required = true) + private String openId; + + @JsonProperty(value = "unionid", required = true) + private String unionid; +} diff --git a/src/main/java/com/northtecom/visatrack/api/model/entity/wechat/WeChatUser.java b/src/main/java/com/northtecom/visatrack/api/model/entity/wechat/WeChatUser.java new file mode 100644 index 0000000..e2bc364 --- /dev/null +++ b/src/main/java/com/northtecom/visatrack/api/model/entity/wechat/WeChatUser.java @@ -0,0 +1,33 @@ +package com.northtecom.visatrack.api.model.entity.wechat; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +@Data +public class WeChatUser { + + @JsonProperty(value = "openid", required = true) + private String openId; + + @JsonProperty(required = true) + private String nickname; + + private Integer sex; + + private String language; + + private String city; + + private String province; + + private String country; + + @JsonProperty(value = "headimgurl") + private String headImgURL; + + @JsonProperty(value = "unionid", required = true) + private String unionId; + +} + + diff --git a/src/main/java/com/northtecom/visatrack/api/service/impl/WeChatService.java b/src/main/java/com/northtecom/visatrack/api/service/impl/WeChatService.java new file mode 100644 index 0000000..94dd73c --- /dev/null +++ b/src/main/java/com/northtecom/visatrack/api/service/impl/WeChatService.java @@ -0,0 +1,144 @@ +package com.northtecom.visatrack.api.service.impl; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.northtecom.visatrack.api.data.entity.VisaCase; +import com.northtecom.visatrack.api.data.repository.CaseVisaReportRepository; +import com.northtecom.visatrack.api.data.repository.UserRepository; +import com.northtecom.visatrack.api.data.repository.VisaCaseRepository; +import com.northtecom.visatrack.api.data.repository.VisaCheckeeCrawlDataRepository; +import com.northtecom.visatrack.api.model.entity.wechat.WeChatAccessToken; +import com.northtecom.visatrack.api.model.entity.wechat.WeChatUser; +import com.northtecom.visatrack.api.model.request.auth.WeChatTokenizeRequest; +import lombok.extern.slf4j.Slf4j; +import okhttp3.*; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.stereotype.Service; + +import java.io.IOException; + +/** + * Created with IntelliJ IDEA. + * + * @author XieYang, YuCheng + * @Date: 2022/10/14/16:17 + * @Description: + */ +@Service +@Slf4j +public class WeChatService { + private final VisaCaseRepository visaCaseRepository; + private final CaseVisaReportRepository caseVisaReportRepository; + private final UserRepository userRepository; + private final CrawlService crawlService; + private final VisaCheckeeCrawlDataRepository visaCheckeeCrawlDataRepository; + + private final ObjectMapper objectMapper; + + + @Autowired + public WeChatService(VisaCaseRepository visaCaseRepository, CaseVisaReportRepository caseVisaReportRepository, UserRepository userRepository, CrawlService crawlService, VisaCheckeeCrawlDataRepository visaCheckeeCrawlDataRepository, ObjectMapper objectMapper) { + this.visaCaseRepository = visaCaseRepository; + this.caseVisaReportRepository = caseVisaReportRepository; + this.userRepository = userRepository; + this.crawlService = crawlService; + this.visaCheckeeCrawlDataRepository = visaCheckeeCrawlDataRepository; + this.objectMapper = objectMapper; + } + + /** + * 分页搜索签证数据 + * + * @param search 搜索参数 + * @return {@link Page}<{@link VisaCase}> + */ + public WeChatUser getWeChatUserInfo(WeChatTokenizeRequest weChatTokenizeRequest) { + OkHttpClient client = new OkHttpClient(); + String response = StringUtils.EMPTY; + WeChatUser weChatUser = null; + + + String weChatCode = weChatTokenizeRequest.getWeChatCode(); + String weChatState = weChatTokenizeRequest.getWeChatState(); + + try { + response = callWeChatAccessTokenAPI(client, weChatCode, weChatState); + WeChatAccessToken weChatAccessToken = objectMapper.readValue(response, WeChatAccessToken.class); + + + String accessToken = weChatAccessToken.getAccessToken(); + String openId = weChatAccessToken.getOpenId(); + response = callWeChatUserInfoAPI(client, accessToken, openId); + weChatUser = objectMapper.readValue(response, WeChatUser.class); + + log.debug("WeChat NickName - [{}]", weChatUser.getNickname()); + + } catch (JsonProcessingException e) { + log.error("Get WeChat User Info Error.", e); + throw new RuntimeException(e); + } + return weChatUser; + } + + + private String callWeChatAccessTokenAPI(OkHttpClient client, String weChatCode, String weChatState) { + String responseStr; + String weChatAppId = "wx26e01c2be46730f3"; + String weChatSecret = "1eef340a999bc71b431dda85e9bffd3a"; + + HttpUrl.Builder urlBuilder = HttpUrl.parse("https://api.weixin.qq.com/sns/oauth2/access_token").newBuilder(); + urlBuilder.addQueryParameter("appid", weChatAppId); + urlBuilder.addQueryParameter("secret", weChatSecret); + urlBuilder.addQueryParameter("code", weChatCode); + urlBuilder.addQueryParameter("grant_type", "authorization_code"); + + try { + + Request request = new Request.Builder().url(urlBuilder.build().toString()).build(); + Call call = client.newCall(request); + + Response response = call.execute(); + responseStr = response.body().string(); + + } catch (IOException e) { + log.error("Call WeChat get access token error.", e); + throw new RuntimeException(e); + } + + return responseStr; + } + + + /** + * @param client + * @param accessToken + * @param openId + * @return + */ + private String callWeChatUserInfoAPI(OkHttpClient client, String accessToken, String openId) { + String responseStr; + + + HttpUrl.Builder urlBuilder = HttpUrl.parse("https://api.weixin.qq.com/sns/userinfo").newBuilder(); + urlBuilder.addQueryParameter("access_token", accessToken); + urlBuilder.addQueryParameter("openid", openId); + + try { + + Request request = new Request.Builder().url(urlBuilder.build().toString()).build(); + Call call = client.newCall(request); + + Response response = call.execute(); + responseStr = response.body().string(); + + } catch (IOException e) { + throw new RuntimeException(e); + } + + return responseStr; + } + + +}