【微信开发】java实现微信公众号的你问我答

更新时间:2018-08-16 09:58:00 点击次数:1361次

从文档上面看,微信公众号的通信是通过xml形式来传递信息的,由此我们需要频繁地将对象转成xml,以及将xml转换成map集合

定义TextMessage用于存储文本相关信息


  1. /**
  2. * @author evan_qb
  3. * @date 2018/8/14 9:03
  4. */
  5. @Data
  6. public class TextMessage{
  7. private String ToUserName;
  8. private String FromUserName;
  9. private Long CreateTime;
  10. private String MsgType;
  11. private String Content;
  12. private String MsgId;
  13. }

由于频繁使用xml和对象的转换,我们将其抽取工具类

首先引入相关的依赖dom4j以及xStream


  1. <!--xml转换相关-->
  2. <dependency>
  3. <groupId>dom4j</groupId>
  4. <artifactId>dom4j</artifactId>
  5. <version>1.6.1</version>
  6. </dependency>
  7. <dependency>
  8. <groupId>com.thoughtworks.xstream</groupId>
  9. <artifactId>xstream</artifactId>
  10. <version>1.4.4</version>
  11. </dependency>

工具类MessageUtil


  1. /**
  2. * @author evan_qb
  3. * @date 2018/8/14 8:57
  4. */
  5. public class MessageUtil {
  6. /**
  7. * xml转Map
  8. * @param request
  9. * @return
  10. * @throws IOException
  11. * @throws DocumentException
  12. */
  13. public static Map<String,String> xmlToMap(HttpServletRequest request) {
  14. Map<String,String> map = new HashMap<>();
  15. SAXReader reader = new SAXReader();
  16. ServletInputStream in = null;
  17. try{
  18. in = request.getInputStream();
  19. Document doc = reader.read(in);
  20. Element root = doc.getRootElement();
  21. List<Element> list = root.elements();
  22. for (Element e: list){
  23. map.put(e.getName(),e.getText());
  24. }
  25. in.close();
  26. }catch (Exception e){
  27. }
  28. return map;
  29. }
  30. /**
  31. * 文本对象转换成xml
  32. * @param message
  33. * @return
  34. */
  35. public static String textMessageToXml(Object message){
  36. XStream xStream = new XStream();
  37. xStream.alias("xml",message.getClass());
  38. return xStream.toXML(message);
  39. }
  40. /**
  41. * 初始化文本信息
  42. * @param toUserName
  43. * @param fromUserName
  44. * @param msgType
  45. * @param content
  46. * @return
  47. */
  48. public static String initText(String toUserName,String fromUserName,String msgType,String content){
  49. TextMessage textMessage = new TextMessage();
  50. textMessage.setFromUserName(toUserName);
  51. textMessage.setToUserName(fromUserName);
  52. textMessage.setMsgType(msgType);
  53. textMessage.setCreateTime(new Date().getTime());
  54. textMessage.setContent(content);
  55. return MessageUtil.textMessageToXml(textMessage);
  56. }
  57. }

接下来编写Controller进行测试:


  1. /**
  2. * 实现你问我答
  3. * @param request
  4. * @return
  5. */
  6. @PostMapping("/verify")
  7. public String replyMessage(HttpServletRequest request){
  8. Map<String,String> map = MessageUtil.xmlToMap(request);
  9. String toUserName = map.get("ToUserName");
  10. String fromUserName = map.get("FromUserName");
  11. String msgType = map.get("MsgType");
  12. String content = map.get("Content");
  13. String message = null;
  14. if (MessageType.MESSAGE_TEXT.equals(msgType)){
  15. //回复文本信息触发的消息
  16. message = MessageUtil.initText(toUserName,fromUserName,MessageType.MESSAGE_TEXT,content);
  17. }else if (MessageType.MESSAGE_EVENT.equals(msgType)){
  18. //关注时触发的消息
  19. String event = map.get("Event");
  20. if (MessageType.MESSAGE_SUBSCRIBE.equals(event)){
  21. message = MessageUtil.initText(toUserName,fromUserName,MessageType.MESSAGE_TEXT,"欢迎关注evan波的公众号");
  22. }
  23. }
  24. return message;
  25. }

测试结果:

 

 

本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责,本站只提供参考并不构成任何投资及应用建议。本站是一个个人学习交流的平台,网站上部分文章为转载,并不用于任何商业目的,我们已经尽可能的对作者和来源进行了通告,但是能力有限或疏忽,造成漏登,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

回到顶部
嘿,我来帮您!