企业可以主动发消息给员工,消息量不受限制。
调用接口时,使用Https协议、JSON数据包格式,数据包不需做加密处理。
目前支持文本、图片、语音、视频、文件、图文等消息类型。除了news类型,其它类型的消息可在发送时加上保密选项,保密消息会被打上水印,并且只有接收者才能阅读。
目前有7种消息类型:text\image\voice\video\file\news\mpnews
统一的Post接口地址:https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=ACCESS_TOKEN
发送消息 SMessage:
package jsp.weixin.msg.Util; import java.util.ArrayList; import java.util.List; import net.sf.json.JSONArray; import jsp.weixin.ParamesAPI.util.ParamesAPI; import jsp.weixin.ParamesAPI.util.WeixinUtil; import jsp.weixin.msg.Resp.Article; /** * 发送消息类 * @author Engineer.Jsp * @date 2014.10.11 */ public class SMessage { //发送接口 public static String POST_URL = "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=ACCESS_TOKEN"; /** * text消息 * @param touser UserID列表(消息接收者,多个接收者用‘|’分隔)。特殊情况:指定为@all,则向关注该企业应用的全部成员发送————"touser": "UserID1|UserID2|UserID3" * @param toparty PartyID列表,多个接受者用‘|’分隔。当touser为@all时忽略本参数————"toparty": " PartyID1 | PartyID2 " * @param totag TagID列表,多个接受者用‘|’分隔。当touser为@all时忽略本参数————"totag": " TagID1 | TagID2 " * @param msgtype 消息类型,此时固定为:text * @param agentid 企业应用的id,整型。可在应用的设置页面查看 * @param content 消息内容 * @param safe 表示是否是保密消息,0表示否,1表示是,默认0 * */ public static String STextMsg(String touser,String toparty,String totag,String agentid,String content){ String PostData = "{\"touser\": %s,\"toparty\": %s,\"totag\": %s,\"msgtype\": \"text\",\"agentid\": %s,\"text\": {\"content\": %s},\"safe\":\"0\"}"; return String.format(PostData, touser,toparty,totag,agentid,content); } /** * image消息 * @param touser UserID列表(消息接收者,多个接收者用‘|’分隔)。特殊情况:指定为@all,则向关注该企业应用的全部成员发送————"touser": "UserID1|UserID2|UserID3" * @param toparty PartyID列表,多个接受者用‘|’分隔。当touser为@all时忽略本参数————"toparty": " PartyID1 | PartyID2 " * @param totag TagID列表,多个接受者用‘|’分隔。当touser为@all时忽略本参数————"totag": " TagID1 | TagID2 " * @param msgtype 消息类型,此时固定为:image * @param agentid 企业应用的id,整型。可在应用的设置页面查看 * @param media_id 媒体资源文件ID * @param safe 表示是否是保密消息,0表示否,1表示是,默认0 * */ public static String SImageMsg(String touser,String toparty,String agentid ,String media_id){ String PostData = "{\"touser\": %s,\"toparty\": %s,\"msgtype\": \"image\",\"agentid\": %s,\"image\": {\"media_id\": %s},\"safe\":\"0\"}"; return String.format(PostData, touser,toparty,agentid,media_id); } /** * voice消息 * @param touser UserID列表(消息接收者,多个接收者用‘|’分隔)。特殊情况:指定为@all,则向关注该企业应用的全部成员发送————"touser": "UserID1|UserID2|UserID3" * @param toparty PartyID列表,多个接受者用‘|’分隔。当touser为@all时忽略本参数————"toparty": " PartyID1 | PartyID2 " * @param totag TagID列表,多个接受者用‘|’分隔。当touser为@all时忽略本参数————"totag": " TagID1 | TagID2 " * @param msgtype 消息类型,此时固定为:voice * @param agentid 企业应用的id,整型。可在应用的设置页面查看 * @param media_id 媒体资源文件ID * @param safe 表示是否是保密消息,0表示否,1表示是,默认0 * */ public static String SVoiceMsg(String touser,String toparty,String totag,String agentid ,String media_id){ String PostData = "{\"touser\": %s,\"toparty\": %s,\"totag\": %s,\"msgtype\": \"voice\",\"agentid\": %s,\"voice\": {\"media_id\": %s},\"safe\":\"0\"}"; return String.format(PostData, touser,toparty,totag,agentid,media_id); } /** * video消息 * @param touser UserID列表(消息接收者,多个接收者用‘|’分隔)。特殊情况:指定为@all,则向关注该企业应用的全部成员发送————"touser": "UserID1|UserID2|UserID3" * @param toparty PartyID列表,多个接受者用‘|’分隔。当touser为@all时忽略本参数————"toparty": " PartyID1 | PartyID2 " * @param totag TagID列表,多个接受者用‘|’分隔。当touser为@all时忽略本参数————"totag": " TagID1 | TagID2 " * @param msgtype 消息类型,此时固定为:video * @param agentid 企业应用的id,整型。可在应用的设置页面查看 * @param media_id 媒体资源文件ID * @param title 视频消息的标题 * @param description 视频消息的描述 * @param safe 表示是否是保密消息,0表示否,1表示是,默认0 */ public static String SVideoMsg(String touser,String toparty,String totag,String agentid,String media_id,String title,String description){ String PostData = "{\"touser\": %s,\"toparty\": %s,\"totag\": %s,\"msgtype\": \"video\",\"agentid\": %s,\" video\": {\"media_id\": %s,\"title\": %s,\"description\": %s},\"safe\":\"0\"}"; return String.format(PostData, touser,toparty,totag,agentid,media_id,title,description); } /** * file消息 * @param touser UserID列表(消息接收者,多个接收者用‘|’分隔)。特殊情况:指定为@all,则向关注该企业应用的全部成员发送————"touser": "UserID1|UserID2|UserID3" * @param toparty PartyID列表,多个接受者用‘|’分隔。当touser为@all时忽略本参数————"toparty": " PartyID1 | PartyID2 " * @param totag TagID列表,多个接受者用‘|’分隔。当touser为@all时忽略本参数————"totag": " TagID1 | TagID2 " * @param msgtype 消息类型,此时固定为:file * @param agentid 企业应用的id,整型。可在应用的设置页面查看 * @param media_id 媒体资源文件ID * @param safe 表示是否是保密消息,0表示否,1表示是,默认0 * */ public static String SFileMsg(String touser,String toparty,String totag,String agentid ,String media_id){ String PostData = "{\"touser\": %s,\"toparty\": %s,\"totag\": %s,\"msgtype\": \"file\",\"agentid\": %s,\"file\": {\"media_id\": %s},\"safe\":\"0\"}"; return String.format(PostData, touser,toparty,totag,agentid,media_id); } /** * news消息 * @param touser UserID列表(消息接收者,多个接收者用‘|’分隔)。特殊情况:指定为@all,则向关注该企业应用的全部成员发送————"touser": "UserID1|UserID2|UserID3" * @param toparty PartyID列表,多个接受者用‘|’分隔。当touser为@all时忽略本参数————"toparty": " PartyID1 | PartyID2 " * @param totag TagID列表,多个接受者用‘|’分隔。当touser为@all时忽略本参数————"totag": " TagID1 | TagID2 " * @param msgtype 消息类型,此时固定为:news * @param agentid 企业应用的id,整型。可在应用的设置页面查看 * @param articlesList 图文集合 */ public static String SNewsMsg(String touser,String toparty,String totag,String agentid , String articlesList){ String postData = "{\"touser\": %s,\"toparty\": %s,\"totag\": %s,\"msgtype\": \"news\",\"agentid\": %s,\"news\": {\"articles\":%s}}"; return String.format(postData, touser,toparty,totag,agentid,articlesList); } /** * mpnews消息 * @param touser UserID列表(消息接收者,多个接收者用‘|’分隔)。特殊情况:指定为@all,则向关注该企业应用的全部成员发送————"touser": "UserID1|UserID2|UserID3" * @param toparty PartyID列表,多个接受者用‘|’分隔。当touser为@all时忽略本参数————"toparty": " PartyID1 | PartyID2 " * @param totag TagID列表,多个接受者用‘|’分隔。当touser为@all时忽略本参数————"totag": " TagID1 | TagID2 " * @param msgtype 消息类型,此时固定为:mpnews * @param agentid 企业应用的id,整型。可在应用的设置页面查看 * @param articlesList mpnews集合 */ public static String SMpNewsMsg(String touser,String toparty,String totag,String agentid , String articlesList){ String postData = "{\"touser\": %s,\"toparty\": %s,\"totag\": %s,\"msgtype\": \"mpnews\",\"agentid\": %s,\"mpnews\": {\"articles\":%s}\"safe\":\"0\"}"; return String.format(postData, touser,toparty,totag,agentid,articlesList); } //示例 public static void main(String[] args) { /** * news示例 * */ // 调取凭证 String access_token = WeixinUtil.getAccessToken(ParamesAPI.corpId, ParamesAPI.secret).getToken(); // 新建图文 Article article1 = new Article(); article1.setTitle("news消息测试-1"); article1.setDescription(""); article1.setPicUrl("http://112.124.111.3/weixinClient/images/weather3.png"); article1.setUrl("http://112.124.111.3/weixinClient/images/weather3.png"); Article article2 = new Article(); article2.setTitle("news消息测试-2"); article2.setDescription(""); article2.setPicUrl("http://112.124.111.3/weixinClient/images/weather3.png"); article2.setUrl("http://112.124.111.3/weixinClient/images/weather3.png"); // 整合图文 List<Article> list = new ArrayList<Article>(); list.add(article1); list.add(article2); // 图文转json String articlesList = JSONArray.fromObject(list).toString(); // Post的数据 String PostData = SNewsMsg("UserID1|UserID2|UserID3", "PartyID1 | PartyID2", "TagID1 | TagID2", "1", articlesList); int result = WeixinUtil.PostMessage(access_token, "POST", POST_URL, PostData); // 打印结果 if(0==result){ System.out.println("操作成功"); } else { System.out.println("操作失败"); } } }
commons-codec-1.9.jar:http://download.csdn.net/detail/jspping/8021291
dom4j-1.6.jar:http://download.csdn.net/detail/jspping/8021321
xstream-1.3:http://download.csdn.net/detail/jspping/8021333
commons-io.jar:http://download.csdn.net/detail/jspping/8021303
json.jar:http://download.csdn.net/detail/jspping/7539279
目前项目结构图:
需要管理员对应用有使用权限,对收件人touser、toparty、totag有查看权限,否则本次调用失败。
如果对应用或收件人、部门、标签任何一个无权限,则本次发送失败;如果收件人、部门或标签不存在,发送仍然执行,但返回无效的部分。
{ "errcode": 0, "errmsg": "ok", "invaliduser": "UserID1", "invalidparty":"PartyID1", "invalidtag":"TagID1" }
本地测试图:
微信端结果图:
有疑问的可以再次留言,看到第一时间回复,欢迎大伙儿留言和转载~ 谢谢!