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 6c86695d..a7a681fd 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 @@ -3,6 +3,7 @@ package com.foxinmy.weixin4j.qy; import java.io.InputStream; import java.util.List; +import com.alibaba.fastjson.JSONObject; import com.foxinmy.weixin4j.cache.CacheStorager; import com.foxinmy.weixin4j.cache.FileCacheStorager; import com.foxinmy.weixin4j.exception.WeixinException; @@ -65,1355 +66,1315 @@ import com.foxinmy.weixin4j.util.Weixin4jConfigUtil; * @author jinyu(foxinmy@gmail.com) * @date 2014年11月19日 * @since JDK 1.6 - * @see api文档 + * @see api文档 */ public class WeixinProxy { - /** - * 授权API - */ - private final OauthApi oauthApi; - /** - * 媒体素材API - */ - private final MediaApi mediaApi; - /** - * 菜单API - */ - private final MenuApi menuApi; - /** - * 消息服务API - */ - private final NotifyApi notifyApi; - /** - * 部门API - */ - private final PartyApi partyApi; - /** - * 成员API - */ - private final UserApi userApi; - /** - * 标签API - */ - private final TagApi tagApi; - /** - * 辅助API - */ - private final HelperApi helperApi; - /** - * 应用API - */ - private final AgentApi agentApi; - /** - * 批量操作API - */ - private final BatchApi batchApi; - /** - * 聊天服务API - */ - private final ChatApi chatApi; - /** - * token管理 - */ - private final TokenManager tokenManager; - /** - * 账号信息 - */ - private final WeixinAccount weixinAccount; - /** - * token存储 - */ - private final CacheStorager cacheStorager; - - /** - * 微信接口实现(使用weixin4j.properties配置的account账号信息, - * 使用FileCacheStorager文件方式缓存TOKEN) - */ - public WeixinProxy() { - this(new FileCacheStorager()); - } - - /** - * 微信接口实现(使用weixin4j.properties配置的account账号信息) - * - * @param cacheStorager - * token管理 - */ - public WeixinProxy(CacheStorager cacheStorager) { - this(Weixin4jConfigUtil.getWeixinAccount(), cacheStorager); - } - - /** - * 微信接口实现 - * - * @param weixinAccount - * 账号信息 - * @param cacheStorager - * token管理 - */ - public WeixinProxy(WeixinAccount weixinAccount, CacheStorager cacheStorager) { - this(weixinAccount, new WeixinTokenCreator(weixinAccount.getId(), weixinAccount.getSecret()), cacheStorager); - } - - /** - * 第三方套件(永久授权码机制) - * - * @param perTicketManager - * 第三方套件永久授权码 - * {@link com.foxinmy.weixin4j.qy.api.SuiteApi#getPerCodeManager(String)} - * @param suiteTokenManager - * 第三方套件凭证token - * {@link com.foxinmy.weixin4j.qy.api.SuiteApi#getTokenManager} - * @see com.foxinmy.weixin4j.qy.api.SuiteApi - * @see WeixinSuiteProxy#getWeixinProxy(String, String) - */ - public WeixinProxy(PerTicketManager perTicketManager, TokenManager suiteTokenManager) { - this(new WeixinAccount(perTicketManager.getThirdId(), perTicketManager.getThirdSecret()), - new WeixinTokenSuiteCreator(perTicketManager, suiteTokenManager), perTicketManager.getCacheStorager()); - } - - /** - * 微信接口实现 - * - * @param settings - * 配置信息 - * @param tokenManager - * token管理 - */ - private WeixinProxy(WeixinAccount weixinAccount, TokenCreator tokenCreator, CacheStorager cacheStorager) { - if (weixinAccount == null) { - throw new IllegalArgumentException("weixinAccount must not be empty"); - } - if (tokenCreator == null) { - throw new IllegalArgumentException("tokenCreator must not be empty"); - } - if (cacheStorager == null) { - throw new IllegalArgumentException("cacheStorager must not be empty"); - } - this.tokenManager = new TokenManager(tokenCreator, cacheStorager); - this.weixinAccount = weixinAccount; - this.cacheStorager = cacheStorager; - this.oauthApi = new OauthApi(weixinAccount); - this.partyApi = new PartyApi(tokenManager); - this.userApi = new UserApi(tokenManager); - this.tagApi = new TagApi(tokenManager); - this.helperApi = new HelperApi(tokenManager); - this.agentApi = new AgentApi(tokenManager); - this.batchApi = new BatchApi(tokenManager); - this.notifyApi = new NotifyApi(tokenManager); - this.menuApi = new MenuApi(tokenManager); - this.mediaApi = new MediaApi(tokenManager); - this.chatApi = new ChatApi(tokenManager); - } - - /** - * token获取 - * - * @return - */ - public TokenManager getTokenManager() { - return this.tokenManager; - } - - /** - * 获取oauth授权API - * - * @see com.foxinmy.weixin4j.qy.api.OauthApi - * @return - */ - public OauthApi getOauthApi() { - return oauthApi; - } - - /** - * 获取微信账号信息 - * - * @return - */ - public WeixinAccount getWeixinAccount() { - return weixinAccount; - } - - /** - * 获取JSSDK Ticket的tokenManager - * - * @param ticketType - * 票据类型 - * @return - */ - public TokenManager getTicketManager(TicketType ticketType) { - return new TokenManager(new WeixinTicketCreator(ticketType, this.tokenManager), cacheStorager); - } - - /** - * 发送消息提醒(需要管理员对应用有使用权限,对收件人touser、toparty、totag有查看权限,否则本次调用失败) - * - * 1) 发送人员列表存在错误的userid:执行发送,开发者需注意返回结果说明 - * 2)发送人员不在通讯录权限范围内:不执行发送任务,返回首个出错的userid - * 3)发送人员不在应用可见范围内:不执行发送任务,返回首个出错的userid - * - * - * @param message - * 消息对象 - * @return 如果对应用或收件人、部门、标签任何一个无权限,则本次发送失败;如果收件人、部门或标签不存在,发送仍然执行,但返回无效的部分 - * - * { "errcode": 0, "errmsg": "ok", "invaliduser": "UserID1", - * "invalidparty":"PartyID1", "invalidtag":"TagID1" } - * @throws WeixinException - * @see com.foxinmy.weixin4j.qy.api.NotifyApi - * @see - * 发送接口说明 - * @see - * 发送格式说明 - * @see com.foxinmy.weixin4j.tuple.Text - * @see com.foxinmy.weixin4j.tuple.Image - * @see com.foxinmy.weixin4j.tuple.Voice - * @see com.foxinmy.weixin4j.tuple.Video - * @see com.foxinmy.weixin4j.tuple.File - * @see com.foxinmy.weixin4j.tuple.News - * @see com.foxinmy.weixin4j.tuple.MpNews - * @see com.foxinmy.weixin4j.qy.model.IdParameter - */ - public IdParameter sendNotifyMessage(NotifyMessage message) throws WeixinException { - return notifyApi.sendNotifyMessage(message); - } - - /** - * 发送客服消息 - * - * @param message - * 消息对象 - * @return 发送结果 - * @see - * 客服接口说明 - * @see com.foxinmy.weixin4j.qy.api.NotifyApi - * @see com.foxinmy.weixin4j.tuple.Text - * @see com.foxinmy.weixin4j.tuple.Image - * @see com.foxinmy.weixin4j.tuple.Voice - * @see com.foxinmy.weixin4j.tuple.Video - * @see com.foxinmy.weixin4j.tuple.File - * @see com.foxinmy.weixin4j.qy.message.CustomeMessage - * @throws WeixinException - */ - public ApiResult sendCustomeMessage(CustomeMessage message) throws WeixinException { - 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); - } - - /** - * 自定义菜单(管理员须拥有应用的管理权限 并且应用必须设置在回调模式) - * - * @param agentid - * 应用ID - * - * @param buttons - * 菜单列表 - * @throws WeixinException - * @see com.foxinmy.weixin4j.qy.api.MenuApi - * @see - * 创建自定义菜单 - * @see com.foxinmy.weixin4j.model.Button - */ - public ApiResult createMenu(int agentid, List buttons) throws WeixinException { - return menuApi.createMenu(agentid, buttons); - } - - /** - * 查询菜单(管理员须拥有应用的管理权限 并且应用必须设置在回调模式。) - * - * @param agentid - * 应用ID - * @return 菜单集合 - * @throws WeixinException - * @see com.foxinmy.weixin4j.qy.api.MenuApi - * @see - * 查询菜单 - * @see com.foxinmy.weixin4j.model.Button - */ - public List getMenu(int agentid) throws WeixinException { - return menuApi.getMenu(agentid); - } - - /** - * 删除菜单(管理员须拥有应用的管理权限 并且应用必须设置在回调模式) - * - * @param agentid - * 应用ID - * @throws WeixinException - * @see com.foxinmy.weixin4j.qy.api.MenuApi - * @see - * 删除菜单 - * @return 处理结果 - */ - public ApiResult deleteMenu(int agentid) throws WeixinException { - return menuApi.deleteMenu(agentid); - } - - /** - * 上传图文消息内的图片:用于上传图片到企业号服务端,接口返回图片url,请注意,该url仅可用于图文消息的发送, - * 且每个企业每天最多只能上传100张图片。 - * - * @param is - * 图片数据 - * @param fileName - * 文件名 - * @see - * 上传图文消息内的图片 - * @return 图片url - * @see com.foxinmy.weixin4j.qy.api.MediaApi - * @throws WeixinException - */ - public String uploadImage(InputStream is, String fileName) throws WeixinException { - return mediaApi.uploadImage(is, fileName); - } - - /** - * 上传媒体文件 - * - * 正常情况下返回{"type":"TYPE","media_id":"MEDIA_ID","created_at":123456789}, - * 否则抛出异常. - * - * - * @param agentid - * 企业应用ID(大于0时视为上传永久媒体文件) - * @param is - * 媒体数据流 - * @param fileName - * 文件名 - * @return 上传到微信服务器返回的媒体标识 - * @see com.foxinmy.weixin4j.qy.api.MediaApi - * @see com.foxinmy.weixin4j.model.media.MediaUploadResult - * @see - * 上传临时素材文件说明 - * @see - * 上传永久素材文件说明 - * @throws WeixinException - */ - public MediaUploadResult uploadMedia(int agentid, InputStream is, String fileName) throws WeixinException { - return mediaApi.uploadMedia(agentid, is, fileName); - } - - /** - * 下载媒体文件 - * - * @param agentid - * 企业应用Id(大于0时视为获取永久媒体文件) - * @param mediaId - * 媒体ID - * @return 媒体下载结果 - * @see com.foxinmy.weixin4j.model.media.MediaDownloadResult - * @see com.foxinmy.weixin4j.qy.api.MediaApi - * @see - * 获取临时媒体说明 - * @see - * 获取永久媒体说明 - * @throws WeixinException - */ - public MediaDownloadResult downloadMedia(int agentid, String mediaId) throws WeixinException { - return mediaApi.downloadMedia(agentid, mediaId); - } - - /** - * 上传永久图文素材 - * - * 、新增的永久素材也可以在公众平台官网素材管理模块中看到,永久素材的数量是有上限的,请谨慎新增。图文消息素材和图片素材的上限为5000, - * 其他类型为1000 - * - * - * @param agentid - * 企业应用的id - * @param articles - * 图文列表 - * @return 上传到微信服务器返回的媒体标识 - * @throws WeixinException - * @see com.foxinmy.weixin4j.qy.api.MediaApi - * @see - * 上传永久媒体素材 - * @see com.foxinmy.weixin4j.tuple.MpArticle - */ - public String uploadMaterialArticle(int agentid, List articles) throws WeixinException { - return mediaApi.uploadMaterialArticle(agentid, articles); - } - - /** - * 删除永久媒体素材 - * - * @param agentid - * 企业应用ID - * @param mediaId - * 媒体素材的media_id - * @return 处理结果 - * @throws WeixinException - * @see com.foxinmy.weixin4j.qy.api.MediaApi - * @see - * 删除永久媒体素材 - */ - public ApiResult deleteMaterialMedia(int agentid, String mediaId) throws WeixinException { - return mediaApi.deleteMaterialMedia(agentid, mediaId); - } - - /** - * 下载永久图文素材 - * - * @param agentid - * 企业应用ID - * @param mediaId - * 媒体素材的media_id - * @return 图文列表 - * @throws WeixinException - * @see {@link #downloadMedia(int, String)} - * @see com.foxinmy.weixin4j.qy.api.MediaApi - * @see com.foxinmy.weixin4j.tuple.MpArticle - */ - public List downloadArticle(int agentid, String mediaId) throws WeixinException { - return mediaApi.downloadArticle(agentid, mediaId); - } - - /** - * 修改永久图文素材 - * - * @param agentid - * 企业应用的id - * @param mediaId - * 上传后的media_id - * @param articles - * 图文列表 - * @return 操作结果 - * @throws WeixinException - * @see com.foxinmy.weixin4j.qy.api.MediaApi - * @see - * 修改永久媒体素材 - * @see com.foxinmy.weixin4j.tuple.MpArticle - */ - public String updateMaterialArticle(int agentid, String mediaId, List articles) throws WeixinException { - return mediaApi.updateMaterialArticle(agentid, mediaId, articles); - } - - /** - * 获取永久媒体素材的总数 - * - * @param agentid - * 企业应用id - * @return 总数对象 - * @throws WeixinException - * @see com.foxinmy.weixin4j.qy.api.MediaApi - * @see com.foxinmy.weixin4j.model.media.MediaCounter - * @see - * 获取素材总数 - */ - public MediaCounter countMaterialMedia(int agentid) throws WeixinException { - return mediaApi.countMaterialMedia(agentid); - } - - /** - * 获取媒体素材记录列表 - * - * @param agentid - * 企业应用ID - * @param mediaType - * 素材的类型,图片(image)、视频(video)、语音 (voice)、图文(news)、文件(file) - * @param pageable - * 分页数据 - * @return 媒体素材的记录对象 - * @throws WeixinException - * @see com.foxinmy.weixin4j.qy.api.MediaApi - * @see com.foxinmy.weixin4j.model.media.MediaRecord - * @see com.foxinmy.weixin4j.type.MediaType - * @see com.foxinmy.weixin4j.model.media.MediaItem - * @see com.foxinmy.weixin4j.model.paging.Pageable - * @see com.foxinmy.weixin4j.model.paging.Pagedata - * @see - * 获取素材列表 - */ - public MediaRecord listMaterialMedia(int agentid, MediaType mediaType, Pageable pageable) throws WeixinException { - return mediaApi.listMaterialMedia(agentid, mediaType, pageable); - } - - /** - * 获取全部的媒体素材 - * - * @param agentid - * 企业应用id - * @param mediaType - * 媒体类型 - * @return 素材列表 - * @see com.foxinmy.weixin4j.qy.api.MediaApi - * @see {@link #listMaterialMedia(int,MediaType, Pageable)} - * @throws WeixinException - */ - public List listAllMaterialMedia(int agentid, MediaType mediaType) throws WeixinException { - return mediaApi.listAllMaterialMedia(agentid, mediaType); - } - - /** - * 创建部门(根部门的parentid为1) - * - * @param party - * 部门对象 - * @see com.foxinmy.weixin4j.qy.model.Party - * @see - * 创建部门说明 - * @see com.foxinmy.weixin4j.qy.api.PartyApi - * @return 部门ID - * @throws WeixinException - */ - public int createParty(Party party) throws WeixinException { - return partyApi.createParty(party); - } - - /** - * 更新部门(如果非必须的字段未指定 则不更新该字段之前的设置值) - * - * @param party - * 部门对象 - * @see com.foxinmy.weixin4j.qy.model.Party - * @see - * 更新部门说明 - * @see com.foxinmy.weixin4j.qy.api.PartyApi - * @return 处理结果 - * @throws WeixinException - */ - public ApiResult updateParty(Party party) throws WeixinException { - return partyApi.updateParty(party); - } - - /** - * 查询部门列表(以部门的order字段从小到大排列) - * - * @param partyId - * 部门ID。获取指定部门ID下的子部门 传入0表示获取全部子部门 - * @see com.foxinmy.weixin4j.qy.model.Party - * @see - * 获取部门列表 - * @see com.foxinmy.weixin4j.qy.api.PartyApi - * @return 部门列表 - * @throws WeixinException - */ - public List listParty(int partyId) throws WeixinException { - return partyApi.listParty(partyId); - } - - /** - * 删除部门(不能删除根部门;不能删除含有子部门、成员的部门) - * - * @param partyId - * 部门ID - * @see - * 删除部门说明 - * @see com.foxinmy.weixin4j.qy.api.PartyApi - * @return 处理结果 - * @throws WeixinException - */ - public ApiResult deleteParty(int partyId) throws WeixinException { - return partyApi.deleteParty(partyId); - } - - /** - * 批量上传部门 - * - * @param parties - * 部门列表 - * @see com.foxinmy.weixin4j.qy.api.MediaApi - * @see com.foxinmy.weixin4j.qy.api.BatchApi - * @see {@link #batchReplaceParty(String,Callback)} - * @see - * 批量任务 - * @return 上传后的mediaId - * @throws WeixinException - */ - public String batchUploadParties(List parties) throws WeixinException { - return mediaApi.batchUploadParties(parties); - } - - /** - * 创建成员 - * - * @param user - * 成员对象 - * @see com.foxinmy.weixin4j.qy.model.User - * @see - * 创建成员说明 - * @see com.foxinmy.weixin4j.qy.api.UserApi - * @return 处理结果 - * @throws WeixinException - */ - public ApiResult createUser(User user) throws WeixinException { - return userApi.createUser(user); - } - - /** - * 创建成员 - * - * @param user - * 成员对象 - * @param avatar - * 头像文件 可为空 - * @see com.foxinmy.weixin4j.qy.model.User - * @see - * 创建成员说明 - * @see com.foxinmy.weixin4j.qy.api.UserApi - * @return 处理结果 - * @throws WeixinException - */ - public ApiResult createUser(User user, InputStream avatar) throws WeixinException { - return userApi.createUser(user, avatar); - } - - /** - * 更新用户(如果非必须的字段未指定 则不更新该字段之前的设置值) - * - * @param user - * 成员对象 - * @see com.foxinmy.weixin4j.qy.model.User - * @see - * 更新成员说明 - * @see com.foxinmy.weixin4j.qy.api.UserApi - * @return 处理结果 - * @throws WeixinException - */ - public ApiResult updateUser(User user) throws WeixinException { - return userApi.updateUser(user); - } - - /** - * 更新用户(如果非必须的字段未指定 则不更新该字段之前的设置值) - * - * @param user - * 成员对象 - * @param avatar - * 头像文件 - * @see com.foxinmy.weixin4j.qy.model.User - * @see - * 更新成员说明 - * @see com.foxinmy.weixin4j.qy.api.UserApi - * @return 处理结果 - * @throws WeixinException - */ - public ApiResult updateUser(User user, InputStream avatar) throws WeixinException { - return userApi.updateUser(user, avatar); - } - - /** - * 获取成员信息 - * - * @param userid - * 成员唯一ID - * @see com.foxinmy.weixin4j.qy.model.User - * @see - * 获取成员说明 - * @see com.foxinmy.weixin4j.qy.api.UserApi - * @return 成员对象 - * @throws WeixinException - */ - public User getUser(String userid) throws WeixinException { - return userApi.getUser(userid); - } - - /** - * code获取userid(管理员须拥有agent的使用权限;agentid必须和跳转链接时所在的企业应用ID相同。) - * - * @param code - * 通过员工授权获取到的code,每次员工授权带上的code将不一样,code只能使用一次,5分钟未被使用自动过期 - * @see com.foxinmy.weixin4j.qy.model.User - * @see com.foxinmy.weixin4j.qy.api.UserApi - * @return 成员对象 - * @see {@link #getUser(String)} - * @see {@link #getUserIdByCode(String)} - * @see - * 企业获取code - * @see - * 根据code获取成员信息 - * @throws WeixinException - */ - public User getUserByCode(String code) throws WeixinException { - return userApi.getUserByCode(code); - } - - /** - * 获取企业号管理员登录信息 - * - * @param authCode - * oauth2.0授权企业号管理员登录产生的code - * @return 登陆信息 - * @see - * 授权获取企业号管理员登录信息 - * @see com.foxinmy.weixin4j.qy.model.OUserInfo - * @throws WeixinException - */ - public OUserInfo getOUserInfoByCode(String authCode) throws WeixinException { - return userApi.getOUserInfoByCode(authCode); - } - - /** - * 根据code获取成员ID信息 - * - * @param code - * 通过员工授权获取到的code,每次员工授权带上的code将不一样,code只能使用一次,5分钟未被使用自动过期 - * @return 两个元素的数组 第一个元素为userId或者openId - * 第二个元素为deviceId - * @see com.foxinmy.weixin4j.qy.api.UserApi - * @see - * oauth授权获取用户信息 - * @throws WeixinException - */ - public String[] getUserIdByCode(String code) throws WeixinException { - return userApi.getUserIdByCode(code); - } - - /** - * 获取部门成员 - * - * @param partyId - * 部门ID - * @param fetchChild - * 是否递归获取子部门下面的成员 - * @param userStatus - * 成员状态 status可叠加 未填写则默认为未关注(4) - * @param findDetail - * 是否获取详细信息 - * @see com.foxinmy.weixin4j.qy.model.User - * @see - * 获取部门成员说明 - * @see com.foxinmy.weixin4j.qy.api.UserApi - * @return 成员列表 - * @throws WeixinException - */ - public List listUser(int partyId, boolean fetchChild, UserStatus userStatus, boolean findDetail) - throws WeixinException { - return userApi.listUser(partyId, fetchChild, userStatus, findDetail); - } - - /** - * 获取权限范围内的所有成员列表 - * - * @param userStatus - * 成员状态 未填写则默认为全部状态下的成员 - * @return 成员列表 - * @see com.foxinmy.weixin4j.qy.api.UserApi - * @see {@link #listUser(int, boolean, UserStatus,boolean)} - * @see {@link PartyApi#listParty(int)} - * @throws WeixinException - */ - public List listAllUser(UserStatus userStatus) throws WeixinException { - return userApi.listAllUser(userStatus); - } - - /** - * 获取部门下所有状态成员(不进行递归) - * - * @param partyId - * 部门ID - * @see {@link #listUser(int, boolean, UserStatus, boolean)} - * @see com.foxinmy.weixin4j.qy.api.UserApi - * @return 成员列表 - * @throws WeixinException - */ - public List listUser(int partyId) throws WeixinException { - return userApi.listUser(partyId); - } - - /** - * 删除成员 - * - * @param userid - * 成员ID - * @see - * 删除成员说明 - * @see com.foxinmy.weixin4j.qy.api.UserApi - * @return 处理结果 - * @throws WeixinException - */ - public ApiResult deleteUser(String userid) throws WeixinException { - return userApi.deleteUser(userid); - } - - /** - * 批量删除成员 - * - * @param userIds - * 成员列表 - * @see 批量删除成员说明 userIds) throws WeixinException { - return userApi.batchDeleteUser(userIds); - } - - /** - * 邀请成员关注(管理员须拥有该成员的查看权限) - * - * @param userId - * 成员ID - * @param tips - * 推送到微信上的提示语(只有认证号可以使用)。当使用微信推送时,该字段默认为“请关注XXX企业号”,邮件邀请时,该字段无效。 - * @see com.foxinmy.weixin4j.qy.api.UserApi - * @return 调用结果 - * @see - * 邀请成员关注说明 - * @throws WeixinException - */ - public InviteType inviteUser(String userId, String tips) throws WeixinException { - return userApi.inviteUser(userId, tips); - } - - /** - * 开启二次验证成功时调用(管理员须拥有userid对应员工的管理权限) - * - * @param userid - * 成员ID - * @return 调用结果 - * @see com.foxinmy.weixin4j.qy.api.UserApi - * @see - * 二次验证说明 - * @throws WeixinException - */ - public ApiResult userAuthsucc(String userId) throws WeixinException { - return userApi.authsucc(userId); - } - - /** - * 创建标签(创建的标签属于管理组;默认为未加锁状态) - * - * @param tag - * 标签对象; - * 标签名称,长度为1~64个字节,标签名不可与其他标签重名; - * 标签id,整型, 指定此参数时新增的标签会生成对应的标签id,不指定时则以目前最大的id自增。 - * @see - * 创建标签说明 - * @see com.foxinmy.weixin4j.qy.api.TagApi - * @return 标签ID - * @throws WeixinException - */ - public int createTag(Tag tag) throws WeixinException { - return tagApi.createTag(tag); - } - - /** - * 更新标签(管理组必须是指定标签的创建者) - * - * @param tag - * 标签信息 - * @see 更新标签说明 - * @see com.foxinmy.weixin4j.qy.model.Tag - * @see com.foxinmy.weixin4j.qy.api.TagApi - * @return 处理结果 - * @throws WeixinException - */ - public ApiResult updateTag(Tag tag) throws WeixinException { - return tagApi.updateTag(tag); - } - - /** - * 删除标签(管理组必须是指定标签的创建者 并且标签的成员列表为空) - * - * @param tagId - * 标签ID - * @return 处理结果 - * @see - * 删除标签说明 - * @see com.foxinmy.weixin4j.qy.api.TagApi - * @throws WeixinException - */ - public ApiResult deleteTag(int tagId) throws WeixinException { - return tagApi.deleteTag(tagId); - } - - /** - * 获取标签列表 - * - * @see - * 获取标签列表说明 - * @see com.foxinmy.weixin4j.qy.model.Tag - * @see com.foxinmy.weixin4j.qy.api.TagApi - * @return 标签列表 - * @throws WeixinException - */ - public List listTag() throws WeixinException { - return tagApi.listTag(); - } - - /** - * 获取标签成员(管理组须拥有“获取标签成员”的接口权限,标签须对管理组可见;返回列表仅包含管理组管辖范围的成员) - * - * @param tagId - * 标签ID - * @see com.foxinmy.weixin4j.qy.model.User - * @see - * 获取标签成员说明 - * @see com.foxinmy.weixin4j.qy.api.TagApi - * @return 成员列表Contacts#getUsers和部门列表 - * Contacts#getPartyIds - * @throws WeixinException - */ - public Contacts getTagUsers(int tagId) throws WeixinException { - return tagApi.getTagUsers(tagId); - } - - /** - * 新增标签成员(标签对管理组可见且未加锁,成员属于管理组管辖范围) - * - * @param tagId - * 标签ID - * @param userIds - * 企业成员ID列表,注意:userlist、partylist不能同时为空 - * @param partyIds - * 企业部门ID列表,注意:userlist、partylist不能同时为空 - * @see - * 新增标签成员说明 - * @see com.foxinmy.weixin4j.qy.api.TagApi - * @see com.foxinmy.weixin4j.qy.model.IdParameter - * @return 非法的userIds和partyIds - * @throws WeixinException - */ - public IdParameter addTagUsers(int tagId, List userIds, List partyIds) throws WeixinException { - return tagApi.addTagUsers(tagId, userIds, partyIds); - } - - /** - * 删除标签成员(标签对管理组可见且未加锁,成员属于管理组管辖范围) - * - * @param tagId - * 标签ID - * @param userIds - * 企业成员ID列表,注意:userlist、partylist不能同时为空 - * @param partyIds - * 企业部门ID列表,注意:userlist、partylist不能同时为空 - * @see - * 删除标签成员说明 - * @see com.foxinmy.weixin4j.qy.api.TagApi - * @see com.foxinmy.weixin4j.qy.model.IdParameter - * @return 非法的userIds和partyIds - * @throws WeixinException - */ - public IdParameter deleteTagUsers(int tagId, List userIds, List partyIds) throws WeixinException { - return tagApi.deleteTagUsers(tagId, userIds, partyIds); - } - - /** - * 获取微信服务器IP地址 - * - * @return IP地址 - * @see com.foxinmy.weixin4j.qy.api.HelperApi - * @see - * 获取IP地址 - * @throws WeixinException - */ - public List getWechatServerIp() throws WeixinException { - return helperApi.getWechatServerIp(); - } - - /** - * 获取企业号某个应用的基本信息,包括头像、昵称、帐号类型、认证类型、可见范围等信息 - * - * @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 ApiResult setAgent(AgentSetter agentSet) throws WeixinException { - return agentApi.setAgent(agentSet); - } - - /** - * 获取应用概况列表 - * - * @see com.foxinmy.weixin4j.qy.model.AgentOverview - * @see com.foxinmy.weixin4j.qy.api.AgentApi - * @see - * 获取应用概况 - * @return 应用概况列表 - * @throws WeixinException - */ - public List listAgentOverview() throws WeixinException { - return agentApi.listAgentOverview(); - } - - /** - * 批量邀请成员关注 - * - * @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 - * 邀请成员关注 - * @throws WeixinException - */ - public String batchInviteUser(IdParameter parameter, Callback callback, String tips) throws WeixinException { - return batchApi.inviteUser(parameter, callback, tips); - } - - /** - * 批量更新成员,本接口以userid为主键,增量更新企业号通讯录成员。 - * - * 1.模板中的部门需填写部门ID,多个部门用分号分隔,部门ID必须为数字 - * 2.文件中存在、通讯录中也存在的成员,更新成员在文件中指定的字段值 - * 3.文件中存在、通讯录中不存在的成员,执行添加操作 - * 4.通讯录中存在、文件中不存在的成员,保持不变 - * - * - * @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 - * 批量更新成员 - * @throws WeixinException - */ - public String batchSyncUser(String mediaId, Callback callback) throws WeixinException { - return batchApi.syncUser(mediaId, callback); - } - - /** - * 批量覆盖成员,本接口以userid为主键,全量覆盖企业号通讯录成员,任务完成后企业号通讯录成员与提交的文件完全保持一致。 - * - * 1.模板中的部门需填写部门ID,多个部门用分号分隔,部门ID必须为数字 - * 2.文件中存在、通讯录中也存在的成员,完全以文件为准 - * 3.文件中存在、通讯录中不存在的成员,执行添加操作 - * 4.通讯录中存在、文件中不存在的成员,执行删除操作。出于安全考虑,如果需要删除的成员多于50人, - * 且多于现有人数的20%以上,系统将中止导入并返回相应的错误码 - * - * - * @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 - * 批量覆盖成员 - * @throws WeixinException - */ - public String batchReplaceUser(String mediaId, Callback callback) throws WeixinException { - return batchApi.replaceUser(mediaId, callback); - } - - /** - * 批量上传成员 - * - * @param users - * 成员列表 - * @see com.foxinmy.weixin4j.qy.api.MediaApi - * @see com.foxinmy.weixin4j.qy.api.BatchApi - * @see {@link #batchSyncUser(String,Callback)} - * @see {@link #batchReplaceUser(String,Callback)} - * @see - * 批量任务 - * @return 上传后的mediaId - * @throws WeixinException - */ - public String batchUploadUsers(List users) throws WeixinException { - return mediaApi.batchUploadUsers(users); - } - - /** - * 批量覆盖部门,本接口以partyid为键,全量覆盖企业号通讯录组织架构,任务完成后企业号通讯录组织架构与提交的文件完全保持一致。 - * - * 1.文件中存在、通讯录中也存在的部门,执行修改操作 - * 2.文件中存在、通讯录中不存在的部门,执行添加操作 - * 3.文件中不存在、通讯录中存在的部门,当部门为空时,执行删除操作 - * 4.CSV文件中,部门名称、部门ID、父部门ID为必填字段,部门ID必须为数字;排序为可选字段,置空或填0不修改排序 - * - * - * @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 - * 批量覆盖部门 - * @throws WeixinException - */ - public String batchReplaceParty(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 - * 获取异步任务执行结果 - * @throws WeixinException - */ - public BatchResult getBatchResult(String jobId) throws WeixinException { - return batchApi.getBatchResult(jobId); - } - - /** - * userid转换成openid:该接口使用场景为微信支付、微信红包和企业转账,企业号用户在使用微信支付的功能时, - * 需要自行将企业号的userid转成openid。 在使用微信红包功能时,需要将应用id和userid转成appid和openid才能使用。 - * - * @param userid - * 企业号内的成员id 必填 - * @param agentid - * 需要发送红包的应用ID,若只是使用微信支付和企业转账,则无需该参数 传入0或负数则忽略 - * @return 结果数组 第一个元素为对应的openid 第二个元素则为应用的appid(如果有) - * @throws WeixinException - * @see com.foxinmy.weixin4j.qy.api.UserApi - * @see - * userid转换成openid - */ - public String[] userid2openid(String userid, int agentid) throws WeixinException { - return userApi.userid2openid(userid, agentid); - } - - /** - * openid转换成userid:该接口主要应用于使用微信支付、微信红包和企业转账之后的结果查询, - * 开发者需要知道某个结果事件的openid对应企业号内成员的信息时,可以通过调用该接口进行转换查询。 - * - * @param openid - * 在使用微信支付、微信红包和企业转账之后,返回结果的openid - * @return 该openid在企业号中对应的成员userid - * @throws WeixinException - * @see com.foxinmy.weixin4j.qy.api.UserApi - * @see - * openid转换成userid - */ - public String openid2userid(String openid) throws WeixinException { - return userApi.openid2userid(openid); - } - - /** - * 创建会话 如果会话id为空,程序会自动生成一个唯一ID - * - * @param chatInfo - * 会话信息 - * @return 会话ID - * @see com.foxinmy.weixin4j.qy.api.ChatApi - * @see com.foxinmy.weixin4j.qy.model.ChatInfo - * @see - * 创建会话 - * @throws WeixinException - */ - public String createChat(ChatInfo chatInfo) throws WeixinException { - return chatApi.createChat(chatInfo); - } - - /** - * 获取会话 - * - * @param chatId - * 会话ID - * @return 会话信息 - * @see com.foxinmy.weixin4j.qy.api.ChatApi - * @see com.foxinmy.weixin4j.qy.model.ChatInfo - * @see - * 获取会话 - * @throws WeixinException - */ - public ChatInfo getChat(String chatId) throws WeixinException { - return chatApi.getChat(chatId); - } - - /** - * 更新会话 - * - * @param chatInfo - * 会话信息 至少保持会话ID不能为空 - * @param operator - * 操作人userid - * @param addUsers - * 会话新增成员列表 - * @param deleteUsers - * 会话退出成员列表 - * @return 处理结果 - * @see com.foxinmy.weixin4j.qy.api.ChatApi - * @see com.foxinmy.weixin4j.qy.model.ChatInfo - * @see - * 修改会话信息 - * @throws WeixinException - */ - public ApiResult updateChat(ChatInfo chatInfo, String operator, List addUsers, List deleteUsers) - throws WeixinException { - return chatApi.updateChat(chatInfo, operator, addUsers, deleteUsers); - } - - /** - * 退出会话 - * - * @param chatId - * 会话ID - * @param operator - * 操作人userid - * @return 处理结果 - * @see com.foxinmy.weixin4j.qy.api.ChatApi - * @see - * 退出会话 - * @throws WeixinException - */ - public ApiResult quitChat(String chatId, String operator) throws WeixinException { - return chatApi.quitChat(chatId, operator); - } - - /** - * 清除会话未读状态 - * - * @param targetId - * 会话值,为userid|chatid,分别表示:成员id|会话id - * @param owner - * 会话所有者的userid - * @param chatType - * 会话类型:single|group,分别表示:群聊|单聊 - * @return 处理结果 - * @see com.foxinmy.weixin4j.qy.api.ChatApi - * @see - * 清除会话未读状态 - * @throws WeixinException - */ - public ApiResult clearChatNotify(String targetId, String owner, ChatType chatType) throws WeixinException { - return chatApi.clearChatNotify(targetId, owner, chatType); - } - - /** - * 设置成员接收到的消息是否提醒。主要场景是用于对接企业im的在线状态,如成员处于在线状态时,可以设置该成员的消息免打扰。当成员离线时,关闭免打扰状态 - * ,对微信端进行提醒。 - * - * @param chatMutes - * 提醒参数 - * @see com.foxinmy.weixin4j.qy.api.ChatApi - * @see com.foxinmy.weixin4j.qy.model.ChatMute - * @see 设置成员新消息免打扰 - * @return 列表中不存在的成员,剩余合法成员会继续执行。 - * @throws WeixinException - */ - public List setChatMute(List chatMutes) throws WeixinException { - return chatApi.setChatMute(chatMutes); - } - - /** - * 发送会话消息 - * - * @param message - * 消息对象 - * @return 处理结果 - * @see com.foxinmy.weixin4j.qy.api.ChatApi - * @see com.foxinmy.weixin4j.qy.message.ChatMessage - * @see - * 发送消息 - * @throws WeixinException - */ - public ApiResult sendChatMessage(ChatMessage message) throws WeixinException { - return chatApi.sendChatMessage(message); - } - - public final static String VERSION = "1.7.7"; + /** + * 授权API + */ + private final OauthApi oauthApi; + /** + * 媒体素材API + */ + private final MediaApi mediaApi; + /** + * 菜单API + */ + private final MenuApi menuApi; + /** + * 消息服务API + */ + private final NotifyApi notifyApi; + /** + * 部门API + */ + private final PartyApi partyApi; + /** + * 成员API + */ + private final UserApi userApi; + /** + * 标签API + */ + private final TagApi tagApi; + /** + * 辅助API + */ + private final HelperApi helperApi; + /** + * 应用API + */ + private final AgentApi agentApi; + /** + * 批量操作API + */ + private final BatchApi batchApi; + /** + * 聊天服务API + */ + private final ChatApi chatApi; + /** + * token管理 + */ + private final TokenManager tokenManager; + /** + * 账号信息 + */ + private final WeixinAccount weixinAccount; + /** + * token存储 + */ + private final CacheStorager cacheStorager; + + /** + * 微信接口实现(使用weixin4j.properties配置的account账号信息, + * 使用FileCacheStorager文件方式缓存TOKEN) + */ + public WeixinProxy() { + this(new FileCacheStorager()); + } + + /** + * 微信接口实现(使用weixin4j.properties配置的account账号信息) + * + * @param cacheStorager + * token管理 + */ + public WeixinProxy(CacheStorager cacheStorager) { + this(Weixin4jConfigUtil.getWeixinAccount(), cacheStorager); + } + + /** + * 微信接口实现 + * + * @param weixinAccount + * 账号信息 + * @param cacheStorager + * token管理 + */ + public WeixinProxy(WeixinAccount weixinAccount, + CacheStorager cacheStorager) { + this(weixinAccount, new WeixinTokenCreator(weixinAccount.getId(), + weixinAccount.getSecret()), cacheStorager); + } + + /** + * 第三方套件(永久授权码机制) + * + * @param perTicketManager + * 第三方套件永久授权码 + * {@link com.foxinmy.weixin4j.qy.api.SuiteApi#getPerCodeManager(String)} + * @param suiteTokenManager + * 第三方套件凭证token + * {@link com.foxinmy.weixin4j.qy.api.SuiteApi#getTokenManager} + * @see com.foxinmy.weixin4j.qy.api.SuiteApi + * @see WeixinSuiteProxy#getWeixinProxy(String, String) + */ + public WeixinProxy(PerTicketManager perTicketManager, + TokenManager suiteTokenManager) { + this( + new WeixinAccount(perTicketManager.getThirdId(), + perTicketManager.getThirdSecret()), + new WeixinTokenSuiteCreator(perTicketManager, suiteTokenManager), + perTicketManager.getCacheStorager()); + } + + /** + * 微信接口实现 + * + * @param settings + * 配置信息 + * @param tokenManager + * token管理 + */ + private WeixinProxy(WeixinAccount weixinAccount, TokenCreator tokenCreator, + CacheStorager cacheStorager) { + if (weixinAccount == null) { + throw new IllegalArgumentException( + "weixinAccount must not be empty"); + } + if (tokenCreator == null) { + throw new IllegalArgumentException("tokenCreator must not be empty"); + } + if (cacheStorager == null) { + throw new IllegalArgumentException( + "cacheStorager must not be empty"); + } + this.tokenManager = new TokenManager(tokenCreator, cacheStorager); + this.weixinAccount = weixinAccount; + this.cacheStorager = cacheStorager; + this.oauthApi = new OauthApi(weixinAccount); + this.partyApi = new PartyApi(tokenManager); + this.userApi = new UserApi(tokenManager); + this.tagApi = new TagApi(tokenManager); + this.helperApi = new HelperApi(tokenManager); + this.agentApi = new AgentApi(tokenManager); + this.batchApi = new BatchApi(tokenManager); + this.notifyApi = new NotifyApi(tokenManager); + this.menuApi = new MenuApi(tokenManager); + this.mediaApi = new MediaApi(tokenManager); + this.chatApi = new ChatApi(tokenManager); + } + + /** + * token获取 + * + * @return + */ + public TokenManager getTokenManager() { + return this.tokenManager; + } + + /** + * 获取oauth授权API + * + * @see com.foxinmy.weixin4j.qy.api.OauthApi + * @return + */ + public OauthApi getOauthApi() { + return oauthApi; + } + + /** + * 获取微信账号信息 + * + * @return + */ + public WeixinAccount getWeixinAccount() { + return weixinAccount; + } + + /** + * 获取JSSDK Ticket的tokenManager + * + * @param ticketType + * 票据类型 + * @return + */ + public TokenManager getTicketManager(TicketType ticketType) { + return new TokenManager(new WeixinTicketCreator(ticketType, + this.tokenManager), cacheStorager); + } + + /** + * 发送消息提醒(需要管理员对应用有使用权限,对收件人touser、toparty、totag有查看权限,否则本次调用失败) + * + * 1) 发送人员列表存在错误的userid:执行发送,开发者需注意返回结果说明 + * 2)发送人员不在通讯录权限范围内:不执行发送任务,返回首个出错的userid + * 3)发送人员不在应用可见范围内:不执行发送任务,返回首个出错的userid + * + * + * @param message + * 消息对象 + * @return 如果对应用或收件人、部门、标签任何一个无权限,则本次发送失败;如果收件人、部门或标签不存在,发送仍然执行,但返回无效的部分 + * { "errcode": 0, "errmsg": "ok", "invaliduser": "UserID1", + * "invalidparty":"PartyID1", "invalidtag":"TagID1" } + * @throws WeixinException + * @see com.foxinmy.weixin4j.qy.api.NotifyApi + * @see 发送接口说明 + * @see com.foxinmy.weixin4j.tuple.Text + * @see com.foxinmy.weixin4j.tuple.Image + * @see com.foxinmy.weixin4j.tuple.Voice + * @see com.foxinmy.weixin4j.tuple.Video + * @see com.foxinmy.weixin4j.tuple.File + * @see com.foxinmy.weixin4j.tuple.News + * @see com.foxinmy.weixin4j.tuple.MpNews + * @see com.foxinmy.weixin4j.qy.model.IdParameter + */ + public IdParameter sendNotifyMessage(NotifyMessage message) + throws WeixinException { + return notifyApi.sendNotifyMessage(message); + } + + /** + * 发送客服消息 + * + * @param message + * 消息对象 + * @return 发送结果 + * @see + * 客服接口说明 + * @see com.foxinmy.weixin4j.qy.api.NotifyApi + * @see com.foxinmy.weixin4j.tuple.Text + * @see com.foxinmy.weixin4j.tuple.Image + * @see com.foxinmy.weixin4j.tuple.Voice + * @see com.foxinmy.weixin4j.tuple.Video + * @see com.foxinmy.weixin4j.tuple.File + * @see com.foxinmy.weixin4j.qy.message.CustomeMessage + * @throws WeixinException + */ + public ApiResult sendCustomeMessage(CustomeMessage message) + throws WeixinException { + 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); + } + + /** + * 自定义菜单(管理员须拥有应用的管理权限 并且应用必须设置在回调模式) + * + * @param agentid + * 应用ID + * + * @param buttons + * 菜单列表 + * @throws WeixinException + * @see com.foxinmy.weixin4j.qy.api.MenuApi + * @see 创建自定义菜单 + * @see com.foxinmy.weixin4j.model.Button + */ + public ApiResult createMenu(int agentid, List buttons) + throws WeixinException { + return menuApi.createMenu(agentid, buttons); + } + + /** + * 查询菜单(管理员须拥有应用的管理权限 并且应用必须设置在回调模式。) + * + * @param agentid + * 应用ID + * @return 菜单集合 + * @throws WeixinException + * @see com.foxinmy.weixin4j.qy.api.MenuApi + * @see 查询菜单 + * @see com.foxinmy.weixin4j.model.Button + */ + public List getMenu(int agentid) throws WeixinException { + return menuApi.getMenu(agentid); + } + + /** + * 删除菜单(管理员须拥有应用的管理权限 并且应用必须设置在回调模式) + * + * @param agentid + * 应用ID + * @throws WeixinException + * @see com.foxinmy.weixin4j.qy.api.MenuApi + * @see 删除菜单 + * @return 处理结果 + */ + public ApiResult deleteMenu(int agentid) throws WeixinException { + return menuApi.deleteMenu(agentid); + } + + /** + * 上传图文消息内的图片:用于上传图片到企业号服务端,接口返回图片url,请注意,该url仅可用于图文消息的发送, + * 且每个企业每天最多只能上传100张图片。 + * + * @param is + * 图片数据 + * @param fileName + * 文件名 + * @see + * 上传图文消息内的图片 + * @return 图片url + * @see com.foxinmy.weixin4j.qy.api.MediaApi + * @throws WeixinException + */ + public String uploadImage(InputStream is, String fileName) + throws WeixinException { + return mediaApi.uploadImage(is, fileName); + } + + /** + * 上传媒体文件 + * + * 正常情况下返回{"type":"TYPE","media_id":"MEDIA_ID","created_at":123456789}, + * 否则抛出异常. + * + * + * @param agentid + * 企业应用ID(大于0时视为上传永久媒体文件) + * @param is + * 媒体数据流 + * @param fileName + * 文件名 + * @return 上传到微信服务器返回的媒体标识 + * @see com.foxinmy.weixin4j.qy.api.MediaApi + * @see com.foxinmy.weixin4j.model.media.MediaUploadResult + * @see 上传临时素材文件说明 + * @see + * 上传永久素材文件说明 + * @throws WeixinException + */ + public MediaUploadResult uploadMedia(int agentid, InputStream is, + String fileName) throws WeixinException { + return mediaApi.uploadMedia(agentid, is, fileName); + } + + /** + * 下载媒体文件 + * + * @param agentid + * 企业应用Id(大于0时视为获取永久媒体文件) + * @param mediaId + * 媒体ID + * @return 媒体下载结果 + * @see com.foxinmy.weixin4j.model.media.MediaDownloadResult + * @see com.foxinmy.weixin4j.qy.api.MediaApi + * @see 获取临时媒体说明 + * @see + * 获取永久媒体说明 + * @throws WeixinException + */ + public MediaDownloadResult downloadMedia(int agentid, String mediaId) + throws WeixinException { + return mediaApi.downloadMedia(agentid, mediaId); + } + + /** + * 上传永久图文素材 + * + * 、新增的永久素材也可以在公众平台官网素材管理模块中看到,永久素材的数量是有上限的,请谨慎新增。图文消息素材和图片素材的上限为5000, + * 其他类型为1000 + * + * + * @param agentid + * 企业应用的id + * @param articles + * 图文列表 + * @return 上传到微信服务器返回的媒体标识 + * @throws WeixinException + * @see com.foxinmy.weixin4j.qy.api.MediaApi + * @see + * 上传永久媒体素材 + * @see com.foxinmy.weixin4j.tuple.MpArticle + */ + public String uploadMaterialArticle(int agentid, List articles) + throws WeixinException { + return mediaApi.uploadMaterialArticle(agentid, articles); + } + + /** + * 删除永久媒体素材 + * + * @param agentid + * 企业应用ID + * @param mediaId + * 媒体素材的media_id + * @return 处理结果 + * @throws WeixinException + * @see com.foxinmy.weixin4j.qy.api.MediaApi + * @see + * 删除永久媒体素材 + */ + public ApiResult deleteMaterialMedia(int agentid, String mediaId) + throws WeixinException { + return mediaApi.deleteMaterialMedia(agentid, mediaId); + } + + /** + * 下载永久图文素材 + * + * @param agentid + * 企业应用ID + * @param mediaId + * 媒体素材的media_id + * @return 图文列表 + * @throws WeixinException + * @see {@link #downloadMedia(int, String)} + * @see com.foxinmy.weixin4j.qy.api.MediaApi + * @see com.foxinmy.weixin4j.tuple.MpArticle + */ + public List downloadArticle(int agentid, String mediaId) + throws WeixinException { + return mediaApi.downloadArticle(agentid, mediaId); + } + + /** + * 修改永久图文素材 + * + * @param agentid + * 企业应用的id + * @param mediaId + * 上传后的media_id + * @param articles + * 图文列表 + * @return 操作结果 + * @throws WeixinException + * @see com.foxinmy.weixin4j.qy.api.MediaApi + * @see + * 修改永久媒体素材 + * @see com.foxinmy.weixin4j.tuple.MpArticle + */ + public String updateMaterialArticle(int agentid, String mediaId, + List articles) throws WeixinException { + return mediaApi.updateMaterialArticle(agentid, mediaId, articles); + } + + /** + * 获取永久媒体素材的总数 + * + * @param agentid + * 企业应用id + * @return 总数对象 + * @throws WeixinException + * @see com.foxinmy.weixin4j.qy.api.MediaApi + * @see com.foxinmy.weixin4j.model.media.MediaCounter + * @see + * 获取素材总数 + */ + public MediaCounter countMaterialMedia(int agentid) throws WeixinException { + return mediaApi.countMaterialMedia(agentid); + } + + /** + * 获取媒体素材记录列表 + * + * @param agentid + * 企业应用ID + * @param mediaType + * 素材的类型,图片(image)、视频(video)、语音 (voice)、图文(news)、文件(file) + * @param pageable + * 分页数据 + * @return 媒体素材的记录对象 + * @throws WeixinException + * @see com.foxinmy.weixin4j.qy.api.MediaApi + * @see com.foxinmy.weixin4j.model.media.MediaRecord + * @see com.foxinmy.weixin4j.type.MediaType + * @see com.foxinmy.weixin4j.model.media.MediaItem + * @see com.foxinmy.weixin4j.model.paging.Pageable + * @see com.foxinmy.weixin4j.model.paging.Pagedata + * @see + * 获取素材列表 + */ + public MediaRecord listMaterialMedia(int agentid, MediaType mediaType, + Pageable pageable) throws WeixinException { + return mediaApi.listMaterialMedia(agentid, mediaType, pageable); + } + + /** + * 获取全部的媒体素材 + * + * @param agentid + * 企业应用id + * @param mediaType + * 媒体类型 + * @return 素材列表 + * @see com.foxinmy.weixin4j.qy.api.MediaApi + * @see {@link #listMaterialMedia(int,MediaType, Pageable)} + * @throws WeixinException + */ + public List listAllMaterialMedia(int agentid, MediaType mediaType) + throws WeixinException { + return mediaApi.listAllMaterialMedia(agentid, mediaType); + } + + /** + * 创建部门(根部门的parentid为1) + * + * @param party + * 部门对象 + * @see com.foxinmy.weixin4j.qy.model.Party + * @see 创建部门说明 + * @see com.foxinmy.weixin4j.qy.api.PartyApi + * @return 部门ID + * @throws WeixinException + */ + public int createParty(Party party) throws WeixinException { + return partyApi.createParty(party); + } + + /** + * 更新部门(如果非必须的字段未指定 则不更新该字段之前的设置值) + * + * @param party + * 部门对象 + * @see com.foxinmy.weixin4j.qy.model.Party + * @see 更新部门说明 + * @see com.foxinmy.weixin4j.qy.api.PartyApi + * @return 处理结果 + * @throws WeixinException + */ + public ApiResult updateParty(Party party) throws WeixinException { + return partyApi.updateParty(party); + } + + /** + * 查询部门列表(以部门的order字段从小到大排列) + * + * @param partyId + * 部门ID。获取指定部门ID下的子部门 传入0表示获取全部子部门 + * @see com.foxinmy.weixin4j.qy.model.Party + * @see 获取部门列表 + * @see com.foxinmy.weixin4j.qy.api.PartyApi + * @return 部门列表 + * @throws WeixinException + */ + public List listParty(int partyId) throws WeixinException { + return partyApi.listParty(partyId); + } + + /** + * 删除部门(不能删除根部门;不能删除含有子部门、成员的部门) + * + * @param partyId + * 部门ID + * @see 删除部门说明 + * @see com.foxinmy.weixin4j.qy.api.PartyApi + * @return 处理结果 + * @throws WeixinException + */ + public ApiResult deleteParty(int partyId) throws WeixinException { + return partyApi.deleteParty(partyId); + } + + /** + * 批量上传部门 + * + * @param parties + * 部门列表 + * @see com.foxinmy.weixin4j.qy.api.MediaApi + * @see com.foxinmy.weixin4j.qy.api.BatchApi + * @see {@link #batchReplaceParty(String,Callback)} + * @see 批量任务 + * @return 上传后的mediaId + * @throws WeixinException + */ + public String batchUploadParties(List parties) + throws WeixinException { + return mediaApi.batchUploadParties(parties); + } + + /** + * 创建成员 + * + * @param user + * 成员对象 + * @see com.foxinmy.weixin4j.qy.model.User + * @see 创建成员说明 + * @see com.foxinmy.weixin4j.qy.api.UserApi + * @return 处理结果 + * @throws WeixinException + */ + public ApiResult createUser(User user) throws WeixinException { + return userApi.createUser(user); + } + + /** + * 创建成员 + * + * @param user + * 成员对象 + * @param avatar + * 头像文件 可为空 + * @see com.foxinmy.weixin4j.qy.model.User + * @see 创建成员说明 + * @see com.foxinmy.weixin4j.qy.api.UserApi + * @return 处理结果 + * @throws WeixinException + */ + public ApiResult createUser(User user, InputStream avatar) + throws WeixinException { + return userApi.createUser(user, avatar); + } + + /** + * 更新用户(如果非必须的字段未指定 则不更新该字段之前的设置值) + * + * @param user + * 成员对象 + * @see com.foxinmy.weixin4j.qy.model.User + * @see 更新成员说明 + * @see com.foxinmy.weixin4j.qy.api.UserApi + * @return 处理结果 + * @throws WeixinException + */ + public ApiResult updateUser(User user) throws WeixinException { + return userApi.updateUser(user); + } + + /** + * 更新用户(如果非必须的字段未指定 则不更新该字段之前的设置值) + * + * @param user + * 成员对象 + * @param avatar + * 头像文件 + * @see com.foxinmy.weixin4j.qy.model.User + * @see 更新成员说明 + * @see com.foxinmy.weixin4j.qy.api.UserApi + * @return 处理结果 + * @throws WeixinException + */ + public ApiResult updateUser(User user, InputStream avatar) + throws WeixinException { + return userApi.updateUser(user, avatar); + } + + /** + * 获取成员信息 + * + * @param userid + * 成员唯一ID + * @see com.foxinmy.weixin4j.qy.model.User + * @see 获取成员说明 + * @see com.foxinmy.weixin4j.qy.api.UserApi + * @return 成员对象 + * @throws WeixinException + */ + public User getUser(String userid) throws WeixinException { + return userApi.getUser(userid); + } + + /** + * code获取userid(管理员须拥有agent的使用权限;agentid必须和跳转链接时所在的企业应用ID相同。) + * + * @param code + * 通过员工授权获取到的code,每次员工授权带上的code将不一样,code只能使用一次,5分钟未被使用自动过期 + * @see com.foxinmy.weixin4j.qy.model.User + * @see com.foxinmy.weixin4j.qy.api.UserApi + * @return 成员对象 + * @see {@link #getUser(String)} + * @see {@link #getUserIdByCode(String)} + * @see + * 企业获取code + * @see + * 根据code获取成员信息 + * @throws WeixinException + */ + public User getUserByCode(String code) throws WeixinException { + return userApi.getUserByCode(code); + } + + /** + * 获取企业号管理员登录信息 + * + * @param authCode + * oauth2.0授权企业号管理员登录产生的code + * @return 登陆信息 + * @see + * 授权获取企业号管理员登录信息 + * @see com.foxinmy.weixin4j.qy.model.OUserInfo + * @throws WeixinException + */ + public OUserInfo getOUserInfoByCode(String authCode) throws WeixinException { + return userApi.getOUserInfoByCode(authCode); + } + + /** + * 根据code获取成员ID信息 + * + * @param code + * 通过员工授权获取到的code,每次员工授权带上的code将不一样,code只能使用一次,5分钟未被使用自动过期 + * @return 换取结果 + * @see com.foxinmy.weixin4j.qy.api.UserApi + * @see + * oauth授权获取用户信息 + * @throws WeixinException + */ + public JSONObject getUserIdByCode(String code) throws WeixinException { + return userApi.getUserIdByCode(code); + } + + /** + * 获取部门成员 + * + * @param partyId + * 部门ID + * @param fetchChild + * 是否递归获取子部门下面的成员 + * @param userStatus + * 成员状态 status可叠加 未填写则默认为未关注(4) + * @param findDetail + * 是否获取详细信息 + * @see com.foxinmy.weixin4j.qy.model.User + * @see 获取部门成员说明 + * @see com.foxinmy.weixin4j.qy.api.UserApi + * @return 成员列表 + * @throws WeixinException + */ + public List listUser(int partyId, boolean fetchChild, + UserStatus userStatus, boolean findDetail) throws WeixinException { + return userApi.listUser(partyId, fetchChild, userStatus, findDetail); + } + + /** + * 获取权限范围内的所有成员列表 + * + * @param userStatus + * 成员状态 未填写则默认为全部状态下的成员 + * @return 成员列表 + * @see com.foxinmy.weixin4j.qy.api.UserApi + * @see {@link #listUser(int, boolean, UserStatus,boolean)} + * @see {@link PartyApi#listParty(int)} + * @throws WeixinException + */ + public List listAllUser(UserStatus userStatus) throws WeixinException { + return userApi.listAllUser(userStatus); + } + + /** + * 获取部门下所有状态成员(不进行递归) + * + * @param partyId + * 部门ID + * @see {@link #listUser(int, boolean, UserStatus, boolean)} + * @see com.foxinmy.weixin4j.qy.api.UserApi + * @return 成员列表 + * @throws WeixinException + */ + public List listUser(int partyId) throws WeixinException { + return userApi.listUser(partyId); + } + + /** + * 删除成员 + * + * @param userid + * 成员ID + * @see 删除成员说明 + * @see com.foxinmy.weixin4j.qy.api.UserApi + * @return 处理结果 + * @throws WeixinException + */ + public ApiResult deleteUser(String userid) throws WeixinException { + return userApi.deleteUser(userid); + } + + /** + * 批量删除成员 + * + * @param userIds + * 成员列表 + * @see 批量删除成员说明 userIds) + throws WeixinException { + return userApi.batchDeleteUser(userIds); + } + + /** + * 邀请成员关注(管理员须拥有该成员的查看权限) + * + * @param userId + * 成员ID + * @param tips + * 推送到微信上的提示语(只有认证号可以使用)。当使用微信推送时,该字段默认为“请关注XXX企业号”,邮件邀请时,该字段无效。 + * @see com.foxinmy.weixin4j.qy.api.UserApi + * @return 调用结果 + * @see + * 邀请成员关注说明 + * @throws WeixinException + */ + public InviteType inviteUser(String userId, String tips) + throws WeixinException { + return userApi.inviteUser(userId, tips); + } + + /** + * 开启二次验证成功时调用(管理员须拥有userid对应员工的管理权限) + * + * @param userid + * 成员ID + * @return 调用结果 + * @see com.foxinmy.weixin4j.qy.api.UserApi + * @see 二次验证说明 + * @throws WeixinException + */ + public ApiResult userAuthsucc(String userId) throws WeixinException { + return userApi.authsucc(userId); + } + + /** + * 创建标签(创建的标签属于管理组;默认为未加锁状态) + * + * @param tag + * 标签对象; 标签名称,长度为1~64个字节,标签名不可与其他标签重名; 标签id,整型, + * 指定此参数时新增的标签会生成对应的标签id,不指定时则以目前最大的id自增。 + * @see 创建标签说明 + * @see com.foxinmy.weixin4j.qy.api.TagApi + * @return 标签ID + * @throws WeixinException + */ + public int createTag(Tag tag) throws WeixinException { + return tagApi.createTag(tag); + } + + /** + * 更新标签(管理组必须是指定标签的创建者) + * + * @param tag + * 标签信息 + * @see 更新标签说明 + * @see com.foxinmy.weixin4j.qy.model.Tag + * @see com.foxinmy.weixin4j.qy.api.TagApi + * @return 处理结果 + * @throws WeixinException + */ + public ApiResult updateTag(Tag tag) throws WeixinException { + return tagApi.updateTag(tag); + } + + /** + * 删除标签(管理组必须是指定标签的创建者 并且标签的成员列表为空) + * + * @param tagId + * 标签ID + * @return 处理结果 + * @see 删除标签说明 + * @see com.foxinmy.weixin4j.qy.api.TagApi + * @throws WeixinException + */ + public ApiResult deleteTag(int tagId) throws WeixinException { + return tagApi.deleteTag(tagId); + } + + /** + * 获取标签列表 + * + * @see 获取标签列表说明 + * @see com.foxinmy.weixin4j.qy.model.Tag + * @see com.foxinmy.weixin4j.qy.api.TagApi + * @return 标签列表 + * @throws WeixinException + */ + public List listTag() throws WeixinException { + return tagApi.listTag(); + } + + /** + * 获取标签成员(管理组须拥有“获取标签成员”的接口权限,标签须对管理组可见;返回列表仅包含管理组管辖范围的成员) + * + * @param tagId + * 标签ID + * @see com.foxinmy.weixin4j.qy.model.User + * @see 获取标签成员说明 + * @see com.foxinmy.weixin4j.qy.api.TagApi + * @return 成员列表Contacts#getUsers和部门列表 Contacts#getPartyIds + * @throws WeixinException + */ + public Contacts getTagUsers(int tagId) throws WeixinException { + return tagApi.getTagUsers(tagId); + } + + /** + * 新增标签成员(标签对管理组可见且未加锁,成员属于管理组管辖范围) + * + * @param tagId + * 标签ID + * @param userIds + * 企业成员ID列表,注意:userlist、partylist不能同时为空 + * @param partyIds + * 企业部门ID列表,注意:userlist、partylist不能同时为空 + * @see 新增标签成员说明 + * @see com.foxinmy.weixin4j.qy.api.TagApi + * @see com.foxinmy.weixin4j.qy.model.IdParameter + * @return 非法的userIds和partyIds + * @throws WeixinException + */ + public IdParameter addTagUsers(int tagId, List userIds, + List partyIds) throws WeixinException { + return tagApi.addTagUsers(tagId, userIds, partyIds); + } + + /** + * 删除标签成员(标签对管理组可见且未加锁,成员属于管理组管辖范围) + * + * @param tagId + * 标签ID + * @param userIds + * 企业成员ID列表,注意:userlist、partylist不能同时为空 + * @param partyIds + * 企业部门ID列表,注意:userlist、partylist不能同时为空 + * @see 删除标签成员说明 + * @see com.foxinmy.weixin4j.qy.api.TagApi + * @see com.foxinmy.weixin4j.qy.model.IdParameter + * @return 非法的userIds和partyIds + * @throws WeixinException + */ + public IdParameter deleteTagUsers(int tagId, List userIds, + List partyIds) throws WeixinException { + return tagApi.deleteTagUsers(tagId, userIds, partyIds); + } + + /** + * 获取微信服务器IP地址 + * + * @return IP地址 + * @see com.foxinmy.weixin4j.qy.api.HelperApi + * @see + * 获取IP地址 + * @throws WeixinException + */ + public List getWechatServerIp() throws WeixinException { + return helperApi.getWechatServerIp(); + } + + /** + * 获取企业号某个应用的基本信息,包括头像、昵称、帐号类型、认证类型、可见范围等信息 + * + * @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 ApiResult setAgent(AgentSetter agentSet) throws WeixinException { + return agentApi.setAgent(agentSet); + } + + /** + * 获取应用概况列表 + * + * @see com.foxinmy.weixin4j.qy.model.AgentOverview + * @see com.foxinmy.weixin4j.qy.api.AgentApi + * @see 获取应用概况 + * @return 应用概况列表 + * @throws WeixinException + */ + public List listAgentOverview() throws WeixinException { + return agentApi.listAgentOverview(); + } + + /** + * 批量邀请成员关注 + * + * @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 + * 邀请成员关注 + * @throws WeixinException + */ + public String batchInviteUser(IdParameter parameter, Callback callback, + String tips) throws WeixinException { + return batchApi.inviteUser(parameter, callback, tips); + } + + /** + * 批量更新成员,本接口以userid为主键,增量更新企业号通讯录成员。 + * + * 1.模板中的部门需填写部门ID,多个部门用分号分隔,部门ID必须为数字 + * 2.文件中存在、通讯录中也存在的成员,更新成员在文件中指定的字段值 3.文件中存在、通讯录中不存在的成员,执行添加操作 + * 4.通讯录中存在、文件中不存在的成员,保持不变 + * + * + * @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 + * 批量更新成员 + * @throws WeixinException + */ + public String batchSyncUser(String mediaId, Callback callback) + throws WeixinException { + return batchApi.syncUser(mediaId, callback); + } + + /** + * 批量覆盖成员,本接口以userid为主键,全量覆盖企业号通讯录成员,任务完成后企业号通讯录成员与提交的文件完全保持一致。 + * + * 1.模板中的部门需填写部门ID,多个部门用分号分隔,部门ID必须为数字 2.文件中存在、通讯录中也存在的成员,完全以文件为准 + * 3.文件中存在、通讯录中不存在的成员,执行添加操作 + * 4.通讯录中存在、文件中不存在的成员,执行删除操作。出于安全考虑,如果需要删除的成员多于50人, + * 且多于现有人数的20%以上,系统将中止导入并返回相应的错误码 + * + * + * @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 + * 批量覆盖成员 + * @throws WeixinException + */ + public String batchReplaceUser(String mediaId, Callback callback) + throws WeixinException { + return batchApi.replaceUser(mediaId, callback); + } + + /** + * 批量上传成员 + * + * @param users + * 成员列表 + * @see com.foxinmy.weixin4j.qy.api.MediaApi + * @see com.foxinmy.weixin4j.qy.api.BatchApi + * @see {@link #batchSyncUser(String,Callback)} + * @see {@link #batchReplaceUser(String,Callback)} + * @see 批量任务 + * @return 上传后的mediaId + * @throws WeixinException + */ + public String batchUploadUsers(List users) throws WeixinException { + return mediaApi.batchUploadUsers(users); + } + + /** + * 批量覆盖部门,本接口以partyid为键,全量覆盖企业号通讯录组织架构,任务完成后企业号通讯录组织架构与提交的文件完全保持一致。 + * + * 1.文件中存在、通讯录中也存在的部门,执行修改操作 2.文件中存在、通讯录中不存在的部门,执行添加操作 + * 3.文件中不存在、通讯录中存在的部门,当部门为空时,执行删除操作 + * 4.CSV文件中,部门名称、部门ID、父部门ID为必填字段,部门ID必须为数字;排序为可选字段,置空或填0不修改排序 + * + * + * @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 + * 批量覆盖部门 + * @throws WeixinException + */ + public String batchReplaceParty(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 + * 获取异步任务执行结果 + * @throws WeixinException + */ + public BatchResult getBatchResult(String jobId) throws WeixinException { + return batchApi.getBatchResult(jobId); + } + + /** + * userid转换成openid:该接口使用场景为微信支付、微信红包和企业转账,企业号用户在使用微信支付的功能时, + * 需要自行将企业号的userid转成openid。 在使用微信红包功能时,需要将应用id和userid转成appid和openid才能使用。 + * + * @param userid + * 企业号内的成员id 必填 + * @param agentid + * 需要发送红包的应用ID,若只是使用微信支付和企业转账,则无需该参数 传入0或负数则忽略 + * @return 结果数组 第一个元素为对应的openid 第二个元素则为应用的appid(如果有) + * @throws WeixinException + * @see com.foxinmy.weixin4j.qy.api.UserApi + * @see + * userid与openid互换 + */ + public String[] userid2openid(String userid, int agentid) + throws WeixinException { + return userApi.userid2openid(userid, agentid); + } + + /** + * openid转换成userid:该接口主要应用于使用微信支付、微信红包和企业转账之后的结果查询, + * 开发者需要知道某个结果事件的openid对应企业号内成员的信息时,可以通过调用该接口进行转换查询。 + * + * @param openid + * 在使用微信支付、微信红包和企业转账之后,返回结果的openid + * @return 该openid在企业号中对应的成员userid + * @throws WeixinException + * @see com.foxinmy.weixin4j.qy.api.UserApi + * @see + * userid与openid互换 + */ + public String openid2userid(String openid) throws WeixinException { + return userApi.openid2userid(openid); + } + + /** + * 创建会话 如果会话id为空,程序会自动生成一个唯一ID + * + * @param chatInfo + * 会话信息 + * @return 会话ID + * @see com.foxinmy.weixin4j.qy.api.ChatApi + * @see com.foxinmy.weixin4j.qy.model.ChatInfo + * @see + * 创建会话 + * @throws WeixinException + */ + public String createChat(ChatInfo chatInfo) throws WeixinException { + return chatApi.createChat(chatInfo); + } + + /** + * 获取会话 + * + * @param chatId + * 会话ID + * @return 会话信息 + * @see com.foxinmy.weixin4j.qy.api.ChatApi + * @see com.foxinmy.weixin4j.qy.model.ChatInfo + * @see + * 获取会话 + * @throws WeixinException + */ + public ChatInfo getChat(String chatId) throws WeixinException { + return chatApi.getChat(chatId); + } + + /** + * 更新会话 + * + * @param chatInfo + * 会话信息 至少保持会话ID不能为空 + * @param operator + * 操作人userid + * @param addUsers + * 会话新增成员列表 + * @param deleteUsers + * 会话退出成员列表 + * @return 处理结果 + * @see com.foxinmy.weixin4j.qy.api.ChatApi + * @see com.foxinmy.weixin4j.qy.model.ChatInfo + * @see + * 修改会话信息 + * @throws WeixinException + */ + public ApiResult updateChat(ChatInfo chatInfo, String operator, + List addUsers, List deleteUsers) + throws WeixinException { + return chatApi.updateChat(chatInfo, operator, addUsers, deleteUsers); + } + + /** + * 退出会话 + * + * @param chatId + * 会话ID + * @param operator + * 操作人userid + * @return 处理结果 + * @see com.foxinmy.weixin4j.qy.api.ChatApi + * @see + * 退出会话 + * @throws WeixinException + */ + public ApiResult quitChat(String chatId, String operator) + throws WeixinException { + return chatApi.quitChat(chatId, operator); + } + + /** + * 清除会话未读状态 + * + * @param targetId + * 会话值,为userid|chatid,分别表示:成员id|会话id + * @param owner + * 会话所有者的userid + * @param chatType + * 会话类型:single|group,分别表示:群聊|单聊 + * @return 处理结果 + * @see com.foxinmy.weixin4j.qy.api.ChatApi + * @see + * 清除会话未读状态 + * @throws WeixinException + */ + public ApiResult clearChatNotify(String targetId, String owner, + ChatType chatType) throws WeixinException { + return chatApi.clearChatNotify(targetId, owner, chatType); + } + + /** + * 设置成员接收到的消息是否提醒。主要场景是用于对接企业im的在线状态,如成员处于在线状态时,可以设置该成员的消息免打扰。当成员离线时,关闭免打扰状态 + * ,对微信端进行提醒。 + * + * @param chatMutes + * 提醒参数 + * @see com.foxinmy.weixin4j.qy.api.ChatApi + * @see com.foxinmy.weixin4j.qy.model.ChatMute + * @see 设置成员新消息免打扰 + * @return 列表中不存在的成员,剩余合法成员会继续执行。 + * @throws WeixinException + */ + public List setChatMute(List chatMutes) + throws WeixinException { + return chatApi.setChatMute(chatMutes); + } + + /** + * 发送会话消息 + * + * @param message + * 消息对象 + * @return 处理结果 + * @see com.foxinmy.weixin4j.qy.api.ChatApi + * @see com.foxinmy.weixin4j.qy.message.ChatMessage + * @see + * 发送消息 + * @throws WeixinException + */ + public ApiResult sendChatMessage(ChatMessage message) + throws WeixinException { + return chatApi.sendChatMessage(message); + } + + public final static String VERSION = "1.7.7"; } diff --git a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/WeixinSuiteProxy.java b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/WeixinSuiteProxy.java index d8b1b7a0..acc8276b 100644 --- a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/WeixinSuiteProxy.java +++ b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/WeixinSuiteProxy.java @@ -33,9 +33,7 @@ import com.foxinmy.weixin4j.util.Weixin4jConfigUtil; * @date 2015年6月22日 * @since JDK 1.6 * @see com.foxinmy.weixin4j.qy.api.SuiteApi - * @see - * 企业号第三方应用 + * @see 企业号第三方应用 */ public class WeixinSuiteProxy { @@ -169,8 +167,7 @@ public class WeixinSuiteProxy { * 套件ID * @param suiteTicket * 套件ticket内容 - * @see + * @see * 推送suite_ticket协议 * @throws WeixinException */ @@ -213,9 +210,7 @@ public class WeixinSuiteProxy { * @see com.foxinmy.weixin4j.qy.api.SuiteApi#getTicketManager() * @see com.foxinmy.weixin4j.qy.api.SuiteApi#getPreCodeManager() * @see com.foxinmy.weixin4j.qy.api.SuiteApi#exchangeAuthInfo(String) - * @see 企业号第三方应用套件授权 + * @see 企业号第三方应用套件授权 * @return 请求授权的URL * @throws WeixinException */ diff --git a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/api/AgentApi.java b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/api/AgentApi.java index e46e52a1..226a3e86 100644 --- a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/api/AgentApi.java +++ b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/api/AgentApi.java @@ -22,8 +22,7 @@ import com.foxinmy.weixin4j.token.TokenManager; * @author jinyu(foxinmy@gmail.com) * @date 2015年3月16日 * @since JDK 1.6 - * @see 管理应用接口说明 + * @see 管理应用接口说明 */ public class AgentApi extends QyApi { private final TokenManager tokenManager; @@ -39,15 +38,14 @@ public class AgentApi extends QyApi { * 授权方应用id * @return 应用信息 * @see com.foxinmy.weixin4j.qy.model.AgentInfo - * @see 企业号应用的信息 + * @see 企业号应用的信息 * @throws WeixinException */ public AgentInfo getAgent(int agentid) throws WeixinException { String agent_get_uri = getRequestUri("agent_get_uri"); Token token = tokenManager.getCache(); - WeixinResponse response = weixinExecutor.get(String.format(agent_get_uri, - token.getAccessToken(), agentid)); + WeixinResponse response = weixinExecutor.get(String.format( + agent_get_uri, token.getAccessToken(), agentid)); JSONObject jsonObj = response.getAsJson(); AgentInfo agent = JSON.toJavaObject(jsonObj, AgentInfo.class); agent.setAllowUsers(JSON.parseArray( @@ -67,8 +65,7 @@ public class AgentApi extends QyApi { * @param agentSet * 设置信息 * @see com.foxinmy.weixin4j.qy.model.AgentSetter - * @see 设置企业号信息 + * @see 设置企业号信息 * @return 处理结果 * @throws WeixinException */ @@ -101,16 +98,15 @@ public class AgentApi extends QyApi { * 获取应用概况列表 * * @see com.foxinmy.weixin4j.qy.model.AgentOverview - * @see 获取应用概况 + * @see 获取应用概况 * @return 应用概况列表 * @throws WeixinException */ public List listAgentOverview() throws WeixinException { String agent_list_uri = getRequestUri("agent_list_uri"); Token token = tokenManager.getCache(); - WeixinResponse response = weixinExecutor.get(String.format(agent_list_uri, - token.getAccessToken())); + WeixinResponse response = weixinExecutor.get(String.format( + agent_list_uri, token.getAccessToken())); return JSON.parseArray(response.getAsJson().getString("agentlist"), AgentOverview.class); diff --git a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/api/BatchApi.java b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/api/BatchApi.java index 449f2b06..ecbdfdd7 100644 --- a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/api/BatchApi.java +++ b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/api/BatchApi.java @@ -20,8 +20,7 @@ import com.foxinmy.weixin4j.token.TokenManager; * @author jinyu(foxinmy@gmail.com) * @date 2015年3月30日 * @since JDK 1.6 - * @see 批量任务 + * @see 批量任务 */ public class BatchApi extends QyApi { @@ -77,8 +76,7 @@ public class BatchApi extends QyApi { * @return 异步任务id,最大长度为64字符 * @see {@link MediaApi#batchUploadUsers(java.util.List)} * @see com.foxinmy.weixin4j.qy.model.Callback - * @see 批量更新成员 + * @see 批量更新成员 * @throws WeixinException */ public String syncUser(String mediaId, Callback callback) @@ -115,8 +113,7 @@ public class BatchApi extends QyApi { * @return 异步任务id,最大长度为64字符 * @see {@link MediaApi#batchUploadUsers(java.util.List)} * @see com.foxinmy.weixin4j.qy.model.Callback - * @see 批量覆盖成员 + * @see 批量覆盖成员 * @throws WeixinException */ public String replaceUser(String mediaId, Callback callback) @@ -140,8 +137,7 @@ public class BatchApi extends QyApi { * @return 异步任务id,最大长度为64字符 * @see {@link MediaApi#batchUploadParties(java.util.List)} * @see com.foxinmy.weixin4j.qy.model.Callback - * @see 批量覆盖部门 + * @see 批量覆盖部门 * @throws WeixinException */ public String replaceParty(String mediaId, Callback callback) diff --git a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/api/MediaApi.java b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/api/MediaApi.java index 5b425ecd..dc328853 100644 --- a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/api/MediaApi.java +++ b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/api/MediaApi.java @@ -54,8 +54,6 @@ import com.foxinmy.weixin4j.util.StringUtil; * @author jinyu(foxinmy@gmail.com) * @date 2014年9月25日 * @since JDK 1.6 - * @see 管理素材文件 * @see com.foxinmy.weixin4j.type.MediaType */ public class MediaApi extends QyApi { @@ -113,8 +111,7 @@ public class MediaApi extends QyApi { * 文件名 * @return 上传到微信服务器返回的媒体标识 * @see com.foxinmy.weixin4j.model.media.MediaUploadResult - * @see 上传临时素材文件说明 + * @see 上传临时素材文件说明 * @see 上传永久素材文件说明 * @throws WeixinException @@ -192,8 +189,7 @@ public class MediaApi extends QyApi { * 媒体ID * @return 媒体下载结果 * @see com.foxinmy.weixin4j.model.media.MediaDownloadResult - * @see 获取临时媒体说明 + * @see 获取临时媒体说明 * @see 获取永久媒体说明 * @throws WeixinException @@ -436,8 +432,7 @@ public class MediaApi extends QyApi { * 成员列表 * @see {@link BatchApi#syncUser(String,Callback)} * @see {@link BatchApi#replaceUser(String,Callback)} - * @see 批量任务 + * @see 批量任务 * @return 上传后的mediaId * @throws WeixinException */ @@ -451,8 +446,7 @@ public class MediaApi extends QyApi { * @param parties * 部门列表 * @see {@link BatchApi#replaceParty(String,Callback)} - * @see 批量任务 + * @see 批量任务 * @return 上传后的mediaId * @throws WeixinException */ diff --git a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/api/MenuApi.java b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/api/MenuApi.java index 131d81a4..c59fcbc9 100644 --- a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/api/MenuApi.java +++ b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/api/MenuApi.java @@ -29,99 +29,103 @@ import com.foxinmy.weixin4j.util.StringUtil; */ public class MenuApi extends QyApi { - private final TokenManager tokenManager; + private final TokenManager tokenManager; - public MenuApi(TokenManager tokenManager) { - this.tokenManager = tokenManager; - } + public MenuApi(TokenManager tokenManager) { + this.tokenManager = tokenManager; + } - /** - * 自定义菜单(管理员须拥有应用的管理权限 并且应用必须设置在回调模式) - * - * @param agentid - * 应用ID - * - * @param buttons - * 菜单列表 - * @throws WeixinException - * @see - * 创建自定义菜单 - * @see com.foxinmy.weixin4j.model.Button - */ - public ApiResult createMenu(int agentid, List buttons) throws WeixinException { - String menu_create_uri = getRequestUri("menu_create_uri"); - Token token = tokenManager.getCache(); - JSONObject obj = new JSONObject(); - obj.put("button", buttons); - WeixinResponse response = weixinExecutor.post(String.format(menu_create_uri, token.getAccessToken(), agentid), - JSON.toJSONString(obj, new NameFilter() { - @Override - public String process(Object object, String name, Object value) { - if (object instanceof Button && name.equals("content") - && StringUtil.isNotBlank(((Button) object).getType())) { - ButtonType buttonType = ButtonType.valueOf(((Button) object).getType()); - if (ButtonType.view == buttonType) { - return "url"; - } else if (ButtonType.media_id == buttonType || ButtonType.view_limited == buttonType) { - return "media_id"; - } else { - return "key"; - } - } - return name; - } - })); + /** + * 自定义菜单(管理员须拥有应用的管理权限 并且应用必须设置在回调模式) + * + * @param agentid + * 应用ID + * + * @param buttons + * 菜单列表 + * @throws WeixinException + * @see 创建自定义菜单 + * @see com.foxinmy.weixin4j.model.Button + */ + public ApiResult createMenu(int agentid, List buttons) + throws WeixinException { + String menu_create_uri = getRequestUri("menu_create_uri"); + Token token = tokenManager.getCache(); + JSONObject obj = new JSONObject(); + obj.put("button", buttons); + WeixinResponse response = weixinExecutor + .post(String.format(menu_create_uri, token.getAccessToken(), + agentid), JSON.toJSONString(obj, new NameFilter() { + @Override + public String process(Object object, String name, + Object value) { + if (object instanceof Button + && name.equals("content") + && StringUtil.isNotBlank(((Button) object) + .getType())) { + ButtonType buttonType = ButtonType + .valueOf(((Button) object).getType()); + if (ButtonType.view == buttonType) { + return "url"; + } else if (ButtonType.media_id == buttonType + || ButtonType.view_limited == buttonType) { + return "media_id"; + } else { + return "key"; + } + } + return name; + } + })); - return response.getAsResult(); - } + return response.getAsResult(); + } - /** - * 查询菜单(管理员须拥有应用的管理权限 并且应用必须设置在回调模式。) - * - * @param agentid - * 应用ID - * @return 菜单集合 - * @throws WeixinException - * @see - * 查询菜单 - * @see com.foxinmy.weixin4j.model.Button - */ - public List getMenu(int agentid) throws WeixinException { - String menu_get_uri = getRequestUri("menu_get_uri"); - Token token = tokenManager.getCache(); - WeixinResponse response = weixinExecutor.get(String.format(menu_get_uri, token.getAccessToken(), agentid)); - JSONArray buttons = response.getAsJson().getJSONArray("button"); - List buttonList = new ArrayList(buttons.size()); - ParseProcess processor = new ExtraProcessor() { - @Override - public void processExtra(Object object, String key, Object value) { - ((Button) object).setContent(String.valueOf(value)); - } - }; - for (int i = 0; i < buttons.size(); i++) { - buttonList.add(JSON.parseObject(buttons.getString(i), Button.class, processor)); - } - return buttonList; - } + /** + * 查询菜单(管理员须拥有应用的管理权限 并且应用必须设置在回调模式。) + * + * @param agentid + * 应用ID + * @return 菜单集合 + * @throws WeixinException + * @see 查询菜单 + * @see com.foxinmy.weixin4j.model.Button + */ + public List getMenu(int agentid) throws WeixinException { + String menu_get_uri = getRequestUri("menu_get_uri"); + Token token = tokenManager.getCache(); + WeixinResponse response = weixinExecutor.get(String.format( + menu_get_uri, token.getAccessToken(), agentid)); + JSONArray buttons = response.getAsJson().getJSONArray("button"); + List buttonList = new ArrayList(buttons.size()); + ParseProcess processor = new ExtraProcessor() { + @Override + public void processExtra(Object object, String key, Object value) { + ((Button) object).setContent(String.valueOf(value)); + } + }; + for (int i = 0; i < buttons.size(); i++) { + buttonList.add(JSON.parseObject(buttons.getString(i), Button.class, + processor)); + } + return buttonList; + } - /** - * 删除菜单(管理员须拥有应用的管理权限 并且应用必须设置在回调模式) - * - * @param agentid - * 应用ID - * @throws WeixinException - * @see - * 删除菜单 - * @return 处理结果 - */ - public ApiResult deleteMenu(int agentid) throws WeixinException { - String menu_delete_uri = getRequestUri("menu_delete_uri"); - Token token = tokenManager.getCache(); - WeixinResponse response = weixinExecutor.get(String.format(menu_delete_uri, token.getAccessToken(), agentid)); + /** + * 删除菜单(管理员须拥有应用的管理权限 并且应用必须设置在回调模式) + * + * @param agentid + * 应用ID + * @throws WeixinException + * @see 删除菜单 + * @return 处理结果 + */ + public ApiResult deleteMenu(int agentid) throws WeixinException { + String menu_delete_uri = getRequestUri("menu_delete_uri"); + Token token = tokenManager.getCache(); + WeixinResponse response = weixinExecutor.get(String.format( + menu_delete_uri, token.getAccessToken(), agentid)); - return response.getAsResult(); - } + return response.getAsResult(); + } } 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 2f5875e9..1415502a 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 @@ -26,10 +26,7 @@ import com.foxinmy.weixin4j.tuple.NotifyTuple; * @author jinyu(foxinmy@gmail.com) * @date 2014年11月21日 * @since JDK 1.6 - * @see 发送接口说明 - * @see 发送格式说明 + * @see 发送接口说明 * @see com.foxinmy.weixin4j.tuple.Text * @see com.foxinmy.weixin4j.tuple.Image * @see com.foxinmy.weixin4j.tuple.Voice @@ -56,14 +53,11 @@ public class NotifyApi extends QyApi { * * @param message * 消息对象 - * @return 如果无权限或收件人不存在,则本次发送失败;如果未关注,发送仍然执行。两种情况下均返回无效的部分(注:由于userid不区分大小写,返回的列表都统一转为小写 { "errcode": - * 0, "errmsg": "ok", "invaliduser": "UserID1", - * "invalidparty":"PartyID1", "invalidtag":"TagID1" } + * @return 如果无权限或收件人不存在,则本次发送失败;如果未关注,发送仍然执行。两种情况下均返回无效的部分(注:由于userid不区分大小写, + * 返回的列表都统一转为小写 { "errcode": 0, "errmsg": "ok", "invaliduser": + * "UserID1", "invalidparty":"PartyID1", "invalidtag":"TagID1" } * @throws WeixinException - * @see 发送接口说明 - * @see 发送格式说明 + * @see 发送接口说明 * @see com.foxinmy.weixin4j.tuple.Text * @see com.foxinmy.weixin4j.tuple.Image * @see com.foxinmy.weixin4j.tuple.Voice diff --git a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/api/OauthApi.java b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/api/OauthApi.java index 0ef16833..021c260c 100644 --- a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/api/OauthApi.java +++ b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/api/OauthApi.java @@ -14,15 +14,10 @@ import com.foxinmy.weixin4j.util.Weixin4jConfigUtil; * @author jinyu(foxinmy@gmail.com) * @date 2015年6月11日 * @since JDK 1.6 + * @see 企业号用户身份授权说明 * @see - * 企业号用户身份授权说明 - * @see - * 企业号第三方提供商授权说明 - * @see - * 企业号第三方套件应用授权说明 + * "http://work.weixin.qq.com/api/doc#11791/服务商的凭证">企业号第三方提供商授权说明 + * @see 企业号第三方套件应用授权说明 */ public class OauthApi extends QyApi { private final WeixinAccount account; @@ -55,7 +50,8 @@ public class OauthApi extends QyApi { public String getUserAuthorizationURL() { String redirectUri = Weixin4jConfigUtil .getValue("user.oauth.redirect.uri"); - return getUserAuthorizationURL(redirectUri, "state"); + return getUserAuthorizationURL(redirectUri, "snsapi_base", "state", + null); } /** @@ -63,19 +59,26 @@ public class OauthApi extends QyApi { * * @param redirectUri * 重定向地址 + * @param scope + * 应用授权作用域。 snsapi_base:静默授权,可获取成员的基础信息; + * snsapi_userinfo:静默授权,可获取成员的详细信息,但不包含手机、邮箱; + * snsapi_privateinfo:手动授权,可获取成员的详细信息,包含手机、邮箱。 * @param state * 用于保持请求和回调的状态 + * @param agentId + * 企业应用的id。 当scope是snsapi_userinfo或snsapi_privateinfo时,该参数必填。 + * 注意redirect_uri的域名必须与该应用的可信域名一致。 * @return 请求授权的URL * @see UserApi#getOUserInfoByCode(String, String) - * @see - * 企业号用户身份授权 + * @see 企业号用户身份授权 */ - public String getUserAuthorizationURL(String redirectUri, String state) { + public String getUserAuthorizationURL(String redirectUri, String scope, + String state, Integer agentId) { String oauth_uri = getRequestUri("user_oauth_uri"); try { return String.format(oauth_uri, account.getId(), - URLEncoder.encode(redirectUri, Consts.UTF_8.name()), state); + URLEncoder.encode(redirectUri, Consts.UTF_8.name()), scope, + state, agentId != null ? agentId.intValue() : ""); } catch (UnsupportedEncodingException e) { ; } diff --git a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/api/PartyApi.java b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/api/PartyApi.java index d1dc86f9..400180e7 100644 --- a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/api/PartyApi.java +++ b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/api/PartyApi.java @@ -19,8 +19,7 @@ import com.foxinmy.weixin4j.token.TokenManager; * @date 2014年11月18日 * @since JDK 1.6 * @see com.foxinmy.weixin4j.qy.model.Party - * @see 管理部门说明 + * @see 管理部门说明 */ public class PartyApi extends QyApi { private final TokenManager tokenManager; @@ -35,8 +34,7 @@ public class PartyApi extends QyApi { * @param party * 部门对象 * @see com.foxinmy.weixin4j.qy.model.Party - * @see 创建部门说明 + * @see 创建部门说明 * @return 部门ID * @throws WeixinException */ @@ -62,8 +60,7 @@ public class PartyApi extends QyApi { * @param party * 部门对象 * @see com.foxinmy.weixin4j.qy.model.Party - * @see 更新部门说明 + * @see 更新部门说明 * @return 处理结果 * @throws WeixinException */ @@ -92,8 +89,7 @@ public class PartyApi extends QyApi { * @param partId * 部门ID。获取指定部门ID下的子部门 传入0表示获取全部子部门 * @see com.foxinmy.weixin4j.qy.model.Party - * @see 获取部门列表 + * @see 获取部门列表 * @return 部门列表 * @throws WeixinException */ @@ -114,8 +110,7 @@ public class PartyApi extends QyApi { * * @param partId * 部门ID - * @see 删除部门说明 + * @see 删除部门说明 * @return 处理结果 * @throws WeixinException */ diff --git a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/api/QyApi.java b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/api/QyApi.java index 0fa2aeaa..e0237acf 100644 --- a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/api/QyApi.java +++ b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/api/QyApi.java @@ -12,7 +12,7 @@ import com.foxinmy.weixin4j.api.BaseApi; * @date 2014年11月18日 * @since JDK 1.6 * @see com.foxinmy.weixin4j.api.BaseApi - * @see api文档 + * @see api文档 */ public class QyApi extends BaseApi { diff --git a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/api/SuiteApi.java b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/api/SuiteApi.java index f3b2ae66..60e5164c 100644 --- a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/api/SuiteApi.java +++ b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/api/SuiteApi.java @@ -25,8 +25,7 @@ import com.foxinmy.weixin4j.token.TokenManager; * @author jinyu(foxinmy@gmail.com) * @date 2015年6月17日 * @since JDK 1.6 - * @see 第三方应用授权 + * @see 第三方应用授权 */ public class SuiteApi extends QyApi { /** @@ -49,9 +48,10 @@ public class SuiteApi extends QyApi { */ public SuiteApi(TicketManager ticketManager) { this.ticketManager = ticketManager; - this.tokenManager = new TokenManager(new WeixinSuiteTokenCreator(ticketManager), - ticketManager.getCacheStorager()); - this.preCodeManager = new TokenManager(new WeixinSuitePreCodeCreator(tokenManager, ticketManager.getThirdId()), + this.tokenManager = new TokenManager(new WeixinSuiteTokenCreator( + ticketManager), ticketManager.getCacheStorager()); + this.preCodeManager = new TokenManager(new WeixinSuitePreCodeCreator( + tokenManager, ticketManager.getThirdId()), ticketManager.getCacheStorager()); } @@ -90,7 +90,8 @@ public class SuiteApi extends QyApi { * @return 应用套件的preticket管理 */ public PerTicketManager getPerTicketManager(String authCorpId) { - return new PerTicketManager(authCorpId, ticketManager.getThirdId(), ticketManager.getThirdSecret(), + return new PerTicketManager(authCorpId, ticketManager.getThirdId(), + ticketManager.getThirdSecret(), ticketManager.getCacheStorager()); } @@ -102,7 +103,8 @@ public class SuiteApi extends QyApi { * @return 企业号token */ public TokenManager getPerTokenManager(String authCorpId) { - return new TokenManager(new WeixinTokenSuiteCreator(getPerTicketManager(authCorpId), tokenManager), + return new TokenManager(new WeixinTokenSuiteCreator( + getPerTicketManager(authCorpId), tokenManager), ticketManager.getCacheStorager()); } @@ -124,8 +126,9 @@ public class SuiteApi extends QyApi { JSONObject appid = new JSONObject(); appid.put("appid", appids); para.put("session_info", appid); - WeixinResponse response = weixinExecutor - .post(String.format(suite_set_session_uri, tokenManager.getAccessToken()), para.toJSONString()); + WeixinResponse response = weixinExecutor.post( + String.format(suite_set_session_uri, + tokenManager.getAccessToken()), para.toJSONString()); return response.getAsResult(); } @@ -138,25 +141,28 @@ public class SuiteApi extends QyApi { * @throws WeixinException * @see com.foxinmy.weixin4j.qy.model.OUserInfo * @see 获取企业号的永久授权码 + * "https://work.weixin.qq.com/api/doc#10975/获取企业永久授权码">获取企业号的永久授权码 */ public OUserInfo exchangeAuthInfo(String authCode) throws WeixinException { String suite_get_permanent_uri = getRequestUri("suite_get_permanent_uri"); JSONObject obj = new JSONObject(); obj.put("suite_id", ticketManager.getThirdId()); obj.put("auth_code", authCode); - WeixinResponse response = weixinExecutor - .post(String.format(suite_get_permanent_uri, tokenManager.getAccessToken()), obj.toJSONString()); + WeixinResponse response = weixinExecutor.post( + String.format(suite_get_permanent_uri, + tokenManager.getAccessToken()), obj.toJSONString()); obj = response.getAsJson(); obj.put("corp_info", obj.remove("auth_corp_info")); obj.put("user_info", obj.remove("auth_user_info")); OUserInfo oInfo = JSON.toJavaObject(obj, OUserInfo.class); // 微信授权企业号的永久授权码 - PerTicketManager perTicketManager = getPerTicketManager(oInfo.getCorpInfo().getCorpId()); + PerTicketManager perTicketManager = getPerTicketManager(oInfo + .getCorpInfo().getCorpId()); // 缓存微信企业号的access_token - TokenCreator tokenCreator = new WeixinTokenSuiteCreator(perTicketManager, tokenManager); - Token token = new Token(obj.getString("access_token"), obj.getLongValue("expires_in") * 1000l); + TokenCreator tokenCreator = new WeixinTokenSuiteCreator( + perTicketManager, tokenManager); + Token token = new Token(obj.getString("access_token"), + obj.getLongValue("expires_in") * 1000l); ticketManager.getCacheStorager().caching(tokenCreator.key(), token); // 缓存微信企业号的永久授权码 perTicketManager.cachingTicket(obj.getString("permanent_code")); @@ -172,16 +178,18 @@ public class SuiteApi extends QyApi { * @throws WeixinException * @see com.foxinmy.weixin4j.qy.model.OUserInfo * @see 获取企业号的授权信息 + * "https://work.weixin.qq.com/api/doc#10975/获取企业授权信息">获取企业号的授权信息 */ public OUserInfo getAuthInfo(String authCorpId) throws WeixinException { String suite_get_authinfo_uri = getRequestUri("suite_get_authinfo_uri"); JSONObject obj = new JSONObject(); obj.put("suite_id", ticketManager.getThirdId()); obj.put("auth_corpid", authCorpId); - obj.put("permanent_code", getPerTicketManager(authCorpId).getAccessTicket()); - WeixinResponse response = weixinExecutor - .post(String.format(suite_get_authinfo_uri, tokenManager.getAccessToken()), obj.toJSONString()); + obj.put("permanent_code", getPerTicketManager(authCorpId) + .getAccessTicket()); + WeixinResponse response = weixinExecutor.post( + String.format(suite_get_authinfo_uri, + tokenManager.getAccessToken()), obj.toJSONString()); obj = response.getAsJson(); obj.put("corp_info", obj.remove("auth_corp_info")); obj.put("user_info", obj.remove("auth_user_info")); @@ -198,24 +206,31 @@ public class SuiteApi extends QyApi { * @return 应用信息 * @see com.foxinmy.weixin4j.qy.model.AgentInfo * @see 获取企业号应用 + * "https://work.weixin.qq.com/api/doc#10975/获取企业授权信息">获取企业号应用 * @throws WeixinException */ - public AgentInfo getAgent(String authCorpId, int agentid) throws WeixinException { + public AgentInfo getAgent(String authCorpId, int agentid) + throws WeixinException { String suite_get_agent_uri = getRequestUri("suite_get_agent_uri"); JSONObject obj = new JSONObject(); obj.put("suite_id", ticketManager.getThirdId()); obj.put("auth_corpid", authCorpId); - obj.put("permanent_code", getPerTicketManager(authCorpId).getAccessTicket()); + obj.put("permanent_code", getPerTicketManager(authCorpId) + .getAccessTicket()); obj.put("agentid", agentid); - WeixinResponse response = weixinExecutor.post(String.format(suite_get_agent_uri, tokenManager.getAccessToken()), - obj.toJSONString()); + WeixinResponse response = weixinExecutor.post( + String.format(suite_get_agent_uri, + tokenManager.getAccessToken()), obj.toJSONString()); 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)); + 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; } @@ -232,14 +247,18 @@ public class SuiteApi extends QyApi { * @return 处理结果 * @throws WeixinException */ - public ApiResult setAgent(String authCorpId, AgentSetter agentSet) throws WeixinException { + public ApiResult setAgent(String authCorpId, AgentSetter agentSet) + throws WeixinException { String suite_set_agent_uri = getRequestUri("suite_set_agent_uri"); JSONObject obj = new JSONObject(); obj.put("suite_id", ticketManager.getThirdId()); obj.put("auth_corpid", authCorpId); - obj.put("permanent_code", getPerTicketManager(authCorpId).getAccessTicket()); + obj.put("permanent_code", getPerTicketManager(authCorpId) + .getAccessTicket()); obj.put("agent", agentSet); - WeixinResponse response = weixinExecutor.post(String.format(suite_set_agent_uri, tokenManager.getAccessToken()), + WeixinResponse response = weixinExecutor.post( + String.format(suite_set_agent_uri, + tokenManager.getAccessToken()), JSON.toJSONString(obj, AgentApi.typeFilter)); return response.getAsResult(); } diff --git a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/api/TagApi.java b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/api/TagApi.java index c7aeddb7..541eaed3 100644 --- a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/api/TagApi.java +++ b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/api/TagApi.java @@ -22,9 +22,7 @@ import com.foxinmy.weixin4j.token.TokenManager; * @author jinyu(foxinmy@gmail.com) * @date 2014年11月19日 * @since JDK 1.6 - * @see - * 管理标签 + * @see 管理标签 */ public class TagApi extends QyApi { private final TokenManager tokenManager; @@ -39,9 +37,7 @@ public class TagApi extends QyApi { * @param tag * 标签对象; 标签名称,长度限制为32个字(汉字或英文字母),标签名不可与其他标签重名。 标签id,整型, * 指定此参数时新增的标签会生成对应的标签id,不指定时则以目前最大的id自增。 - * @see - * 创建标签说明 + * @see 创建标签说明 * @return 标签ID * @throws WeixinException */ @@ -63,9 +59,7 @@ public class TagApi extends QyApi { * * @param tag * 标签信息 - * @see 更新标签说明 + * @see 更新标签说明 * @return 处理结果 * @see com.foxinmy.weixin4j.qy.model.Tag * @throws WeixinException @@ -85,9 +79,7 @@ public class TagApi extends QyApi { * @param tagId * 标签ID * @return 处理结果 - * @see - * 删除标签说明 + * @see 删除标签说明 * @throws WeixinException */ public ApiResult deleteTag(int tagId) throws WeixinException { @@ -101,9 +93,7 @@ public class TagApi extends QyApi { /** * 获取标签列表 * - * @see - * 获取标签列表说明 + * @see 获取标签列表说明 * @return 标签列表 * @see com.foxinmy.weixin4j.qy.model.Tag * @throws WeixinException @@ -124,9 +114,7 @@ public class TagApi extends QyApi { * 标签ID * @see com.foxinmy.weixin4j.qy.model.Contacts * @see com.foxinmy.weixin4j.qy.model.User - * @see - * 获取标签成员说明 + * @see 获取标签成员说明 * @return 成员列表Contacts#getUsers和部门列表Contacts#getPartyIds * @throws WeixinException @@ -154,9 +142,7 @@ public class TagApi extends QyApi { * 企业成员ID列表,注意:userlist、partylist不能同时为空,单次请求长度不超过1000 * @param partyIds * 企业部门ID列表,注意:userlist、partylist不能同时为空,单次请求长度不超过100 - * @see - * 新增标签成员说明 + * @see 新增标签成员说明 * @see com.foxinmy.weixin4j.qy.model.IdParameter * @return 非法的userIds和partyIds * @throws WeixinException @@ -176,9 +162,7 @@ public class TagApi extends QyApi { * 企业成员ID列表,注意:userlist、partylist不能同时为空 * @param partyIds * 企业部门ID列表,注意:userlist、partylist不能同时为空 - * @see - * 删除标签成员说明 + * @see 删除标签成员说明 * @see com.foxinmy.weixin4j.qy.model.IdParameter * @return 非法的userIds和partyIds * @throws WeixinException diff --git a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/api/UserApi.java b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/api/UserApi.java index 91774c5e..110dc323 100644 --- a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/api/UserApi.java +++ b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/api/UserApi.java @@ -28,9 +28,7 @@ import com.foxinmy.weixin4j.util.StringUtil; * @date 2014年11月19日 * @since JDK 1.6 * @see com.foxinmy.weixin4j.qy.model.User - * @see - * 管理成员说明 + * @see 管理成员说明 */ public class UserApi extends QyApi { private final MediaApi mediaApi; @@ -49,9 +47,7 @@ public class UserApi extends QyApi { * @param user * 成员对象 * @see com.foxinmy.weixin4j.qy.model.User - * @see - * 创建成员说明 + * @see 创建成员说明 * @return 处理结果 * @throws WeixinException */ @@ -68,9 +64,7 @@ public class UserApi extends QyApi { * @param avatar * 头像文件 可为空 * @see com.foxinmy.weixin4j.qy.model.User - * @see - * 创建成员说明 + * @see 创建成员说明 * @return 处理结果 * @throws WeixinException */ @@ -86,9 +80,7 @@ public class UserApi extends QyApi { * @param user * 成员对象 * @see com.foxinmy.weixin4j.qy.model.User - * @see - * 更新成员说明 + * @see 更新成员说明 * @return 处理结果 * @throws WeixinException */ @@ -105,9 +97,7 @@ public class UserApi extends QyApi { * @param avatar * 头像文件 * @see com.foxinmy.weixin4j.qy.model.User - * @see - * 更新成员说明 + * @see 更新成员说明 * @return 处理结果 * @throws WeixinException */ @@ -147,9 +137,7 @@ public class UserApi extends QyApi { * @param userid * 成员唯一ID * @see com.foxinmy.weixin4j.qy.model.User - * @see - * 获取成员说明 + * @see 获取成员说明 * @return 成员对象 * @throws WeixinException */ @@ -177,17 +165,35 @@ public class UserApi extends QyApi { * @return 成员对象 * @see {@link #getUser(String)} * @see {@link #getUserIdByCode(String)} - * @see + * @see * oauth授权获取用户信息 * @throws WeixinException */ public User getUserByCode(String code) throws WeixinException { - String[] userIds = getUserIdByCode(code); - if (Boolean.parseBoolean(userIds[2])) { - return getUser(openid2userid(userIds[0])); + JSONObject result = getUserIdByCode(code); + if (result.containsKey("user_ticket")) { + String user_ticket_detail_uri = getRequestUri("user_ticket_detail_uri"); + Token token = tokenManager.getCache(); + WeixinResponse response = weixinExecutor.post( + String.format(user_ticket_detail_uri, + token.getAccessToken()), + String.format("{\"user_ticket\":\"%s\"}", + result.getString("user_ticket"))); + JSONObject obj = response.getAsJson(); + Object attrs = obj.remove("extattr"); + User user = JSON.toJavaObject(obj, User.class); + if (attrs != null) { + user.setExtattr(JSON.parseArray( + ((JSONObject) attrs).getString("attrs"), + NameValue.class)); + } + return user; } else { - return getUser(userIds[0]); + String userId = result.getString("UserId"); + if (StringUtil.isBlank(userId)) { + userId = openid2userid(result.getString("OpenId")); + } + return getUser(userId); } } @@ -196,27 +202,17 @@ public class UserApi extends QyApi { * * @param code * 通过员工授权获取到的code,每次员工授权带上的code将不一样,code只能使用一次,5分钟未被使用自动过期 - * @return 两个元素的数组 第一个元素为userId或者openId - * 第二个元素为deviceId - * @see + * @return 换取结果 + * @see * oauth授权获取用户信息 * @throws WeixinException */ - public String[] getUserIdByCode(String code) throws WeixinException { + public JSONObject getUserIdByCode(String code) throws WeixinException { String user_getid_uri = getRequestUri("user_getid_uri"); Token token = tokenManager.getCache(); WeixinResponse response = weixinExecutor.get(String.format( user_getid_uri, token.getAccessToken(), code)); - JSONObject result = response.getAsJson(); - String userId = result.getString("UserId"); - boolean need2 = false; - if (StringUtil.isBlank(userId)) { - userId = result.getString("OpenId"); - need2 = true; - } - return new String[] { userId, result.getString("DeviceId"), - Boolean.toString(need2) }; + return response.getAsJson(); } /** @@ -252,9 +248,7 @@ public class UserApi extends QyApi { * @param findDetail * 是否获取详细信息 * @see com.foxinmy.weixin4j.qy.model.User - * @see - * 获取部门成员说明 + * @see 获取部门成员说明 * @return 成员列表 * @throws WeixinException */ @@ -334,9 +328,7 @@ public class UserApi extends QyApi { * * @param userid * 成员ID - * @see - * 删除成员说明 + * @see 删除成员说明 * @return 处理结果 * @throws WeixinException */ @@ -353,9 +345,7 @@ public class UserApi extends QyApi { * * @param userIds * 成员列表 - * @see 批量删除成员说明 + * @see 批量删除成员说明 * @return 处理结果 * @throws WeixinException */ @@ -377,9 +367,7 @@ public class UserApi extends QyApi { * @param userid * 成员ID * @return 调用结果 - * @see - * 二次验证说明 + * @see 二次验证说明 * @throws WeixinException */ public ApiResult authsucc(String userId) throws WeixinException { @@ -433,9 +421,8 @@ public class UserApi extends QyApi { * 需要发送红包的应用ID,若只是使用微信支付和企业转账,则无需该参数 传入0或负数则忽略 * @return 结果数组 第一个元素为对应的openid 第二个元素则为应用的appid(如果有) * @throws WeixinException - * @see - * userid转换成openid + * @see + * userid与openid互换 */ public String[] userid2openid(String userid, int agentid) throws WeixinException { @@ -460,9 +447,8 @@ public class UserApi extends QyApi { * 在使用微信支付、微信红包和企业转账之后,返回结果的openid * @return 该openid在企业号中对应的成员userid * @throws WeixinException - * @see - * openid转换成userid + * @see + * userid与openid互换 */ public String openid2userid(String openid) throws WeixinException { String openid2userid_uri = getRequestUri("openid2userid_uri"); 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 b464f18a..0a0d4e16 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 @@ -1,6 +1,6 @@ # ---------------------------------------------------------------------------- # api\u9996\u9875 -# http://qydev.weixin.qq.com/wiki/index.php +# https://work.weixin.qq.com/api/doc # ---------------------------------------------------------------------------- api_base_url=https://qyapi.weixin.qq.com/cgi-bin @@ -21,6 +21,8 @@ user_update_uri={api_base_url}/user/update?access_token=%s 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}/user/getuserinfo?access_token=%s&code=%s +# code->ticket\u83b7\u53d6\u6210\u5458\u4fe1\u606f +user_ticket_detail_uri={api_base_url}/user/getuserdetail?access_token=%s # \u83b7\u53d6\u90e8\u95e8\u6210\u5458 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) @@ -87,7 +89,9 @@ batch_replaceparty.cvs={"header":"\u90e8\u95e8\u540d\u79f0,\u90e8\u95e8ID,\u7236 batch_getresult_uri={api_base_url}/batch/getresult?access_token=%s&jobid=%s # \u7528\u6237\u8eab\u4efdoauth\u6388\u6743 -user_oauth_uri=https://open.weixin.qq.com/connect/oauth2/authorize?appid=%s&redirect_uri=%s&response_type=code&scope=snsapi_base&state=%s#wechat_redirect +user_oauth_uri=https://open.weixin.qq.com/connect/oauth2/authorize?appid=%s&redirect_uri=%s&response_type=code&scope=%s&state=%s&agentid=%s#wechat_redirect +# \u4f7f\u7528user_ticket\u83b7\u53d6\u6210\u5458\u8be6\u60c5 +user_oauth_userdetail_uri={api_base_url}/user/getuserdetail?access_token=%s # \u6210\u5458\u767b\u5f55\u7b2c\u4e09\u65b9oauth\u6388\u6743 user_thirdoauth_uri=https://qy.weixin.qq.com/cgi-bin/loginpage?corp_id=%s&redirect_uri=%s&state=%s&usertype=%s # \u4f01\u4e1a\u53f7\u6210\u5458\u767b\u5f55\u7b2c\u4e09\u65b9\u4fe1\u606f diff --git a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/message/CustomeMessage.java b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/message/CustomeMessage.java index b87c9ac3..cf7af68d 100644 --- a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/message/CustomeMessage.java +++ b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/message/CustomeMessage.java @@ -17,8 +17,6 @@ import com.foxinmy.weixin4j.tuple.NotifyTuple; * @see com.foxinmy.weixin4j.tuple.Voice * @see com.foxinmy.weixin4j.tuple.Video * @see com.foxinmy.weixin4j.tuple.File - * @see 客服消息 */ public class CustomeMessage implements Serializable { diff --git a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/message/NotifyMessage.java b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/message/NotifyMessage.java index b8e1e867..92077c79 100644 --- a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/message/NotifyMessage.java +++ b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/message/NotifyMessage.java @@ -20,8 +20,6 @@ import com.foxinmy.weixin4j.tuple.NotifyTuple; * @see com.foxinmy.weixin4j.tuple.File * @see com.foxinmy.weixin4j.tuple.News * @see com.foxinmy.weixin4j.tuple.MpNews - * @see 消息说明 */ public class NotifyMessage implements Serializable { @@ -51,7 +49,8 @@ public class NotifyMessage implements Serializable { this(agentid, tuple, IdParameter.get(), false); } - public NotifyMessage(int agentId, NotifyTuple tuple, IdParameter target, boolean isSafe) { + public NotifyMessage(int agentId, NotifyTuple tuple, IdParameter target, + boolean isSafe) { this.agentId = agentId; this.safe = isSafe ? 1 : 0; this.tuple = tuple; @@ -84,6 +83,7 @@ public class NotifyMessage implements Serializable { @Override public String toString() { - return "NotifyMessage [agentId=" + agentId + ", safe=" + safe + ", tuple=" + tuple + ", target=" + target + "]"; + return "NotifyMessage [agentId=" + agentId + ", safe=" + safe + + ", tuple=" + tuple + ", target=" + target + "]"; } } diff --git a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/model/AgentSetter.java b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/model/AgentSetter.java index 6d4f6317..9376691d 100644 --- a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/model/AgentSetter.java +++ b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/model/AgentSetter.java @@ -12,8 +12,6 @@ import com.foxinmy.weixin4j.qy.type.ReportLocationType; * @author jinyu(foxinmy@gmail.com) * @date 2015年3月16日 * @since JDK 1.6 - * @see 设置企业号应用 */ public class AgentSetter implements Serializable { private static final long serialVersionUID = 5420335232308079801L; diff --git a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/model/Party.java b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/model/Party.java index 3959edef..50c63c28 100644 --- a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/model/Party.java +++ b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/model/Party.java @@ -11,8 +11,6 @@ import com.alibaba.fastjson.annotation.JSONField; * @author jinyu(foxinmy@gmail.com) * @date 2014年11月18日 * @since JDK 1.6 - * @see 管理部门说明 */ public class Party implements Serializable { @@ -31,7 +29,7 @@ public class Party implements Serializable { @JSONField(name = "parentid") private int parentId; /** - * 在父部门中的次序值。order值大的排序靠前。有效的值范围是[0, 2^32) + * 在父部门中的次序值。order值大的排序靠前。有效的值范围是[0, 2^32) */ private int order; diff --git a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/model/PrivilegeInfo.java b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/model/PrivilegeInfo.java index a86681d3..cd2e06f6 100644 --- a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/model/PrivilegeInfo.java +++ b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/model/PrivilegeInfo.java @@ -8,7 +8,7 @@ import com.alibaba.fastjson.annotation.JSONField; /** * 权限信息 * - * @className Privilege + * @className PrivilegeInfo * @author jinyu(foxinmy@gmail.com) * @date 2016年3月28日 * @since JDK 1.6 diff --git a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/model/PrivilegeLevel.java b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/model/PrivilegeLevel.java index 40753f93..fe7d4242 100644 --- a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/model/PrivilegeLevel.java +++ b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/model/PrivilegeLevel.java @@ -3,7 +3,7 @@ package com.foxinmy.weixin4j.qy.model; /** * 权限级别 * - * @className Privilege + * @className PrivilegeLevel * @author jinyu(foxinmy@gmail.com) * @date 2016年3月28日 * @since JDK 1.6 diff --git a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/model/User.java b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/model/User.java index 4bb37971..a80bed80 100644 --- a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/model/User.java +++ b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/model/User.java @@ -16,8 +16,6 @@ import com.foxinmy.weixin4j.util.NameValue; * @author jinyu(foxinmy@gmail.com) * @date 2014年11月19日 * @since JDK 1.6 - * @see 管理成员说明 */ public class User implements Serializable { diff --git a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/model/WeixinQyAccount.java b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/model/WeixinQyAccount.java index f7f0d419..bade1903 100644 --- a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/model/WeixinQyAccount.java +++ b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/model/WeixinQyAccount.java @@ -13,9 +13,6 @@ import com.foxinmy.weixin4j.model.WeixinAccount; * @author jinyu(foxinmy@gmail.com) * @date 2014年11月18日 * @since JDK 1.6 - * @see 企业号设置 */ public class WeixinQyAccount extends WeixinAccount { @@ -72,8 +69,8 @@ public class WeixinQyAccount extends WeixinAccount { @Override public String toString() { - return "WeixinQyAccount [" + super.toString() + ", suites=" - + suites + ", providerSecret=" + providerSecret - + ", chatSecret=" + chatSecret + "]"; + return "WeixinQyAccount [" + super.toString() + ", suites=" + suites + + ", providerSecret=" + providerSecret + ", chatSecret=" + + chatSecret + "]"; } } diff --git a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/suite/WeixinSuitePreCodeCreator.java b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/suite/WeixinSuitePreCodeCreator.java index 8df6465f..e0fcd35d 100644 --- a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/suite/WeixinSuitePreCodeCreator.java +++ b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/suite/WeixinSuitePreCodeCreator.java @@ -15,44 +15,46 @@ import com.foxinmy.weixin4j.token.TokenManager; * @author jinyu(foxinmy@gmail.com) * @date 2015年6月17日 * @since JDK 1.6 - * @see + * @see * 获取应用套件预授权码 * @see com.foxinmy.weixin4j.model.Token */ public class WeixinSuitePreCodeCreator extends TokenCreator { - private final TokenManager suiteTokenManager; - private final String suiteId; + private final TokenManager suiteTokenManager; + private final String suiteId; - /** - * - * @param suiteTokenManager - * 应用套件的token - * @param suiteId - * 应用套件ID - */ - public WeixinSuitePreCodeCreator(TokenManager suiteTokenManager, String suiteId) { - this.suiteTokenManager = suiteTokenManager; - this.suiteId = suiteId; - } + /** + * + * @param suiteTokenManager + * 应用套件的token + * @param suiteId + * 应用套件ID + */ + public WeixinSuitePreCodeCreator(TokenManager suiteTokenManager, + String suiteId) { + this.suiteTokenManager = suiteTokenManager; + this.suiteId = suiteId; + } - @Override - public String name() { - return "qy_suite_precode"; - } + @Override + public String name() { + return "qy_suite_precode"; + } - @Override - public String uniqueid() { - return suiteId; - } + @Override + public String uniqueid() { + return suiteId; + } - @Override - public Token create() throws WeixinException { - WeixinResponse response = weixinExecutor.post( - String.format(URLConsts.SUITE_PRE_CODE_URL, suiteTokenManager.getAccessToken()), - String.format("{\"suite_id\":\"%s\"}", suiteId)); - JSONObject result = response.getAsJson(); - return new Token(result.getString("pre_auth_code"), result.getLongValue("expires_in") * 1000l); - } + @Override + public Token create() throws WeixinException { + WeixinResponse response = weixinExecutor.post( + String.format(URLConsts.SUITE_PRE_CODE_URL, + suiteTokenManager.getAccessToken()), + String.format("{\"suite_id\":\"%s\"}", suiteId)); + JSONObject result = response.getAsJson(); + return new Token(result.getString("pre_auth_code"), + result.getLongValue("expires_in") * 1000l); + } } diff --git a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/suite/WeixinSuiteTokenCreator.java b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/suite/WeixinSuiteTokenCreator.java index 07664baf..1965323f 100644 --- a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/suite/WeixinSuiteTokenCreator.java +++ b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/suite/WeixinSuiteTokenCreator.java @@ -15,41 +15,42 @@ import com.foxinmy.weixin4j.token.TokenCreator; * @author jinyu(foxinmy@gmail.com) * @date 2015年6月17日 * @since JDK 1.6 - * @see 获取应用套件凭证 + * @see 获取应用套件凭证 * @see com.foxinmy.weixin4j.model.Token */ public class WeixinSuiteTokenCreator extends TokenCreator { - private final TicketManager ticketManager; + private final TicketManager ticketManager; - /** - * - * @param ticketManager - * 套件ticket存取 - */ - public WeixinSuiteTokenCreator(TicketManager ticketManager) { - this.ticketManager = ticketManager; - } + /** + * + * @param ticketManager + * 套件ticket存取 + */ + public WeixinSuiteTokenCreator(TicketManager ticketManager) { + this.ticketManager = ticketManager; + } - @Override - public String name() { - return "qy_suite_token"; - } + @Override + public String name() { + return "qy_suite_token"; + } - @Override - public String uniqueid() { - return ticketManager.getThirdId(); - } + @Override + public String uniqueid() { + return ticketManager.getThirdId(); + } - @Override - public Token create() throws WeixinException { - JSONObject obj = new JSONObject(); - obj.put("suite_id", ticketManager.getThirdId()); - obj.put("suite_secret", ticketManager.getThirdSecret()); - obj.put("suite_ticket", ticketManager.getAccessTicket()); - WeixinResponse response = weixinExecutor.post(URLConsts.SUITE_TOKEN_URL, obj.toJSONString()); - obj = response.getAsJson(); - return new Token(obj.getString("suite_access_token"), obj.getLongValue("expires_in") * 1000l); - } + @Override + public Token create() throws WeixinException { + JSONObject obj = new JSONObject(); + obj.put("suite_id", ticketManager.getThirdId()); + obj.put("suite_secret", ticketManager.getThirdSecret()); + obj.put("suite_ticket", ticketManager.getAccessTicket()); + WeixinResponse response = weixinExecutor.post( + URLConsts.SUITE_TOKEN_URL, obj.toJSONString()); + obj = response.getAsJson(); + return new Token(obj.getString("suite_access_token"), + obj.getLongValue("expires_in") * 1000l); + } } diff --git a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/suite/WeixinTokenSuiteCreator.java b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/suite/WeixinTokenSuiteCreator.java index 418cb730..6926125b 100644 --- a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/suite/WeixinTokenSuiteCreator.java +++ b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/suite/WeixinTokenSuiteCreator.java @@ -16,47 +16,50 @@ import com.foxinmy.weixin4j.token.TokenManager; * @author jinyu(foxinmy@gmail.com) * @date 2015年6月17日 * @since JDK 1.6 - * @see + * @see * 获取企业号access_token * @see com.foxinmy.weixin4j.model.Token */ public class WeixinTokenSuiteCreator extends TokenCreator { - private final PerTicketManager perTicketManager; - private final TokenManager suiteTokenManager; + private final PerTicketManager perTicketManager; + private final TokenManager suiteTokenManager; - /** - * - * @param perTicketManager - * 第三方套件永久授权码 - * @param suiteTokenManager - * 第三方套件凭证token - */ - public WeixinTokenSuiteCreator(PerTicketManager perTicketManager, TokenManager suiteTokenManager) { - this.perTicketManager = perTicketManager; - this.suiteTokenManager = suiteTokenManager; - } + /** + * + * @param perTicketManager + * 第三方套件永久授权码 + * @param suiteTokenManager + * 第三方套件凭证token + */ + public WeixinTokenSuiteCreator(PerTicketManager perTicketManager, + TokenManager suiteTokenManager) { + this.perTicketManager = perTicketManager; + this.suiteTokenManager = suiteTokenManager; + } - @Override - public String name() { - return String.format("qy_token_suite_%s_%s", perTicketManager.getThirdId(), perTicketManager.getAuthAppId()); - } + @Override + public String name() { + return String.format("qy_token_suite_%s_%s", + perTicketManager.getThirdId(), perTicketManager.getAuthAppId()); + } - @Override - public String uniqueid() { - throw new UnsupportedOperationException(); - } + @Override + public String uniqueid() { + throw new UnsupportedOperationException(); + } - @Override - public Token create() throws WeixinException { - JSONObject obj = new JSONObject(); - obj.put("suite_id", perTicketManager.getThirdId()); - obj.put("auth_corpid", perTicketManager.getAuthAppId()); - obj.put("permanent_code", perTicketManager.getAccessTicket()); - WeixinResponse response = weixinExecutor - .post(String.format(URLConsts.TOKEN_SUITE_URL, suiteTokenManager.getAccessToken()), obj.toJSONString()); - obj = response.getAsJson(); - return new Token(obj.getString("access_token"), obj.getLongValue("expires_in") * 1000l); - } + @Override + public Token create() throws WeixinException { + JSONObject obj = new JSONObject(); + obj.put("suite_id", perTicketManager.getThirdId()); + obj.put("auth_corpid", perTicketManager.getAuthAppId()); + obj.put("permanent_code", perTicketManager.getAccessTicket()); + WeixinResponse response = weixinExecutor + .post(String.format(URLConsts.TOKEN_SUITE_URL, + suiteTokenManager.getAccessToken()), obj.toJSONString()); + obj = response.getAsJson(); + return new Token(obj.getString("access_token"), + obj.getLongValue("expires_in") * 1000l); + } } diff --git a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/token/WeixinProviderTokenCreator.java b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/token/WeixinProviderTokenCreator.java index 4efded71..596277c8 100644 --- a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/token/WeixinProviderTokenCreator.java +++ b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/token/WeixinProviderTokenCreator.java @@ -14,45 +14,45 @@ import com.foxinmy.weixin4j.token.TokenCreator; * @author jinyu(foxinmy@gmail.com) * @date 2015年1月10日 * @since JDK 1.6 - * @see - * 获取应用提供商凭证 + * @see 服务商的凭证 * @see com.foxinmy.weixin4j.model.Token */ public class WeixinProviderTokenCreator extends TokenCreator { - private final String corpid; - private final String providersecret; + private final String corpid; + private final String providersecret; - /** - * - * @param corpid - * 企业号ID - * @param providersecret - * 企业号提供商的secret - */ - public WeixinProviderTokenCreator(String corpid, String providersecret) { - this.corpid = corpid; - this.providersecret = providersecret; - } + /** + * + * @param corpid + * 企业号ID + * @param providersecret + * 企业号提供商的secret + */ + public WeixinProviderTokenCreator(String corpid, String providersecret) { + this.corpid = corpid; + this.providersecret = providersecret; + } - @Override - public String name() { - return "qy_provider_token"; - } + @Override + public String name() { + return "qy_provider_token"; + } - @Override - public String uniqueid() { - return corpid; - } + @Override + public String uniqueid() { + return corpid; + } - @Override - public Token create() throws WeixinException { - JSONObject obj = new JSONObject(); - obj.put("corpid", corpid); - obj.put("provider_secret", providersecret); - WeixinResponse response = weixinExecutor.post(URLConsts.PROVIDER_TOKEN_URL, obj.toJSONString()); - obj = response.getAsJson(); - return new Token(obj.getString("provider_access_token"), obj.getLongValue("expires_in") * 1000l); - } + @Override + public Token create() throws WeixinException { + JSONObject obj = new JSONObject(); + obj.put("corpid", corpid); + obj.put("provider_secret", providersecret); + WeixinResponse response = weixinExecutor.post( + URLConsts.PROVIDER_TOKEN_URL, obj.toJSONString()); + obj = response.getAsJson(); + return new Token(obj.getString("provider_access_token"), + obj.getLongValue("expires_in") * 1000l); + } } diff --git a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/token/WeixinTicketCreator.java b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/token/WeixinTicketCreator.java index 12c45c0e..4ff09ba8 100644 --- a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/token/WeixinTicketCreator.java +++ b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/token/WeixinTicketCreator.java @@ -16,48 +16,50 @@ import com.foxinmy.weixin4j.type.TicketType; * @author jinyu(foxinmy@gmail.com) * @date 2015年12月25日 * @since JDK 1.6 - * @see JSTICKET + * @see JSTICKET */ public class WeixinTicketCreator extends TokenCreator { - private final TicketType ticketType; - private final TokenManager weixinTokenManager; + private final TicketType ticketType; + private final TokenManager weixinTokenManager; - /** - * @param ticketType - * 票据类型 - * @param weixinTokenManager - * 企业号的access_token - */ - public WeixinTicketCreator(TicketType ticketType, TokenManager weixinTokenManager) { - this.ticketType = ticketType; - this.weixinTokenManager = weixinTokenManager; - } + /** + * @param ticketType + * 票据类型 + * @param weixinTokenManager + * 企业号的access_token + */ + public WeixinTicketCreator(TicketType ticketType, + TokenManager weixinTokenManager) { + this.ticketType = ticketType; + this.weixinTokenManager = weixinTokenManager; + } - @Override - public String name() { - return String.format("qy_ticket_%s", ticketType.name()); - } + @Override + public String name() { + return String.format("qy_ticket_%s", ticketType.name()); + } - @Override - public String uniqueid() { - return weixinTokenManager.getWeixinId(); - } + @Override + public String uniqueid() { + return weixinTokenManager.getWeixinId(); + } - @Override - public Token create() throws WeixinException { - WeixinResponse response = null; - if (ticketType == TicketType.jsapi) { - response = weixinExecutor - .get(String.format(URLConsts.JS_TICKET_URL, weixinTokenManager.getCache().getAccessToken())); - } else { - response = weixinExecutor.get(String.format(URLConsts.SUITE_TICKET_URL, - weixinTokenManager.getCache().getAccessToken(), ticketType.name())); - } - JSONObject result = response.getAsJson(); - return new Token(result.getString("ticket"), result.getLong("expires_in") * 1000l).pushExtra("group_id", - result.getString("group_id")); - } + @Override + public Token create() throws WeixinException { + WeixinResponse response = null; + if (ticketType == TicketType.jsapi) { + response = weixinExecutor.get(String.format( + URLConsts.JS_TICKET_URL, weixinTokenManager.getCache() + .getAccessToken())); + } else { + response = weixinExecutor.get(String.format( + URLConsts.SUITE_TICKET_URL, weixinTokenManager.getCache() + .getAccessToken(), ticketType.name())); + } + JSONObject result = response.getAsJson(); + return new Token(result.getString("ticket"), + result.getLong("expires_in") * 1000l).pushExtra("group_id", + result.getString("group_id")); + } } diff --git a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/token/WeixinTokenCreator.java b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/token/WeixinTokenCreator.java index 37e1bcd0..2127aeac 100644 --- a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/token/WeixinTokenCreator.java +++ b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/token/WeixinTokenCreator.java @@ -14,43 +14,43 @@ import com.foxinmy.weixin4j.token.TokenCreator; * @author jinyu(foxinmy@gmail.com) * @date 2015年1月10日 * @since JDK 1.6 - * @see - * 微信企业号获取token说明 + * @see 微信企业号获取token说明 * @see com.foxinmy.weixin4j.model.Token */ public class WeixinTokenCreator extends TokenCreator { - private final String corpid; - private final String corpsecret; + private final String corpid; + private final String corpsecret; - /** - * - * @param corpid - * 企业号ID - * @param corpsecret - * 企业号secret - */ - public WeixinTokenCreator(String corpid, String corpsecret) { - this.corpid = corpid; - this.corpsecret = corpsecret; - } + /** + * + * @param corpid + * 企业号ID + * @param corpsecret + * 企业号secret + */ + public WeixinTokenCreator(String corpid, String corpsecret) { + this.corpid = corpid; + this.corpsecret = corpsecret; + } - @Override - public String name() { - return "qy_token"; - } + @Override + public String name() { + return "qy_token"; + } - @Override - public String uniqueid() { - return corpid; - } + @Override + public String uniqueid() { + return corpid; + } - @Override - public Token create() throws WeixinException { - String tokenUrl = String.format(URLConsts.ASSESS_TOKEN_URL, corpid, corpsecret); - WeixinResponse response = weixinExecutor.get(tokenUrl); - JSONObject result = response.getAsJson(); - return new Token(result.getString("access_token"), result.getLongValue("expires_in") * 1000l); - } + @Override + public Token create() throws WeixinException { + String tokenUrl = String.format(URLConsts.ASSESS_TOKEN_URL, corpid, + corpsecret); + WeixinResponse response = weixinExecutor.get(tokenUrl); + JSONObject result = response.getAsJson(); + return new Token(result.getString("access_token"), + result.getLongValue("expires_in") * 1000l); + } } diff --git a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/type/URLConsts.java b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/type/URLConsts.java index 24000dd2..1bd9a347 100644 --- a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/type/URLConsts.java +++ b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/type/URLConsts.java @@ -29,7 +29,7 @@ public final class URLConsts { /** * 应用套件oauth授权 */ - public static final String SUITE_OAUTH_URL = "https://qy.weixin.qq.com/cgi-bin/loginpage?suite_id=%s&pre_auth_code=%s&redirect_uri=%s&state=%s"; + public static final String SUITE_OAUTH_URL = "https://open.work.weixin.qq.com/3rdapp/install?suite_id=%s&pre_auth_code=%s&redirect_uri=%s&state=%s"; /** * 企业号获取ticket的url */
- * 1) 发送人员列表存在错误的userid:执行发送,开发者需注意返回结果说明 - * 2)发送人员不在通讯录权限范围内:不执行发送任务,返回首个出错的userid - * 3)发送人员不在应用可见范围内:不执行发送任务,返回首个出错的userid - *
- * 正常情况下返回{"type":"TYPE","media_id":"MEDIA_ID","created_at":123456789}, - * 否则抛出异常. - *
- * 、新增的永久素材也可以在公众平台官网素材管理模块中看到,永久素材的数量是有上限的,请谨慎新增。图文消息素材和图片素材的上限为5000, - * 其他类型为1000 - *
- * 1.模板中的部门需填写部门ID,多个部门用分号分隔,部门ID必须为数字 - * 2.文件中存在、通讯录中也存在的成员,更新成员在文件中指定的字段值 - * 3.文件中存在、通讯录中不存在的成员,执行添加操作 - * 4.通讯录中存在、文件中不存在的成员,保持不变 - *
- * 1.模板中的部门需填写部门ID,多个部门用分号分隔,部门ID必须为数字 - * 2.文件中存在、通讯录中也存在的成员,完全以文件为准 - * 3.文件中存在、通讯录中不存在的成员,执行添加操作 - * 4.通讯录中存在、文件中不存在的成员,执行删除操作。出于安全考虑,如果需要删除的成员多于50人, - * 且多于现有人数的20%以上,系统将中止导入并返回相应的错误码 - *
- * 1.文件中存在、通讯录中也存在的部门,执行修改操作 - * 2.文件中存在、通讯录中不存在的部门,执行添加操作 - * 3.文件中不存在、通讯录中存在的部门,当部门为空时,执行删除操作 - * 4.CSV文件中,部门名称、部门ID、父部门ID为必填字段,部门ID必须为数字;排序为可选字段,置空或填0不修改排序 - *
+ * 1) 发送人员列表存在错误的userid:执行发送,开发者需注意返回结果说明 + * 2)发送人员不在通讯录权限范围内:不执行发送任务,返回首个出错的userid + * 3)发送人员不在应用可见范围内:不执行发送任务,返回首个出错的userid + *
+ * 正常情况下返回{"type":"TYPE","media_id":"MEDIA_ID","created_at":123456789}, + * 否则抛出异常. + *
+ * 、新增的永久素材也可以在公众平台官网素材管理模块中看到,永久素材的数量是有上限的,请谨慎新增。图文消息素材和图片素材的上限为5000, + * 其他类型为1000 + *
+ * 1.模板中的部门需填写部门ID,多个部门用分号分隔,部门ID必须为数字 + * 2.文件中存在、通讯录中也存在的成员,更新成员在文件中指定的字段值 3.文件中存在、通讯录中不存在的成员,执行添加操作 + * 4.通讯录中存在、文件中不存在的成员,保持不变 + *
+ * 1.模板中的部门需填写部门ID,多个部门用分号分隔,部门ID必须为数字 2.文件中存在、通讯录中也存在的成员,完全以文件为准 + * 3.文件中存在、通讯录中不存在的成员,执行添加操作 + * 4.通讯录中存在、文件中不存在的成员,执行删除操作。出于安全考虑,如果需要删除的成员多于50人, + * 且多于现有人数的20%以上,系统将中止导入并返回相应的错误码 + *
+ * 1.文件中存在、通讯录中也存在的部门,执行修改操作 2.文件中存在、通讯录中不存在的部门,执行添加操作 + * 3.文件中不存在、通讯录中存在的部门,当部门为空时,执行删除操作 + * 4.CSV文件中,部门名称、部门ID、父部门ID为必填字段,部门ID必须为数字;排序为可选字段,置空或填0不修改排序 + *