package com.gs.xky.service; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.databind.ObjectMapper; import com.gs.xky.config.DataAcquisitionConfiguration; import lombok.Data; import lombok.RequiredArgsConstructor; import okhttp3.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; import java.io.IOException; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.concurrent.TimeUnit; @Service @RequiredArgsConstructor public class WorkWXService { private static final Logger log = LoggerFactory.getLogger(WorkWXService.class); private final OkHttpClient client = new OkHttpClient.Builder() .connectTimeout(90, TimeUnit.SECONDS) .readTimeout(90, TimeUnit.SECONDS) .build(); private final ObjectMapper objectMapper = new ObjectMapper(); public String getAccessToken() throws IOException { String url = String.format("https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=%s&corpsecret=%s", DataAcquisitionConfiguration.CORPID, DataAcquisitionConfiguration.CORPSECRET); Request request = new Request.Builder() .url(url) .get() .build(); try (Response response = client.newCall(request).execute()) { if (!response.isSuccessful()) { log.error("获取企业微信access_token失败,HTTP状态码: {}", response.code()); throw new IOException("获取access_token失败: " + response.message()); } String responseBody = response.body().string(); WorkWXTokenResponse tokenResponse = objectMapper.readValue(responseBody, WorkWXTokenResponse.class); if (tokenResponse.getErrcode() != 0) { log.error("获取企业微信access_token失败,错误码: {}, 错误信息: {}", tokenResponse.getErrcode(), tokenResponse.getErrmsg()); throw new IOException("获取access_token失败: " + tokenResponse.getErrmsg()); } log.info("成功获取企业微信access_token,有效期: {}秒", tokenResponse.getExpiresIn()); log.info("access_token : {}", tokenResponse.getAccessToken()); return tokenResponse.getAccessToken(); } } public String getUserIdByMobile(String mobile) throws IOException { String accessToken = getAccessToken(); String url = String.format("https://qyapi.weixin.qq.com/cgi-bin/user/getuserid?access_token=%s", accessToken); Map requestBody = new HashMap<>(); requestBody.put("mobile", mobile); MediaType mediaType = MediaType.parse("application/json; charset=UTF-8"); String jsonBody = objectMapper.writeValueAsString(requestBody); RequestBody body = RequestBody.create(mediaType, jsonBody); Request request = new Request.Builder() .url(url) .post(body) .addHeader("Content-Type", "application/json; charset=UTF-8") .build(); try (Response response = client.newCall(request).execute()) { if (!response.isSuccessful()) { log.error("通过手机号获取userid失败,HTTP状态码: {}", response.code()); throw new IOException("获取userid失败: " + response.message()); } String responseBody = response.body().string(); log.info("通过手机号获取userid响应: {}", responseBody); WorkWXUserIdResponse userIdResponse = objectMapper.readValue(responseBody, WorkWXUserIdResponse.class); if (userIdResponse.getErrcode() != 0) { log.error("通过手机号获取userid失败,错误码: {}, 错误信息: {}", userIdResponse.getErrcode(), userIdResponse.getErrmsg()); throw new IOException("获取userid失败: " + userIdResponse.getErrmsg()); } log.info("成功通过手机号 {} 获取userid: {}", mobile, userIdResponse.getUserid()); return userIdResponse.getUserid(); } } public List getUserList() throws IOException { String accessToken = getAccessToken(); String url = String.format( "https://qyapi.weixin.qq.com/cgi-bin/user/simplelist?access_token=%s&department_id=1&fetch_child=1", accessToken); Request request = new Request.Builder() .url(url) .get() .build(); try (Response response = client.newCall(request).execute()) { if (!response.isSuccessful()) { log.error("获取企业微信用户列表失败,HTTP状态码: {}", response.code()); throw new IOException("获取用户列表失败: " + response.message()); } String responseBody = response.body().string(); log.info("获取用户列表响应: {}", responseBody); WorkWXUserListResponse userListResponse = objectMapper.readValue(responseBody, WorkWXUserListResponse.class); if (userListResponse.getErrcode() != 0) { log.error("获取企业微信用户列表失败,错误码: {}, 错误信息: {}", userListResponse.getErrcode(), userListResponse.getErrmsg()); throw new IOException("获取用户列表失败: " + userListResponse.getErrmsg()); } log.info("成功获取企业微信用户列表,用户数量: {}", userListResponse.getUserlist() != null ? userListResponse.getUserlist().size() : 0); return userListResponse.getUserlist(); } } @Data private static class WorkWXTokenResponse { private Integer errcode; private String errmsg; @JsonProperty("access_token") private String accessToken; @JsonProperty("expires_in") private Integer expiresIn; } @Data private static class WorkWXUserIdResponse { private Integer errcode; private String errmsg; private String userid; } @Data private static class WorkWXUserListResponse { private Integer errcode; private String errmsg; private List userlist; } @Data public static class WorkWXUser { private String userid; private String name; private List department; @JsonProperty("open_userid") private String openUserid; } }