微信开发源码讲解
微信開發請求Servlet
package com.weixin.servlet;import java.io.IOException; import java.io.PrintWriter;import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;import org.jeecg.util.SignUtil;import com.weixin.service.CoreService;/*** 核心請求處理類* * @author liufeng* @date 2013-05-18*/ public class CoreServlet extends HttpServlet {private static final long serialVersionUID = 4440739483644821986L;/*** 確認請求來自微信服務器*/public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// 微信加密簽名String signature = request.getParameter("signature");// 時間戳String timestamp = request.getParameter("timestamp");// 隨機數String nonce = request.getParameter("nonce");// 隨機字符串String echostr = request.getParameter("echostr");PrintWriter out = response.getWriter();// 通過檢驗signature對請求進行校驗,若校驗成功則原樣返回echostr,表示接入成功,否則接入失敗if (SignUtil.checkSignature(signature, timestamp, nonce)) {out.print(echostr);}out.close();out = null;}/*** 處理微信服務器發來的消息*/public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// 將請求、響應的編碼均設置為UTF-8(防止中文亂碼)request.setCharacterEncoding("UTF-8");response.setCharacterEncoding("UTF-8");// 調用核心業務類接收消息、處理消息//String respMessage = MingXingService.processRequest(request);String respMessage =CoreService.processRequest(request);// 響應消息PrintWriter out = response.getWriter();out.print(respMessage);out.close();}}針對用戶事件具體邏輯處理代碼:
package com.weixin.service;
 
 
 import java.io.IOException;
 import java.io.InputStream;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Properties;
 
 
 import javax.servlet.http.HttpServletRequest;
 
 
 import org.apache.log4j.Logger;
 import org.jeecg.message.resp.Article;
 import org.jeecg.message.resp.NewsMessage;
 import org.jeecg.message.resp.TextMessage;
 import org.jeecg.util.FreemarkerHelper;
 import org.jeecg.util.MessageUtil;
 import org.jeecg.util.weather.Weather;
 
 
 
 
 /**
 ?* 核心服務類
 ?*?
 ?* @author liufeng
 ?* @date 2013-05-20
 ?*/
 public class CoreService {
 private static Logger log = Logger.getLogger(CoreService.class);
 
 
 /**
 * 處理微信發來的請求
 *?
 * @param request
 * @return
 */
 public static String processRequest(HttpServletRequest request) {
 String respMessage = null;
 try {
 // 默認返回的文本消息內容
 String respContent = "請求處理異常,請稍候嘗試!";
 // xml請求解析
 Map<String, String> requestMap = MessageUtil.parseXml(request);
 // Map<String, String> requestMap = new HashMap<String, String>();
 // // 發送方帳號(open_id)
 String fromUserName = requestMap.get("FromUserName");
 // 公眾帳號
 String toUserName = requestMap.get("ToUserName");
 // 消息類型
 String msgType = requestMap.get("MsgType");
 // 默認回復此文本消息
 TextMessage textMessage = new TextMessage();
 textMessage.setToUserName(fromUserName);
 textMessage.setFromUserName(toUserName);
 textMessage.setCreateTime(new Date().getTime());
 textMessage.setMsgType(MessageUtil.RESP_MESSAGE_TYPE_TEXT);
 textMessage.setFuncFlag(0);
 // 由于href屬性值必須用雙引號引起,這與字符串本身的雙引號沖突,所以要轉義
 textMessage.setContent(getMainMenu());
 // 將文本消息對象轉換成xml字符串
 respMessage = MessageUtil.textMessageToXml(textMessage);
 // 文本消息
 if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_TEXT)) {
 String content = requestMap.get("Content");
 if ("?".equals(content)) {
 respContent = getMainMenu();
 textMessage.setContent(respContent);
 respMessage = MessageUtil.textMessageToXml(textMessage);
 } else if ("1".equals(content)) {
 respContent = "作者:張代浩 (scott) \n郵箱:scott@jeecg.org \n QQ群:129190229";
 textMessage.setContent(respContent);
 respMessage = MessageUtil.textMessageToXml(textMessage);
 } else if ("2".equals(content)) {
 respContent = "<a href=\"www.jeecg.org\">www.jeecg.org</a>";
 textMessage.setContent(respContent);
 respMessage = MessageUtil.textMessageToXml(textMessage);
 } else if ("3".equals(content)) {
 // 創建圖文消息
 NewsMessage newsMessage = new NewsMessage();
 newsMessage.setToUserName(fromUserName);
 newsMessage.setFromUserName(toUserName);
 newsMessage.setCreateTime(new Date().getTime());
 newsMessage.setMsgType(MessageUtil.RESP_MESSAGE_TYPE_NEWS);
 newsMessage.setFuncFlag(0);
 
 
 List<Article> articleList = new ArrayList<Article>();
 Article article1 = new Article();
 article1.setTitle("JEECG專題介紹");
 article1.setDescription("JEECG 微云快速開發平臺");
 article1.setPicUrl("http://avatar.csdn.net/3/D/E/1_zhangdaiscott.jpg");
 article1.setUrl("http://zhangdaiscott.github.io/jeecg/");
 
 
 Article article4 = new Article();
 article4.setTitle("第2篇\n MiniDao專題介紹");
 article4.setDescription("");
 article4.setPicUrl("http://www.jeecg.org/data/attachment/forum/201308/18/224051ey14ehqe000iegja.jpg");
 article4.setUrl("http://zhangdaiscott.github.io/MiniDao/");
 
 
 Article article2 = new Article();
 article2.setTitle("第3篇\n JEECG CSDN專家訪談");
 article2.setDescription("");
 article2.setPicUrl("https://img-my.csdn.net/uploads/201301/23/1358930662_6750.jpg");
 article2.setUrl("http://blog.csdn.net/blogdevteam/article/details/8534797");
 
 
 Article article3 = new Article();
 article3.setTitle("第4篇\n 參與開源");
 article3.setDescription("");
 article3.setPicUrl("http://avatar.csdn.net/3/D/E/1_zhangdaiscott.jpg");
 article3.setUrl("http://blog.csdn.net/zhangdaiscott/article/details/14160383");
 
 
 
 
 articleList.add(article1);
 articleList.add(article4);
 articleList.add(article2);
 articleList.add(article3);
 newsMessage.setArticleCount(articleList.size());
 newsMessage.setArticles(articleList);
 respMessage = MessageUtil.newsMessageToXml(newsMessage);
 }else if ("4".equals(content)) {
 respContent = "<a href=\"http://jeecgdemo.duapp.com/html5Servlet\">微應用演示 ? -- 用力點我</a>";
 textMessage.setContent(respContent);
 respMessage = MessageUtil.textMessageToXml(textMessage);
 }else if ("5".equals(content)||"翻譯".equals(content)) {
 respContent = getTranslateUsage();
 textMessage.setContent(respContent);
 respMessage = MessageUtil.textMessageToXml(textMessage);
 }else if ("6".equals(content)||"大轉盤".equals(content)) {
 NewsMessage newsMessage = new NewsMessage();
 newsMessage.setToUserName(fromUserName);
 newsMessage.setFromUserName(toUserName);
 newsMessage.setCreateTime(new Date().getTime());
 newsMessage.setMsgType(MessageUtil.RESP_MESSAGE_TYPE_NEWS);
 newsMessage.setFuncFlag(0);
 
 Article article3 = new Article();
 List<Article> articleList = new ArrayList<Article>();
 article3.setTitle("大轉盤");
 article3.setDescription("");
 article3.setPicUrl("http://www.jeecg.org/data/attachment/forum/201312/17/165432nuqktzqq305hkr06.jpg");
 article3.setUrl("http://jeecgdemo.duapp.com/zhuanpan.htm");
 articleList.add(article3);
 newsMessage.setArticleCount(articleList.size());
 newsMessage.setArticles(articleList);
 respMessage = MessageUtil.newsMessageToXml(newsMessage);
 }else if (content.startsWith("翻譯")) {
 String keyWord = content.replaceAll("^翻譯", "").trim(); ?
 ? ? ? ?if ("".equals(keyWord)) { ?
 ? ? ? ? ? ?textMessage.setContent(getTranslateUsage()); ?
 ? ? ? ?} else { ?
 ? ? ? ? ? ?textMessage.setContent(BaiduTranslateService.translate(keyWord)); ?
 ? ? ? ?} ?
 respMessage = MessageUtil.textMessageToXml(textMessage);
 }else if (content.startsWith("天氣")||content.startsWith("7")) {
 String keyWord = content.replaceAll("天氣", "").trim(); ?
 if ("".equals(keyWord)||"7".equals(keyWord)) { ?
 StringBuffer buffer = new StringBuffer();
 ? ? // 接收用戶發送的文本消息內容 ??
 buffer.append("發送天氣+城市,例如'天氣廣州'").append("\n");
 ? ? ? ? ? ?textMessage.setContent(buffer.toString());?
 ? ? ? ? ? ?respMessage = MessageUtil.textMessageToXml(textMessage);
 ? ? ? ?} else { ?
 ? ? ? ?  Map<String, Object> map = new HashMap<String, Object>();
 ? ? ? ? ? ?  Map<String, Object> map2 = new HashMap<String, Object>();
 ? ? ? ? ? ?  try{
 ? ? ? ? ? ?  String filepach = request.getRealPath("/");
 ? ? ? ? ? ?  Weather util = new Weather();
 ? ? ? ?  map = util.report(keyWord,filepach);
 ? ? ? ?  map2 = util.report2(keyWord,filepach);
 ? ? ? ? ? ?  }catch (Exception e) {
 ? ? ? ? ? ?  e.printStackTrace();
 ? ? ? ? ? ?  StringBuffer buffer = new StringBuffer();
 ? ? ? ? ? ?  // 接收用戶發送的文本消息內容 ??
 ? ? ? ?  buffer.append("發送天氣+城市,例如'天氣廣州'").append("\n");
 ? ? ? ?  textMessage.setContent(buffer.toString());
 ? ? ? ?  respMessage = MessageUtil.textMessageToXml(textMessage);
 ? ? ? ?  return respMessage;
 ? ? }
 ? ? ? ? ? ?  
 ? ? ? ? ? ?  List<Article> articleList = new ArrayList<Article>();
 ? ? ? ? ? ?  // 創建圖文消息 ??
 ? ? ? ? ? ? ? ?NewsMessage newsMessage = new NewsMessage(); ?
 ? ? ? ? ? ? ? ?newsMessage.setToUserName(fromUserName); ?
 ? ? ? ? ? ? ? ?newsMessage.setFromUserName(toUserName); ?
 ? ? ? ? ? ? ? ?newsMessage.setCreateTime(new Date().getTime()); ?
 ? ? ? ? ? ? ? ?newsMessage.setMsgType(MessageUtil.RESP_MESSAGE_TYPE_NEWS); ?
 ? ? ? ? ? ? ? ?newsMessage.setFuncFlag(0);?
 ? ? ? ? ? ? ? ?
 // ? ? ? ? ? ? ? ?Properties prop = new Properties();
 // ? ?  InputStream inStream = CoreService.class
 // ? ?  .getResourceAsStream("/messages.properties");
 // ? ?  try {
 // ? ?  prop.load(inStream);
 // ? ?  inStream.close();
 // ? ?  } catch (IOException e) {
 // ? ?  e.printStackTrace();
 // ? ?  }
 // ? ?  String picurl = prop.getProperty("picurl");
 ? ? ? ? ? ?  
 ? ? ? ? ? ?  Article article1 = new Article(); ?
 ? ? ? ? ? ? ? ?article1.setTitle("【"+content.substring(2)+"】天氣實況 氣溫:"+map2.get("temp")+"度 ?風速:"+map2.get("WD")+" "+map2.get("WS")+" 濕度:"+map2.get("SD") ); ?
 ? ? ? ? ? ? ? ?article1.setDescription(""); ?
 // ? ? ? ? ? ? ? ?article1.setPicUrl(picurl+"/image/khdxz2.jpg"); ?
 ? ? ? ? ? ? ? ?article1.setPicUrl("");
 ? ? ? ? ? ? ? ?article1.setUrl(""); ?
 
 
 ? ? ? ? ? ? ? ?Article article2 = new Article(); ?
 ? ? ? ? ? ? ? ?article2.setTitle("建議:"+map.get("index_d")); ?
 ? ? ? ? ? ? ? ?article2.setDescription(""); ?
 ? ? ? ? ? ? ? ?article2.setPicUrl(""); ?
 ? ? ? ? ? ? ? ?article2.setUrl(""); ?
 ? ? ? ? ? ? ? ?
 ? ? ? ? ? ? ? ?Article article3 = new Article(); ?
 ? ? ? ? ? ? ? ?article3.setTitle(map.get("mydate1")+" ?"+map.get("myweek1")+" ?"+map.get("temp1")+" ?"+map.get("weather1")+" ?"+map.get("wind1")+" "+map.get("fl1")); ?
 ? ? ? ? ? ? ? ?article3.setDescription(""); ?
 ? ? ? ? ? ? ? ?article3.setPicUrl("http://m.weather.com.cn/img/b"+map.get("img1")+".gif"); ?
 ? ? ? ? ? ? ? ?article3.setUrl(""); ?
 
 
 ? ? ? ? ? ? ? ?Article article4 = new Article(); ?
 ? ? ? ? ? ? ? ?article4.setTitle(map.get("mydate2")+" ?"+map.get("myweek2")+" ?"+map.get("temp2")+" ?"+map.get("weather2")+" ?"+map.get("wind2")+" "+map.get("fl2")); ?
 ? ? ? ? ? ? ? ?article4.setDescription(""); ?
 ? ? ? ? ? ? ? ?article4.setPicUrl("http://m.weather.com.cn/img/b"+map.get("img2")+".gif"); ?
 ? ? ? ? ? ? ? ?article4.setUrl(""); ?
 ? ? ? ? ? ? ? ?
 ? ? ? ? ? ? ? ?Article article5 = new Article(); ?
 ? ? ? ? ? ? ? ?article5.setTitle(map.get("mydate3")+" ?"+map.get("myweek3")+" ?"+map.get("temp3")+" ?"+map.get("weather3")+" ?"+map.get("wind3")+" "+map.get("fl3")); ?
 ? ? ? ? ? ? ? ?article5.setDescription(""); ?
 ? ? ? ? ? ? ? ?article5.setPicUrl("http://m.weather.com.cn/img/b"+map.get("img3")+".gif"); ?
 ? ? ? ? ? ? ? ?article5.setUrl("");
 
 
 ? ? ? ? ? ? ? ?articleList.add(article1); ?
 ? ? ? ? ? ? ? ?articleList.add(article2); ?
 ? ? ? ? ? ? ? ?articleList.add(article3); ?
 ? ? ? ? ? ? ? ?articleList.add(article4);
 ? ? ? ? ? ? ? ?articleList.add(article5);
 ? ? ? ? ? ? ? ?newsMessage.setArticleCount(articleList.size()); ?
 ? ? ? ? ? ? ? ?newsMessage.setArticles(articleList); ?
 ? ? ? ? ? ? ? ?respMessage = MessageUtil.newsMessageToXml(newsMessage);
 ? ? ? ?} ?
 
 }
 }
 // 圖片消息
 else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_IMAGE)) {
 respContent = "您發送的是圖片消息!";
 }
 // 地理位置消息
 else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_LOCATION)) {
 respContent = "您發送的是地理位置消息!";
 }
 // 鏈接消息
 else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_LINK)) {
 respContent = "您發送的是鏈接消息!";
 }
 // 音頻消息
 else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_VOICE)) {
 respContent = "您發送的是音頻消息!";
 }
 // 事件推送
 else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_EVENT)) {
 // 事件類型
 String eventType = requestMap.get("Event");
 // 訂閱
 if (eventType.equals(MessageUtil.EVENT_TYPE_SUBSCRIBE)) {
 respContent = "謝謝您的關注!回復\"?\"進入主菜單。";
 textMessage.setContent(respContent);
 respMessage = MessageUtil.textMessageToXml(textMessage);
 }
 // 取消訂閱
 else if (eventType.equals(MessageUtil.EVENT_TYPE_UNSUBSCRIBE)) {
 // TODO 取消訂閱后用戶再收不到公眾號發送的消息,因此不需要回復消息
 }
 // 自定義菜單點擊事件
 else if (eventType.equals(MessageUtil.EVENT_TYPE_CLICK)) {
 // TODO 自定義菜單權沒有開放,暫不處理該類消息
 String EventKey = requestMap.get("EventKey");
 if("jeecg.name".equals(EventKey)){
 respContent = "作者:張代浩 (scott)\n 郵箱:scott@jeecg.org \n QQ群:129190229";
 textMessage.setContent(respContent);
 respMessage = MessageUtil.textMessageToXml(textMessage);
 }
 if("翻譯".equals(EventKey)){
 respContent = getTranslateUsage();
 textMessage.setContent(respContent);
 respMessage = MessageUtil.textMessageToXml(textMessage);
 }
 
 }
 }
 
 
 } catch (Exception e) {
 e.printStackTrace();
 }
 
 
 return respMessage;
 }
 
 
 /**
 * 歡迎語
 * @return
 */
 public static String getMainMenu() {
 
 // 復雜字符串文本讀取,采用文件方式存儲
 String html = new FreemarkerHelper().parseTemplate("/text/welcome.ftl", null);
 return html;
 }
 
 
 
 /**
 * Q譯通使用指南
 *?
 * @return
 */
 public static String getTranslateUsage() {
 StringBuffer buffer = new StringBuffer();
 buffer.append("微譯使用指南").append("\n\n");
 buffer.append("微譯為用戶提供專業的多語言翻譯服務,目前支持以下翻譯方向:").append("\n");
 buffer.append(" ? ?中 -> 英").append("\n");
 buffer.append(" ? ?英 -> 中").append("\n");
 buffer.append(" ? ?日 -> 中").append("\n\n");
 buffer.append("使用示例:").append("\n");
 buffer.append(" ? ?翻譯我是中國人").append("\n");
 buffer.append(" ? ?翻譯dream").append("\n");
 buffer.append(" ? ?翻譯さようなら").append("\n\n");
 buffer.append("回復“?”顯示主菜單");
 return buffer.toString();
 }
 
 }
 
去123123
總結
 
                            
                        - 上一篇: JSF 源代码赏析之Lifecycle
- 下一篇: 1251_统计难题
