在上一篇文章中,我們實現了文本消息的接收與響應。可以在用戶發送任何內容的時候,回復一段固定的文字。本章節中,我們將對上一章節的代碼進行適當的完善,同時實現【被關注回復與關鍵詞回復】功能。
喜歡本文,請點擊一下下方的喜歡唄!??
一、微信可提供的消息類型
在上一篇文章中,在我們的Servalet中,我們有這樣的一段代碼:
我們說這是用于判斷接收的消息類型是否為text,即是否為文本消息時,將用戶發送的給信息拼接后返回。但這個這個功能現在不足以滿足我們的時候,我們將重寫代碼,實現被關注時自動回復,以及根據關鍵詞自動回復。而首先,我們需要了解微信公眾平臺支持的消息類型以及對應的事件關鍵字:
1、可接收消息類型:
文本消息——text,語音消息——voice,圖片消息——image,
視頻消息——video,鏈接消息——link,位置消息——location,
消息視頻消息——shortvideo,
2、支持的事件推送——event
關注——subscribe,取消關注——unsubscribe,上傳地理位置——location
菜單點擊——點擊菜單獲取消息時觸發click/點擊菜單跳轉鏈接時觸發view
掃描帶參數二維碼——未關注時觸發subscribe/已關注時觸發scan
那我們可以清楚的看到,微信可接收的消息類型以及可觸發的事件類型有很多種,而每種類型都對應著詳細的XML包,在微信公眾平臺開發文檔中有詳細解析,此處不做贅述,詳情可參考開發文檔內容:
可接受消息類型:
http://mp.weixin.qq.com/wiki/10/79502792eef98d6e0c6e1739da387346.html
可支持事件類型:
http://mp.weixin.qq.com/wiki/2/5baf56ce4947d35003b86a9805634b1e.html
二、實現被關注自動回復
根據上述消息類型的描述,我們可以重寫一下我們上周的MessageUtil類,讓我們的工具類可以提供更完善的功能:
1、根據消息類型,提供各種常量:
在我們的工具類中提供各種常量,方便在使用不同消息類型的時候,可以直接調用:
2、修改Servlet中的文本消息判斷方式
有了這樣的一些常量呢,我們就需要將上周判斷文本消息的代碼,替換為用常量判斷
替換為
同時,添加一種類型判斷,判斷接收的消息類型,是否為事件類型,添加完后,if-else結構框架如下:
而在傳入事件過程中,我們知道又細分為關注、取消關注、點擊菜單等多種功能,那如何細分呢?我們可以在else if 中繼續做判斷,通過我們上周將xml轉換為的map中,直接get(“Event”),從而取到詳細的事件類型,然后可以進一步判斷事件為subscribe還是unsubscribe等,詳細如下:
通過上述if結構,我們可以精確的判斷到關注時所觸發的事件,也就是說我們可以在用戶關注時,推送一條消息主菜單,那么我們需要在MessageUtil類中,新建兩個方法:
3、撰寫拼接主菜單方法&初始化消息方法
① 拼接主菜單方法,此方法比較簡單,只是簡單地字符串拼接,方便后期頻繁使用:
② 初始化消息方法,此方法用于傳入接收用戶、發送用戶、消息內容,進而進行拼接組裝,并轉換為XML結構:
完成上述兩個方法后,我們就可以在用戶關注的if結構中,調用initText方法,傳入我們拼接的主菜單,在用戶關注時,推送我們的功能主菜單:
截止到這,我們就完成了用戶關注時,推送主菜單的功能,實現效果如下:
三、實現關鍵詞自動回復
有了上述關注自動回復的基礎,我們再實現關鍵詞自動回復,就會非常的簡單,只需要在原始判斷消息類型為Text的if條件中,繼續進行二次判斷,判斷用戶發送的消息為“1”、“2”、“?”還是其他內容,當然為了更好地體驗,我們判定中英文?均會調出主菜單,詳細實現代碼如下:
通過上述代碼,我們就順利的完成了關鍵詞回復功能,詳細實現效果如下:
至此,我們本篇文章的“被關注回復與關鍵詞回復”功能就已經介紹并開發完畢。
【附】源碼參考:
1、MessageUtil類:
package com.jredu.util;
import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import com.jredu.entity.TextMessage;
import com.thoughtworks.xstream.XStream;
public class MessageUtil {
public static final String MESSAGE_TEXT = "text";
public static final String MESSAGE_IMAGE = "image";
public static final String MESSAGE_VOICE = "voice";
public static final String MESSAGE_VIDEO = "video";
public static final String MESSAGE_SHORTVIDEO = "shortvideo";
public static final String MESSAGE_LINK = "link";
public static final String MESSAGE_LOCATION = "location";
public static final String MESSAGE_EVENT = "event";
public static final String MESSAGE_SUBSCRIBE = "subscribe";
public static final String MESSAGE_UNSUBSCRIBE = "unsubscribe";
public static final String MESSAGE_CLICK = "CLICK";
public static final String MESSAGE_VIEW = "VIEW";
public static final String MESSAGE_SCAN = "SCAN";
/**
* 將XML轉為MAP集合
* @param request
* @return
* @throws IOException
* @throws DocumentException
*/
public static Map xmlToMap(HttpServletRequest request) throws IOException, DocumentException{
Map map = new HashMap();
SAXReader reader = new SAXReader();
//從request對象中獲取輸入流
InputStream ins = request.getInputStream();
//使用reader對象讀取輸入流,解析為XML文檔
Document doc = reader.read(ins);
//獲取XML根元素
Element root = doc.getRootElement();
//將根元素的所有節點,放入列表中
List list = root.elements();
//遍歷list對象,并保存到集合中
for (Element element : list) {
map.put(element.getName(), element.getText());
}
ins.close();
return map;
}
/**
* 將文本消息對象轉成XML
* @param text
* @return
*/
public static String textMessageToXml(TextMessage textMessage){
XStream xstream = new XStream();
//將xml的根節點替換成 ?默認為TextMessage的包名
xstream.alias("xml", textMessage.getClass());
return xstream.toXML(textMessage);
}
/**
* 拼接關注主菜單
*/
public static String menuText(){
StringBuffer sb = new StringBuffer();
sb.append("歡迎關注史上最帥公眾號,請選擇:\n\n");
sb.append("1、姜浩真帥。\n");
sb.append("2、姜浩并不帥。\n\n");
sb.append("回復?調出主菜單。\n\n");
return sb.toString();
}
/**
* 初始化回復消息
*/
public static String initText(String toUSerName,String fromUserName,String content){
TextMessage text = new TextMessage();
text.setFromUserName(toUSerName);
text.setToUserName(fromUserName);
text.setMsgType(MESSAGE_TEXT);
text.setCreateTime(new Date().getTime()+"");
text.setContent(content);
return MessageUtil.textMessageToXml(text);
}
}
【版權聲明】
原創內容,歡迎轉載!轉載請注明出處!需要源碼下載,請聯系博主!微博@小風飛魚