微信开发源码讲解
微信開發請求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_统计难题