使用Java开发微信公众平台——消息的接收与响应
Posted tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Java开发微信公众平台——消息的接收与响应相关的知识,希望对你有一定的参考价值。
上一篇文章中,我们学习了使用Java语言开发微信公众平台的第一部分——环境搭建与开发接入。那么,本篇文章,我们将在此基础上,学习【消息的接收与响应】。
喜欢本文,请点击下方喜欢按钮呗!❤️
当然,我们在后续的开发过程中肯定还是离不开微信提供的开发者文档:http://mp.weixin.qq.com/wiki/home/,打开开发文档,点击左侧的“消息管理”——“接受普通消息”,本节内容,我们来学习普通消息的接收与响应。
微信开发文档
之前我们强调过,接入微信公众平台的时候,微信将发送Get请求给我们的校验方法。那当我们接收消息的时候,微信将向我们发送Post请求,并以XML的格式发送与接收数据。并且在开发过程中,我们需要注意一点小细节:
微信服务器在五秒内收不到响应会断掉连接,并且重新发起请求,总共重试三次。假如服务器无法保证在五秒内处理并回复,可以直接回复空串,微信服务器不会对此作任何处理,并且不会发起重试。
下面,我们来看一下微信发给我们的普通文本消息的XML包结构,各标签所包裹的内容,在官方文档中说的很详细:
普通文本消息的XML包结构
了解了微信给我们推送的XML包结构,下面我们就通过创建文本消息,来实现消息的接收与响应:
继续打开我们上次编写的Servlet,即微信请求的Servlet地址。在Post方法中,接收微信发送的XML内容,当然在此之前,为了方便我们的数据处理,我们需要新建两个方法,将XML数据类型,转成我们熟悉的集合类型。反之,能够将我们的对象类型,转成XML类型,并返回给微信公众平台:
1、将接收到的XML格式,转为集合对象(Map)
这里,我们在我们的Util包下,新建一个Message工具类:
首先,新建一个方法,将我们接收到的XML格式,转化为Map格式。在这个过程中,我们需要借助一个dom4j的jar包。并将其放置在Web-INF下的lib包中。这个jar包很容易下载,此处提供一个下载链接,如果下载遇到问题,可加入杰瑞教育技术交流群(452379712)下载。
好了,借助dom4j的jar包,我们可以编写方法,将XML格式,转化对Map对象格式,方法实现如下:
2、类似上述方法,我们需要编写方法,将我们的消息对象,转成XML。
此处,我们仍需借助一个jar包:xstream-x.x.jar,导入方式同dom4j
当然,首先,我们需要新建一个实体类,用于承载消息对象,实体类中6个属性,分别对应上述微信给我们发送的XML文本的6个参数,并提供对应Get/Set方法以及空参/全参构造,此处不做赘述:
接下来,我们编写方法,来转换此文本消息类的对象,将其转换为XML格式返回:
3、写完上述两个处理方法后,我们来实现【消息的接收与响应】,
回到我们最开始的Servlet中,在doPost方法中进行编写操作:
这样,我们就成功的完成了文本消息的接收与响应。实现效果如下,用户发送任何内容,将会返回各种信息:
运行效果图
【附录】相关代码:
一、Servlet中的doPost方法 :
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
PrintWriter out = response.getWriter();
String str = null;
try
//将request请求,传到Message工具类的转换方法中,返回接收到的Map对象
Map map = Message.xmlToMap(request);
//从集合中,获取XML各个节点的内容
String ToUserName = map.get("ToUserName");
String FromUserName = map.get("FromUserName");
String CreateTime = map.get("CreateTime");
String MsgType = map.get("MsgType");
String Content = map.get("Content");
String MsgId = map.get("MsgId");
if(MsgType.equals("text"))//判断消息类型是否是文本消息(text)
TestMessage message = new TestMessage();
message.setFromUserName(ToUserName);//原来【接收消息用户】变为回复时【发送消息用户】
message.setToUserName(FromUserName);
message.setMsgType("text");
message.setCreateTime(new Date().getTime());//创建当前时间为消息时间
message.setContent("您好,"+FromUserName+"\\n我是:"+ToUserName
+"\\n您发送的消息类型为:"+MsgType+"\\n您发送的时间为"+CreateTime
+"\\n我回复的时间为:"+message.getCreateTime()+"您发送的内容是"+Content);
str = Message.objectToXml(message); //调用Message工具类,将对象转为XML字符串
二、Message处理工具类 :
/**
新建方法,将接收到的XML格式,转化为Map对象
@param request 将request对象,通过参数传入
@return 返回转换后的Map对象
*/
public static Map xmlToMap(HttpServletRequest request) throws IOException, DocumentException
Map map = new HashMap();
//从dom4j的jar包中,拿到SAXReader对象。
SAXReader reader = new SAXReader();
InputStream is = request.getInputStream();//从request中,获取输入流
Document doc = reader.read(is);//从reader对象中,读取输入流
Element root = doc.getRootElement();//获取XML文档的根元素
List list = root.elements();//获得根元素下的所有子节点
for (Element e : list)
map.put(e.getName(), e.getText());//遍历list对象,并将结果保存到集合中
is.close();
return map;
/**
将文本消息对象转化成XML格式
@param message 文本消息对象
@return 返回转换后的XML格式
*/
public static String objectToXml(TestMessage message)
XStream xs = new XStream();
//由于转换后xml根节点默认为class类,需转化为
xs.alias("xml", message.getClass());
return xs.toXML(message);
三、TestMessage实体类 :
//属性如下
private String ToUserName;
private String FromUserName;
private Long CreateTime;
private String MsgType;
private String Content;
private String MsgId;
//以及Get/Set方法
【版权声明】
原创内容,欢迎转载!转载请注明出处!需要源码下载,请联系博主!
【原文出处】http://www.cnblogs.com/qdjianghao/
【版权声明】本文版权归原作者@小风飞鱼所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
【联系方式】1987289469
使用Java语言开发微信公众平台——音乐消息的回复
在上一节课程中,我们学习了图片消息的回复功能。根据微信公众平台的消息类型显示,微信共支持文本、图片、语音、视频、音乐、图文等6种消息类型的回复:
其中,我们已经实现了文本、图文、图片等消息的回复处理,而语音、视频两种消息类型的功能与图片消息完全一样。均需使用我们写好的文件上传接口,上传文件并获得MediaID,从而使用MediaID推送图片、语音、视频。没有学习过的同学,可进入杰瑞教育博客园继续学习:http://www.cnblogs.com/jerehedu/p/6781456.html
今天,我们来学习最后一种消息类型——音乐消息的回复功能。
一、音乐消息数据结构
按照国际惯例,在学习一种新的消息回复的时候,我们都需要首先了解这种消息的数据结构以及XML 包结构。那么,让我们进入微信开发帮助文档看一下:
http://mp.weixin.qq.com/wiki/1/6239b44c206cab9145b1d52c67e6c551.html
我们可以清晰的看到这样一段XML数据结构:
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>12345678</CreateTime>
<MsgType><![CDATA[music]]></MsgType>
<Music>
<Title><![CDATA[TITLE]]></Title>
<Description><![CDATA[DESCRIPTION]]></Description>
<MusicUrl><![CDATA[MUSIC_Url]]></MusicUrl>
<HQMusicUrl><![CDATA[HQ_MUSIC_Url]]></HQMusicUrl>
<ThumbMediaId><![CDATA[media_id]]></ThumbMediaId>
</Music>
</xml>
官方给出的解释如下:
在这当中,我们看到发送音乐消息,除了必备的标题、描述、链接等。还需要一张缩略图id,那么聪明的同学应该知道怎么处理了……
二、上传缩略图并取得ID
上周我们已经实现了图片的上传功能,其中在测试类中上传图片是,我们选择的上传的类型为image:
根据上传的媒体文件类型【媒体文件类型,分别有图片(image)、语音(voice)、视频(video)和缩略图(thumb)】我们只需要把image修改为thumb,即可实现缩略图的上传,并取得MediaID:
public static void main(String[] args) throws ClientProtocolException, IOException,
KeyManagementException, NoSuchAlgorithmException, NoSuchProviderException { AccessToken token = WeiXinUtil.getAccessToken(); System.out.println("Access_Token为:"+token.getToken()); System.out.println("有效时间为:"+token.getExpiresIn()); String path = "E:/bg.jpg"; String MediaId = WeiXinUtil.upload(path, token.getToken(), "thumb");
}
注意:上传文件类型只能是JPG且小于64KB。最终,得到thumb_media_id如下:4Ln9zjbEdBjMWS-TtYCmd89stx7CVmmmMGx1wdKul9-g6zOHQYJMukPEsC0pVd4h
得到缩略图的ID以后,我们就可以进行音乐消息的组装了。
三、组装音乐消息实体对象
① 组装Music.java实体
所需属性如下,并提供Get/Set方法
② 组装MusicMessage.java实体
所需属性如下,并继承自MusicMessage类。
四、编写音乐对象转XML方法
回到MessageUtil工具类,撰写音乐对象转XML方法:
public static String musicMessageToXml(MusicMessage musicMessage){
XStream xstream = new XStream();
xstream.alias("xml", musicMessage.getClass());
return xstream.toXML(musicMessage);
}
五、编写组装音乐消息的方法
继续在MessageUtil类中,进行音乐消息的组装。当然,需要提前准备:缩略图ID、音乐链接。其中,我在WebRoot下的res文件夹中,放了一个MP3音乐文件,因此可得到我自己的音乐链接:http://jerehedu.applinzi.com/res/达康书记不容易.mp3
/**
* 组装音乐消息
*/
public static String initMusicMessage(String toUserName,String fromUserName){
String message = null;
Music music = new Music();
music.setThumbMediaId("4Ln9zjbEdBjMWS-TtYCmd89stx7CVmmmMGx1wdKul9-g6zOHQYJMukPEsC0pVd4h");
music.setTitle("达康书记不同意");
music.setDescription("达康书记不容易——山东工商学院杨军老师作词作曲演唱");
music.setMusicUrl("http://jerehedu.applinzi.com/res/达康书记不容易.mp3");
music.setHQMusicUrl("http://jerehedu.applinzi.com/res/达康书记不容易.mp3");
MusicMessage musicMessage = new MusicMessage();
musicMessage.setFromUserName(toUserName);
musicMessage.setToUserName(fromUserName);
musicMessage.setMsgType(MESSAGE_MUSIC);
musicMessage.setCreateTime(new Date().getTime());
musicMessage.setMusic(music);
message = musicMessageToXml(musicMessage);
return message;
}
六、测试与运行
上述方法编写完成后,回到Servlet中调用方法,当回复5的时候,接收音乐:
运行效果如下:
以上是关于使用Java开发微信公众平台——消息的接收与响应的主要内容,如果未能解决你的问题,请参考以下文章