4.4.5 使用CoreService类完成消息的处理

本例中,CoreService类只有一个processRequest()方法,用于处理请求消息。首先从request对象中解析出请求消息参数,再根据参数MsgType判断请求消息类型,最后返回XML格式的文本消息。CoreService类的实现代码如下:

  1. package org.liufeng.course.service;
  2.  
  3. import java.util.Date;
  4. import java.util.Map;
  5. import javax.servlet.http.HttpServletRequest;
  6. import org.liufeng.course.message.resp.TextMessage;
  7. import org.liufeng.course.util.MessageUtil;
  8.  
  9. /**
  10. * 核心服务类
  11. *
  12. * @author liufeng
  13. * @date 2013-09-29
  14. */
  15. public class CoreService {
  16. /**
  17. * 处理微信发来的请求
  18. *
  19. * @param request
  20. * @return xml
  21. */
  22. public static String processRequest(HttpServletRequest request) {
  23. // XML格式的消息数据
  24. String respXml = null;
  25. // 默认返回的文本消息内容
  26. String respContent = "未知的消息类型!";
  27. try {
  28. // 调用parseXml方法解析请求消息
  29. Map<String, String> requestMap = MessageUtil.parseXml(request);
  30. // 发送方账号
  31. String fromUserName = requestMap.get("FromUserName");
  32. // 开发者微信号
  33. String toUserName = requestMap.get("ToUserName");
  34. // 消息类型
  35. String msgType = requestMap.get("MsgType");
  36.  
  37. // 回复文本消息
  38. TextMessage textMessage = new TextMessage();
  39. textMessage.setToUserName(fromUserName);
  40. textMessage.setFromUserName(toUserName);
  41. textMessage.setCreateTime(new Date().getTime());
  42. textMessage.setMsgType(MessageUtil.RESP_MESSAGE_TYPE_TEXT);
  43.  
  44. // 文本消息
  45. if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_TEXT)) {
  46. respContent = "您发送的是文本消息!";
  47. }
  48. // 图片消息
  49. else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_IMAGE)) {
  50. respContent = "您发送的是图片消息!";
  51. }
  52. // 语音消息
  53. else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_VOICE)) {
  54. respContent = "您发送的是语音消息!";
  55. }
  56. // 视频消息
  57. else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_VIDEO)) {
  58. respContent = "您发送的是视频消息!";
  59. }
  60. // 地理位置消息
  61. else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_LOCATION)) {
  62. respContent = "您发送的是地理位置消息!";
  63. }
  64. // 链接消息
  65. else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_LINK)) {
  66. respContent = "您发送的是链接消息!";
  67. }
  68. // 事件推送
  69. else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_EVENT)) {
  70. // 事件类型
  71. String eventType = requestMap.get("Event");
  72. // 关注
  73. if (eventType.equals(MessageUtil.EVENT_TYPE_SUBSCRIBE)) {
  74. respContent = "谢谢您的关注!";
  75. }
  76. // 取消关注
  77. else if (eventType.equals(MessageUtil.EVENT_TYPE_UNSUBSCRIBE)) {
  78. // TODO 取消订阅后,用户不会再收到公众账号发送的消息,因此不需要回复
  79. }
  80. // 扫描带参数二维码
  81. else if (eventType.equals(MessageUtil.EVENT_TYPE_SCAN)) {
  82. // TODO 处理扫描带参数二维码事件
  83. }
  84. // 上报地理位置
  85. else if (eventType.equals(MessageUtil.EVENT_TYPE_LOCATION)) {
  86. // TODO 处理上报地理位置事件
  87. }
  88. // 自定义菜单
  89. else if (eventType.equals(MessageUtil.EVENT_TYPE_CLICK)) {
  90. // TODO 处理菜单单击事件
  91. }
  92. }
  93. // 设置文本消息的内容
  94. textMessage.setContent(respContent);
  95. // 将文本消息对象转换成XML
  96. respXml = MessageUtil.messageToXml(textMessage);
  97. } catch (Exception e) {
  98. e.printStackTrace();
  99. }
  100. return respXml;
  101. }
  102. }