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