使用Java語言開發微信公眾平台(五)——被關注回復與關鍵詞回復


 

 

在上一篇文章中,我們實現了文本消息的接收與響應。可以在用戶發送任何內容的時候,回復一段固定的文字。本章節中,我們將對上一章節的代碼進行適當的完善,同時實現【被關注回復與關鍵詞回復】功能。

一、微信可提供的消息類型

在上一篇文章中,在我們的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”、“?”還是其他內容,當然為了更好地體驗,我們判定中英文?均會調出主菜單,詳細實現代碼如下:

 

通過上述代碼,我們就順利的完成了關鍵詞回復功能,詳細實現效果如下:

 

至此,我們本篇文章的“被關注回復與關鍵詞回復”功能就已經介紹並開發完畢。同學們可下載源碼或加入傑瑞教育開發交流QQ群(452379712),進行進一步的學習交流。

 

【附】源碼參考:

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<String , String> xmlToMap(HttpServletRequest request) throws IOException, DocumentException{

Map<String , String> map = new HashMap<String, String>();

SAXReader reader = new SAXReader();

//從request對象中獲取輸入流

InputStream ins = request.getInputStream();

//使用reader對象讀取輸入流,解析為XML文檔

Document doc = reader.read(ins);

//獲取XML根元素

Element root = doc.getRootElement();

//將根元素的所有節點,放入列表中

List<Element> 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的根節點替換成<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);

}

}

2、Servlet中的doPost方法:

request.setCharacterEncoding("UTF-8");

response.setCharacterEncoding("UTF-8");

PrintWriter out = response.getWriter();

 

try {

Map<String , String> map = MessageUtil.xmlToMap(request);

String ToUserName = map.get("ToUserName");

String FromUserName = map.get("FromUserName");

String CreateTime = map.get("CreateTime");

String MsgType = map.get("MsgType");

String Content = map.get("Content");

String MsgId  = map.get("MsgId ");

 

String message = null;

if (MsgType.equals(MessageUtil.MESSAGE_TEXT)) {//判斷是否為文本消息類型

if (Content.equals("1")) {

message = MessageUtil.initText(ToUserName, FromUserName,

   "對啊!我也是這么覺得!姜浩帥哭了!");

} else if(Content.equals("2")){

message = MessageUtil.initText(ToUserName, FromUserName,

   "好可憐啊!你年級輕輕地就瞎了!");

} else if(Content.equals("?") || Content.equals("?")){

message = MessageUtil.initText(ToUserName, FromUserName,

   MessageUtil.menuText());

} else {

message = MessageUtil.initText(ToUserName, FromUserName,

   "沒讓你選的就別瞎嘚瑟!!!");

}

 

}else if(MsgType.equals(MessageUtil.MESSAGE_EVENT)){//判斷是否為事件類型

//從集合中,或許是哪一種事件傳入

String eventType = map.get("Event");

//關注事件

if (eventType.equals(MessageUtil.MESSAGE_SUBSCRIBE)) {

message = MessageUtil.initText(ToUserName, FromUserName,

   MessageUtil.menuText());

}

}

 

System.out.println(message);

out.print(message);

 

} catch (DocumentException e) {

e.printStackTrace();

}finally{

out.close();


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM