新增发红包&企业付款&批量执行任务接口

This commit is contained in:
jinyu
2015-04-01 20:04:49 +08:00
parent 464359ae7a
commit 92037c567a
38 changed files with 1732 additions and 187 deletions
+7 -1
View File
@@ -7,7 +7,7 @@ weixin4j-qy-api
功能列表
-------
* DepartApi `部门管理API`
* PartyApi `部门管理API`
* UserApi `成员管理API`
@@ -93,3 +93,9 @@ weixin.properties说明
* 2015-03-29
+ 单行注释调整为多行文档注释
* 2015-04-01
+ 新增[BatchApi](./src/main/java/com/foxinmy/weixin4j/qy/api/BatchApi.java)批量异步执行任务接口
+ <font color="red">DepartApi命名为[PartyApi](./src/main/java/com/foxinmy/weixin4j/qy/api/PartyApi.java)</font>
@@ -5,13 +5,17 @@ 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.BatchApi;
import com.foxinmy.weixin4j.qy.api.HelperApi;
import com.foxinmy.weixin4j.qy.api.PartyApi;
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.BatchResult;
import com.foxinmy.weixin4j.qy.model.Callback;
import com.foxinmy.weixin4j.qy.model.IdParameter;
import com.foxinmy.weixin4j.qy.model.Party;
import com.foxinmy.weixin4j.qy.model.Tag;
import com.foxinmy.weixin4j.qy.model.User;
import com.foxinmy.weixin4j.qy.type.InviteType;
@@ -31,11 +35,12 @@ import com.foxinmy.weixin4j.type.AccountType;
* @see <a href="http://qydev.weixin.qq.com/wiki/index.php">api文档</a>
*/
public class WeixinProxy {
private final DepartApi departApi;
private final PartyApi partyApi;
private final UserApi userApi;
private final TagApi tagApi;
private final HelperApi helperApi;
private final AgentApi agentApi;
private final BatchApi batchApi;
/**
* 默认采用文件存放Token信息
@@ -61,74 +66,75 @@ public class WeixinProxy {
* @param tokenHolder
*/
public WeixinProxy(TokenHolder tokenHolder) {
this.departApi = new DepartApi(tokenHolder);
this.partyApi = new PartyApi(tokenHolder);
this.userApi = new UserApi(tokenHolder);
this.tagApi = new TagApi(tokenHolder);
this.helperApi = new HelperApi(tokenHolder);
this.agentApi = new AgentApi(tokenHolder);
this.batchApi = new BatchApi(tokenHolder);
}
/**
* 创建部门(根部门的parentid为1)
*
* @param depart
* @param party
* 部门对象
* @see com.foxinmy.weixin4j.qy.model.Department
* @see com.foxinmy.weixin4j.qy.model.Party
* @see <a
* href="http://qydev.weixin.qq.com/wiki/index.php?title=%E7%AE%A1%E7%90%86%E9%83%A8%E9%97%A8#.E5.88.9B.E5.BB.BA.E9.83.A8.E9.97.A8">创建部门说明</a>
* @see com.foxinmy.weixin4j.qy.api.DepartApi
* @see com.foxinmy.weixin4j.qy.api.PartyApi
* @return 部门ID
* @throws WeixinException
*/
public int createDepart(Department depart) throws WeixinException {
return departApi.createDepart(depart);
public int createParty(Party party) throws WeixinException {
return partyApi.createParty(party);
}
/**
* 更新部门(如果非必须的字段未指定 则不更新该字段之前的设置值)
*
* @param depart
* @param party
* 部门对象
* @see com.foxinmy.weixin4j.qy.model.Department
* @see com.foxinmy.weixin4j.qy.model.Party
* @see <a
* href="http://qydev.weixin.qq.com/wiki/index.php?title=%E7%AE%A1%E7%90%86%E9%83%A8%E9%97%A8#.E6.9B.B4.E6.96.B0.E9.83.A8.E9.97.A8">更新部门说明</a>
* @see com.foxinmy.weixin4j.qy.api.DepartApi
* @see com.foxinmy.weixin4j.qy.api.PartyApi
* @return 处理结果
* @throws WeixinException
*/
public JsonResult updateDepart(Department depart) throws WeixinException {
return departApi.updateDepart(depart);
public JsonResult updateParty(Party party) throws WeixinException {
return partyApi.updateParty(party);
}
/**
* 查询部门列表(以部门的order字段从小到大排列)
*
* @param departId
* @param partyId
* 部门ID。获取指定部门ID下的子部门
* @see com.foxinmy.weixin4j.qy.model.Department
* @see com.foxinmy.weixin4j.qy.model.Party
* @see <a
* href="http://qydev.weixin.qq.com/wiki/index.php?title=%E7%AE%A1%E7%90%86%E9%83%A8%E9%97%A8#.E8.8E.B7.E5.8F.96.E9.83.A8.E9.97.A8.E5.88.97.E8.A1.A8">获取部门列表</a>
* @see com.foxinmy.weixin4j.qy.api.DepartApi
* @see com.foxinmy.weixin4j.qy.api.PartyApi
* @return 部门列表
* @throws WeixinException
*/
public List<Department> listDepart(int departId) throws WeixinException {
return departApi.listDepart(departId);
public List<Party> listParty(int partyId) throws WeixinException {
return partyApi.listParty(partyId);
}
/**
* 删除部门(不能删除根部门;不能删除含有子部门、成员的部门)
*
* @param departId
* @param partyId
* 部门ID
* @see <a
* href="http://qydev.weixin.qq.com/wiki/index.php?title=%E7%AE%A1%E7%90%86%E9%83%A8%E9%97%A8#.E5.88.A0.E9.99.A4.E9.83.A8.E9.97.A8">删除部门说明</a>
* @see com.foxinmy.weixin4j.qy.api.DepartApi
* @see com.foxinmy.weixin4j.qy.api.PartyApi
* @return 处理结果
* @throws WeixinException
*/
public JsonResult deleteDepart(int departId) throws WeixinException {
return departApi.deleteDepart(departId);
public JsonResult deleteParty(int partyId) throws WeixinException {
return partyApi.deleteParty(partyId);
}
/**
@@ -202,7 +208,7 @@ public class WeixinProxy {
/**
* 获取部门成员
*
* @param departId
* @param partyId
* 部门ID 必须
* @param fetchChild
* 是否递归获取子部门下面的成员 非必须
@@ -217,9 +223,9 @@ public class WeixinProxy {
* @return 成员列表
* @throws WeixinException
*/
public List<User> listUser(int departId, boolean fetchChild,
public List<User> listUser(int partyId, boolean fetchChild,
UserStatus userStatus, boolean findDetail) throws WeixinException {
return userApi.listUser(departId, fetchChild, userStatus, findDetail);
return userApi.listUser(partyId, fetchChild, userStatus, findDetail);
}
/**
@@ -445,4 +451,114 @@ public class WeixinProxy {
public JsonResult setAgent(AgentSetter agentSet) throws WeixinException {
return agentApi.setAgent(agentSet);
}
/**
* 批量邀请成员关注
*
* @param parameter
* 成员ID,标签ID,部门ID
* @param callback
* 接收任务执行结果的回调地址等信息
* @param tips
* 推送到微信上的提示语(只有认证号可以使用)。当使用微信推送时,该字段默认为“请关注XXX企业号”,邮件邀请时,该字段无效。
* @return 异步任务id,最大长度为64字符
* @see com.foxinmy.weixin4j.qy.model.IdParameter
* @see com.foxinmy.weixin4j.qy.model.Callback
* @see com.foxinmy.weixin4j.qy.api.BatchApi
* @see <a
* href="http://qydev.weixin.qq.com/wiki/index.php?title=%E5%BC%82%E6%AD%A5%E4%BB%BB%E5%8A%A1%E6%8E%A5%E5%8F%A3#.E9.82.80.E8.AF.B7.E6.88.90.E5.91.98.E5.85.B3.E6.B3.A8">邀请成员关注</a>
* @throws WeixinException
*/
public String inviteuser(IdParameter parameter, Callback callback,
String tips) throws WeixinException {
return batchApi.inviteuser(parameter, callback, tips);
}
/**
* 批量更新成员,本接口以userid为主键,增量更新企业号通讯录成员。
* <p>
* 1.模板中的部门需填写部门ID,多个部门用分号分隔,部门ID必须为数字</br>
* 2.文件中存在、通讯录中也存在的成员,更新成员在文件中指定的字段值 </br> 3.文件中存在、通讯录中不存在的成员,执行添加操作</br>
* 4.通讯录中存在、文件中不存在的成员,保持不变</br>
* </p>
*
* @param mediaId
* 带user信息的cvs文件上传后的media_id
* @param callback
* 接收任务执行结果的回调地址等信息
* @return 异步任务id,最大长度为64字符
* @see com.foxinmy.weixin4j.qy.model.Callback
* @see com.foxinmy.weixin4j.qy.api.BatchApi
* @see <a
* href="http://qydev.weixin.qq.com/wiki/index.php?title=%E5%BC%82%E6%AD%A5%E4%BB%BB%E5%8A%A1%E6%8E%A5%E5%8F%A3#.E5.A2.9E.E9.87.8F.E6.9B.B4.E6.96.B0.E6.88.90.E5.91.98">批量更新成员</a>
* @throws WeixinException
*/
public String syncuser(String mediaId, Callback callback)
throws WeixinException {
return batchApi.syncuser(mediaId, callback);
}
/**
* 批量覆盖成员,本接口以userid为主键,全量覆盖企业号通讯录成员,任务完成后企业号通讯录成员与提交的文件完全保持一致。
* <p>
* 1.模板中的部门需填写部门ID,多个部门用分号分隔,部门ID必须为数字</br> 2.文件中存在、通讯录中也存在的成员,完全以文件为准</br>
* 3.文件中存在、通讯录中不存在的成员,执行添加操作</br>
* 4.通讯录中存在、文件中不存在的成员,执行删除操作。出于安全考虑,如果需要删除的成员多于50人,
* 且多于现有人数的20%以上,系统将中止导入并返回相应的错误码
* </p>
*
* @param mediaId
* 带userid信息的cvs文件上传后的media_id
* @param callback
* 接收任务执行结果的回调地址等信息
* @return 异步任务id,最大长度为64字符
* @see com.foxinmy.weixin4j.qy.model.Callback
* @see com.foxinmy.weixin4j.qy.api.BatchApi
* @see <a
* href="http://qydev.weixin.qq.com/wiki/index.php?title=%E5%BC%82%E6%AD%A5%E4%BB%BB%E5%8A%A1%E6%8E%A5%E5%8F%A3#.E5.85.A8.E9.87.8F.E8.A6.86.E7.9B.96.E6.88.90.E5.91.98">批量覆盖成员</a>
* @throws WeixinException
*/
public String replaceuser(String mediaId, Callback callback)
throws WeixinException {
return batchApi.replaceuser(mediaId, callback);
}
/**
* 批量覆盖部门,本接口以partyid为键,全量覆盖企业号通讯录组织架构,任务完成后企业号通讯录组织架构与提交的文件完全保持一致。
* <p>
* 1.文件中存在、通讯录中也存在的部门,执行修改操作</br> 2.文件中存在、通讯录中不存在的部门,执行添加操作</br>
* 3.文件中不存在、通讯录中存在的部门,当部门为空时,执行删除操作</br>
* 4.CSV文件中,部门名称、部门ID、父部门ID为必填字段,部门ID必须为数字;排序为可选字段,置空或填0不修改排序
* </p>
*
* @param mediaId
* 带partyid信息的cvs文件上传后的media_id
* @param callback
* 接收任务执行结果的回调地址等信息
* @return 异步任务id,最大长度为64字符
* @see com.foxinmy.weixin4j.qy.model.Callback
* @see com.foxinmy.weixin4j.qy.api.BatchApi
* @see <a
* href="http://qydev.weixin.qq.com/wiki/index.php?title=%E5%BC%82%E6%AD%A5%E4%BB%BB%E5%8A%A1%E6%8E%A5%E5%8F%A3#.E5.85.A8.E9.87.8F.E8.A6.86.E7.9B.96.E9.83.A8.E9.97.A8">批量覆盖部门</a>
* @throws WeixinException
*/
public String replaceparty(String mediaId, Callback callback)
throws WeixinException {
return batchApi.replaceparty(mediaId, callback);
}
/**
* 获取异步任务执行的结果
*
* @param jobId
* 任务ID
* @return 效果信息
* @see com.foxinmy.weixin4j.qy.model.BatchResult
* @see com.foxinmy.weixin4j.qy.api.BatchApi
* @see <a
* href="http://qydev.weixin.qq.com/wiki/index.php?title=%E5%BC%82%E6%AD%A5%E4%BB%BB%E5%8A%A1%E6%8E%A5%E5%8F%A3#.E8.8E.B7.E5.8F.96.E5.BC.82.E6.AD.A5.E4.BB.BB.E5.8A.A1.E7.BB.93.E6.9E.9C">获取异步任务执行结果</a>
* @throws WeixinException
*/
public BatchResult getresult(String jobId) throws WeixinException {
return batchApi.getresult(jobId);
}
}
@@ -0,0 +1,168 @@
package com.foxinmy.weixin4j.qy.api;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.TypeReference;
import com.foxinmy.weixin4j.exception.WeixinException;
import com.foxinmy.weixin4j.http.Response;
import com.foxinmy.weixin4j.model.Token;
import com.foxinmy.weixin4j.qy.model.BatchResult;
import com.foxinmy.weixin4j.qy.model.Callback;
import com.foxinmy.weixin4j.qy.model.IdParameter;
import com.foxinmy.weixin4j.token.TokenHolder;
/**
* 批量异步任务API
* <p>
* 异步任务接口用于大批量数据的处理,提交后接口即返回,企业号会在后台继续执行任务。执行完成后,通过任务事件通知企业获取结果
* </p>
*
* @className BatchApi
* @author jy
* @date 2015年3月30日
* @since JDK 1.7
* @see <a
* href="http://qydev.weixin.qq.com/wiki/index.php?title=%E5%BC%82%E6%AD%A5%E4%BB%BB%E5%8A%A1%E6%8E%A5%E5%8F%A3">批量任务</a>
*/
public class BatchApi extends QyApi {
private final TokenHolder tokenHolder;
public BatchApi(TokenHolder tokenHolder) {
this.tokenHolder = tokenHolder;
}
/**
* 批量邀请成员关注
*
* @param parameter
* 成员ID,标签ID,部门ID
* @param callback
* 接收任务执行结果的回调地址等信息
* @param tips
* 推送到微信上的提示语(只有认证号可以使用)。当使用微信推送时,该字段默认为“请关注XXX企业号”,邮件邀请时,该字段无效。
* @return 异步任务id,最大长度为64字符
* @see com.foxinmy.weixin4j.qy.model.IdParameter
* @see com.foxinmy.weixin4j.qy.model.Callback
* @see <a
* href="http://qydev.weixin.qq.com/wiki/index.php?title=%E5%BC%82%E6%AD%A5%E4%BB%BB%E5%8A%A1%E6%8E%A5%E5%8F%A3#.E9.82.80.E8.AF.B7.E6.88.90.E5.91.98.E5.85.B3.E6.B3.A8">邀请成员关注</a>
* @throws WeixinException
*/
public String inviteuser(IdParameter parameter, Callback callback,
String tips) throws WeixinException {
String batch_inviteuser_uri = getRequestUri("batch_inviteuser_uri");
Token token = tokenHolder.getToken();
JSONObject obj = new JSONObject();
obj.putAll(parameter.getParameter());
obj.put("callback", callback);
obj.put("invite_tips", tips);
Response response = request.post(
String.format(batch_inviteuser_uri, token.getAccessToken()),
obj.toJSONString());
return response.getAsJson().getString("jobid");
}
/**
* 批量更新成员,本接口以userid为主键,增量更新企业号通讯录成员。
* <p>
* 1.模板中的部门需填写部门ID,多个部门用分号分隔,部门ID必须为数字</br>
* 2.文件中存在、通讯录中也存在的成员,更新成员在文件中指定的字段值 </br> 3.文件中存在、通讯录中不存在的成员,执行添加操作</br>
* 4.通讯录中存在、文件中不存在的成员,保持不变</br>
* </p>
*
* @param mediaId
* 带user信息的cvs文件上传后的media_id TODO
* @param callback
* 接收任务执行结果的回调地址等信息
* @return 异步任务id,最大长度为64字符
* @see com.foxinmy.weixin4j.qy.model.Callback
* @see <a
* href="http://qydev.weixin.qq.com/wiki/index.php?title=%E5%BC%82%E6%AD%A5%E4%BB%BB%E5%8A%A1%E6%8E%A5%E5%8F%A3#.E5.A2.9E.E9.87.8F.E6.9B.B4.E6.96.B0.E6.88.90.E5.91.98">批量更新成员</a>
* @throws WeixinException
*/
public String syncuser(String mediaId, Callback callback)
throws WeixinException {
String batch_syncuser_uri = getRequestUri("batch_syncuser_uri");
return batch(batch_syncuser_uri, mediaId, callback);
}
private String batch(String batchUrl, String mediaId, Callback callback)
throws WeixinException {
Token token = tokenHolder.getToken();
JSONObject obj = new JSONObject();
obj.put("media_id", mediaId);
obj.put("callback", callback);
Response response = request.post(
String.format(batchUrl, token.getAccessToken()),
obj.toJSONString());
return response.getAsJson().getString("jobid");
}
/**
* 批量覆盖成员,本接口以userid为主键,全量覆盖企业号通讯录成员,任务完成后企业号通讯录成员与提交的文件完全保持一致。
* <p>
* 1.模板中的部门需填写部门ID,多个部门用分号分隔,部门ID必须为数字</br> 2.文件中存在、通讯录中也存在的成员,完全以文件为准</br>
* 3.文件中存在、通讯录中不存在的成员,执行添加操作</br>
* 4.通讯录中存在、文件中不存在的成员,执行删除操作。出于安全考虑,如果需要删除的成员多于50人,
* 且多于现有人数的20%以上,系统将中止导入并返回相应的错误码
* </p>
*
* @param mediaId
* 带userid信息的cvs文件上传后的media_id
* @param callback
* 接收任务执行结果的回调地址等信息
* @return 异步任务id,最大长度为64字符
* @see com.foxinmy.weixin4j.qy.model.Callback
* @see <a
* href="http://qydev.weixin.qq.com/wiki/index.php?title=%E5%BC%82%E6%AD%A5%E4%BB%BB%E5%8A%A1%E6%8E%A5%E5%8F%A3#.E5.85.A8.E9.87.8F.E8.A6.86.E7.9B.96.E6.88.90.E5.91.98">批量覆盖成员</a>
* @throws WeixinException
*/
public String replaceuser(String mediaId, Callback callback)
throws WeixinException {
String batch_replaceuser_uri = getRequestUri("batch_replaceuser_uri");
return batch(batch_replaceuser_uri, mediaId, callback);
}
/**
* 批量覆盖部门,本接口以partyid为键,全量覆盖企业号通讯录组织架构,任务完成后企业号通讯录组织架构与提交的文件完全保持一致。
* <p>
* 1.文件中存在、通讯录中也存在的部门,执行修改操作</br> 2.文件中存在、通讯录中不存在的部门,执行添加操作</br>
* 3.文件中不存在、通讯录中存在的部门,当部门为空时,执行删除操作</br>
* 4.CSV文件中,部门名称、部门ID、父部门ID为必填字段,部门ID必须为数字;排序为可选字段,置空或填0不修改排序
* </p>
*
* @param mediaId
* 带partyid信息的cvs文件上传后的media_id
* @param callback
* 接收任务执行结果的回调地址等信息
* @return 异步任务id,最大长度为64字符
* @see com.foxinmy.weixin4j.qy.model.Callback
* @see <a
* href="http://qydev.weixin.qq.com/wiki/index.php?title=%E5%BC%82%E6%AD%A5%E4%BB%BB%E5%8A%A1%E6%8E%A5%E5%8F%A3#.E5.85.A8.E9.87.8F.E8.A6.86.E7.9B.96.E9.83.A8.E9.97.A8">批量覆盖部门</a>
* @throws WeixinException
*/
public String replaceparty(String mediaId, Callback callback)
throws WeixinException {
String batch_replaceparty_uri = getRequestUri("batch_replaceparty_uri");
return batch(batch_replaceparty_uri, mediaId, callback);
}
/**
* 获取异步任务执行的结果
*
* @param jobId
* 任务ID
* @return 效果信息
* @see com.foxinmy.weixin4j.qy.model.BatchResult
* @see <a
* href="http://qydev.weixin.qq.com/wiki/index.php?title=%E5%BC%82%E6%AD%A5%E4%BB%BB%E5%8A%A1%E6%8E%A5%E5%8F%A3#.E8.8E.B7.E5.8F.96.E5.BC.82.E6.AD.A5.E4.BB.BB.E5.8A.A1.E7.BB.93.E6.9E.9C">获取异步任务执行结果</a>
* @throws WeixinException
*/
public BatchResult getresult(String jobId) throws WeixinException {
Token token = tokenHolder.getToken();
String batch_getresult_uri = getRequestUri("batch_getresult_uri");
Response response = request.get(String.format(batch_getresult_uri,
token.getAccessToken(), jobId));
return response.getAsObject(new TypeReference<BatchResult>() {
});
}
}
@@ -8,24 +8,24 @@ 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.Department;
import com.foxinmy.weixin4j.qy.model.Party;
import com.foxinmy.weixin4j.token.TokenHolder;
/**
* 部门API
*
* @className DepartApi
* @className PartyApi
* @author jy
* @date 2014年11月18日
* @since JDK 1.7
* @see com.foxinmy.weixin4j.qy.model.Department
* @see com.foxinmy.weixin4j.qy.model.Party
* @see <a
* href="http://qydev.weixin.qq.com/wiki/index.php?title=%E7%AE%A1%E7%90%86%E9%83%A8%E9%97%A8">管理部门说明</a>
*/
public class DepartApi extends QyApi {
public class PartyApi extends QyApi {
private final TokenHolder tokenHolder;
public DepartApi(TokenHolder tokenHolder) {
public PartyApi(TokenHolder tokenHolder) {
this.tokenHolder = tokenHolder;
}
@@ -34,13 +34,13 @@ public class DepartApi extends QyApi {
*
* @param depart
* 部门对象
* @see com.foxinmy.weixin4j.qy.model.Department
* @see com.foxinmy.weixin4j.qy.model.Party
* @see <a
* href="http://qydev.weixin.qq.com/wiki/index.php?title=%E7%AE%A1%E7%90%86%E9%83%A8%E9%97%A8#.E5.88.9B.E5.BB.BA.E9.83.A8.E9.97.A8">创建部门说明</a>
* @return 部门ID
* @throws WeixinException
*/
public int createDepart(Department depart) throws WeixinException {
public int createParty(Party depart) throws WeixinException {
String department_create_uri = getRequestUri("department_create_uri");
JSONObject obj = (JSONObject) JSON.toJSON(depart);
obj.remove("id");
@@ -56,15 +56,15 @@ public class DepartApi extends QyApi {
*
* @param depart
* 部门对象
* @see com.foxinmy.weixin4j.qy.model.Department
* @see com.foxinmy.weixin4j.qy.model.Party
* @see <a
* href="http://qydev.weixin.qq.com/wiki/index.php?title=%E7%AE%A1%E7%90%86%E9%83%A8%E9%97%A8#.E6.9B.B4.E6.96.B0.E9.83.A8.E9.97.A8">更新部门说明</a>
* @return 处理结果
* @throws WeixinException
*/
public JsonResult updateDepart(Department depart) throws WeixinException {
public JsonResult updateParty(Party party) throws WeixinException {
String department_update_uri = getRequestUri("department_update_uri");
JSONObject obj = (JSONObject) JSON.toJSON(depart);
JSONObject obj = (JSONObject) JSON.toJSON(party);
Token token = tokenHolder.getToken();
Response response = request.post(
String.format(department_update_uri, token.getAccessToken()),
@@ -75,37 +75,37 @@ public class DepartApi extends QyApi {
/**
* 查询部门列表(以部门的order字段从小到大排列)
*
* @param departId 部门ID获取指定部门ID下的子部门
* @see com.foxinmy.weixin4j.qy.model.Department
* @param partId 部门ID获取指定部门ID下的子部门
* @see com.foxinmy.weixin4j.qy.model.Party
* @see <a
* href="http://qydev.weixin.qq.com/wiki/index.php?title=%E7%AE%A1%E7%90%86%E9%83%A8%E9%97%A8#.E8.8E.B7.E5.8F.96.E9.83.A8.E9.97.A8.E5.88.97.E8.A1.A8">获取部门列表</a>
* @return 部门列表
* @throws WeixinException
*/
public List<Department> listDepart(int departId) throws WeixinException {
public List<Party> listParty(int partId) throws WeixinException {
String department_list_uri = getRequestUri("department_list_uri");
Token token = tokenHolder.getToken();
Response response = request.post(String.format(department_list_uri,
token.getAccessToken()));
return JSON.parseArray(response.getAsJson().getString("department"),
Department.class);
Party.class);
}
/**
* 删除部门(不能删除根部门不能删除含有子部门成员的部门)
*
* @param departId
* @param partId
* 部门ID
* @see <a
* href="http://qydev.weixin.qq.com/wiki/index.php?title=%E7%AE%A1%E7%90%86%E9%83%A8%E9%97%A8#.E5.88.A0.E9.99.A4.E9.83.A8.E9.97.A8">删除部门说明</a>
* @return 处理结果
* @throws WeixinException
*/
public JsonResult deleteDepart(int departId) throws WeixinException {
public JsonResult deleteParty(int partId) throws WeixinException {
String department_delete_uri = getRequestUri("department_delete_uri");
Token token = tokenHolder.getToken();
Response response = request.post(String.format(department_delete_uri,
token.getAccessToken(), departId));
token.getAccessToken(), partId));
return response.getAsJsonResult();
}
}
@@ -64,4 +64,14 @@ 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
agent_set_uri={api_base_url}/agent/set?access_token=%s
# \u6279\u91cf\u9080\u8bf7\u6210\u5458\u5173\u6ce8
batch_inviteuser_uri={api_base_url}/batch/inviteuser?access_token=%s
# \u6279\u91cf\u66f4\u65b0\u6210\u5458
batch_syncuser_uri={api_base_url}/batch/syncuser?access_token=%s
# \u6279\u91cf\u8986\u76d6\u6210\u5458
batch_replaceuser_uri={api_base_url}/batch/replaceuser?access_token=%s
# \u6279\u91cf\u8986\u76d6\u90e8\u95e8
batch_replaceparty_uri={api_base_url}/batch/replaceparty?access_token=%s
# \u83b7\u53d6\u5f02\u6b65\u4efb\u52a1\u6267\u884c\u7ed3\u679c
batch_getresult_uri={api_base_url}/batch/getresult?access_token=%s&jobid=%s
@@ -0,0 +1,99 @@
package com.foxinmy.weixin4j.qy.model;
import com.alibaba.fastjson.JSONArray;
import com.foxinmy.weixin4j.http.JsonResult;
import com.foxinmy.weixin4j.qy.type.BatchStatus;
import com.foxinmy.weixin4j.qy.type.BatchType;
/**
* 异步任务执行结果
*
* @className BatchResult
* @author jy
* @date 2015年3月31日
* @since JDK 1.7
* @see
*/
public class BatchResult extends JsonResult {
private static final long serialVersionUID = 4985338631992208903L;
/**
* 任务状态
*/
private int status;
/**
* 任务类型
*/
private String type;
/**
* 任务运行总条数
*/
private int total;
/**
* 目前运行百分比,当任务完成时为100
*/
private int percentage;
/**
* 预估剩余时间(单位:分钟),当任务完成时为0
*/
private int remaintime;
/**
* 详细的处理结果 TODO
*/
private JSONArray result;
public BatchStatus getStatus() {
return BatchStatus.values()[status - 1];
}
public void setStatus(int status) {
this.status = status;
}
public BatchType getType() {
return BatchType.valueOf(type);
}
public void setType(String type) {
this.type = type;
}
public int getTotal() {
return total;
}
public void setTotal(int total) {
this.total = total;
}
public int getPercentage() {
return percentage;
}
public void setPercentage(int percentage) {
this.percentage = percentage;
}
public int getRemaintime() {
return remaintime;
}
public void setRemaintime(int remaintime) {
this.remaintime = remaintime;
}
public JSONArray getResult() {
return result;
}
public void setResult(JSONArray result) {
this.result = result;
}
@Override
public String toString() {
return "BatchResult [status=" + status + ", type=" + type + ", total="
+ total + ", percentage=" + percentage + ", remaintime="
+ remaintime + ", result=" + result + "]";
}
}
@@ -0,0 +1,52 @@
package com.foxinmy.weixin4j.qy.model;
import java.io.Serializable;
import com.alibaba.fastjson.annotation.JSONField;
/**
* 调用某些接口时填入的回调信息
*
* @className Callback
* @author jy
* @date 2015年3月30日
* @since JDK 1.7
* @see
*/
public class Callback implements Serializable {
private static final long serialVersionUID = 8575808461248605317L;
/**
* 企业应用接收企业号推送请求的访问协议和地址,支持http或https协议
*/
private String url;
/**
* 用于生成签名
*/
private String token;
/**
* 用于消息体的加密,是AES密钥的Base64编码
*/
@JSONField(name = "encodingaeskey")
private String aesKey;
public Callback(String url, String token, String aesKey) {
this.url = url;
this.token = token;
this.aesKey = aesKey;
}
public String getUrl() {
return url;
}
public String getToken() {
return token;
}
public String getAesKey() {
return aesKey;
}
}
@@ -0,0 +1,64 @@
package com.foxinmy.weixin4j.qy.model;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.lang3.StringUtils;
/**
* id参数集
*
* @className IdParameter
* @author jy
* @date 2015年3月30日
* @since JDK 1.7
* @see
*/
public class IdParameter implements Serializable {
private static final long serialVersionUID = -2689758682205591133L;
private Map<String, String> parameterMap;
public IdParameter() {
this.parameterMap = new HashMap<String, String>();
}
/**
* 成员ID列表,最多支持1000个
*
* @param userIds
* @return
*/
public IdParameter putUseIds(String... userIds) {
parameterMap.put("touser", StringUtils.join(userIds, '|'));
return this;
}
/**
* 部门ID列表,最多支持100个
*
* @param partyIds
* @return
*/
public IdParameter putUseIds(int... partyIds) {
parameterMap.put("toparty", StringUtils.join(partyIds, '|'));
return this;
}
/**
* 标签ID列表
*
* @param tagIds
* @return
*/
public IdParameter putTagIds(int... tagIds) {
parameterMap.put("totag", StringUtils.join(tagIds, '|'));
return this;
}
public Map<String, String> getParameter() {
return parameterMap;
}
}
@@ -5,14 +5,14 @@ import java.io.Serializable;
/**
* 部门对象
*
* @className Department
* @className Party
* @author jy
* @date 2014年11月18日
* @since JDK 1.7
* @see <a
* href="http://qydev.weixin.qq.com/wiki/index.php?title=%E7%AE%A1%E7%90%86%E9%83%A8%E9%97%A8">管理部门说明</a>
*/
public class Department implements Serializable {
public class Party implements Serializable {
private static final long serialVersionUID = -2567893218591084288L;
/**
@@ -32,15 +32,15 @@ public class Department implements Serializable {
*/
private int order;
public Department() {
public Party() {
}
public Department(String name) {
public Party(String name) {
this(name, 1, 1);
}
public Department(String name, int parentid, int order) {
public Party(String name, int parentid, int order) {
this.name = name;
this.parentid = parentid;
this.order = order;
@@ -80,7 +80,7 @@ public class Department implements Serializable {
@Override
public String toString() {
return "Department [id=" + id + ", name=" + name + ", parentid="
return "Party [id=" + id + ", name=" + name + ", parentid="
+ parentid + ", order=" + order + "]";
}
}
@@ -0,0 +1,34 @@
package com.foxinmy.weixin4j.qy.type;
/**
* 异步任务的状态
*
* @className BatchStatus
* @author jy
* @date 2015年3月31日
* @since JDK 1.7
* @see
*/
public enum BatchStatus {
/**
* 开始
*/
START(1),
/**
* 进行中
*/
PROCESS(2),
/**
* 完成
*/
DONE(3);
private int code;
BatchStatus(int code) {
this.code = code;
}
public int getCode() {
return code;
}
}
@@ -0,0 +1,39 @@
package com.foxinmy.weixin4j.qy.type;
/**
* 异步任务的类型
*
* @className BatchType
* @author jy
* @date 2015年3月31日
* @since JDK 1.7
* @see
*/
public enum BatchType {
/**
* 增量更新成员
*/
SYNC_USER(1),
/**
* 全量覆盖成员
*/
REPLACE_USER(2),
/**
* 邀请成员关注
*/
INVITE_USER(3),
/**
* 全量覆盖部门
*/
REPLACE_PARTY(4);
private int code;
BatchType(int code) {
this.code = code;
}
public int getCode() {
return code;
}
}
@@ -0,0 +1,39 @@
package com.foxinmy.weixin4j.qy.test;
import org.junit.Before;
import org.junit.Test;
import com.foxinmy.weixin4j.exception.WeixinException;
import com.foxinmy.weixin4j.qy.api.BatchApi;
import com.foxinmy.weixin4j.qy.model.BatchResult;
import com.foxinmy.weixin4j.qy.model.Callback;
/**
* 异步任务测试
*
* @className BatchTest
* @author jy
* @date 2015年3月31日
* @since JDK 1.7
* @see
*/
public class BatchTest extends TokenTest {
public BatchApi batchApi;
@Before
public void init() {
this.batchApi = new BatchApi(tokenHolder);
}
@Test
public void replaceparty() throws WeixinException {
String jobId = batchApi.replaceparty("mediaId", new Callback("url", "token", "aesKey"));
System.err.println(jobId);
}
@Test
public void getresult() throws WeixinException {
BatchResult result = batchApi.getresult("jobId");
System.err.println(result);
}
}
@@ -8,51 +8,51 @@ import org.junit.Test;
import com.foxinmy.weixin4j.exception.WeixinException;
import com.foxinmy.weixin4j.http.JsonResult;
import com.foxinmy.weixin4j.qy.api.DepartApi;
import com.foxinmy.weixin4j.qy.model.Department;
import com.foxinmy.weixin4j.qy.api.PartyApi;
import com.foxinmy.weixin4j.qy.model.Party;
/**
* 部门API测试
*
* @className DepartTest
* @className PartyTest
* @author jy
* @date 2014年11月18日
* @since JDK 1.7
* @see
*/
public class DepartTest extends TokenTest {
public DepartApi departApi;
public class PartyTest extends TokenTest {
public PartyApi partyApi;
@Before
public void init() {
this.departApi = new DepartApi(tokenHolder);
this.partyApi = new PartyApi(tokenHolder);
}
@Test
public void create() throws WeixinException {
Department depart = new Department("苦逼组");
int id = departApi.createDepart(depart);
Party Party = new Party("苦逼组");
int id = partyApi.createParty(Party);
Assert.assertTrue(id > 0);
}
@Test
public void update() throws WeixinException {
Department depart = new Department("苦逼组111");
depart.setId(2);
JsonResult result = departApi.updateDepart(depart);
Party Party = new Party("苦逼组111");
Party.setId(2);
JsonResult result = partyApi.updateParty(Party);
Assert.assertEquals("updated", result.getDesc());
}
@Test
public void list() throws WeixinException {
List<Department> list = departApi.listDepart(1);
List<Party> list = partyApi.listParty(1);
Assert.assertFalse(list.isEmpty());
System.out.println(list);
}
@Test
public void delete() throws WeixinException {
JsonResult result = departApi.deleteDepart(2);
JsonResult result = partyApi.deleteParty(2);
Assert.assertEquals("deleted", result.getDesc());
}
}