From 7cb8e2157942cedfbdc2ac404025d6a839b10683 Mon Sep 17 00:00:00 2001 From: jinyu Date: Tue, 17 Mar 2015 10:51:45 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E4=BC=81=E4=B8=9A=E5=8F=B7?= =?UTF-8?q?=E5=BA=94=E7=94=A8=E8=AE=BE=E7=BD=AE=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGE.md | 6 +- weixin4j-qy/README.md | 6 + weixin4j-qy/weixin4j-qy-api/README.md | 12 ++ .../com/foxinmy/weixin4j/qy/WeixinProxy.java | 37 ++++++ .../com/foxinmy/weixin4j/qy/api/AgentApi.java | 96 +++++++++++++++ .../foxinmy/weixin4j/qy/api/weixin.properties | 6 +- .../foxinmy/weixin4j/qy/model/AgentInfo.java | 91 ++++++++++++++ .../weixin4j/qy/model/AgentSetter.java | 111 ++++++++++++++++++ .../weixin4j/qy/type/ReportLocationType.java | 15 +++ .../src/main/resources/weixin.properties | 2 +- .../foxinmy/weixin4j/qy/test/AgentTest.java | 47 ++++++++ .../com/foxinmy/weixin4j/qy/test/TagTest.java | 4 +- 12 files changed, 428 insertions(+), 5 deletions(-) create mode 100644 weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/api/AgentApi.java create mode 100644 weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/model/AgentInfo.java create mode 100644 weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/model/AgentSetter.java create mode 100644 weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/type/ReportLocationType.java create mode 100644 weixin4j-qy/weixin4j-qy-api/src/test/java/com/foxinmy/weixin4j/qy/test/AgentTest.java diff --git a/CHANGE.md b/CHANGE.md index 2ad833a0..ae874e7d 100644 --- a/CHANGE.md +++ b/CHANGE.md @@ -180,4 +180,8 @@ * 2015-03-08 - + **weixin4j-qy**: 新增根据code获取成员信息接口 \ No newline at end of file + + **weixin4j-qy**: 新增根据code获取成员信息接口 + +* 2015-03-17 + + + **weixin4j-qy**: 新增企业应用设置接口 \ No newline at end of file diff --git a/weixin4j-qy/README.md b/weixin4j-qy/README.md index 704ced6c..0bb18738 100644 --- a/weixin4j-qy/README.md +++ b/weixin4j-qy/README.md @@ -19,6 +19,8 @@ weixin4j-qy + MenuApi `菜单管理API` + NotifyApi `消息发送API` + + + AgentApi `应用设置API` * **weixin4j-qy-server** @@ -110,3 +112,7 @@ weixin4j-qy * 2015-03-08 + **weixin4j-qy-api**: 新增根据code获取成员信息接口 + +* 2015-03-17 + + + **weixin4j-qy-api**: 新增企业应用设置接口 diff --git a/weixin4j-qy/weixin4j-qy-api/README.md b/weixin4j-qy/weixin4j-qy-api/README.md index c3e7ec44..15edd5ea 100644 --- a/weixin4j-qy/weixin4j-qy-api/README.md +++ b/weixin4j-qy/weixin4j-qy-api/README.md @@ -12,6 +12,14 @@ weixin4j-qy-api * UserApi `成员管理API` * TagApi `标签管理API` + + * MediaApi `多媒体管理API` + + * MenuApi `菜单管理API` + + * NotifyApi `消息发送API` + + * AgentApi `应用设置API` 如何使用 -------- @@ -75,3 +83,7 @@ weixin.properties说明 * 2015-03-08 + 新增根据code获取成员信息接口 + +* 2015-03-17 + + + 新增企业应用设置接口 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 ee866cdc..8534742a 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 @@ -4,10 +4,13 @@ import java.util.List; import com.foxinmy.weixin4j.exception.WeixinException; import com.foxinmy.weixin4j.http.JsonResult; +import com.foxinmy.weixin4j.qy.api.AgentApi; import com.foxinmy.weixin4j.qy.api.DepartApi; import com.foxinmy.weixin4j.qy.api.HelperApi; import com.foxinmy.weixin4j.qy.api.TagApi; import com.foxinmy.weixin4j.qy.api.UserApi; +import com.foxinmy.weixin4j.qy.model.AgentInfo; +import com.foxinmy.weixin4j.qy.model.AgentSetter; import com.foxinmy.weixin4j.qy.model.Department; import com.foxinmy.weixin4j.qy.model.Tag; import com.foxinmy.weixin4j.qy.model.User; @@ -32,6 +35,7 @@ public class WeixinProxy { private final UserApi userApi; private final TagApi tagApi; private final HelperApi helperApi; + private final AgentApi agentApi; /** * 默认采用文件存放Token信息 @@ -61,6 +65,7 @@ public class WeixinProxy { this.userApi = new UserApi(tokenHolder); this.tagApi = new TagApi(tokenHolder); this.helperApi = new HelperApi(tokenHolder); + this.agentApi = new AgentApi(tokenHolder); } /** @@ -408,4 +413,36 @@ public class WeixinProxy { public List getcallbackip() throws WeixinException { return helperApi.getcallbackip(); } + + /** + * 获取企业号某个应用的基本信息,包括头像、昵称、帐号类型、认证类型、可见范围等信息 + * + * @param agentid + * 授权方应用id + * @return 应用信息 + * @see com.foxinmy.weixin4j.qy.model.AgentInfo + * @see com.foxinmy.weixin4j.qy.api.AgentApi + * @see 企业号应用的信息 + * @throws WeixinException + */ + public AgentInfo getAgent(int agentid) throws WeixinException { + return agentApi.getAgent(agentid); + } + + /** + * 设置企业应用的选项设置信息,如:地理位置上报等 + * + * @param agentSet + * 设置参数 + * @see com.foxinmy.weixin4j.qy.model.AgentSetter + * @see com.foxinmy.weixin4j.qy.api.AgentApi + * @see 设置企业号信息 + * @return 处理结果 + * @throws WeixinException + */ + public JsonResult setAgent(AgentSetter agentSet) throws WeixinException { + return agentApi.setAgent(agentSet); + } } diff --git a/weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/api/AgentApi.java b/weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/api/AgentApi.java new file mode 100644 index 00000000..cbd4c100 --- /dev/null +++ b/weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/api/AgentApi.java @@ -0,0 +1,96 @@ +package com.foxinmy.weixin4j.qy.api; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson.serializer.ValueFilter; +import com.foxinmy.weixin4j.exception.WeixinException; +import com.foxinmy.weixin4j.http.JsonResult; +import com.foxinmy.weixin4j.http.Response; +import com.foxinmy.weixin4j.model.Token; +import com.foxinmy.weixin4j.qy.model.AgentInfo; +import com.foxinmy.weixin4j.qy.model.AgentSetter; +import com.foxinmy.weixin4j.qy.model.User; +import com.foxinmy.weixin4j.token.TokenHolder; + +/** + * 管理应用接口 + * + * @className AgentApi + * @author jy + * @date 2015年3月16日 + * @since JDK 1.7 + * @see 管理应用接口说明 + */ +public class AgentApi extends QyApi { + private final TokenHolder tokenHolder; + + public AgentApi(TokenHolder tokenHolder) { + this.tokenHolder = tokenHolder; + } + + /** + * 获取企业号某个应用的基本信息,包括头像、昵称、帐号类型、认证类型、可见范围等信息 + * + * @param agentid + * 授权方应用id + * @return 应用信息 + * @see com.foxinmy.weixin4j.qy.model.AgentInfo + * @see 企业号应用的信息 + * @throws WeixinException + */ + public AgentInfo getAgent(int agentid) throws WeixinException { + String agent_get_uri = getRequestUri("agent_get_uri"); + Token token = tokenHolder.getToken(); + Response response = request.post(String.format(agent_get_uri, + token.getAccessToken(), agentid)); + JSONObject jsonObj = response.getAsJson(); + AgentInfo agent = JSON.toJavaObject(jsonObj, AgentInfo.class); + agent.setAllowUsers(JSON.parseArray( + jsonObj.getJSONObject("allow_userinfos").getString("user"), + User.class)); + agent.setAllowPartys(JSON.parseArray( + jsonObj.getJSONObject("allow_partys").getString("partyid"), + Integer.class)); + agent.setAllowTags(JSON.parseArray(jsonObj.getJSONObject("allow_tags") + .getString("tagid"), Integer.class)); + return agent; + } + + /** + * 设置企业应用的选项设置信息,如:地理位置上报等 + * + * @param agentSet + * 设置参数 + * @see com.foxinmy.weixin4j.qy.model.AgentSetter + * @see 设置企业号信息 + * @return 处理结果 + * @throws WeixinException + */ + public JsonResult setAgent(AgentSetter agentSet) throws WeixinException { + String agent_set_uri = getRequestUri("agent_set_uri"); + Token token = tokenHolder.getToken(); + Response response = request.post( + String.format(agent_set_uri, token.getAccessToken()), + JSON.toJSONString(agentSet, typeFilter)); + return response.getAsJsonResult(); + } + + private static ValueFilter typeFilter; + static { + typeFilter = new ValueFilter() { + @Override + public Object process(Object object, String name, Object value) { + if (value instanceof Boolean) { + return ((Boolean) value) ? 1 : 0; + } + if (value instanceof Enum) { + return ((Enum) value).ordinal(); + } + return value; + } + }; + } +} 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 702c7459..f6eb71e2 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 @@ -60,4 +60,8 @@ menu_get_uri={api_base_url}/menu/get?access_token=%s&agentid=%d # \u53d1\u9001\u6d88\u606f message_send_uri={api_base_url}/message/send?access_token=%s # \u83b7\u53d6\u5fae\u4fe1IP\u5730\u5740 -getcallbackip_uri={api_base_url}/getcallbackip?access_token=%s \ No newline at end of file +getcallbackip_uri={api_base_url}/getcallbackip?access_token=%s +# \u83b7\u53d6\u4f01\u4e1a\u53f7\u5e94\u7528\u4fe1\u606f +agent_get_uri={api_base_url}/agent/get?access_token=%s&agentid=%d +# \u8bbe\u7f6e\u4f01\u4e1a\u53f7\u5e94\u7528\u4fe1\u606f +agent_set_uri={api_base_url}/agent/set?access_token=%s \ No newline at end of file diff --git a/weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/model/AgentInfo.java b/weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/model/AgentInfo.java new file mode 100644 index 00000000..789bc5cc --- /dev/null +++ b/weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/model/AgentInfo.java @@ -0,0 +1,91 @@ +package com.foxinmy.weixin4j.qy.model; + +import java.util.List; + +import com.alibaba.fastjson.annotation.JSONField; + +/** + * 企业号应用的基本信息 + * + * @className AgentInfo + * @author jy + * @date 2015年3月17日 + * @since JDK 1.7 + * @see + */ +public class AgentInfo extends AgentSetter { + + private static final long serialVersionUID = -8975132919768696174L; + + @JSONField(name = "square_logo_url") + private String squareLogoUrl;// 企业应用方形头像 + @JSONField(name = "round_logo_url") + private String roundLogoUrl;// 企业应用圆形头像 + @JSONField(serialize = false) + private List allowUsers;// 企业应用可见范围(人员),其中包括userid和关注状态state + @JSONField(serialize = false) + private List allowPartys; // 企业应用可见范围(部门) + @JSONField(serialize = false) + private List allowTags; // 企业应用可见范围(标签) + private boolean close; // 企业应用是否被禁用 + + public AgentInfo() { + super(0); + } + + public String getSquareLogoUrl() { + return squareLogoUrl; + } + + public void setSquareLogoUrl(String squareLogoUrl) { + this.squareLogoUrl = squareLogoUrl; + } + + public String getRoundLogoUrl() { + return roundLogoUrl; + } + + public void setRoundLogoUrl(String roundLogoUrl) { + this.roundLogoUrl = roundLogoUrl; + } + + public List getAllowUsers() { + return allowUsers; + } + + public void setAllowUsers(List allowUsers) { + this.allowUsers = allowUsers; + } + + public List getAllowPartys() { + return allowPartys; + } + + public void setAllowPartys(List allowPartys) { + this.allowPartys = allowPartys; + } + + public List getAllowTags() { + return allowTags; + } + + public void setAllowTags(List allowTags) { + this.allowTags = allowTags; + } + + public boolean isClose() { + return close; + } + + public void setClose(boolean close) { + this.close = close; + } + + @Override + public String toString() { + return "AgentInfo [squareLogoUrl=" + squareLogoUrl + ", roundLogoUrl=" + + roundLogoUrl + ", allowUsers=" + allowUsers + + ", allowPartys=" + allowPartys + ", allowTags=" + allowTags + + ", close=" + close + ", " + super.toString() + "]"; + } +} diff --git a/weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/model/AgentSetter.java b/weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/model/AgentSetter.java new file mode 100644 index 00000000..d8e35dbb --- /dev/null +++ b/weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/model/AgentSetter.java @@ -0,0 +1,111 @@ +package com.foxinmy.weixin4j.qy.model; + +import java.io.Serializable; + +import com.alibaba.fastjson.annotation.JSONField; +import com.foxinmy.weixin4j.qy.type.ReportLocationType; + +/** + * 设置企业号应用 + * + * @className AgentSetter + * @author jy + * @date 2015年3月16日 + * @since JDK 1.7 + * @see 设置企业号应用 + */ +public class AgentSetter implements Serializable { + private static final long serialVersionUID = 5420335232308079801L; + + private int agentid; // 企业应用的id + @JSONField(name = "report_location_flag") + private ReportLocationType reportLocationType; // 企业应用是否打开地理位置上报 + @JSONField(name = "logo_mediaid") + private String logoMediaid; // 企业应用头像的mediaid,通过多媒体接口上传图片获得mediaid,上传后会自动裁剪成方形和圆形两个头像 + private String name; // 企业应用名称 + private String description; // 企业应用详情 + @JSONField(name = "redirect_domain") + private String redirectDomain; // 企业应用可信域名 + @JSONField(name = "isreportuser") + private int isReportUser; // 是否接收用户变更通知。0:不接收;1:接收 + @JSONField(name = "isreportenter") + private int isReportEnter; // 是否上报用户进入应用事件。0:不接收;1:接收 + + public AgentSetter(int agentid) { + this.agentid = agentid; + } + + public int getAgentid() { + return agentid; + } + + public void setAgentid(int agentid) { + this.agentid = agentid; + } + + public ReportLocationType getReportLocationType() { + return reportLocationType; + } + + public void setReportLocationType(ReportLocationType reportLocationType) { + this.reportLocationType = reportLocationType; + } + + public String getLogoMediaid() { + return logoMediaid; + } + + public void setLogoMediaid(String logoMediaid) { + this.logoMediaid = logoMediaid; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getRedirectDomain() { + return redirectDomain; + } + + public void setRedirectDomain(String redirectDomain) { + this.redirectDomain = redirectDomain; + } + + public boolean getIsReportUser() { + return isReportUser == 1; + } + + public void setIsReportUser(boolean isReportUser) { + this.isReportUser = isReportUser ? 1 : 0; + } + + public boolean getIsReportEnter() { + return isReportEnter == 1; + } + + public void setIsReportEnter(boolean isReportEnter) { + this.isReportEnter = isReportEnter ? 1 : 0; + } + + @Override + public String toString() { + return "agentid=" + agentid + ", reportLocationType=" + + reportLocationType + ", logoMediaid=" + logoMediaid + + ", name=" + name + ", description=" + description + + ", redirectDomain=" + redirectDomain + ", isReportUser=" + + isReportUser + ", isReportEnter=" + isReportEnter; + } +} diff --git a/weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/type/ReportLocationType.java b/weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/type/ReportLocationType.java new file mode 100644 index 00000000..c4fbfef6 --- /dev/null +++ b/weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/type/ReportLocationType.java @@ -0,0 +1,15 @@ +package com.foxinmy.weixin4j.qy.type; + +/** + * 上报策略 + * @className ReportLocationType + * @author jy + * @date 2015年3月16日 + * @since JDK 1.7 + * @see + */ +public enum ReportLocationType { + NOT, // 不上报 + DIALOG, // 进入回话上报 + PERSIST; // 持续上报 +} diff --git a/weixin4j-qy/weixin4j-qy-api/src/main/resources/weixin.properties b/weixin4j-qy/weixin4j-qy-api/src/main/resources/weixin.properties index 34f59597..c42bd003 100644 --- a/weixin4j-qy/weixin4j-qy-api/src/main/resources/weixin.properties +++ b/weixin4j-qy/weixin4j-qy-api/src/main/resources/weixin.properties @@ -1,6 +1,6 @@ # \u6d4b\u8bd5\u4e4b\u7528 \u6b63\u5f0f\u73af\u5883\u4e0bcopy\u4e00\u4efd\u5230classpath # \u4f01\u4e1a\u53f7\u4fe1\u606f -account={"id":"wxd9d9fa581a07cefd","secret":"7tr6FXh2NORvqq1la9CVwxV0xZWGsRSgI6tfqd3-JFc9E2p7UukNNYeKoOTLe0Ru",\ +account={"id":"wxf10bce209c91d0e2","secret":"cW0OtP7-7YJ7jHKFZaJW2skJHE9bLHadxOswBdVdI2walRBSPfTSA6QqD_QXw8JZ",\ "token":"gp2eGT5mIpngr",\ "encodingAesKey":"BRYfV4zPFUJb3v3MySNBg1ERKE3vyyMRoScu76vFySv"} diff --git a/weixin4j-qy/weixin4j-qy-api/src/test/java/com/foxinmy/weixin4j/qy/test/AgentTest.java b/weixin4j-qy/weixin4j-qy-api/src/test/java/com/foxinmy/weixin4j/qy/test/AgentTest.java new file mode 100644 index 00000000..8ac066b4 --- /dev/null +++ b/weixin4j-qy/weixin4j-qy-api/src/test/java/com/foxinmy/weixin4j/qy/test/AgentTest.java @@ -0,0 +1,47 @@ +package com.foxinmy.weixin4j.qy.test; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import com.foxinmy.weixin4j.exception.WeixinException; +import com.foxinmy.weixin4j.http.JsonResult; +import com.foxinmy.weixin4j.qy.api.AgentApi; +import com.foxinmy.weixin4j.qy.model.AgentInfo; +import com.foxinmy.weixin4j.qy.model.AgentSetter; +import com.foxinmy.weixin4j.qy.type.ReportLocationType; + +/** + * 应用API测试 + * + * @className AgentTest + * @author jy + * @date 2015年03月17日 + * @since JDK 1.7 + * @see + */ +public class AgentTest extends TokenTest { + public AgentApi agentApi; + + @Before + public void init() { + this.agentApi = new AgentApi(tokenHolder); + } + + @Test + public void get() throws WeixinException { + AgentInfo agent = agentApi.getAgent(0); + Assert.assertTrue(agent != null); + System.err.println(agent); + } + + @Test + public void set() throws WeixinException { + AgentSetter agentSet = new AgentSetter(1); + agentSet.setDescription("test"); + agentSet.setRedirectDomain("test.com"); + agentSet.setReportLocationType(ReportLocationType.DIALOG); + JsonResult result = agentApi.setAgent(agentSet); + Assert.assertTrue(result.getCode() == 0); + } +} diff --git a/weixin4j-qy/weixin4j-qy-api/src/test/java/com/foxinmy/weixin4j/qy/test/TagTest.java b/weixin4j-qy/weixin4j-qy-api/src/test/java/com/foxinmy/weixin4j/qy/test/TagTest.java index 853d770e..4ff4856c 100644 --- a/weixin4j-qy/weixin4j-qy-api/src/test/java/com/foxinmy/weixin4j/qy/test/TagTest.java +++ b/weixin4j-qy/weixin4j-qy-api/src/test/java/com/foxinmy/weixin4j/qy/test/TagTest.java @@ -14,9 +14,9 @@ import com.foxinmy.weixin4j.qy.model.Tag; import com.foxinmy.weixin4j.qy.model.User; /** - * 部门API测试 + * 标签API测试 * - * @className DepartTest + * @className TagTest * @author jy * @date 2014年11月18日 * @since JDK 1.7