ANDRU-PC\Andru
2022-08-11 155ce4aba49bb16d0de96eda50ea975d3008fa50
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
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
package com.hx.mp.util;
 
import net.sf.json.JSONArray;
import net.sf.json.JSONException;
import net.sf.json.JSONObject;
import org.apache.commons.io.IOUtils;
 
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
 
/**
 * 企业微信客户工具
 */
public class CorpMpClientUtil {
 
    /**
     * 生成联系我按钮参数的链接(生成config_id)
     */
    public static final String CREATE_CONTACT_ID_URL = "https://qyapi.weixin.qq.com/cgi-bin/externalcontact/add_contact_way?access_token=";
    /**
     * 获取企业客户详情链接
     */
    public static final String GET_CLIENT_DETAIL_URL = "https://qyapi.weixin.qq.com/cgi-bin/externalcontact/get";
    /**
     * 获取获取企业标签库链接
     */
    public static final String GET_CORP_TAG_LIST = "https://qyapi.weixin.qq.com/cgi-bin/externalcontact/get_corp_tag_list?access_token=";
    /**
     * 添加客户联系人标签
     */
    public static final String ADD_TAG = "https://qyapi.weixin.qq.com/cgi-bin/externalcontact/add_corp_tag?access_token=";
    /**
     * 编辑企业客户标签
     */
    public static final String EDIT_TAG = "https://qyapi.weixin.qq.com/cgi-bin/externalcontact/edit_corp_tag?access_token=";
    /**
     * 删除客户联系人标签
     */
    public static final String DEL_TAG = "https://qyapi.weixin.qq.com/cgi-bin/externalcontact/del_corp_tag?access_token=";
    /**
     * 客户关联企业微信的标签url
     */
    public static final String RELATION_TAG = "https://qyapi.weixin.qq.com/cgi-bin/externalcontact/mark_tag?access_token=";
 
 
    /**
     * 生成企业成员联系我的id-单人
     *
     * @param accessToken 企业的accessToken
     * @param userId      企业成员的userId
     * @param state       企业自定义的state参数,用于区分不同的添加渠道,在调用“获取外部联系人详情”时会返回该参数值,不超过30个字符
     * @param remark      联系方式的备注信息,用于助记,不超过30个字符
     * @return 返回
     */
    public static JSONObject createContactId(String accessToken, String userId, String state, String remark) {
 
        String configId = null;
        JSONObject data = new JSONObject();
        data.put("type", 1);
        data.put("scene", 1);
        data.put("state", state);
        data.put("remark", remark);
        JSONArray userIds = new JSONArray();
        userIds.add(userId);
        data.put("user", userIds);
 
        //请求,返回格式
       /*{
           "errcode": 0,
               "errmsg": "ok",
               "config_id":"42b34949e138eb6e027c123cba77fAAA"  
       }*/
 
        return HttpURLUtil(CREATE_CONTACT_ID_URL + accessToken, data.toString());
    }
 
    /**
     * 获取企业客户详情信息
     *
     * @param accessToken    企业的accessToken
     * @param externalUserId 外部人员的userId
     * @return 返回
     */
    public static JSONObject getClientData(String accessToken, String externalUserId) {
 
        return HttpURLUtil(GET_CLIENT_DETAIL_URL + "?access_token=" + accessToken + "&external_userid=" + externalUserId, null);
    }
 
    /**
     * 企业可通过此接口获取企业客户标签详情
     *
     * @param accessToken 企业的accessToken
     * @param tagId  标签id
     * @param groupId 标签组id
     * @return 返回
     */
    public static JSONObject getCorpTagList(String accessToken, JSONArray tagId, JSONArray groupId) {
        JSONObject data = new JSONObject();
        data.put("tag_id", tagId);
        data.put("group_id", groupId);
        return HttpURLUtil(GET_CORP_TAG_LIST + accessToken, data.toString());
    }
 
