使用Java开发微信公众平台(二)——消息的接收与响应
上一篇文章(http://www.jerehedu.com/fenxiang/171807_for_detail.htm )中,我们学习了使用Java语言开发微信公众平台的第一部分——环境搭建与开发接入。那么,本篇文章,我们将在此基础上,学习【消息的接收与响应】。
当然,我们在后续的开发过程中肯定还是离不开微信提供的开发者文档:http://mp.weixin.qq.com/wiki/home/ ,打开开发文档,点击左侧的“消息管理”——“接受普通消息”,本节内容,我们来学习普通消息的接收与响应。
之前我们强调过,接入微信公众平台的时候,微信将发送Get请求给我们的校验方法。那当我们接收消息的时候,微信将向我们发送Post请求,并以XML的格式发送与接收数据。并且在开发过程中,我们需要注意一点小细节:
微信服务器在五秒内收不到响应会断掉连接,并且重新发起请求,总共重试三次。假如服务器无法保证在五秒内处理并回复,可以直接回复空串,微信服务器不会对此作任何处理,并且不会发起重试。
下面,我们来看一下微信发给我们的普通文本消息的XML包结构:
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>1348831860</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[this is a test]]></Content>
<MsgId>1234567890123456</MsgId>
</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<String, String> 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字符串
}
} catch (DocumentException e) {
e.printStackTrace();
}
out.print(str); //返回转换后的XML字符串
out.close();
}
二、 Message处理工具类:
/**
* 新建方法,将接收到的XML格式,转化为Map对象
* @param request 将request对象,通过参数传入
* @return 返回转换后的Map对象
*/
public static Map<String, String> xmlToMap(HttpServletRequest request) throws IOException, DocumentException{
Map<String, String> map = new HashMap<String, String>();
//从dom4j的jar包中,拿到SAXReader对象。
SAXReader reader = new SAXReader();
InputStream is = request.getInputStream();//从request中,获取输入流
Document doc = reader.read(is);//从reader对象中,读取输入流
Element root = doc.getRootElement();//获取XML文档的根元素
List<Element> 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类,需转化为<xml>
xs.alias("xml", message.getClass());
return xs.toXML(message);
}
三、 TestMessage实体类:
package com.jredu.entity;
public class TestMessage {
private String ToUserName;
private String FromUserName;
private Long CreateTime;
private String MsgType;
private String Content;
private String MsgId;
public String getToUserName() {
return ToUserName;
}
public void setToUserName(String toUserName) {
ToUserName = toUserName;
}
public String getFromUserName() {
return FromUserName;
}
public void setFromUserName(String fromUserName) {
FromUserName = fromUserName;
}
public Long getCreateTime() {
return CreateTime;
}
public void setCreateTime(long l) {
CreateTime = l;
}
public String getMsgType() {
return MsgType;
}
public void setMsgType(String msgType) {
MsgType = msgType;
}
public String getContent() {
return Content;
}
public void setContent(String content) {
Content = content;
}
public String getMsgId() {
return MsgId;
}
public void setMsgId(String msgId) {
MsgId = msgId;
}
public TestMessage(String toUserName, String fromUserName,
Long createTime, String msgType, String content, String msgId) {
super();
ToUserName = toUserName;
FromUserName = fromUserName;
CreateTime = createTime;
MsgType = msgType;
Content = content;
MsgId = msgId;
}
public TestMessage() {
super();
}
}
使用Java开发微信公众平台(二)——消息的接收与响应的更多相关文章
- 微信开发——微信公众平台实现消息接收以及消息的处理(Java版)
本文主要讲述了如何在微信公众平台实现消息接收以及消息的处理,使用java语言开发,现在把实现思路和代码整理出来分先给兄弟们,希望给他们带来帮助. 温馨提示: 这篇文章是依赖前几篇的文章的. 第一篇:微 ...
- 使用Java开发微信公众平台(四)——消息的接收与响应
上一篇文章(http://www.jerehedu.com/fenxiang/171807_for_detail.htm )中,我们学习了使用Java语言开发微信公众平台的第一部分——环境搭建与开发接 ...
- 运用Java对微信公众平台二次开发技术——开发者模式接入
当初我在这碰到了很多问题,市面上以及网络上的资料特别少,所以当初碰了很多壁,所以现在跟大家分享一下,如何用Java,对微信公众平台进行二次开发. 一.开发预备知识: 最基本的JavaSE与JavaWe ...
- 使用JAVA开发微信公众平台(一)——环境搭建与开发接入
一. 初始微信公众平台 微信公众平台,即我们平时所说的"公众号",曾用名"官方平台"."媒体平台",但最终命名为"公众平台&quo ...
- Java开发微信公众号模板消息【同步|异步】
第一步:申请模板消息功能并添加模板 在微信公众平台找到你需要的模板,并添加上即可: 第二步:添加功能模块后开始开发 功能中使用的类及代码: 发送数据主实体类: Template.java packag ...
- 使用java开发微信公众平台(1)
目录 开发服务器 域名验证 获取access_token 自定义菜单 个人账号不能定义url访问服务器,使用测试号就不用认证添加url了,进入公众平台测试账号 开发服务器 域名验证 进入公众平台测试账 ...
- java开发微信公众平台备忘
简单记录下前段时间开发的电子书的 公众平台的一些备忘及开发心得经验等 eclipse的一些技巧: 1.ctrl+shift+o 自动添加必要import空间及移除无用import 项目备忘+说明 1. ...
- 使用Java语言开发微信公众平台(七)——音乐消息的回复
在上一节课程中,我们学习了图片消息的回复功能.根据微信公众平台的消息类型显示,微信共支持文本.图片.语音.视频.音乐.图文等6种消息类型的回复: 其中,我们已经实现了文本.图文.图片等消息的回复处理, ...
- Java开发微信公众号(二)---开启开发者模式,接入微信公众平台开发
接入微信公众平台开发,开发者需要按照如下步骤完成: 1.填写服务器配置 2.验证服务器地址的有效性 3.依据接口文档实现业务逻辑 资料准备: 1.一个可以访问的外网,即80的访问端口,因为微信公众号接 ...
随机推荐
- BZOJ.4516.[SDOI2016]生成魔咒(后缀数组 RMQ)
题目链接 后缀自动机做法见这(超好写啊). 后缀数组是可以做的: 本质不同的字符串的个数为 \(子串个数-\sum_{ht[i]}\),即 \(\frac{n(n+1)}{2}-\sum_{ht[i] ...
- 【BZOJ】3732: Network【Kruskal重构树】
3732: Network Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2812 Solved: 1363[Submit][Status][Dis ...
- java自动给版本升级,遇9变0且前面一个版本加1
/** * 自动升级版本号,版本号+1 * @param version * @return */ private String autoUpgradeVersion(String version){ ...
- Anaconda、Miniconda、Conda、pip的相互关系_我是刘振岗_新浪博客
Anaconda.Miniconda.Conda.pip的相互关系_我是刘振岗_新浪博客 http://blog.sina.com.cn/s/blog_8a122dcf0102x9vn.html
- PDCA管理方法论
PDCA管理方法论 PDCA管理循环,由日本的高管们在1950年日本科学家和工程师联盟研讨班上学到的戴明环改造而成,最先是由休哈特博士提出来的,由戴明把PDCA发扬光大,并且用到质量领域,故称为质量环 ...
- Technical Information ARM-related JTAG / SWD / SWV / ETM Target Interfaces
https://www.computex.co.jp/eg/products/pdf/technical_pdf/arm_if01_gijutsu_eng.pdf
- Team Foundation Server (TFS) 2015 安装指导
1. 概述 微软于8月6日发布了大家期待已久的TFS 2015正式版, https://www.visualstudio.com/en-us/news/tfs2015-vs.aspx ,新版本包含的大 ...
- 最简单的例子理解Javascript闭包
理解Javascript的闭包非常关键,本篇试图用最简单的例子理解此概念. function greet(sth){ return function(name){ console.log(sth + ...
- 延迟调用或多次调用第三方的Web API服务
当我们调用第三方的Web API服务的时候,不一定每次都是成功的.这时候,我们可能会再多尝试几次,也有可能延迟一段时间再去尝试调用服务. Task的静态方法Delay允许我们延迟执行某个Task,此方 ...
- java的异常和java web容器的异常
一.java的异常,只要catch住异常了,程序就不会挂,依然会执行catch之后的语句 Java程序发生异常就挂了吗? 为了验证程序不会挂,我写了个例子给大家看看. 测试代码: import jav ...