前面已经配置了微信服务器,那么先开始最简单的接收微信消息吧~
可以用我们的微信号来直接进行测试,下面先看测试效果图:
这是最基本的文本消息的接收、处理及返回,来看看是怎么实现的吧!
具体实现如下:
第一步,接收微信发送的文本消息入口:
1 /**
2 * 处理微信服务器发来的消息3 */
4 public void doPost(HttpServletRequest request, HttpServletResponse response) throwsServletException, IOException5 {6 //TODO 消息的接收、处理、响应
7 System.out.println("接口调用了一次");8
9 String ret = IOUtils.toString(request.getInputStream(), "utf-8").toString();10 System.out.println(ret);11
12 WeChatMsgBL tWeChatMsgBL = newWeChatMsgBL();13 String result =tWeChatMsgBL.dealWechatMsg(ret);14
15 response.setCharacterEncoding("UTF-8");16
17 //返回文本消息,将处理结果返回
18 PrintWriter out =response.getWriter();19
20 System.out.println(result);21
22 out.print(result);23
24 out.close();25
26 }
View Code
可以先输出接收到的xml信息:
第二步,解析及处理接收到数据的内容:
从微信提供的接口文档上,我们可以发现,不论是文本消息还是语音、图片等消息,在xml报文中,有部分节点信息的一致的,因此可以创建一个父类在处理(变量名要与xml中节点名一致,大小写也一样,这样后面返回消息结果时很方便):
1 /**
2 * 微信消息主要类3 *@authoruser4 */
5 public classWechatMsg6 {7 //开发者微信号
8 private String ToUserName = "";9
10 //发送方帐号(一个OpenID)
11 private String FromUserName = "";12
13 //消息创建时间 (整型)
14 private String CreateTime = "";15
16 //消息类型
17 private String MsgType = "";18
19 //消息id,64位整型
20 private String MsgId = "";21
22 publicString getToUserName()23 {24 returnToUserName;25 }26
27 public voidsetToUserName(String toUserName)28 {29 ToUserName =toUserName;30 }31
32 publicString getFromUserName()33 {34 returnFromUserName;35 }36
37 public voidsetFromUserName(String fromUserName)38 {39 FromUserName =fromUserName;40 }41
42 publicString getCreateTime()43 {44 returnCreateTime;45 }46
47 public voidsetCreateTime(String createTime)48 {49 CreateTime =createTime;50 }51
52 publicString getMsgType()53 {54 returnMsgType;55 }56
57 public voidsetMsgType(String msgType)58 {59 MsgType =msgType;60 }61
62 publicString getMsgId()63 {64 returnMsgId;65 }66
67 public voidsetMsgId(String msgId)68 {69 MsgId =msgId;70 }71
72
73
74 }
View Code
然后对应的基本信息子类为(只用多一个变量):
1 /**
2 * 普通消息类3 *@authorDamon4 */
5 public class WechatTextMsg extendsWechatMsg6 {7
8 //文本内容
9 private String Content = "";10
11 publicString getContent()12 {13 returnContent;14 }15
16 public voidsetContent(String content)17 {18 this.Content =content;19 }20 }
View Code
下面来看具体的处理,涉及新增jar包:dom4j-1.6.1.jar
1 /**
2 * 处理微信信息3 *@paramreqInfo xml信息数据4 *@return处理结果5 */
6 publicString dealWechatMsg(String reqInfo)7 {8
9 String ret =reqInfo;10
11 String result = "";12
13 WechatTextMsg tReturnMsg = newWechatTextMsg();14
15 try
16 {17 Document returndoc =DocumentHelper.parseText(ret);18
19 Element rootElement =returndoc.getRootElement();20
21 String tMsgType = rootElement.elementText("MsgType");22
23 //根据MsgType 返回具体的消息类
24
25 if(SysCon.TEXT_MSG_TYPE.equals(tMsgType))26 {27 result =dealTextMsg(rootElement);28 }29
30 //封装返回信息
31 tReturnMsg.setCreateTime(new Date().getTime() + "");32 tReturnMsg.setToUserName(rootElement.elementText("FromUserName"));33 tReturnMsg.setFromUserName(rootElement.elementText("ToUserName"));34 tReturnMsg.setContent(result);35 tReturnMsg.setMsgType(SysCon.TEXT_MSG_TYPE);36 //将返回结果封装成文本消息
37 result =WeChatUtil.textToXML(tReturnMsg);38 }39 catch(DocumentException e)40 {41 //TODO Auto-generated catch block
42 e.printStackTrace();43 }44
45 returnresult;46 }47
48 /**
49 * 处理文本消息50 *@parammsg51 *@return
52 */
53 privateString dealTextMsg(Element rootElement)54 {55
56 WechatTextMsg tWechatTextMsg = newWechatTextMsg();57 //依次赋值
58 tWechatTextMsg.setCreateTime(rootElement.elementText("CreateTime"));59 tWechatTextMsg.setFromUserName(rootElement.elementText("FromUserName"));60 tWechatTextMsg.setToUserName(rootElement.elementText("ToUserName"));61 tWechatTextMsg.setMsgType(rootElement.elementText("MsgType"));62 tWechatTextMsg.setMsgId(rootElement.elementText("MsgId"));63 tWechatTextMsg.setContent(rootElement.elementText("Content"));64
65 System.out.println("传入的消息是:" +tWechatTextMsg.getContent());66
67 //后续可处理保存到数据库及数据分析等,现在直接返回结果68
69 //将数据转存至数据库70 //Connection conn = DBConnPool.getConnection();
71
72 return "传入的文本消息处理完毕";73 }
View Code
其中对于参数类型判断,可以在SysCon类中添加基本参数
1 //定义微信消息类型--文本
2 public static final String TEXT_MSG_TYPE = "text";
View Code
第三步,处理消息的返回
消息处理完成后,返回文本(可返回不同类型,仅以文本为例)处理结果
这里用到了工具类中 的方法如下:
1 /**
2 * 将对象转为XML输出3 *@paramtextMsg4 *@return
5 */
6 public staticString textToXML(WechatTextMsg textMsg)7 {8 xstream.alias("xml", textMsg.getClass());9 returnxstream.toXML(textMsg);10
11 }12
13
14 /**
15 * 扩展xstream使其支持CDATA16 */
17 private static XStream xstream = new XStream(newXppDriver()18 {19 publicHierarchicalStreamWriter createWriter(Writer out)20 {21 return newPrettyPrintWriter(out)22 {23 //对所有xml节点的转换都增加CDATA标记
24 boolean cdata = true;25
26 @SuppressWarnings("unchecked")27 public voidstartNode(String name, Class clazz)28 {29 super.startNode(name, clazz);30 }31
32 protected voidwriteText(QuickWriter writer, String text)33 {34 if(cdata)35 {36 writer.write("");39 }40 else
41 {42 writer.write(text);43 }44 }45 };46 }47 });
View Code
涉及到新增jar包:xstream-1.3.1.jar
可以在最后返回前输出处理的结果:
微信上可接收到消息:传入的文本消息处理完毕。
到这,本节内容就结束了,可以自己去扩展语音消息的接收和处理哦~