tjx
2025-11-25 2c1a6f5df6ca8938e5e71b4c51e0e8315cf7f45a
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
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<DeptUser> 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<String, Object> 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> deptUser;
    }
 
    @Data
    public static class DeptUser {
        private String userid;
        private Integer department;
    }
}