    /**
     * 添加客户联系人标签,
     * 如果要向指定的标签组下添加标签,需要填写group_id参数;如果要创建一个全新的标签组以及标签,
     * 则需要通过group_name参数指定新标签组名称,如果填写的groupname已经存在,则会在此标签组下新建标签
     *
     * @param accessToken 企业的accessToken
     * @param groupId     组id(组名称和组id必填一个)
     * @param groupName   组名称 组名称和组id必填一个)
     * @param groupOrder  组排序,不填默认企业微信生成规则
     * @param tagArray    数组,格式:[{ "name": "TAG_NAME_1", "order": 1 }]
     * @return 返回
     */
    public static JSONObject addTable(String accessToken, String groupId, String groupName, String groupOrder, JSONArray tagArray) {
        JSONObject data = new JSONObject();
        data.put("group_id", groupId);
        data.put("group_name", groupName);
        data.put("order", groupOrder);
        data.put("tag", tagArray);
        return HttpURLUtil(ADD_TAG + accessToken, data.toString());
    }
 
    /**
     * 编辑企业客户标签,
     * 注意:修改后的标签组不能和已有的标签组重名,标签也不能和同一标签组下的其他标签重名。
     *
     * @param accessToken 企业的accessToken
     * @param id     标签或标签组的id
     * @param name   新的标签或标签组名称,最长为30个字符
     * @param order  标签/标签组的次序值。order值大的排序靠前。有效的值范围是[0, 2^32)
     * @return 返回
     */
    public static JSONObject editTable(String accessToken, String id, String name, String order) {
        JSONObject data = new JSONObject();
        data.put("id", id);
        data.put("name", name);
        data.put("order", order);
        return HttpURLUtil(EDIT_TAG + accessToken, data.toString());
    }
 
    /**
     * 删除客户联系人标签
     * groupArr和tagArr不可同时为空。
     * 如果一个标签组下所有的标签均被删除,则标签组会被自动删除。
     *
     * @param accessToken 企业的accessToken
     * @param groupArr    组id数组
     * @param tagArr      标签id数组
     * @return 返回
     */
    public static JSONObject delTable(String accessToken, JSONArray groupArr, JSONArray tagArr) {
        JSONObject data = new JSONObject();
        data.put("tag_id", tagArr);
        data.put("group_id", groupArr);
        return HttpURLUtil(DEL_TAG + accessToken, data.toString());
    }
 
    /**
     * 客户关联企业微信的标签
     * 注意:请确保external_userid是userid的外部联系人。
     * add_tag和remove_tag不可同时为空。
     *
     * @param accessToken    企业的accessToken
     * @param userId         企业成员的userid
     * @param externalUserId 外部联系人的id
     * @param addTag         新增的标签id(企业标签的id)数组
     * @param removeTag      删除的标签id(企业标签的id)数组
     * @return 返回
     */
    public static JSONObject relationTag(String accessToken, String userId, String externalUserId, JSONArray addTag, JSONArray removeTag) {
        JSONObject data = new JSONObject();
        data.put("userid", userId);
        data.put("external_userid", externalUserId);
        data.put("add_tag", addTag);
        data.put("remove_tag", removeTag);
        return HttpURLUtil(RELATION_TAG + accessToken, data.toString());
    }
 
 
    /**
     * 请求http协议 获取信息工具
     **/
    public static JSONObject HttpURLUtil(String url, String data) {
        HttpURLConnection con = null;
        URL u = null;
        String wxMsgXml = null;
        JSONObject obj = null;
        try {
            u = new URL(url);
            con = (HttpURLConnection) u.openConnection();
            con.setRequestMethod("POST");
            con.setDoOutput(true);
            con.setDoInput(true);
            con.setUseCaches(false);
            con.setReadTimeout(5000);
            con.setRequestProperty("Charset", "UTF-8");
            con.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
 
            if (data != null) {
                OutputStream os = con.getOutputStream();
                os.write(data.getBytes("utf-8"));
            }
 
            if (con.getResponseCode() != 200)
                throw new RuntimeException("请求url失败");
            // 读取返回内容
            wxMsgXml = IOUtils.toString(con.getInputStream(), "utf-8");
            obj = JSONObject.fromObject(wxMsgXml);
            // //System.out.println("HttpURLUtil:"+wxMsgXml);
        } catch (Exception e) {
            e.printStackTrace();
            obj = new JSONObject();
            try {
                obj.put("status", 1);
                obj.put("errMsg", e.getMessage());
            } catch (JSONException e1) {
                e1.printStackTrace();
            }
        } finally {
            if (con != null) {
                con.disconnect();
            }
        }
        return obj;
    }
}