diff --git a/weixin-java-enterprise/src/main/java/me/chanjar/weixin/enterprise/api/WxCpService.java b/weixin-java-enterprise/src/main/java/me/chanjar/weixin/enterprise/api/WxCpService.java index daa24e9ec..39c0013cb 100644 --- a/weixin-java-enterprise/src/main/java/me/chanjar/weixin/enterprise/api/WxCpService.java +++ b/weixin-java-enterprise/src/main/java/me/chanjar/weixin/enterprise/api/WxCpService.java @@ -133,46 +133,47 @@ public interface WxCpService { /** *
-   * 分组管理接口 - 创建分组
-   * 最多支持创建500个分组
-   * 详情请见: http://mp.weixin.qq.com/wiki/index.php?title=分组管理接口
+   * 部门管理接口 - 创建部门
+   * 最多支持创建500个部门
+   * 详情请见: http://mp.weixin.qq.com/wiki/index.php?title=部门管理接口
    * 
- * @param name 分组名字(30个字符以内) + * @param depart 部门 + * @return 部门id * @throws WxErrorException */ - public WxCpDepart departmentCreate(String name) throws WxErrorException; + public Integer departCreate(WxCpDepart depart) throws WxErrorException; /** *
-   * 分组管理接口 - 查询所有分组
-   * 详情请见: http://mp.weixin.qq.com/wiki/index.php?title=分组管理接口
+   * 部门管理接口 - 查询所有部门
+   * 详情请见: http://mp.weixin.qq.com/wiki/index.php?title=部门管理接口
    * 
* @return * @throws WxErrorException */ - public List departmentGet() throws WxErrorException; + public List departGet() throws WxErrorException; /** *
-   * 分组管理接口 - 修改分组名
-   * 详情请见: http://mp.weixin.qq.com/wiki/index.php?title=分组管理接口
+   * 部门管理接口 - 修改部门名
+   * 详情请见: http://mp.weixin.qq.com/wiki/index.php?title=部门管理接口
    * 
-   * 如果id为0(未分组),1(黑名单),2(星标组),或者不存在的id,微信会返回系统繁忙的错误
+   * 如果id为0(未部门),1(黑名单),2(星标组),或者不存在的id,微信会返回系统繁忙的错误
    * 
* @param group 要更新的group,group的id,name必须设置 * @throws WxErrorException */ - public void departmentUpdate(WxCpDepart group) throws WxErrorException; + public void departUpdate(WxCpDepart group) throws WxErrorException; /** *
    * 部门管理接口 - 删除部门
    *
    * 
- * @param department + * @param departId * @throws WxErrorException */ - public void departmentDelete(WxCpDepart department) throws WxErrorException; + public void departDelete(Integer departId) throws WxErrorException; public void userCreate(WxUser user) throws WxErrorException; diff --git a/weixin-java-enterprise/src/main/java/me/chanjar/weixin/enterprise/api/WxCpServiceImpl.java b/weixin-java-enterprise/src/main/java/me/chanjar/weixin/enterprise/api/WxCpServiceImpl.java index bd0b45e45..c0e8865d7 100644 --- a/weixin-java-enterprise/src/main/java/me/chanjar/weixin/enterprise/api/WxCpServiceImpl.java +++ b/weixin-java-enterprise/src/main/java/me/chanjar/weixin/enterprise/api/WxCpServiceImpl.java @@ -9,6 +9,7 @@ import java.util.UUID; import java.util.concurrent.atomic.AtomicBoolean; import me.chanjar.weixin.common.bean.WxAccessToken; +import me.chanjar.weixin.common.util.GsonHelper; import me.chanjar.weixin.enterprise.bean.*; import me.chanjar.weixin.enterprise.util.http.SimpleGetRequestExecutor; import me.chanjar.weixin.enterprise.util.crypto.SHA1; @@ -147,30 +148,28 @@ public class WxCpServiceImpl implements WxCpService { } - public WxCpDepart departmentCreate(String name) throws WxErrorException { - // TODO - String url = "https://api.weixin.qq.com/cgi-bin/groups/create"; - JsonObject json = new JsonObject(); - JsonObject groupJson = new JsonObject(); - json.add("group", groupJson); - groupJson.addProperty("name", name); - + public Integer departCreate(WxCpDepart depart) throws WxErrorException { + String url = "https://qyapi.weixin.qq.com/cgi-bin/department/create"; String responseContent = execute( new SimplePostRequestExecutor(), url, - json.toString()); - return WxCpDepart.fromJson(responseContent); + depart.toJson()); + JsonElement tmpJsonElement = Streams.parse(new JsonReader(new StringReader(responseContent))); + return GsonHelper.getAsInteger(tmpJsonElement.getAsJsonObject().get("id")); } - public void departmentUpdate(WxCpDepart group) throws WxErrorException { - // TODO - String url = "https://api.weixin.qq.com/cgi-bin/groups/update"; + public void departUpdate(WxCpDepart group) throws WxErrorException { + String url = "https://qyapi.weixin.qq.com/cgi-bin/department/update"; execute(new SimplePostRequestExecutor(), url, group.toJson()); } - public List departmentGet() throws WxErrorException { - // TODO - String url = "https://api.weixin.qq.com/cgi-bin/groups/get"; + public void departDelete(Integer departId) throws WxErrorException { + String url = "https://qyapi.weixin.qq.com/cgi-bin/department/delete?id=" + departId; + String responseContent = execute(new SimpleGetRequestExecutor(), url, null); + } + + public List departGet() throws WxErrorException { + String url = "https://qyapi.weixin.qq.com/cgi-bin/department/list"; String responseContent = execute(new SimpleGetRequestExecutor(), url, null); /* * 操蛋的微信API,创建时返回的是 { group : { id : ..., name : ...} } @@ -178,13 +177,10 @@ public class WxCpServiceImpl implements WxCpService { */ JsonElement tmpJsonElement = Streams.parse(new JsonReader(new StringReader(responseContent))); return WxCpGsonBuilder.INSTANCE.create() - .fromJson(tmpJsonElement.getAsJsonObject().get("groups"), new TypeToken>() { - }.getType()); - } - - public void departmentDelete(WxCpDepart department) throws WxErrorException { - // TODO - + .fromJson( + tmpJsonElement.getAsJsonObject().get("department"), + new TypeToken>() { }.getType() + ); } @Override diff --git a/weixin-java-enterprise/src/main/java/me/chanjar/weixin/enterprise/bean/WxCpDepart.java b/weixin-java-enterprise/src/main/java/me/chanjar/weixin/enterprise/bean/WxCpDepart.java index bd07a1459..51243d7ee 100644 --- a/weixin-java-enterprise/src/main/java/me/chanjar/weixin/enterprise/bean/WxCpDepart.java +++ b/weixin-java-enterprise/src/main/java/me/chanjar/weixin/enterprise/bean/WxCpDepart.java @@ -4,33 +4,52 @@ import me.chanjar.weixin.enterprise.util.json.WxCpGsonBuilder; /** * 微信部门 - * @author Daniel Qian * + * @author Daniel Qian */ public class WxCpDepart { - private long id = -1; + private Integer id; private String name; - private long parentId; - private long order; + private Integer parentId; + private Integer order; - public long getId() { + public Integer getId() { return id; } - public void setId(long id) { + + public void setId(Integer id) { this.id = id; } + public String getName() { return name; } + public void setName(String name) { this.name = name; } + public Integer getParentId() { + return parentId; + } + + public void setParentId(Integer parentId) { + this.parentId = parentId; + } + + public Integer getOrder() { + return order; + } + + public void setOrder(Integer order) { + this.order = order; + } + public static WxCpDepart fromJson(String json) { return WxCpGsonBuilder.create().fromJson(json, WxCpDepart.class); } - + public String toJson() { return WxCpGsonBuilder.create().toJson(this); } diff --git a/weixin-java-enterprise/src/main/java/me/chanjar/weixin/enterprise/bean/result/WxError.java b/weixin-java-enterprise/src/main/java/me/chanjar/weixin/enterprise/bean/result/WxError.java index 891126dae..677a9c095 100644 --- a/weixin-java-enterprise/src/main/java/me/chanjar/weixin/enterprise/bean/result/WxError.java +++ b/weixin-java-enterprise/src/main/java/me/chanjar/weixin/enterprise/bean/result/WxError.java @@ -13,93 +13,6 @@ import me.chanjar.weixin.enterprise.util.json.WxCpGsonBuilder; */ public class WxError { - protected static final Map errMap = new HashMap(); - - static { - errMap.put(-1, "系统繁忙"); - errMap.put(0, "请求成功"); - errMap.put(40001, "获取access_token时AppSecret错误,或者access_token无效"); - errMap.put(40002, "不合法的凭证类型"); - errMap.put(40003, "不合法的OpenID"); - errMap.put(40004, "不合法的媒体文件类型"); - errMap.put(40005, "不合法的文件类型"); - errMap.put(40006, "不合法的文件大小"); - errMap.put(40007, "不合法的媒体文件id"); - errMap.put(40008, "不合法的消息类型"); - errMap.put(40009, "不合法的图片文件大小"); - errMap.put(40010, "不合法的语音文件大小"); - errMap.put(40011, "不合法的视频文件大小"); - errMap.put(40012, "不合法的缩略图文件大小"); - errMap.put(40013, "不合法的APPID"); - errMap.put(40014, "不合法的access_token"); - errMap.put(40015, "不合法的菜单类型"); - errMap.put(40016, "不合法的按钮个数"); - errMap.put(40017, "不合法的按钮个数"); - errMap.put(40018, "不合法的按钮名字长度"); - errMap.put(40019, "不合法的按钮KEY长度"); - errMap.put(40020, "不合法的按钮URL长度"); - errMap.put(40021, "不合法的菜单版本号"); - errMap.put(40022, "不合法的子菜单级数"); - errMap.put(40023, "不合法的子菜单按钮个数"); - errMap.put(40024, "不合法的子菜单按钮类型"); - errMap.put(40025, "不合法的子菜单按钮名字长度"); - errMap.put(40026, "不合法的子菜单按钮KEY长度"); - errMap.put(40027, "不合法的子菜单按钮URL长度"); - errMap.put(40028, "不合法的自定义菜单使用用户"); - errMap.put(40029, "不合法的oauth_code"); - errMap.put(40030, "不合法的refresh_token"); - errMap.put(40031, "不合法的openid列表"); - errMap.put(40032, "不合法的openid列表长度"); - errMap.put(40033, "不合法的请求字符,不能包含\\uxxxx格式的字符"); - errMap.put(40035, "不合法的参数"); - errMap.put(40038, "不合法的请求格式"); - errMap.put(40039, "不合法的URL长度"); - errMap.put(40050, "不合法的分组id"); - errMap.put(40051, "分组名字不合法"); - errMap.put(41001, "缺少access_token参数"); - errMap.put(41002, "缺少appid参数"); - errMap.put(41003, "缺少refresh_token参数"); - errMap.put(41004, "缺少secret参数"); - errMap.put(41005, "缺少多媒体文件数据"); - errMap.put(41006, "缺少media_id参数"); - errMap.put(41007, "缺少子菜单数据"); - errMap.put(41008, "缺少oauth code"); - errMap.put(41009, "缺少openid"); - errMap.put(42001, "access_token超时"); - errMap.put(42002, "refresh_token超时"); - errMap.put(42003, "oauth_code超时"); - errMap.put(43001, "需要GET请求"); - errMap.put(43002, "需要POST请求"); - errMap.put(43003, "需要HTTPS请求"); - errMap.put(43004, "需要接收者关注"); - errMap.put(43005, "需要好友关系"); - errMap.put(44001, "多媒体文件为空"); - errMap.put(44002, "POST的数据包为空"); - errMap.put(44003, "图文消息内容为空"); - errMap.put(44004, "文本消息内容为空"); - errMap.put(45001, "多媒体文件大小超过限制"); - errMap.put(45002, "消息内容超过限制"); - errMap.put(45003, "标题字段超过限制"); - errMap.put(45004, "描述字段超过限制"); - errMap.put(45005, "链接字段超过限制"); - errMap.put(45006, "图片链接字段超过限制"); - errMap.put(45007, "语音播放时间超过限制"); - errMap.put(45008, "图文消息超过限制"); - errMap.put(45009, "接口调用超过限制"); - errMap.put(45010, "创建菜单个数超过限制"); - errMap.put(45015, "回复时间超过限制"); - errMap.put(45016, "系统分组,不允许修改"); - errMap.put(45017, "分组名字过长"); - errMap.put(45018, "分组数量超过上限"); - errMap.put(46001, "不存在媒体数据"); - errMap.put(46002, "不存在的菜单版本"); - errMap.put(46003, "不存在的菜单数据"); - errMap.put(46004, "不存在的用户"); - errMap.put(47001, "解析JSON/XML内容错误"); - errMap.put(48001, "api功能未授权"); - errMap.put(50001, "用户未授权该api"); - } - protected int errorCode; protected String errorMsg; @@ -120,17 +33,13 @@ public class WxError { this.errorMsg = errorMsg; } - public String getDescription() { - return errMap.get(errorCode); - } - public static WxError fromJson(String json) { return WxCpGsonBuilder.create().fromJson(json, WxError.class); } @Override public String toString() { - return "微信错误 errcode=" + errorCode + ", errmsg=" + errorMsg + ", description=" + getDescription(); + return "微信错误 errcode=" + errorCode + ", errmsg=" + errorMsg; } } diff --git a/weixin-java-enterprise/src/main/java/me/chanjar/weixin/enterprise/util/json/WxCpDepartGsonAdapter.java b/weixin-java-enterprise/src/main/java/me/chanjar/weixin/enterprise/util/json/WxCpDepartGsonAdapter.java index d2cff9452..1d4b29969 100644 --- a/weixin-java-enterprise/src/main/java/me/chanjar/weixin/enterprise/util/json/WxCpDepartGsonAdapter.java +++ b/weixin-java-enterprise/src/main/java/me/chanjar/weixin/enterprise/util/json/WxCpDepartGsonAdapter.java @@ -22,38 +22,44 @@ import com.google.gson.JsonSerializationContext; import com.google.gson.JsonSerializer; /** - * * @author Daniel Qian - * */ public class WxCpDepartGsonAdapter implements JsonSerializer, JsonDeserializer { public JsonElement serialize(WxCpDepart group, Type typeOfSrc, JsonSerializationContext context) { JsonObject json = new JsonObject(); - JsonObject groupJson = new JsonObject(); - groupJson.addProperty("name", group.getName()); - groupJson.addProperty("id", group.getId()); - groupJson.addProperty("count", group.getCount()); - json.add("group", groupJson); + if (group.getId() != null) { + json.addProperty("id", group.getId()); + } + if (group.getName() != null) { + json.addProperty("name", group.getName()); + } + if (group.getParentId() != null) { + json.addProperty("parentid", group.getParentId()); + } + if (group.getOrder() != null) { + json.addProperty("order", String.valueOf(group.getOrder())); + } return json; } - public WxCpDepart deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { - WxCpDepart group = new WxCpDepart(); - JsonObject groupJson = json.getAsJsonObject(); - if (json.getAsJsonObject().get("group") != null) { - groupJson = json.getAsJsonObject().get("group").getAsJsonObject(); + public WxCpDepart deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) + throws JsonParseException { + WxCpDepart depart = new WxCpDepart(); + JsonObject departJson = json.getAsJsonObject(); + if (departJson.get("id") != null && !departJson.get("id").isJsonNull()) { + depart.setId(GsonHelper.getAsInteger(departJson.get("id"))); } - if (groupJson.get("name") != null && !groupJson.get("name").isJsonNull()) { - group.setName(GsonHelper.getAsString(groupJson.get("name"))); + if (departJson.get("name") != null && !departJson.get("name").isJsonNull()) { + depart.setName(GsonHelper.getAsString(departJson.get("name"))); } - if (groupJson.get("id") != null && !groupJson.get("id").isJsonNull()) { - group.setId(GsonHelper.getAsPrimitiveLong(groupJson.get("id"))); + if (departJson.get("order") != null && !departJson.get("order").isJsonNull()) { + depart.setOrder(GsonHelper.getAsInteger(departJson.get("order"))); } - if (groupJson.get("count") != null && !groupJson.get("count").isJsonNull()) { - group.setCount(GsonHelper.getAsPrimitiveLong(groupJson.get("count"))); + if (departJson.get("parentid") != null && !departJson.get("parentid").isJsonNull()) { + depart.setParentId(GsonHelper.getAsInteger(departJson.get("parentid"))); } - return group; + return depart; } - + } diff --git a/weixin-java-enterprise/src/test/java/me/chanjar/weixin/enterprise/api/WxCpDepartAPITest.java b/weixin-java-enterprise/src/test/java/me/chanjar/weixin/enterprise/api/WxCpDepartAPITest.java index 817cb7c2d..6e97a37ec 100644 --- a/weixin-java-enterprise/src/test/java/me/chanjar/weixin/enterprise/api/WxCpDepartAPITest.java +++ b/weixin-java-enterprise/src/test/java/me/chanjar/weixin/enterprise/api/WxCpDepartAPITest.java @@ -12,11 +12,11 @@ import me.chanjar.weixin.enterprise.exception.WxErrorException; import com.google.inject.Inject; /** - * 测试分组接口 - * + * 测试部门接口 + * * @author Daniel Qian */ -@Test(groups = "groupAPI", dependsOnGroups = "baseAPI") +@Test(groups = "departAPI", dependsOnGroups = "baseAPI") @Guice(modules = ApiTestModule.class) public class WxCpDepartAPITest { @@ -24,27 +24,35 @@ public class WxCpDepartAPITest { protected WxCpServiceImpl wxService; protected WxCpDepart depart; - - public void testGroupCreate() throws WxErrorException { - WxCpDepart res = wxService.departmentCreate("测试分组1"); - Assert.assertEquals(res.getName(), "测试分组1"); + + public void testDepartCreate() throws WxErrorException { + WxCpDepart depart = new WxCpDepart(); + depart.setName("测试部门"); + depart.setParentId(1); + depart.setOrder(1); + Integer departId = wxService.departCreate(depart); } - @Test(dependsOnMethods="testGroupCreate") - public void testGroupGet() throws WxErrorException { - List groupList = wxService.departmentGet(); - Assert.assertNotNull(groupList); - Assert.assertTrue(groupList.size() > 0); - for (WxCpDepart g : groupList) { + @Test(dependsOnMethods = "testDepartCreate") + public void testDepartGet() throws WxErrorException { + List departList = wxService.departGet(); + Assert.assertNotNull(departList); + Assert.assertTrue(departList.size() > 0); + for (WxCpDepart g : departList) { depart = g; Assert.assertNotNull(g.getName()); } } - - @Test(dependsOnMethods={"testGroupGet", "testGroupCreate"}) - public void getGroupUpdate() throws WxErrorException { - depart.setName("分组改名"); - wxService.departmentUpdate(depart); + + @Test(dependsOnMethods = { "testDepartGet", "testDepartCreate" }) + public void testDepartUpdate() throws WxErrorException { + depart.setName("部门改名"); + wxService.departUpdate(depart); + } + + @Test(dependsOnMethods = "testDepartUpdate") + public void testDepartDelete() throws WxErrorException { + wxService.departDelete(depart.getId()); } }