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 List getUserList() throws IOException { String accessToken = getAccessToken(); String url = String.format("https://qyapi.weixin.qq.com/cgi-bin/user/list_id?access_token=%s", accessToken); Map requestBody = new HashMap<>(); requestBody.put("limit", 10000); 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("获取企业微信用户列表失败,HTTP状态码: {}", response.code()); throw new IOException("获取用户列表失败: " + response.message()); } String responseBody = response.body().string(); 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.getDeptUser() != null ? userListResponse.getDeptUser().size() : 0); return userListResponse.getDeptUser(); } } @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 WorkWXUserListResponse { private Integer errcode; private String errmsg; @JsonProperty("next_cursor") private String nextCursor; @JsonProperty("dept_user") private List deptUser; } @Data public static class DeptUser { private String userid; private Integer department; } }