diff --git a/CHANGE.md b/CHANGE.md index bc129f93..3ad974da 100644 --- a/CHANGE.md +++ b/CHANGE.md @@ -615,4 +615,8 @@ + weixin4j-mp:新增获取模板和删除模板接口 - + weixin4j-mp:新增自定义个性化菜单语言信息匹配项 \ No newline at end of file + + weixin4j-mp:新增自定义个性化菜单语言信息匹配项 + +* 2016-01-23 + + + weixin4j-qy:新增获取客服列表接口 \ No newline at end of file diff --git a/weixin4j-qy/CHANGE.md b/weixin4j-qy/CHANGE.md index 5f512949..79464071 100644 --- a/weixin4j-qy/CHANGE.md +++ b/weixin4j-qy/CHANGE.md @@ -164,3 +164,7 @@ * 2015-12-31 + version upgrade to 1.6.6 + +* 2016-01-23 + + + 新增获取客服列表接口 diff --git a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/WeixinProxy.java b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/WeixinProxy.java index 55fdda5a..57caef22 100644 --- a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/WeixinProxy.java +++ b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/WeixinProxy.java @@ -44,6 +44,7 @@ import com.foxinmy.weixin4j.qy.token.WeixinTicketCreator; import com.foxinmy.weixin4j.qy.token.WeixinTokenCreator; import com.foxinmy.weixin4j.qy.type.ChatType; import com.foxinmy.weixin4j.qy.type.InviteType; +import com.foxinmy.weixin4j.qy.type.KfType; import com.foxinmy.weixin4j.qy.type.UserStatus; import com.foxinmy.weixin4j.token.TokenHolder; import com.foxinmy.weixin4j.token.TokenStorager; @@ -242,6 +243,22 @@ public class WeixinProxy { return notifyApi.sendCustomeMessage(message); } + /** + * 获取客服列表 + * + * @param kfType + * 客服类型 为空时返回全部类型的客服 + * @return 第一个元素为内部客服(internal),第二个参数为外部客服(external) + * @see com.foxinmy.weixin4j.qy.api.NotifyApi + * @see com.foxinmy.weixin4j.qy.model.IdParameter + * @see 客服列表 + * @throws WeixinException + */ + public IdParameter[] getKfList(KfType kfType) throws WeixinException { + return notifyApi.getKfList(kfType); + } + /** * 自定义菜单(管理员须拥有应用的管理权限 并且应用必须设置在回调模式) * diff --git a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/api/NotifyApi.java b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/api/NotifyApi.java index 6a60b777..95427376 100644 --- a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/api/NotifyApi.java +++ b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/api/NotifyApi.java @@ -10,6 +10,8 @@ import com.foxinmy.weixin4j.http.weixin.WeixinResponse; import com.foxinmy.weixin4j.model.Token; import com.foxinmy.weixin4j.qy.message.CustomeMessage; import com.foxinmy.weixin4j.qy.message.NotifyMessage; +import com.foxinmy.weixin4j.qy.model.IdParameter; +import com.foxinmy.weixin4j.qy.type.KfType; import com.foxinmy.weixin4j.token.TokenHolder; import com.foxinmy.weixin4j.tuple.NotifyTuple; @@ -119,4 +121,31 @@ public class NotifyApi extends QyApi { obj.toJSONString()); return response.getAsJsonResult(); } + + /** + * 获取客服列表 + * + * @param kfType + * 客服类型 为空时返回全部类型的客服 + * @return 第一个元素为内部客服(internal),第二个参数为外部客服(external) + * @see com.foxinmy.weixin4j.qy.model.IdParameter + * @see 客服列表 + * @throws WeixinException + */ + public IdParameter[] getKfList(KfType kfType) throws WeixinException { + String message_kf_list_uri = getRequestUri("message_kf_list_uri"); + if (kfType != null) { + message_kf_list_uri += "&type=" + kfType.name(); + } + Token token = tokenHolder.getToken(); + WeixinResponse response = weixinExecutor.get(String.format( + message_kf_list_uri, token.getAccessToken())); + JSONObject obj = response.getAsJson(); + return new IdParameter[] { + obj.containsKey("internal") ? obj.getObject("internal", + IdParameter.class) : null, + obj.containsKey("external") ? obj.getObject("external", + IdParameter.class) : null }; + } } diff --git a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/api/weixin.properties b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/api/weixin.properties index 312f18fa..3d9a7835 100644 --- a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/api/weixin.properties +++ b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/api/weixin.properties @@ -61,6 +61,8 @@ menu_get_uri={api_base_url}/menu/get?access_token=%s&agentid=%d message_send_uri={api_base_url}/message/send?access_token=%s # \u53d1\u9001\u5ba2\u670d\u6d88\u606f message_kf_send_uri={api_base_url}/kf/send?access_token=%s +# \u83b7\u53d6\u5ba2\u670d\u5217\u8868 +message_kf_list_uri={api_base_url}/kf/list?access_token=%s # \u83b7\u53d6\u5fae\u4fe1IP\u5730\u5740 getcallbackip_uri={api_base_url}/getcallbackip?access_token=%s # \u83b7\u53d6\u4f01\u4e1a\u53f7\u5e94\u7528\u4fe1\u606f diff --git a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/jssdk/JSSDKContactConfigurator.java b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/jssdk/JSSDKContactConfigurator.java index 359f7db5..62329037 100644 --- a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/jssdk/JSSDKContactConfigurator.java +++ b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/jssdk/JSSDKContactConfigurator.java @@ -37,13 +37,13 @@ public class JSSDKContactConfigurator { } /** - * 可选范围:部门ID列表(如果departmentIds为0则表示显示管理组下所有部门) + * 可选范围:部门ID列表(如果partyIds为0则表示显示管理组下所有部门) * * @param departmentIds * @return */ - public JSSDKContactConfigurator departmentIds(Integer... departmentIds) { - contactParameter.putDepartmentIds(departmentIds); + public JSSDKContactConfigurator partyIds(Integer... partyIds) { + contactParameter.putPartyIds(partyIds); return this; } diff --git a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/jssdk/JSSDKContactParameter.java b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/jssdk/JSSDKContactParameter.java index 9e0a79f2..f2147485 100644 --- a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/jssdk/JSSDKContactParameter.java +++ b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/jssdk/JSSDKContactParameter.java @@ -65,8 +65,8 @@ public class JSSDKContactParameter extends IdParameter { this.limitTypes = limitTypes; } - public void putLimitType(String type) { - this.limitTypes.add(type); + public void putLimitType(String... limitTypes) { + this.limitTypes.addAll(Arrays.asList(limitTypes)); } public List getSelectedUserIds() { diff --git a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/model/IdParameter.java b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/model/IdParameter.java index 8b8ce6d7..9a8ed9fe 100644 --- a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/model/IdParameter.java +++ b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/model/IdParameter.java @@ -7,6 +7,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import com.alibaba.fastjson.annotation.JSONField; import com.foxinmy.weixin4j.util.StringUtil; /** @@ -24,13 +25,16 @@ public class IdParameter implements Serializable { private static final char SEPARATOR = '|'; + @JSONField(name = "user") private List userIds; - private List departmentIds; + @JSONField(name = "party") + private List partyIds; + @JSONField(name = "tag") private List tagIds; public IdParameter() { this.userIds = new ArrayList(); - this.departmentIds = new ArrayList(); + this.partyIds = new ArrayList(); this.tagIds = new ArrayList(); } @@ -45,36 +49,14 @@ public class IdParameter implements Serializable { return this; } - /** - * 设置成员ID列表,最多支持1000个 - * - * @param userIds - * @return - */ - public IdParameter setUserIds(List userIds) { - this.userIds = userIds; - return this; - } - /** * 新增部门ID列表,最多支持100个 * - * @param departmentIds + * @param partyIds * @return */ - public IdParameter putDepartmentIds(Integer... departmentIds) { - this.departmentIds.addAll(Arrays.asList(departmentIds)); - return this; - } - - /** - * 设置部门ID列表,最多支持100个 - * - * @param departmentIds - * @return - */ - public IdParameter setDepartmentIds(List departmentIds) { - this.departmentIds = departmentIds; + public IdParameter putPartyIds(Integer... partyIds) { + this.partyIds.addAll(Arrays.asList(partyIds)); return this; } @@ -89,19 +71,32 @@ public class IdParameter implements Serializable { return this; } - /** - * 设置标签ID列表 - * - * @param tagIds - * @return - */ - public IdParameter setTagIds(List tagIds) { + public List getUserIds() { + return userIds; + } + + public List getPartyIds() { + return partyIds; + } + + public List getTagIds() { + return tagIds; + } + + public void setUserIds(List userIds) { + this.userIds = userIds; + } + + public void setPartyIds(List partyIds) { + this.partyIds = partyIds; + } + + public void setTagIds(List tagIds) { this.tagIds = tagIds; - return this; } /** - * 目标参数 + * 生成某些接口需要的目标参数 如发送客服消息接口 * * @return */ @@ -110,8 +105,8 @@ public class IdParameter implements Serializable { if (userIds != null && !userIds.isEmpty()) { parameterMap.put("touser", StringUtil.join(userIds, SEPARATOR)); } - if (departmentIds != null && !departmentIds.isEmpty()) { - parameterMap.put("toparty", StringUtil.join(departmentIds, SEPARATOR)); + if (partyIds != null && !partyIds.isEmpty()) { + parameterMap.put("toparty", StringUtil.join(partyIds, SEPARATOR)); } if (tagIds != null && !tagIds.isEmpty()) { parameterMap.put("totag", StringUtil.join(tagIds, SEPARATOR)); @@ -121,7 +116,7 @@ public class IdParameter implements Serializable { @Override public String toString() { - return "IdParameter [userIds=" + userIds + ", departmentIds=" - + departmentIds + ", tagIds=" + tagIds + "]"; + return "IdParameter [userIds=" + userIds + ", partyIds=" + partyIds + + ", tagIds=" + tagIds + "]"; } } diff --git a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/type/KfType.java b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/type/KfType.java new file mode 100644 index 00000000..6542bea9 --- /dev/null +++ b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/type/KfType.java @@ -0,0 +1,21 @@ +package com.foxinmy.weixin4j.qy.type; + +/** + * 客服类型 + * + * @className KfType + * @author jy + * @date 2016年1月23日 + * @since JDK 1.7 + * @see + */ +public enum KfType { + /** + * 内部客服 + */ + internal, + /** + * 外部客服 + */ + external +}