View Javadoc
1   package com.foxinmy.weixin4j.qy.api;
2   
3   import java.util.Arrays;
4   import java.util.List;
5   
6   import com.alibaba.fastjson.JSON;
7   import com.alibaba.fastjson.JSONObject;
8   import com.foxinmy.weixin4j.exception.WeixinException;
9   import com.foxinmy.weixin4j.http.weixin.ApiResult;
10  import com.foxinmy.weixin4j.http.weixin.WeixinResponse;
11  import com.foxinmy.weixin4j.model.Token;
12  import com.foxinmy.weixin4j.qy.model.Contacts;
13  import com.foxinmy.weixin4j.qy.model.IdParameter;
14  import com.foxinmy.weixin4j.qy.model.Tag;
15  import com.foxinmy.weixin4j.qy.model.User;
16  import com.foxinmy.weixin4j.token.TokenManager;
17  
18  /**
19   * 标签API
20   *
21   * @className TagApi
22   * @author jinyu(foxinmy@gmail.com)
23   * @date 2014年11月19日
24   * @since JDK 1.6
25   * @see <a href="http://work.weixin.qq.com/api/doc#10915">管理标签</a>
26   */
27  public class TagApi extends QyApi {
28  	private final TokenManager tokenManager;
29  
30  	public TagApi(TokenManager tokenManager) {
31  		this.tokenManager = tokenManager;
32  	}
33  
34  	/**
35  	 * 创建标签(创建的标签属于管理组;默认为加锁状态。加锁状态下只有本管理组才可以增删成员,解锁状态下其它管理组也可以增删成员)
36  	 *
37  	 * @param tag
38  	 *            标签对象;</br> 标签名称,长度限制为32个字(汉字或英文字母),标签名不可与其他标签重名。</br> 标签id,整型,
39  	 *            指定此参数时新增的标签会生成对应的标签id,不指定时则以目前最大的id自增。
40  	 * @see <a href= "https://work.weixin.qq.com/api/doc#10915"> 创建标签说明</a>
41  	 * @return 标签ID
42  	 * @throws WeixinException
43  	 */
44  	public int createTag(Tag tag) throws WeixinException {
45  		String tag_create_uri = getRequestUri("tag_create_uri");
46  		Token token = tokenManager.getCache();
47  		JSONObject obj = (JSONObject) JSON.toJSON(tag);
48  		if (obj.getIntValue("tagid") <= 0) {
49  			obj.remove("tagid");
50  		}
51  		WeixinResponse response = weixinExecutor.post(
52  				String.format(tag_create_uri, token.getAccessToken()),
53  				obj.toJSONString());
54  		return response.getAsJson().getIntValue("tagid");
55  	}
56  
57  	/**
58  	 * 更新标签(管理组必须是指定标签的创建者)
59  	 *
60  	 * @param tag
61  	 *            标签信息
62  	 * @see <a href= "https://work.weixin.qq.com/api/doc#10919" >更新标签说明</a>
63  	 * @return 处理结果
64  	 * @see com.foxinmy.weixin4j.qy.model.Tag
65  	 * @throws WeixinException
66  	 */
67  	public ApiResult updateTag(Tag tag) throws WeixinException {
68  		String tag_update_uri = getRequestUri("tag_update_uri");
69  		Token token = tokenManager.getCache();
70  		WeixinResponse response = weixinExecutor.post(
71  				String.format(tag_update_uri, token.getAccessToken()),
72  				JSON.toJSONString(tag));
73  		return response.getAsResult();
74  	}
75  
76  	/**
77  	 * 删除标签(管理组必须是指定标签的创建者,并且标签的成员列表为空。)
78  	 *
79  	 * @param tagId
80  	 *            标签ID
81  	 * @return 处理结果
82  	 * @see <a href= "https://work.weixin.qq.com/api/doc#10920"> 删除标签说明</a>
83  	 * @throws WeixinException
84  	 */
85  	public ApiResult deleteTag(int tagId) throws WeixinException {
86  		String tag_delete_uri = getRequestUri("tag_delete_uri");
87  		Token token = tokenManager.getCache();
88  		WeixinResponse response = weixinExecutor.get(String.format(
89  				tag_delete_uri, token.getAccessToken(), tagId));
90  		return response.getAsResult();
91  	}
92  
93  	/**
94  	 * 获取标签列表
95  	 *
96  	 * @see <a href= "https://work.weixin.qq.com/api/doc#10926"> 获取标签列表说明</a>
97  	 * @return 标签列表
98  	 * @see com.foxinmy.weixin4j.qy.model.Tag
99  	 * @throws WeixinException
100 	 */
101 	public List<Tag> listTag() throws WeixinException {
102 		String tag_list_uri = getRequestUri("tag_list_uri");
103 		Token token = tokenManager.getCache();
104 		WeixinResponse response = weixinExecutor.get(String.format(
105 				tag_list_uri, token.getAccessToken()));
106 		return JSON.parseArray(response.getAsJson().getString("taglist"),
107 				Tag.class);
108 	}
109 
110 	/**
111 	 * 获取标签成员(管理组须拥有“获取标签成员”的接口权限,返回列表仅包含管理组管辖范围的成员。)
112 	 *
113 	 * @param tagId
114 	 *            标签ID
115 	 * @see com.foxinmy.weixin4j.qy.model.Contacts
116 	 * @see com.foxinmy.weixin4j.qy.model.User
117 	 * @see <a href= "https://work.weixin.qq.com/api/doc#10921"> 获取标签成员说明</a>
118 	 * @return 成员列表<font color="red">Contacts#getUsers</font>和部门列表<font
119 	 *         color="red">Contacts#getPartyIds</font>
120 	 * @throws WeixinException
121 	 */
122 	public Contacts getTagUsers(int tagId) throws WeixinException {
123 		String tag_get_user_uri = getRequestUri("tag_get_user_uri");
124 		Token token = tokenManager.getCache();
125 		WeixinResponse response = weixinExecutor.get(String.format(
126 				tag_get_user_uri, token.getAccessToken(), tagId));
127 		JSONObject obj = response.getAsJson();
128 		Contacts contacts = new Contacts();
129 		contacts.setUsers(JSON.parseArray(obj.getString("userlist"), User.class));
130 		contacts.setPartyIds(JSON.parseArray(obj.getString("partylist"),
131 				Integer.class));
132 		contacts.putTagIds(tagId);
133 		return contacts;
134 	}
135 
136 	/**
137 	 * 新增标签成员(标签对管理组可见且未加锁,成员属于管理组管辖范围。)
138 	 *
139 	 * @param tagId
140 	 *            标签ID
141 	 * @param userIds
142 	 *            企业成员ID列表,注意:userlist、partylist不能同时为空,单次请求长度不超过1000
143 	 * @param partyIds
144 	 *            企业部门ID列表,注意:userlist、partylist不能同时为空,单次请求长度不超过100
145 	 * @see <a href= "https://work.weixin.qq.com/api/doc#10923"> 新增标签成员说明</a>
146 	 * @see com.foxinmy.weixin4j.qy.model.IdParameter
147 	 * @return 非法的userIds和partyIds
148 	 * @throws WeixinException
149 	 */
150 	public IdParameter addTagUsers(int tagId, List<String> userIds,
151 			List<Integer> partyIds) throws WeixinException {
152 		String tag_add_user_uri = getRequestUri("tag_add_user_uri");
153 		return excuteUsers(tag_add_user_uri, tagId, userIds, partyIds);
154 	}
155 
156 	/**
157 	 * 删除标签成员(标签对管理组未加锁,成员属于管理组管辖范围)<br>
158 	 *
159 	 * @param tagId
160 	 *            标签ID
161 	 * @param userIds
162 	 *            企业成员ID列表,注意:userlist、partylist不能同时为空
163 	 * @param partyIds
164 	 *            企业部门ID列表,注意:userlist、partylist不能同时为空
165 	 * @see <a href= "https://work.weixin.qq.com/api/doc#10925"> 删除标签成员说明</a>
166 	 * @see com.foxinmy.weixin4j.qy.model.IdParameter
167 	 * @return 非法的userIds和partyIds
168 	 * @throws WeixinException
169 	 */
170 	public IdParameter deleteTagUsers(int tagId, List<String> userIds,
171 			List<Integer> partyIds) throws WeixinException {
172 		String tag_delete_user_uri = getRequestUri("tag_delete_user_uri");
173 		return excuteUsers(tag_delete_user_uri, tagId, userIds, partyIds);
174 	}
175 
176 	private IdParameter excuteUsers(String uri, int tagId,
177 			List<String> userIds, List<Integer> partyIds)
178 			throws WeixinException {
179 		JSONObject obj = new JSONObject();
180 		obj.put("tagid", tagId);
181 		obj.put("userlist", userIds);
182 		obj.put("partylist", partyIds);
183 		Token token = tokenManager.getCache();
184 		WeixinResponse response = weixinExecutor.post(
185 				String.format(uri, token.getAccessToken()), obj.toJSONString());
186 		obj = response.getAsJson();
187 		IdParameter idParameter = IdParameter.get();
188 		if (obj.containsKey("invalidlist")) {
189 			idParameter.setUserIds(Arrays.asList(obj.getString("invalidlist")
190 					.split(IdParameter.SEPARATORS)));
191 		}
192 		if (obj.containsKey("partylist")) {
193 			idParameter.setPartyIds(JSON.parseArray(obj.getString("partylist"),
194 					Integer.class));
195 		}
196 		return idParameter;
197 	}
198 }