上一篇文章(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开发微信公众平台(四)——消息的接收与响应的更多相关文章

  1. 使用Java开发微信公众平台(二)——消息的接收与响应

    上一篇文章(http://www.jerehedu.com/fenxiang/171807_for_detail.htm )中,我们学习了使用Java语言开发微信公众平台的第一部分——环境搭建与开发接 ...

  2. 微信开发——微信公众平台实现消息接收以及消息的处理(Java版)

    本文主要讲述了如何在微信公众平台实现消息接收以及消息的处理,使用java语言开发,现在把实现思路和代码整理出来分先给兄弟们,希望给他们带来帮助. 温馨提示: 这篇文章是依赖前几篇的文章的. 第一篇:微 ...

  3. 使用Java语言开发微信公众平台(四)——图文消息的发送与响应

    在上一篇文章中,我们实现了被关注回复与关键词回复功能.在用户关注的时候自动推送功能菜单,并根据用户输入的关键词,回复特定信息.但是,我们只能回复文本消息给用户,如何才回复一条图文消息呢?本周,我们一起 ...

  4. 使用JAVA开发微信公众平台(一)——环境搭建与开发接入

    一. 初始微信公众平台 微信公众平台,即我们平时所说的"公众号",曾用名"官方平台"."媒体平台",但最终命名为"公众平台&quo ...

  5. Java开发微信公众号模板消息【同步|异步】

    第一步:申请模板消息功能并添加模板 在微信公众平台找到你需要的模板,并添加上即可: 第二步:添加功能模块后开始开发 功能中使用的类及代码: 发送数据主实体类: Template.java packag ...

  6. 使用java开发微信公众平台(1)

    目录 开发服务器 域名验证 获取access_token 自定义菜单 个人账号不能定义url访问服务器,使用测试号就不用认证添加url了,进入公众平台测试账号 开发服务器 域名验证 进入公众平台测试账 ...

  7. java开发微信公众平台备忘

    简单记录下前段时间开发的电子书的 公众平台的一些备忘及开发心得经验等 eclipse的一些技巧: 1.ctrl+shift+o 自动添加必要import空间及移除无用import 项目备忘+说明 1. ...

  8. 使用Java语言开发微信公众平台(七)——音乐消息的回复

    在上一节课程中,我们学习了图片消息的回复功能.根据微信公众平台的消息类型显示,微信共支持文本.图片.语音.视频.音乐.图文等6种消息类型的回复: 其中,我们已经实现了文本.图文.图片等消息的回复处理, ...

  9. Java开发微信公众号(四)---微信服务器post消息体的接收及消息的处理

    在前几节文章中我们讲述了微信公众号环境的搭建.如何接入微信公众平台.以及微信服务器请求消息,响应消息,事件消息以及工具处理类的封装:接下来我们重点说一下-微信服务器post消息体的接收及消息的处理,这 ...

随机推荐

  1. NodeJS学习笔记 (10)网络TCP-net(ok)

    模块概览 net模块是同样是nodejs的核心模块.在http模块概览里提到,http.Server继承了net.Server,此外,http客户端与http服务端的通信均依赖于socket(net. ...

  2. 去除windows编辑文本中的回车符

    情景描述: 最近,huskiesir的朋友遇到了一个很奇葩的问题.那就是他在windows上搭建了一个http服务,把A脚本放在了上面并用linux去下载和执行,但是在执行的时候出现了问题,在linu ...

  3. element-ui table 行内编辑

    EditRow.ts vue+element-ui+slot-scope原生实现可编辑表格 interface NoParamConstructor<T> { new(): T; } ex ...

  4. [NOI2015]品酒大会(SA数组)

    [NOI2015]品酒大会 题目描述 一年一度的"幻影阁夏日品酒大会"隆重开幕了.大会包含品尝和趣味挑战 两个环节,分别向优胜者颁发"首席品酒家"和" ...

  5. python main函数

    关于Python的主(main)函数问题 2007-07-23 19:14 初次接触Python的人会很不习惯Python没有main主函数.这里简单的介绍一下,在Python中使用main函数的方法 ...

  6. POJ——T 3255 Roadblocks|| COGS——T 315. [POJ3255] 地砖RoadBlocks || 洛谷—— P2865 [USACO06NOV]路障Roadblocks

    http://poj.org/problem?id=3255 Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 15680   ...

  7. iOS 动画Animation - 5:UIBezier

    首先说明:这是一系列文章,參考本专题下其它的文章有助于你对本文的理解. 在之前的bolg中大家会发现总是会出现UIBezier,可是我也没有做过多介绍,今天就集中介绍一下UIBezier.首先.UIB ...

  8. X的追求道路

    X的追求道路 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描写叙述 X在大家的帮助下最终找到了一个妹纸,于是開始了漫漫的追求之路,那 ...

  9. iOS开发之软键盘使用小技巧

    在iOS开发过程中,有时候须要弹出软键盘进行输入,有时候又须要在某些情况下隐藏软键盘,以提高用户体验. 今天有几个关于软键盘的小技巧和大家分享. (1)仅仅弹出数字键盘 有某些需求中,要求用户仅仅能在 ...

  10. bzoj2843极地旅行社题解

    题目大意 有n座小岛,当中每一个岛都有若干帝企鹅. 一開始岛与岛之间互不相连.有m个操作.各自是在两个岛之间修一座双向桥,若两岛已连通则不修并输出no,若不连通就输出yes并修建.改动一个岛上帝企鹅的 ...