使用Java語言開發(fā)微信公眾平臺(三)——被關(guān)注回復(fù)與關(guān)鍵詞回復(fù)

在上一篇文章中警绩,我們實(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)效果如下:

被關(guān)注回復(fù)運(yù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ù)運(yù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)飛魚


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末岖是,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子实苞,更是在濱河造成了極大的恐慌豺撑,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,997評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件硬梁,死亡現(xiàn)場離奇詭異前硫,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)荧止,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評論 3 392
  • 文/潘曉璐 我一進(jìn)店門屹电,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人跃巡,你說我怎么就攤上這事危号。” “怎么了素邪?”我有些...
    開封第一講書人閱讀 163,359評論 0 353
  • 文/不壞的土叔 我叫張陵外莲,是天一觀的道長。 經(jīng)常有香客問我兔朦,道長偷线,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,309評論 1 292
  • 正文 為了忘掉前任沽甥,我火速辦了婚禮声邦,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘摆舟。我一直安慰自己亥曹,他們只是感情好邓了,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,346評論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著媳瞪,像睡著了一般骗炉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蛇受,一...
    開封第一講書人閱讀 51,258評論 1 300
  • 那天句葵,我揣著相機(jī)與錄音,去河邊找鬼兢仰。 笑死笼呆,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的旨别。 我是一名探鬼主播,決...
    沈念sama閱讀 40,122評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼汗茄,長吁一口氣:“原來是場噩夢啊……” “哼秸弛!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起洪碳,我...
    開封第一講書人閱讀 38,970評論 0 275
  • 序言:老撾萬榮一對情侶失蹤递览,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后瞳腌,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體绞铃,經(jīng)...
    沈念sama閱讀 45,403評論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,596評論 3 334
  • 正文 我和宋清朗相戀三年嫂侍,在試婚紗的時候發(fā)現(xiàn)自己被綠了儿捧。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,769評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡挑宠,死狀恐怖菲盾,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情各淀,我是刑警寧澤懒鉴,帶...
    沈念sama閱讀 35,464評論 5 344
  • 正文 年R本政府宣布,位于F島的核電站碎浇,受9級特大地震影響临谱,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜奴璃,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,075評論 3 327
  • 文/蒙蒙 一悉默、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧溺健,春花似錦麦牺、人聲如沸钮蛛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,705評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽魏颓。三九已至,卻和暖如春吱晒,著一層夾襖步出監(jiān)牢的瞬間甸饱,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,848評論 1 269
  • 我被黑心中介騙來泰國打工仑濒, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留叹话,地道東北人。 一個月前我還...
    沈念sama閱讀 47,831評論 2 370
  • 正文 我出身青樓墩瞳,卻偏偏與公主長得像驼壶,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子喉酌,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,678評論 2 354

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理热凹,服務(wù)發(fā)現(xiàn),斷路器泪电,智...
    卡卡羅2017閱讀 134,654評論 18 139
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法般妙,類相關(guān)的語法,內(nèi)部類的語法相速,繼承相關(guān)的語法碟渺,異常的語法,線程的語...
    子非魚_t_閱讀 31,625評論 18 399
  • 小編費(fèi)力收集:給你想要的面試集合 1.C++或Java中的異常處理機(jī)制的簡單原理和應(yīng)用突诬。 當(dāng)JAVA程序違反了JA...
    八爺君閱讀 4,587評論 1 114
  • 環(huán)信官方Demo源碼分析及SDK簡單應(yīng)用 環(huán)信官方Demo源碼分析及SDK簡單應(yīng)用-ChatDemoUI3.0 環(huán)...
    imGeek閱讀 1,553評論 0 3
  • 最近一直在聽薛兆豐老師的北大經(jīng)濟(jì)學(xué)課苫拍,近期的核心觀點(diǎn)是建立成本意識,以前總認(rèn)為自己知道什么是成本啊旺隙,學(xué)了才知道原來...
    貓叔老徐閱讀 840評論 0 51