使用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方法


【版权声明】

原创内容,欢迎转载!转载请注明出处!需要源码下载,请联系博主!微博@小风飞鱼

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,937评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,503评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,712评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,668评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,677评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,601评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,975评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,637评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,881评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,621评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,710评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,387评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,971评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,947评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,189评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,805评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,449评论 2 342

推荐阅读更多精彩内容