前面已经配置了微信服务器,那么先开始最简单的接收微信消息吧~
 
可以用我们的微信号来直接进行测试,下面先看测试效果图:
 

这是最基本的文本消息的接收、处理及返回,来看看是怎么实现的吧!
 
首先可以参考微信消息相关的接口文档:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140453
 
具体实现如下:
第一步,接收微信发送的文本消息入口:

 /**
* 处理微信服务器发来的消息
*/
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
// TODO 消息的接收、处理、响应
System.out.println("接口调用了一次"); String ret = IOUtils.toString(request.getInputStream(), "utf-8").toString();
System.out.println(ret); WeChatMsgBL tWeChatMsgBL = new WeChatMsgBL();
String result = tWeChatMsgBL.dealWechatMsg(ret); response.setCharacterEncoding("UTF-8"); // 返回文本消息,将处理结果返回
PrintWriter out = response.getWriter(); System.out.println(result); out.print(result); out.close(); }

可以先输出接收到的xml信息:

 

第二步,解析及处理接收到数据的内容:

从微信提供的接口文档上,我们可以发现,不论是文本消息还是语音、图片等消息,在xml报文中,有部分节点信息的一致的,因此可以创建一个父类在处理(变量名要与xml中节点名一致,大小写也一样,这样后面返回消息结果时很方便):
 /**
* 微信消息主要类
* @author user
*/
public class WechatMsg
{
// 开发者微信号
private String ToUserName = ""; // 发送方帐号(一个OpenID)
private String FromUserName = ""; // 消息创建时间 (整型)
private String CreateTime = ""; // 消息类型
private String MsgType = ""; // 消息id,64位整型
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 String getCreateTime()
{
return CreateTime;
} public void setCreateTime(String createTime)
{
CreateTime = createTime;
} public String getMsgType()
{
return MsgType;
} public void setMsgType(String msgType)
{
MsgType = msgType;
} public String getMsgId()
{
return MsgId;
} public void setMsgId(String msgId)
{
MsgId = msgId;
} }

然后对应的基本信息子类为(只用多一个变量):
 /**
* 普通消息类
* @author Damon
*/
public class WechatTextMsg extends WechatMsg
{ // 文本内容
private String Content = ""; public String getContent()
{
return Content;
} public void setContent(String content)
{
this.Content = content;
}
}
下面来看具体的处理,涉及新增jar包:dom4j-1.6.1.jar  
     /**
* 处理微信信息
* @param reqInfo xml信息数据
* @return 处理结果
*/
public String dealWechatMsg(String reqInfo)
{ String ret = reqInfo; String result = ""; WechatTextMsg tReturnMsg = new WechatTextMsg(); try
{
Document returndoc = DocumentHelper.parseText(ret); Element rootElement = returndoc.getRootElement(); String tMsgType = rootElement.elementText("MsgType"); // 根据MsgType 返回具体的消息类 if (SysCon.TEXT_MSG_TYPE.equals(tMsgType))
{
result = dealTextMsg(rootElement);
} // 封装返回信息
tReturnMsg.setCreateTime(new Date().getTime() + "");
tReturnMsg.setToUserName(rootElement.elementText("FromUserName"));
tReturnMsg.setFromUserName(rootElement.elementText("ToUserName"));
tReturnMsg.setContent(result);
tReturnMsg.setMsgType(SysCon.TEXT_MSG_TYPE);
// 将返回结果封装成文本消息
result = WeChatUtil.textToXML(tReturnMsg);
}
catch (DocumentException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
} return result;
} /**
* 处理文本消息
* @param msg
* @return
*/
private String dealTextMsg(Element rootElement)
{ WechatTextMsg tWechatTextMsg = new WechatTextMsg();
// 依次赋值
tWechatTextMsg.setCreateTime(rootElement.elementText("CreateTime"));
tWechatTextMsg.setFromUserName(rootElement.elementText("FromUserName"));
tWechatTextMsg.setToUserName(rootElement.elementText("ToUserName"));
tWechatTextMsg.setMsgType(rootElement.elementText("MsgType"));
tWechatTextMsg.setMsgId(rootElement.elementText("MsgId"));
tWechatTextMsg.setContent(rootElement.elementText("Content")); System.out.println("传入的消息是:" + tWechatTextMsg.getContent()); // 后续可处理保存到数据库及数据分析等,现在直接返回结果 // 将数据转存至数据库
// Connection conn = DBConnPool.getConnection(); return "传入的文本消息处理完毕";
}

其中对于参数类型判断,可以在SysCon类中添加基本参数

     // 定义微信消息类型--文本
public static final String TEXT_MSG_TYPE = "text";
第三步,处理消息的返回
消息处理完成后,返回文本(可返回不同类型,仅以文本为例)处理结果
这里用到了工具类中 的方法如下:
     /**
* 将对象转为XML输出
* @param textMsg
* @return
*/
public static String textToXML(WechatTextMsg textMsg)
{
xstream.alias("xml", textMsg.getClass());
return xstream.toXML(textMsg); } /**
* 扩展xstream使其支持CDATA
*/
private static XStream xstream = new XStream(new XppDriver()
{
public HierarchicalStreamWriter createWriter(Writer out)
{
return new PrettyPrintWriter(out)
{
// 对所有xml节点的转换都增加CDATA标记
boolean cdata = true; @SuppressWarnings("unchecked")
public void startNode(String name, Class clazz)
{
super.startNode(name, clazz);
} protected void writeText(QuickWriter writer, String text)
{
if (cdata)
{
writer.write("<![CDATA[");
writer.write(text);
writer.write("]]>");
}
else
{
writer.write(text);
}
}
};
}
});

涉及到新增jar包:xstream-1.3.1.jar
可以在最后返回前输出处理的结果:

