文档章节

微信企业号发送消息接口-Java

闪电
 闪电
发布于 2015/05/18 22:27
字数 2025
阅读 234
收藏 1
刚写完一遍日志,再接再厉,把发送消息接口也整了,这个消息接口的不同于公众号的,消息类型有很多种,整个类写到了大概200行左右代码吧,用到了比较多的 正则表达式,json封装,网络请求等

企业可以主动发消息给员工,消息量不受限制


调用接口时,使用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("操作失败");
		}
}
}


上一篇说到的,项目需要用到的jar如下:

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"
}
本地测试图:
 
 
微信端结果图:
 
有疑问的可以再次留言,看到第一时间回复,欢迎大伙儿留言和转载~ 谢谢!
 

本文转载自:http://blog.csdn.net/jspping/article/details/39997105

闪电
粉丝 75
博文 392
码字总数 6789
作品 0
海淀
技术主管
私信 提问
加载中

评论(2)

却又让幽兰枯萎
却又让幽兰枯萎
全部要积分,能不能靠谱点
EyeKey云服务
EyeKey云服务
www.eyekey.com,免费的人脸识别API和SDK,可以去看看哦~~指纹识别、虹膜识别的免费接口也即将公布
weixin-java-tools 1.0.6 发布

weixin-java-tools 1.0.6 发布,更新内容如下: 发布说明 issue #47 rule的reEnter判断时机过迟的问题 issue #51 发送模板消息需要返回 获得的messageid issue #53 模板 消息发送后,微信服务...

jarchan
2014/12/30
3.6K
8
weixin-java-tools 1.3.0,微信公众企业开发 SDK

weixin-java-tools 1.3.0 发布,更新内容如下: PR #198 增加企业号异步任务接口 PR #202 增加点击图文消息跳转链接 issue #200 修改 WxMpServiceImpl#oauth2buildAuthorizationUrl javadoc错...

简单代码
2015/09/18
3.8K
4
Java微信开发_00_资源汇总贴

1.微信公众平台技术文档(https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1445241432) 2.微信企业号开发接口文档(http://qydev.weixin.qq.com/wiki/index.php?title=%E4%B8%BB%E......

rayner
2017/08/07
0
0
weixin-java-tools 1.0.5 发布

weixin-java-tools 1.0.5 发布! 发布说明 issue #32 发送客服消息图文消息时,拼接对象错误 issue #36 News写成Mews的错误 fix 修改消息路由器,使用固定大小的线程池,并在构造函数里提供线...

jarchan
2014/12/01
4.8K
13
weixin-java-tools 1.1.0 发布,重大更新版本

weixin-java-tools 1.1.0 发布(重大更新) issue #23 添加日志输出 issue #66 微信消息去重 issue #69 添加Session支持 issue #71 用xstream替换了jaxb issue #72 企业号成员的avatar和sta...

jarchan
2015/01/23
3.9K
3

没有更多内容

加载失败,请刷新页面

加载更多

thinkphp5.1学习过程四——trait

<?php /** *trait实现了代码的复用 *并且突破了单继承的限制 *trait是类不是类,不能实例化 */ trait Demo1 { public function hello1() { return __METHOD__; } } trait Demo2 { public fu......

大海yht
33分钟前
6
0
DB2 sequence 操作

操作DB2 下 sequence seqName db2数据库一般seq还是比较大的,但是程序在调用的时候还是不可避免的有一些bug, 下面是对于seq一些简单的操作,也作为工作的一些记录 1、命令行取sequence se...

飞雪无痕
40分钟前
6
0
《吊打面试官》系列-秒杀系统设计

你知道的越多,你不知道的越多 点赞再看,养成习惯 GitHub上已经开源 https://github.com/JavaFamily 有一线大厂面试点脑图和个人联系方式,欢迎Star和指教 絮叨 之前写了很多Redis相关的知识...

敖丙
46分钟前
12
0
Qt编写气体安全管理系统11-数据打印

一、前言 在各种软件系统中,数据打印也是常用的功能之一,一般来说会对查询的数据结果导出到excel,还会对查询的数据结果直接打印,在Qt中提供了打印机类QPrinter,在printsupport组件中,可...

飞扬青云
52分钟前
5
0
初级阶段

#include <stdio.h> #include <stdlib.h> int main(){ int a; int Sn = 0; int i; int tmp = 0; scanf_s("%d", &a); for (i = 1; i <= 5; i++) { tmp = tmp * 10 + a; Sn += tmp; } printf("......

Lxxxxx256
53分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部