玩玩微信公众号Java版之二:接收、处理及返回微信消息
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了玩玩微信公众号Java版之二:接收、处理及返回微信消息,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含5419字,纯文字阅读大概需要8分钟。
内容图文
前面已经配置了微信服务器,那么先开始最简单的接收微信消息吧~
可以用我们的微信号来直接进行测试,下面先看测试效果图:
这是最基本的文本消息的接收、处理及返回,来看看是怎么实现的吧!
首先可以参考微信消息相关的接口文档:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140453
具体实现如下:
第一步,接收微信发送的文本消息入口:
1/** 2 * 处理微信服务器发来的消息 3*/ 4publicvoid doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 5 { 6// TODO 消息的接收、处理、响应 7 System.out.println("接口调用了一次"); 8 9 String ret = IOUtils.toString(request.getInputStream(), "utf-8").toString(); 10 System.out.println(ret); 1112 WeChatMsgBL tWeChatMsgBL = new WeChatMsgBL(); 13 String result = tWeChatMsgBL.dealWechatMsg(ret); 1415 response.setCharacterEncoding("UTF-8"); 1617// 返回文本消息,将处理结果返回18 PrintWriter out = response.getWriter(); 1920 System.out.println(result); 2122 out.print(result); 2324 out.close(); 2526 }
可以先输出接收到的xml信息:
第二步,解析及处理接收到数据的内容:
从微信提供的接口文档上,我们可以发现,不论是文本消息还是语音、图片等消息,在xml报文中,有部分节点信息的一致的,因此可以创建一个父类在处理(变量名要与xml中节点名一致,大小写也一样,这样后面返回消息结果时很方便):
1 /** 2 * 微信消息主要类 3 * @author user 4 */ 5 public class WechatMsg 6 { 7 // 开发者微信号 8 private String ToUserName = ""; 910// 发送方帐号(一个OpenID)11private String FromUserName = ""; 1213// 消息创建时间 (整型)14private String CreateTime = ""; 1516// 消息类型17private String MsgType = ""; 1819// 消息id,64位整型20private String MsgId = ""; 2122public String getToUserName() 23 { 24return ToUserName; 25 } 2627publicvoid setToUserName(String toUserName) 28 { 29 ToUserName = toUserName; 30 } 3132public String getFromUserName() 33 { 34return FromUserName; 35 } 3637publicvoid setFromUserName(String fromUserName) 38 { 39 FromUserName = fromUserName; 40 } 4142public String getCreateTime() 43 { 44return CreateTime; 45 } 4647publicvoid setCreateTime(String createTime) 48 { 49 CreateTime = createTime; 50 } 5152public String getMsgType() 53 { 54return MsgType; 55 } 5657publicvoid setMsgType(String msgType) 58 { 59 MsgType = msgType; 60 } 6162public String getMsgId() 63 { 64return MsgId; 65 } 6667publicvoid setMsgId(String msgId) 68 { 69 MsgId = msgId; 70 } 71727374 }
然后对应的基本信息子类为(只用多一个变量):
1 /** 2 * 普通消息类 3 * @author Damon 4 */ 5 public class WechatTextMsg extends WechatMsg 6{ 7 8// 文本内容 9private String Content = ""; 1011public String getContent() 12 { 13return Content; 14 } 1516publicvoid setContent(String content) 17 { 18this.Content = content; 19 } 20 }
下面来看具体的处理,涉及新增jar包:dom4j-1.6.1.jar
1 /** 2 * 微信消息处理类 3 * @author Damon 4 */ 5 public class WeChatMsgBL 6 { 7 8 /** 9 * 处理微信信息 10 * @param reqInfo xml信息数据 11 * @return 处理结果 12 */ 13 public String dealWechatMsg(String reqInfo) 14 { 15 16 String ret = reqInfo; 1718 String result = ""; 1920 WechatTextMsg tReturnMsg = new WechatTextMsg(); 2122try23 { 24 Document returndoc = DocumentHelper.parseText(ret); 2526 Element rootElement = returndoc.getRootElement(); 2728 String tMsgType = rootElement.elementText("MsgType"); 2930// 根据MsgType 返回具体的消息类3132if (WeChatUtil.TEXT_MSG_TYPE.equals(tMsgType)) 33 { 34 result = dealTextMsg(rootElement); 35 } 3637// 封装返回信息38 tReturnMsg.setCreateTime(new Date().getTime() + ""); 39 tReturnMsg.setToUserName(rootElement.elementText("FromUserName")); 40 tReturnMsg.setFromUserName(rootElement.elementText("ToUserName")); 41 tReturnMsg.setContent(result); 42 tReturnMsg.setMsgType(WeChatUtil.TEXT_MSG_TYPE); 43// 将返回结果封装成文本消息44 result = WeChatUtil.textToXML(tReturnMsg); 45 } 46catch (DocumentException e) 47 { 48// TODO Auto-generated catch block49 e.printStackTrace(); 50 } 5152return result; 53 } 5455/**56 * 处理文本消息 57 * @param msg 58 * @return59*/60private String dealTextMsg(Element rootElement) 61 { 6263 WechatTextMsg tWechatTextMsg = new WechatTextMsg(); 64// 依次赋值65 tWechatTextMsg.setCreateTime(rootElement.elementText("CreateTime")); 66 tWechatTextMsg.setFromUserName(rootElement.elementText("FromUserName")); 67 tWechatTextMsg.setToUserName(rootElement.elementText("ToUserName")); 68 tWechatTextMsg.setMsgType(rootElement.elementText("MsgType")); 69 tWechatTextMsg.setMsgId(rootElement.elementText("MsgId")); 70 tWechatTextMsg.setContent(rootElement.elementText("Content")); 7172 System.out.println("传入的消息是:" + tWechatTextMsg.getContent()); 7374// 后续可处理保存到数据库及数据分析等,现在直接返回结果 7576// 将数据转存至数据库 77// Connection conn = DBConnPool.getConnection();7879return "传入的文本消息处理完毕"; 80 } 8182 }
其中对于参数类型判断,可以在SysCon类中添加基本参数
1// 定义微信消息类型--文本2publicstaticfinal String TEXT_MSG_TYPE = "text";
第三步,处理消息的返回
消息处理完成后,返回文本(可返回不同类型,仅以文本为例)处理结果
这里用到了工具类中 的方法如下:
1 /** 2 * 将对象转为XML输出 3 * @param textMsg 4 * @return 5 */ 6 public static String textToXML(WechatTextMsg textMsg) 7 { 8 xstream.alias("xml", textMsg.getClass()); 9return xstream.toXML(textMsg); 1011 } 121314/**15 * 扩展xstream使其支持CDATA 16*/17privatestatic XStream xstream = new XStream(new XppDriver() 18 { 19public HierarchicalStreamWriter createWriter(Writer out) 20 { 21returnnew PrettyPrintWriter(out) 22 { 23// 对所有xml节点的转换都增加CDATA标记24boolean cdata = true; 2526 @SuppressWarnings("unchecked") 27publicvoid startNode(String name, Class clazz) 28 { 29super.startNode(name, clazz); 30 } 3132protectedvoid writeText(QuickWriter writer, String text) 33 { 34if (cdata) 35 { 36 writer.write("<![CDATA["); 37 writer.write(text); 38 writer.write("]]>"); 39 } 40else41 { 42 writer.write(text); 43 } 44 } 45 }; 46 } 47 });
涉及到新增jar包:xstream-1.3.1.jar
可以在最后返回前输出处理的结果:
微信上可接收到消息:传入的文本消息处理完毕。
到这,本节内容就结束了,可以自己去扩展语音消息的接收和处理哦~
原文:http://www.cnblogs.com/cooldamon/p/7208622.html
内容总结
以上是互联网集市为您收集整理的玩玩微信公众号Java版之二:接收、处理及返回微信消息全部内容,希望文章能够帮你解决玩玩微信公众号Java版之二:接收、处理及返回微信消息所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。
来源:【匿名】