微信上可接收到消息:传入的文本消息处理完毕。
 
 到这,本节内容就结束了,可以自己去扩展语音消息的接收和处理哦~

玩玩微信公众号Java版之二:接收、处理及返回微信消息的更多相关文章

  1. 玩玩微信公众号Java版之七:自定义微信分享

    前面已经学会了微信网页授权,现在微信网页的功能也可以开展起来啦! 首先,我们先来学习一下分享,如何在自己的页面获取分享接口及让小伙伴来分享呢? 今天的主人公: 微信 JS-SDK, 对应官方链接为:微 ...

  2. 玩玩微信公众号Java版之一:配置微信公众平台服务器信息

    在进行微信公众平台开发前,前先做好准备工作,好了以后,我们可以开始啦!   第一.准备好服务端接口   定义一个http服务接口,主要分为如下几步:   1.创建一个servlet类,用来接收请求: ...

  3. 玩玩微信公众号Java版之准备

    微信自2013年流行起来,现在的发展已经超过了我们的想象,那么对应的公众平台,小程序等都是让人眼前一亮的东西,这里来学习一下微信工作号的对接,实现为Java,希望大家一起学习!   这里大概描述一下所 ...

  4. 玩玩微信公众号Java版之四:自定义公众号菜单

    序: 微信公众号基本的菜单很难满足个性化及多功能的实现,那么微信能否实现自定菜单呢,具体的功能又如何去实现么?下面就来学习一下微信自定义公众号菜单吧! 自定义菜单接口可实现多种类型按钮,如下: 1.c ...

  5. 玩玩微信公众号Java版之六:微信网页授权

    我们经常会访问一些网站,用微信登录的时候需要用到授权,那么微信网页授权是怎么一回事呢,一起来看看吧!   参考官方文档:https://mp.weixin.qq.com/wiki?t=resource ...

  6. 玩玩微信公众号Java版之三:access_token及存储access_token

    微信官方参考文档:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140183   基本说明: access_token是 ...

  7. 玩玩微信公众号Java版之五:获取关注用户信息

    在关注者与公众号产生消息交互后,公众号可获得关注者的OpenID(加密后的微信号,每个用户对每个公众号的OpenID是唯一的.对于不同公众号,同一用户的openid不同).公众号可通过本接口来根据Op ...

  8. C#微信公众号开发系列教程(接收事件推送与消息排重)

    微信服务器在5秒内收不到响应会断掉连接,并且重新发起请求,总共重试三次.这样的话,问题就来了.有这样一个场景:当用户关注微信账号时,获取当前用户信息,然后将信息写到数据库中.类似于pc端网站的注册.可 ...

  9. 微信公众号Java接入demo

    微信公众号Java接入demo 前不久买了一台服务,本来是用来当梯子用的,后来买了一个域名搭了一个博客网站,后来不怎么在上面写博客一直闲着,最近申请了一个微信公众号就想着弄点什么玩玩.周末没事就鼓捣了 ...

随机推荐

  1. Ubuntu环境下 matplotlib 图例中文乱码

    最近做了一个最小二乘法的代码编写并用 matplotlib 绘制了一张图,但是碰到了中文乱码问题.简单搜索之后,发现有人总结出了比较好的方案,亲测可行.推荐给大家. 本文前提条件是 已经 安装好 ma ...

  2. GPU编程--kernels(2)

    "如何区分不同的数据单位单位呢?" "如何确定程序是在CPU端执行,还是GPU端执行呢?" "如何确定要调用的GPU线程数呢?" 下面举一个 ...

  3. gulp - less 在node.js上的安装和使用

    推荐个一个网站 http://www.ydcss.com/ 很详细的入门gulp 官网 http://www.gulpjs.com.cn/docs/getting-started/ 下面 是我的个人总 ...

  4. 腾讯AlloyTeam发布AlloyLever - 开发调试发布错误监控上报用户问题定位尽在1kb代码

    AlloyLever [官网][Giuhub] 1kb(gzip)代码搞定开发调试发布,错误监控上报,用户问题定位. 支持错误监控和上报 支持 vConsole错误展示 支持开发阶段使用 vConso ...

  5. 通过数据,修改金蝶ERP的收料通知单不合格和合格数量,修改生产投料单,委外发出数量

    update POInStockEntry set FAuxNotPassQty=不合格数量 where FInterID=(select FInterID from POInStock where ...

  6. canvas水波纹效果

    先看效果 演示效果 自然界中水波纹效果十分麻烦,我这里只是根据水波纹的几个特性,在理想环境下模拟水波纹的扩散效果. 这里应用到的属性有:扩散.波动.折射. 扩散:很好理解,水波纹会从触发原点开始向周围 ...

  7. 关系数据标准语言SQL之数据查询

    数据查询是数据库的核心操作.SQL提供了SELECT语句进行数据查询,该语句具有灵活的使用方式和丰富的功能. 其一般格式为 select [all | distinct]<目标表达式>[, ...

  8. 将数据库从服务器移到浏览器--indexedDB基本操作封装

    数据库是属于服务器的,这是天经地义的事,但是有时候数据也许并非需要存储在服务器,但是这些数据也是一条一条的记录,怎么办?今天来带领你领略一下H5的一个新特性--indexedDB的风骚.你会情不自禁的 ...

  9. django ngRoute ui-router 开发环境下禁用缓存

    问题描述: Python manage.py runserver ,禁用缓存,及时修改反馈到浏览器 解决办法: 使用dummy cache: Dummy caching (for developmen ...

  10. Linux中FTP服务器的搭建

    vmware12上安装的CentOs6.8,最终实现物理机上的windows10能正常访问CentOs上的FTP服务器. 一.查看是否安装有ftp相关的安装包. # rpm -qa | grep vs ...