diff --git a/README.md b/README.md index 1a482b5d..5eb81036 100644 --- a/README.md +++ b/README.md @@ -197,6 +197,12 @@ netty的代码没有放到maven中心仓库,也没什么意义,因为最终需 + clear code with findbugs plugin + change the version to 1.1 + +* 2014-12-28 + + + **weixin4j-qy**:增加用户进入应用的callback事件 + + + **weixin4j-qy**:增加批量获取用户详情的接口 接下来 ------ diff --git a/pom.xml b/pom.xml index 41366489..01f3994e 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 com.foxinmy weixin4j - 1.1 + 1.2-SNAPSHOT pom weixin4j https://github.com/foxinmy/weixin4j diff --git a/weixin4j-base/pom.xml b/weixin4j-base/pom.xml index 624fd516..7f57ad68 100644 --- a/weixin4j-base/pom.xml +++ b/weixin4j-base/pom.xml @@ -1,11 +1,10 @@ - + 4.0.0 com.foxinmy weixin4j - 1.1-SNAPSHOT + 1.2-SNAPSHOT weixin4j-base weixin4j-base diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/model/BaseMsg.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/model/BaseMsg.java index ba508f91..94f95021 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/model/BaseMsg.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/model/BaseMsg.java @@ -34,7 +34,7 @@ public class BaseMsg implements Serializable { } public BaseMsg(String msgType) { - this(msgType, null, null); + this.msgType = msgType; } public BaseMsg(String toUserName, String fromUserName) { diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/event/EnterAgentEventMessage.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/event/EnterAgentEventMessage.java new file mode 100644 index 00000000..b22a5410 --- /dev/null +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/event/EnterAgentEventMessage.java @@ -0,0 +1,37 @@ +package com.foxinmy.weixin4j.msg.event; + +import com.foxinmy.weixin4j.type.EventType; +import com.thoughtworks.xstream.annotations.XStreamAlias; + +/** + * 用户进入应用的事件推送(企业号)本事件只有在应用的回调模式中打开上报开关时上报 + * + * @className EnterAgentEventMessage + * @author jy + * @date 2014年12月28日 + * @since JDK 1.7 + * @see用户进入应用的事件推送 + */ +public class EnterAgentEventMessage extends EventMessage { + + private static final long serialVersionUID = 7675732524832500820L; + + public EnterAgentEventMessage() { + super(EventType.enter_agent); + } + + @XStreamAlias("EventKey") + private String eventKey; // 事件KEY值,与自定义菜单接口中KEY值对应 + + public String getEventKey() { + return eventKey; + } + + @Override + public String toString() { + return "EnterAgentEventMessage [eventKey=" + eventKey + ", " + + super.toString() + "]"; + } +} diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/event/TemplatesendjobfinishMessage.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/event/TemplatesendjobfinishMessage.java index 08f6314e..9fdfc1cd 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/event/TemplatesendjobfinishMessage.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/event/TemplatesendjobfinishMessage.java @@ -4,7 +4,7 @@ import com.foxinmy.weixin4j.type.EventType; import com.thoughtworks.xstream.annotations.XStreamAlias; /** - * 模板消息事件推送 + * 模板消息事件推送(公众平台) * * @className TemplatesendjobfinishMessage * @author jy diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/event/menu/MenuEventMessage.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/event/menu/MenuEventMessage.java index cacb2acf..83c4258a 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/event/menu/MenuEventMessage.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/event/menu/MenuEventMessage.java @@ -37,6 +37,7 @@ public class MenuEventMessage extends EventMessage { @Override public String toString() { - return "eventKey=" + eventKey + ", " + super.toString(); + return "MenuEventMessage [eventKey=" + eventKey + ", " + + super.toString() + "]"; } } diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/response/ResponseMessage.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/response/ResponseMessage.java index 6e5dd1c4..dfed1d73 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/response/ResponseMessage.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/response/ResponseMessage.java @@ -8,6 +8,7 @@ import com.foxinmy.weixin4j.msg.model.Base; import com.foxinmy.weixin4j.msg.model.News; import com.foxinmy.weixin4j.msg.model.Responseable; import com.foxinmy.weixin4j.util.ClassUtil; +import com.foxinmy.weixin4j.xml.TextConverter; import com.foxinmy.weixin4j.xml.XmlStream; import com.thoughtworks.xstream.annotations.XStreamAlias; @@ -107,10 +108,7 @@ public class ResponseMessage extends BaseMsg { @Override public String toString() { - return "ResponseMessage [" + box.toString() + ", attach=" + attach - + ", getToUserName()=" + getToUserName() - + ", getFromUserName()=" + getFromUserName() - + ", getCreateTime()=" + getCreateTime() + ", getMsgType()=" - + getMsgType() + "]"; + return "ResponseMessage [ " + super.toString() + ", attach=" + attach + + ", box=" + box + "]"; } } diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/type/EventType.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/type/EventType.java index f648b3a2..bb1bb3e8 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/type/EventType.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/type/EventType.java @@ -1,5 +1,6 @@ package com.foxinmy.weixin4j.type; +import com.foxinmy.weixin4j.msg.event.EnterAgentEventMessage; import com.foxinmy.weixin4j.msg.event.EventMessage; import com.foxinmy.weixin4j.msg.event.LocationEventMessage; import com.foxinmy.weixin4j.msg.event.MassEventMessage; @@ -31,7 +32,7 @@ public enum EventType { MenuLocationEventMessage.class), click(MenuEventMessage.class), location( LocationEventMessage.class),masssendjobfinish( MassEventMessage.class), templatesendjobfinish( - TemplatesendjobfinishMessage.class); + TemplatesendjobfinishMessage.class),enter_agent(EnterAgentEventMessage.class); private Class eventClass; diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/response/TextConverter.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/xml/TextConverter.java similarity index 93% rename from weixin4j-base/src/main/java/com/foxinmy/weixin4j/response/TextConverter.java rename to weixin4j-base/src/main/java/com/foxinmy/weixin4j/xml/TextConverter.java index 012a5800..93baaf7b 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/response/TextConverter.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/xml/TextConverter.java @@ -1,4 +1,4 @@ -package com.foxinmy.weixin4j.response; +package com.foxinmy.weixin4j.xml; import com.foxinmy.weixin4j.msg.model.Text; import com.thoughtworks.xstream.converters.SingleValueConverter; diff --git a/weixin4j-mp/pom.xml b/weixin4j-mp/pom.xml index dacef773..b94227b8 100644 --- a/weixin4j-mp/pom.xml +++ b/weixin4j-mp/pom.xml @@ -4,7 +4,7 @@ com.foxinmy weixin4j - 1.1-SNAPSHOT + 1.2-SNAPSHOT weixin4j-mp weixin4j-mp diff --git a/weixin4j-mp/weixin4j-mp-api/pom.xml b/weixin4j-mp/weixin4j-mp-api/pom.xml index 27253a2e..9952839b 100644 --- a/weixin4j-mp/weixin4j-mp-api/pom.xml +++ b/weixin4j-mp/weixin4j-mp-api/pom.xml @@ -1,11 +1,10 @@ - + 4.0.0 com.foxinmy weixin4j-mp - 1.1-SNAPSHOT + 1.2-SNAPSHOT weixin4j-mp-api weixin4j-mp-api diff --git a/weixin4j-mp/weixin4j-mp-server/pom.xml b/weixin4j-mp/weixin4j-mp-server/pom.xml index c33710d3..f4f4c897 100644 --- a/weixin4j-mp/weixin4j-mp-server/pom.xml +++ b/weixin4j-mp/weixin4j-mp-server/pom.xml @@ -1,11 +1,10 @@ - + 4.0.0 com.foxinmy weixin4j-mp - 1.1-SNAPSHOT + 1.2-SNAPSHOT weixin4j-mp-server weixin4j-mp-server diff --git a/weixin4j-qy/README.md b/weixin4j-qy/README.md index b37856ed..f9b4532a 100644 --- a/weixin4j-qy/README.md +++ b/weixin4j-qy/README.md @@ -88,3 +88,9 @@ weixin4j-qy * 2014-11-24 + **weixin4j-qy-server**: 新增netty服务与消息分发 + + * 2014-12-28 + + + **weixin4j-qy**:增加用户进入应用的callback事件 + + + **weixin4j-qy**:增加批量获取用户详情的接口 diff --git a/weixin4j-qy/pom.xml b/weixin4j-qy/pom.xml index ecc3f8f9..93018719 100644 --- a/weixin4j-qy/pom.xml +++ b/weixin4j-qy/pom.xml @@ -4,7 +4,7 @@ com.foxinmy weixin4j - 1.1-SNAPSHOT + 1.2-SNAPSHOT weixin4j-qy weixin4j-qy diff --git a/weixin4j-qy/weixin4j-qy-api/README.md b/weixin4j-qy/weixin4j-qy-api/README.md index d31d778b..2461187e 100644 --- a/weixin4j-qy/weixin4j-qy-api/README.md +++ b/weixin4j-qy/weixin4j-qy-api/README.md @@ -57,3 +57,7 @@ weixin.properties说明 + 新增`用户管理`接口 + 新增`标签管理`接口 + +* 2014-12-28 + + + 增加`批量获取用户详情`的接口 diff --git a/weixin4j-qy/weixin4j-qy-api/pom.xml b/weixin4j-qy/weixin4j-qy-api/pom.xml index 14bd7bf8..63d52783 100644 --- a/weixin4j-qy/weixin4j-qy-api/pom.xml +++ b/weixin4j-qy/weixin4j-qy-api/pom.xml @@ -1,11 +1,10 @@ - + 4.0.0 com.foxinmy weixin4j-qy - 1.1-SNAPSHOT + 1.2-SNAPSHOT weixin4j-qy-api weixin4j-qy-api diff --git a/weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/WeixinProxy.java b/weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/WeixinProxy.java index 1867b0d5..6c67c5b1 100644 --- a/weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/WeixinProxy.java +++ b/weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/WeixinProxy.java @@ -185,6 +185,8 @@ public class WeixinProxy { * 是否递归获取子部门下面的成员 非必须 * @param userStatus * 成员状态 status可叠加 非必须 + * @param findDetail + * 是否获取详细信息 * @see com.foxinmy.weixin4j.qy.model.User * @see 获取部门成员说明 @@ -193,8 +195,8 @@ public class WeixinProxy { * @throws WeixinException */ public List listUser(int departId, boolean fetchChild, - UserStatus userStatus) throws WeixinException { - return userApi.listUser(departId, fetchChild, userStatus); + UserStatus userStatus, boolean findDetail) throws WeixinException { + return userApi.listUser(departId, fetchChild, userStatus, findDetail); } /** @@ -244,7 +246,8 @@ public class WeixinProxy { /** * 更新标签(管理组必须是指定标签的创建者) * - * @param tag 标签信息 + * @param tag + * 标签信息 * @see 更新标签说明 diff --git a/weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/api/UserApi.java b/weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/api/UserApi.java index aac4cab8..1b114a4a 100644 --- a/weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/api/UserApi.java +++ b/weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/api/UserApi.java @@ -1,8 +1,10 @@ package com.foxinmy.weixin4j.qy.api; +import java.util.ArrayList; import java.util.List; import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.foxinmy.weixin4j.exception.WeixinException; import com.foxinmy.weixin4j.http.JsonResult; @@ -132,6 +134,8 @@ public class UserApi extends QyApi { * 是否递归获取子部门下面的成员 非必须 * @param userStatus * 成员状态 status可叠加 非必须 + * @param findDetail + * 是否获取详细信息 * @see com.foxinmy.weixin4j.qy.model.User * @see 获取部门成员说明 @@ -139,14 +143,30 @@ public class UserApi extends QyApi { * @throws WeixinException */ public List listUser(int departId, boolean fetchChild, - UserStatus userStatus) throws WeixinException { - String user_list_uri = getRequestUri("user_list_uri"); + UserStatus userStatus, boolean findDetail) throws WeixinException { + String user_list_uri = findDetail ? getRequestUri("user_list_uri") + : getRequestUri("user_slist_uri"); Token token = tokenHolder.getToken(); Response response = request.post(String.format(user_list_uri, token.getAccessToken(), departId, fetchChild ? 1 : 0, userStatus.getVal())); - return JSON.parseArray(response.getAsJson().getString("userlist"), - User.class); + List list = null; + if (findDetail) { + JSONArray arrays = response.getAsJson().getJSONArray("userlist"); + list = new ArrayList(arrays.size()); + for (int i = 0; i < arrays.size(); i++) { + JSONObject obj = arrays.getJSONObject(i); + Object attrs = obj.getJSONObject("extattr").remove("attrs"); + if (attrs != null) { + obj.put("extattr", attrs); + } + list.add(JSON.toJavaObject(obj, User.class)); + } + } else { + list = JSON.parseArray(response.getAsJson().getString("userlist"), + User.class); + } + return list; } /** @@ -159,7 +179,7 @@ public class UserApi extends QyApi { * @throws WeixinException */ public List listUser(int departId) throws WeixinException { - return listUser(departId, false, UserStatus.BOTH); + return listUser(departId, false, UserStatus.BOTH, false); } /** diff --git a/weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/api/weixin.properties b/weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/api/weixin.properties index 77c63c72..ef58b8ea 100644 --- a/weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/api/weixin.properties +++ b/weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/api/weixin.properties @@ -22,7 +22,9 @@ user_get_uri={api_base_url}/user/get?access_token=%s&userid=%s # code\u83b7\u53d6\u6210\u5458\u4fe1\u606f user_getid_uri={api_base_url}/getuserinfo?access_token=%s&code=%s&agentid=%d # \u83b7\u53d6\u90e8\u95e8\u6210\u5458 -user_list_uri={api_base_url}/user/simplelist?access_token=%s&department_id=%d&fetch_child=%d&status=%d +user_slist_uri={api_base_url}/user/simplelist?access_token=%s&department_id=%d&fetch_child=%d&status=%d +# \u83b7\u53d6\u90e8\u95e8\u6210\u5458(\u8be6\u60c5) +user_list_uri={api_base_url}/user/list?access_token=%s&department_id=%d&fetch_child=%d&status=%d # \u5220\u9664\u6210\u5458 user_delete_uri={api_base_url}/user/delete?access_token=%s&userid=%s # \u6210\u5458\u4e8c\u6b21\u9a8c\u8bc1\u6210\u529f\u65f6\u8c03\u7528 diff --git a/weixin4j-qy/weixin4j-qy-api/src/test/java/com/foxinmy/weixin4j/qy/test/UserTest.java b/weixin4j-qy/weixin4j-qy-api/src/test/java/com/foxinmy/weixin4j/qy/test/UserTest.java index 8e75fabe..f6e99c30 100644 --- a/weixin4j-qy/weixin4j-qy-api/src/test/java/com/foxinmy/weixin4j/qy/test/UserTest.java +++ b/weixin4j-qy/weixin4j-qy-api/src/test/java/com/foxinmy/weixin4j/qy/test/UserTest.java @@ -10,6 +10,7 @@ import com.foxinmy.weixin4j.exception.WeixinException; import com.foxinmy.weixin4j.http.JsonResult; import com.foxinmy.weixin4j.qy.api.UserApi; import com.foxinmy.weixin4j.qy.model.User; +import com.foxinmy.weixin4j.qy.type.UserStatus; /** * 部门API测试 @@ -57,7 +58,10 @@ public class UserTest extends TokenTest { @Test public void list() throws WeixinException { - List userList = userApi.listUser(1); + List userList = userApi.listUser(1, true, UserStatus.BOTH, true); + Assert.assertFalse(userList.isEmpty()); + System.out.println(userList); + userList = userApi.listUser(1); Assert.assertFalse(userList.isEmpty()); System.out.println(userList); } diff --git a/weixin4j-qy/weixin4j-qy-server/README.md b/weixin4j-qy/weixin4j-qy-server/README.md index 09e4762c..59517e61 100644 --- a/weixin4j-qy/weixin4j-qy-server/README.md +++ b/weixin4j-qy/weixin4j-qy-server/README.md @@ -51,4 +51,8 @@ weixin4j-qy-server * 2014-11-24 - + 新增netty服务与消息分发 \ No newline at end of file + + 新增netty服务与消息分发 + +* 2014-12-28 + + + 增加用户进入应用的callback事件 \ No newline at end of file diff --git a/weixin4j-qy/weixin4j-qy-server/pom.xml b/weixin4j-qy/weixin4j-qy-server/pom.xml index b8888293..c276e976 100644 --- a/weixin4j-qy/weixin4j-qy-server/pom.xml +++ b/weixin4j-qy/weixin4j-qy-server/pom.xml @@ -4,7 +4,7 @@ com.foxinmy weixin4j-qy - 1.1-SNAPSHOT + 1.2-SNAPSHOT weixin4j-qy-server weixin4j-qy-server diff --git a/weixin4j-qy/weixin4j-qy-server/src/main/java/com/foxinmy/weixin4j/qy/action/event/EnterAgentAction.java b/weixin4j-qy/weixin4j-qy-server/src/main/java/com/foxinmy/weixin4j/qy/action/event/EnterAgentAction.java new file mode 100644 index 00000000..dd23c736 --- /dev/null +++ b/weixin4j-qy/weixin4j-qy-server/src/main/java/com/foxinmy/weixin4j/qy/action/event/EnterAgentAction.java @@ -0,0 +1,24 @@ +package com.foxinmy.weixin4j.qy.action.event; + +import com.foxinmy.weixin4j.action.DebugAction; +import com.foxinmy.weixin4j.action.mapping.ActionAnnotation; +import com.foxinmy.weixin4j.msg.event.EnterAgentEventMessage; +import com.foxinmy.weixin4j.type.EventType; +import com.foxinmy.weixin4j.type.MessageType; + +/** + * 用户进入应用的事件推送 + * + * @className + * @author jy + * @date 2014年12月28日 + * @since JDK 1.7 + * @see com.foxinmy.weixin4j.msg.event.EnterAgentEventMessage + * @see用户进入应用的事件推送 + */ +@ActionAnnotation(msgType = MessageType.event, eventType = { EventType.enter_agent }) +public class EnterAgentAction extends DebugAction { + +}