5.6.6 实现业务逻辑

最后,需要根据本实例的需求及菜单结构修改CoreService类中的业务逻辑代码,修改后的完整代码如下:

  1. 1 package org.liufeng.course.service;
  2. 2 
  3. 3 import java.util.ArrayList;
  4. 4 import java.util.Date;
  5. 5 import java.util.List;
  6. 6 import java.util.Map;
  7. 7 import javax.servlet.http.HttpServletRequest;
  8. 8 import org.liufeng.course.message.resp.Article;
  9. 9 import org.liufeng.course.message.resp.NewsMessage;
  10. 10 import org.liufeng.course.message.resp.TextMessage;
  11. 11 import org.liufeng.course.util.MessageUtil;
  12. 12 
  13. 13 /**
  14. 14  * 核心服务类
  15. 15  *
  16. 16  * @author liufeng
  17. 17  * @date 2013-10-17
  18. 18  */
  19. 19 public class CoreService {
  20. 20  /**
  21. 21  * 处理微信发来的请求
  22. 22  *
  23. 23  * @param request
  24. 24  * @return xml
  25. 25  */
  26. 26  public static String processRequest(HttpServletRequest request) {
  27. 27  // XML格式的消息数据
  28. 28  String respXml = null;
  29. 29  try {
  30. 30  // 调用parseXml方法解析请求消息
  31. 31  Map<String, String> requestMap = MessageUtil.parseXml(request);
  32. 32  // 发送方账号
  33. 33  String fromUserName = requestMap.get("FromUserName");
  34. 34  // 开发者微信号
  35. 35  String toUserName = requestMap.get("ToUserName");
  36. 36  // 消息类型
  37. 37  String msgType = requestMap.get("MsgType");
  38. 38 
  39. 39  TextMessage textMessage = new TextMessage();
  40. 40  textMessage.setToUserName(fromUserName);
  41. 41  textMessage.setFromUserName(toUserName);
  42. 42  textMessage.setCreateTime(new Date().getTime());
  43. 43  textMessage.setMsgType(MessageUtil.RESP_MESSAGE_TYPE_TEXT);
  44. 44  // 事件推送
  45. 45  if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_EVENT)) {
  46. 46  // 事件类型
  47. 47  String eventType = requestMap.get("Event");
  48. 48  // 订阅
  49. 49  if (eventType.equals(MessageUtil.EVENT_TYPE_SUBSCRIBE)) {
  50. 50  textMessage.setContent("您好,欢迎关注网址导航!我们致力于打造
  51.     精品网址聚合应用,为用户提供便捷的上网导航服务。体验生活,从这里开始!");
  52. 51  // 将消息对象转换成XML
  53. 52  respXml = MessageUtil.messageToXml(textMessage);
  54. 53  }
  55. 54  // 取消订阅
  56. 55  else if (eventType.equals(MessageUtil.EVENT_TYPE_UNSUBSCRIBE)) {
  57. 56  // TODO 暂不做处理
  58. 57  }
  59. 58  // 自定义菜单点击事件
  60. 59  else if (eventType.equals(MessageUtil.EVENT_TYPE_CLICK)) {
  61. 60  // 事件KEY值,与创建菜单时的key值对应
  62. 61  String eventKey = requestMap.get("EventKey");
  63. 62  // 根据key值判断用户点击的按钮
  64. 63  if (eventKey.equals("oschina")) {
  65. 64  Article article = new Article();
  66. 65  article.setTitle("开源中国");
  67. 66  article.setDescription("开源中国社区成立于2008年8月,
  68. 是目前中国最大的开源技术社区。\n\n开源中国的目的是为中国的
  69. IT技术人员提供一个全面的、快捷更新的、用来检索开源软件以及交
  70. 流开源经验的平台。\n\n经过不断的改进,目前开源中国社区包含
  71. 开源软件库、代码分享、资讯、讨论区和博客等几大频道内容。");
  72. 67  article.setPicUrl("");
  73. 68  article.setUrl("http:// m.oschina.net");
  74. 69  List<Article> articleList = new ArrayList<Article>();
  75. 70  articleList.add(article);
  76. 71  // 创建图文消息
  77. 72  NewsMessage newsMessage = new NewsMessage();
  78. 73  newsMessage.setToUserName(fromUserName);
  79. 74  newsMessage.setFromUserName(toUserName);
  80. 75  newsMessage.setCreateTime(new Date().getTime());
  81. 76  newsMessage.setMsgType(MessageUtil.RESP_MESSAGE_
  82. TYPE_NEWS);
  83. 77  newsMessage.setArticleCount(articleList.size());
  84. 78  newsMessage.setArticles(articleList);
  85. 79  respXml = MessageUtil.messageToXml(newsMessage);
  86. 80  } else if (eventKey.equals("iteye")) {
  87. 81  textMessage.setContent("ITeye即创办于2003年9月的
  88.   JavaEye,从最初的以讨论Java技术为主的技术论坛,已
  89.   经逐渐发展成为涵盖整个软件开发领域的综合性网站。\n\nhttp://
  90. www.iteye.com");
  91. 82  respXml = MessageUtil.messageToXml(textMessage);
  92. 83  }
  93. 84  }
  94. 85  }
  95. 86  // 当用户发消息时
  96. 87  else {
  97. 88  textMessage.setContent("请通过菜单使用网址导航服务!");
  98. 89  respXml = MessageUtil.messageToXml(textMessage);
  99. 90  }
  100. 91  } catch (Exception e) {
  101. 92  e.printStackTrace();
  102. 93  }
  103. 94  return respXml;
  104. 95  }
  105. 96 }

第49~53行代码表示当事件类型为订阅事件时回复欢迎词。第59~85行代码用于处理自定义菜单点击事件(只需处理click类型的菜单按钮的点击事件);当key值等于"oschina"时回复一条介绍开源中国的单图文消息,而key值等于"iteye"时回复一条介绍ITeye的文本消息。第87~90行代码表示当用户发送任意类型的消息时都将收到一条内容为“请通过菜单使用网址导航服务!”的文本消息。