使用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);

}

}

2Servlet中的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