9.5.5 CoreService类的实现

在CoreService类中,主要处理了关注事件、地理位置消息和文本消息。当用户关注公众账号时,向用户介绍周边搜索的功能;当用户发送地理位置消息时,后台将用户地理位置存储到BAE的MySQL中;当用户发送以“附近”开头的文本消息时,后台根据用户最后一次发送的地理位置搜索POI。CoreService类的实现代码如下:

  1. package org.liufeng.course.service;
  2.  
  3. import java.util.Date;
  4. import java.util.List;
  5. import java.util.Map;
  6. import javax.servlet.http.HttpServletRequest;
  7. import org.liufeng.course.message.resp.Article;
  8. import org.liufeng.course.message.resp.NewsMessage;
  9. import org.liufeng.course.message.resp.TextMessage;
  10. import org.liufeng.course.pojo.BaiduPlace;
  11. import org.liufeng.course.pojo.UserLocation;
  12. import org.liufeng.course.util.BaiduMapUtil;
  13. import org.liufeng.course.util.MessageUtil;
  14. import org.liufeng.course.util.MySQLUtil;
  15.  
  16. /**
  17. * 核心服务类
  18. *
  19. * @author liufeng
  20. * @date 2013-11-19
  21. */
  22. public class CoreService {
  23. /**
  24. * 处理微信发来的请求
  25. *
  26. * @param request
  27. * @return xml
  28. */
  29. public static String processRequest(HttpServletRequest request) {
  30. // xml格式的消息数据
  31. String respXml = null;
  32. // 默认返回的文本消息内容
  33. String respContent = null;
  34. try {
  35. // 调用parseXml方法解析请求消息
  36. Map<String, String> requestMap = MessageUtil.parseXml(request);
  37. // 发送方账号
  38. String fromUserName = requestMap.get("FromUserName");
  39. // 开发者微信号
  40. String toUserName = requestMap.get("ToUserName");
  41. // 消息类型
  42. String msgType = requestMap.get("MsgType");
  43.  
  44. // 回复文本消息
  45. TextMessage textMessage = new TextMessage();
  46. textMessage.setToUserName(fromUserName);
  47. textMessage.setFromUserName(toUserName);
  48. textMessage.setCreateTime(new Date().getTime());
  49. textMessage.setMsgType(MessageUtil.RESP_MESSAGE_TYPE_TEXT);
  50.  
  51. // 文本消息
  52. if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_TEXT)) {
  53. String content = requestMap.get("Content").trim();
  54. if (content.equals("附近")) {
  55. respContent = getUsage();
  56. }
  57. // 周边搜索
  58. else if (content.startsWith("附近")) {
  59. String keyWord = content.replaceAll("附近", "").trim();
  60. // 获取用户最后一次发送的地理位置
  61. UserLocation location =
  62. MySQLUtil.getLastLocation(request, fromUserName);
  63. // 未获取到
  64. if (null == location) {
  65. respContent = getUsage();
  66. } else {
  67. // 根据转换后(纠偏)的坐标搜索周边POI
  68. List<BaiduPlace> placeList =
  69. BaiduMapUtil.searchPlace(keyWord,
  70. location.getBd09Lng(), location.getBd09Lat());
  71. // 未搜索到POI
  72. if (null == placeList || 0 == placeList.size()) {
  73. respContent = String.format
  74. ("/难过,您发送的位置附近未搜索到"%s"信息!", keyWord);
  75. } else {
  76. List<Article> articleList =
  77. BaiduMapUtil.makeArticleList(placeList,
  78. location.getBd09Lng(),
  79. location.getBd09Lat());
  80. // 回复图文消息
  81. NewsMessage newsMessage = new NewsMessage();
  82. newsMessage.setToUserName(fromUserName);
  83. newsMessage.setFromUserName(toUserName);
  84. newsMessage.setCreateTime(new Date().getTime());
  85. newsMessage.setMsgType
  86. (MessageUtil.RESP_MESSAGE_TYPE_NEWS);
  87. newsMessage.setArticles(articleList);
  88. newsMessage.setArticleCount(articleList.size());
  89. respXml = MessageUtil.messageToXml(newsMessage);
  90. }
  91. }
  92. } else
  93. respContent = getUsage();
  94. }
  95. // 地理位置消息
  96. else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_LOCATION)) {
  97. // 用户发送的经纬度
  98. String lng = requestMap.get("Location_Y");
  99. String lat = requestMap.get("Location_X");
  100. // 坐标转换后的经纬度
  101. String bd09Lng = null;
  102. String bd09Lat = null;
  103. // 调用接口转换坐标
  104. UserLocation userLocation = BaiduMapUtil.convertCoord(lng, lat);
  105. if (null != userLocation) {
  106. bd09Lng = userLocation.getBd09Lng();
  107. bd09Lat = userLocation.getBd09Lat();
  108. }
  109. // 保存用户地理位置
  110. MySQLUtil.saveUserLocation(request, fromUserName,
  111. lng, lat, bd09Lng, bd09Lat);
  112.  
  113. StringBuffer buffer = new StringBuffer();
  114. buffer.append("[愉快]").append("成功接收您的位置!").append("\n\n");
  115. buffer.append("您可以输入搜索关键词获取周边信息了,例如:").append("\n");
  116. buffer.append(" 附近ATM").append("\n");
  117. buffer.append(" 附近KTV").append("\n");
  118. buffer.append(" 附近厕所").append("\n");
  119. buffer.append("必须以"附近"两个字开头!");
  120. respContent = buffer.toString();
  121. }
  122. // 事件推送
  123. else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_EVENT)) {
  124. // 事件类型
  125. String eventType = requestMap.get("Event");
  126. // 关注
  127. if (eventType.equals(MessageUtil.EVENT_TYPE_SUBSCRIBE)) {
  128. respContent = getSubscribeMsg();
  129. }
  130. } else {
  131. respContent = getUsage();
  132. }
  133. if (null != respContent) {
  134. // 设置文本消息的内容
  135. textMessage.setContent(respContent);
  136. // 将文本消息对象转换成XML
  137. respXml = MessageUtil.messageToXml(textMessage);
  138. }
  139. } catch (Exception e) {
  140. e.printStackTrace();
  141. }
  142. return respXml;
  143. }
  144.  
  145. /**
  146. * 关注提示语
  147. *
  148. * @return
  149. */
  150. private static String getSubscribeMsg() {
  151. StringBuffer buffer = new StringBuffer();
  152. buffer.append("您是否有过出门在外四处找ATM或厕所的经历?").append("\n\n");
  153. buffer.append("您是否有过出差在外搜寻美食或娱乐场所的经历?").append("\n\n");
  154. buffer.append("周边搜索为您的出行保驾护航,为您提供专业的周边生活指南,回复"附近"开始体验吧!");
  155. return buffer.toString();
  156. }
  157.  
  158. /**
  159. * 使用说明
  160. *
  161. * @return
  162. */
  163. private static String getUsage() {
  164. StringBuffer buffer = new StringBuffer();
  165. buffer.append("周边搜索使用说明").append("\n\n");
  166. buffer.append("1)发送地理位置").append("\n");
  167. buffer.append("点击窗口底部的"+"按钮,选择"位置",点"发送"").append("\n\n");
  168. buffer.append("2)指定关键词搜索").append("\n");
  169. buffer.append("格式:附近+关键词\n例如:附近ATM、附近KTV、附近厕所");
  170. return buffer.toString();
  171. }
  172. }