在上一篇文章中警绩,我們實(shí)現(xiàn)了文本消息的接收與響應(yīng)肩祥〈罨茫可以在用戶發(fā)送任何內(nèi)容的時候松申,回復(fù)一段固定的文字。本章節(jié)中舅逸,我們將對上一章節(jié)的代碼進(jìn)行適當(dāng)?shù)耐晟谱蛊撸瑫r實(shí)現(xiàn)【被關(guān)注回復(fù)與關(guān)鍵詞回復(fù)】功能彪置。
喜歡本文拳魁,請點(diǎn)擊一下下方的喜歡唄!??
一授舟、微信可提供的消息類型
在上一篇文章中裙椭,在我們的Servalet中扫尺,我們有這樣的一段代碼:
我們說這是用于判斷接收的消息類型是否為text炊汤,即是否為文本消息時正驻,將用戶發(fā)送的給信息拼接后返回。但這個這個功能現(xiàn)在不足以滿足我們的時候抢腐,我們將重寫代碼姑曙,實(shí)現(xiàn)被關(guān)注時自動回復(fù),以及根據(jù)關(guān)鍵詞自動回復(fù)迈倍。而首先伤靠,我們需要了解微信公眾平臺支持的消息類型以及對應(yīng)的事件關(guān)鍵字:
1、可接收消息類型:
文本消息——text啼染,語音消息——voice宴合,圖片消息——image焕梅,
視頻消息——video,鏈接消息——link卦洽,位置消息——location贞言,
消息視頻消息——shortvideo,
2阀蒂、支持的事件推送——event
關(guān)注——subscribe该窗,取消關(guān)注——unsubscribe,上傳地理位置——location
菜單點(diǎn)擊——點(diǎn)擊菜單獲取消息時觸發(fā)click/點(diǎn)擊菜單跳轉(zhuǎn)鏈接時觸發(fā)view
掃描帶參數(shù)二維碼——未關(guān)注時觸發(fā)subscribe/已關(guān)注時觸發(fā)scan
那我們可以清楚的看到蚤霞,微信可接收的消息類型以及可觸發(fā)的事件類型有很多種酗失,而每種類型都對應(yīng)著詳細(xì)的XML包,在微信公眾平臺開發(fā)文檔中有詳細(xì)解析争便,此處不做贅述级零,詳情可參考開發(fā)文檔內(nèi)容:
可接受消息類型:
http://mp.weixin.qq.com/wiki/10/79502792eef98d6e0c6e1739da387346.html
可支持事件類型:
http://mp.weixin.qq.com/wiki/2/5baf56ce4947d35003b86a9805634b1e.html
二、實(shí)現(xiàn)被關(guān)注自動回復(fù)
根據(jù)上述消息類型的描述滞乙,我們可以重寫一下我們上周的MessageUtil類奏纪,讓我們的工具類可以提供更完善的功能:
1、根據(jù)消息類型斩启,提供各種常量:
在我們的工具類中提供各種常量序调,方便在使用不同消息類型的時候,可以直接調(diào)用:
2兔簇、修改Servlet中的文本消息判斷方式
有了這樣的一些常量呢发绢,我們就需要將上周判斷文本消息的代碼,替換為用常量判斷
替換為
同時垄琐,添加一種類型判斷边酒,判斷接收的消息類型,是否為事件類型狸窘,添加完后墩朦,if-else結(jié)構(gòu)框架如下:
而在傳入事件過程中,我們知道又細(xì)分為關(guān)注翻擒、取消關(guān)注氓涣、點(diǎn)擊菜單等多種功能,那如何細(xì)分呢陋气?我們可以在else if 中繼續(xù)做判斷劳吠,通過我們上周將xml轉(zhuǎn)換為的map中,直接get(“Event”),從而取到詳細(xì)的事件類型巩趁,然后可以進(jìn)一步判斷事件為subscribe還是unsubscribe等痒玩,詳細(xì)如下:
通過上述if結(jié)構(gòu),我們可以精確的判斷到關(guān)注時所觸發(fā)的事件,也就是說我們可以在用戶關(guān)注時蠢古,推送一條消息主菜單燃观,那么我們需要在MessageUtil類中,新建兩個方法:
3便瑟、撰寫拼接主菜單方法&初始化消息方法
① 拼接主菜單方法,此方法比較簡單番川,只是簡單地字符串拼接到涂,方便后期頻繁使用:
② 初始化消息方法,此方法用于傳入接收用戶颁督、發(fā)送用戶践啄、消息內(nèi)容,進(jìn)而進(jìn)行拼接組裝沉御,并轉(zhuǎn)換為XML結(jié)構(gòu):
完成上述兩個方法后屿讽,我們就可以在用戶關(guān)注的if結(jié)構(gòu)中,調(diào)用initText方法吠裆,傳入我們拼接的主菜單伐谈,在用戶關(guān)注時,推送我們的功能主菜單:
截止到這试疙,我們就完成了用戶關(guān)注時诵棵,推送主菜單的功能,實(shí)現(xiàn)效果如下:
三祝旷、實(shí)現(xiàn)關(guān)鍵詞自動回復(fù)
有了上述關(guān)注自動回復(fù)的基礎(chǔ)履澳,我們再實(shí)現(xiàn)關(guān)鍵詞自動回復(fù),就會非常的簡單怀跛,只需要在原始判斷消息類型為Text的if條件中距贷,繼續(xù)進(jìn)行二次判斷,判斷用戶發(fā)送的消息為“1”吻谋、“2”忠蝗、“?”還是其他內(nèi)容滨溉,當(dāng)然為了更好地體驗(yàn)什湘,我們判定中英文?均會調(diào)出主菜單晦攒,詳細(xì)實(shí)現(xiàn)代碼如下:
通過上述代碼闽撤,我們就順利的完成了關(guān)鍵詞回復(fù)功能,詳細(xì)實(shí)現(xiàn)效果如下:
至此脯颜,我們本篇文章的“被關(guān)注回復(fù)與關(guān)鍵詞回復(fù)”功能就已經(jīng)介紹并開發(fā)完畢哟旗。
【附】源碼參考:
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轉(zhuǎn)為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();
//將根元素的所有節(jié)點(diǎn),放入列表中
List list = root.elements();
//遍歷list對象闸餐,并保存到集合中
for (Element element : list) {
map.put(element.getName(), element.getText());
}
ins.close();
return map;
}
/**
* 將文本消息對象轉(zhuǎn)成XML
* @param text
* @return
*/
public static String textMessageToXml(TextMessage textMessage){
XStream xstream = new XStream();
//將xml的根節(jié)點(diǎn)替換成 ?默認(rèn)為TextMessage的包名
xstream.alias("xml", textMessage.getClass());
return xstream.toXML(textMessage);
}
/**
* 拼接關(guān)注主菜單
*/
public static String menuText(){
StringBuffer sb = new StringBuffer();
sb.append("歡迎關(guān)注史上最帥公眾號饱亮,請選擇:\n\n");
sb.append("1、姜浩真帥舍沙。\n");
sb.append("2近上、姜浩并不帥。\n\n");
sb.append("回復(fù)拂铡?調(diào)出主菜單壹无。\n\n");
return sb.toString();
}
/**
* 初始化回復(fù)消息
*/
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);
}
}
【版權(quán)聲明】
原創(chuàng)內(nèi)容,歡迎轉(zhuǎn)載感帅!轉(zhuǎn)載請注明出處斗锭!需要源碼下載,請聯(lián)系博主失球!微博@小風(fēng)飛魚