消息回覆,實現與用戶交互
一、消息接收的數據與回覆數據結構分析
1.接收的數據結構
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>1348831860</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[this is a test]]></Content>
<MsgId>1234567890123456</MsgId>
</xml>
2.發送消息的數據結構
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>12345678</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[你好]]></Content>
</xml>
思路的分析:需要將微信平臺發送的xml格式請求信息解析,後臺處理已xml的格式返回給微信公衆平臺;後期的語音消息,圖片消息都是類似的思路。根據xml格式,分析數據結構,構建bean類(做了一個調整,建立一個基類,方便後期的語音,圖片的擴展)
/**
*
* 類名稱: BaseMessage
* 類描述: 回覆消息的基類
* @author yuanjun
* 創建時間:2017年12月8日上午11:38:11
*/
public class BaseMessage {
protected String ToUserName;
protected String FromUserName;
protected long CreateTime;
protected String MsgType;
public BaseMessage() {
super();
}
public String getToUserName() {
return ToUserName;
}
public void setToUserName(String toUserName) {
ToUserName = toUserName;
}
public String getFromUserName() {
return FromUserName;
}
public void setFromUserName(String fromUserName) {
FromUserName = fromUserName;
}
public long getCreateTime() {
return CreateTime;
}
public void setCreateTime(long createTime) {
CreateTime = createTime;
}
public String getMsgType() {
return MsgType;
}
public void setMsgType(String msgType) {
MsgType = msgType;
}
}
/**
*
* 類名稱: MessageTest
* 類描述: 消息內容實體
* @author yuanjun
* 創建時間:2017年12月5日上午10:41:40
*/
public class MessageText extends BaseMessage {
private String Content;//文本消息內容
private String MsgId;//消息id,64位整型
public MessageText(){
}
public MessageText(String toUserName, String fromUserName,
long createTime, String msgType, String content, String msgId) {
super();
ToUserName = toUserName;
FromUserName = fromUserName;
CreateTime = createTime;
MsgType = msgType;
Content = content;
MsgId = msgId;
}
public String getContent() {
return Content;
}
public void setContent(String content) {
Content = content;
}
public String getMsgId() {
return MsgId;
}
public void setMsgId(String msgId) {
MsgId = msgId;
}
}二、獲取信息請求,封裝xml回覆信息格式
2.1在pom文件添加dom4j的jar包
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
</dependency>
2.2 將後臺的xml請求,轉成map
import java.io.IOException;
import java.io.InputStream;
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;
/**
*
* 類名稱: MessageUtil
* 類描述: 消息處理工具
* @author yuanjun
* 創建時間:2017年12月8日下午3:20:48
*/
public class MessageUtil {
/**
* 將微信的請求中參數轉成map
* @param request
* @return
*/
public static Map<String,String> xmlToMap(HttpServletRequest request){
Map<String,String> map = new HashMap<String,String>();
SAXReader reader = new SAXReader();
InputStream in = null;
try {
in = request.getInputStream();
Document doc = reader.read(in);
Element root = doc.getRootElement();
List<Element> list = root.elements();
for (Element element : list) {
map.put(element.getName(), element.getText());
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (DocumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try {
in.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return map;
}
}
2.3發送消息的xml封裝
/**
*
* 類名稱: BaseMessageUtil
* 類描述: 消息封裝工具類的基類,這裏採用泛型,方便後期功能擴展
* @author yuanjun
* 創建時間:2017年12月6日下午2:06:55
*/
public interface BaseMessageUtil <T>{
/**
* 將回復的信息對象轉xml格式給微信
* @param message
* @return
*/
public abstract String messageToxml(T t);
/**
* 回覆的信息封裝
* @param FromUserName
* @param ToUserName
* @param Content
* @return
*/
public abstract String initMessage(String FromUserName,String ToUserName);
}
2.4實現封裝接口,添加xstream,json等jar包
<dependency>
<groupId>com.thoughtworks.xstream</groupId>
<artifactId>xstream</artifactId>
<version>1.4.9</version>
</dependency>
<dependency>
<groupId>net.sf.json-lib</groupId>
<artifactId>json-lib</artifactId>
<version>2.4</version>
<classifier>jdk15</classifier>
</dependency>
2.5 發送文本消息xml封裝實現
public class TextMessageUtil{
/**
* 將發送消息封裝成對應的xml格式
*/
public String messageToxml(MessageText message) {
XStream xstream = new XStream();
xstream.alias("xml", message.getClass());
return xstream.toXML(message);
}
/**
* 封裝發送消息對象,封裝時,需要將調換髮送者和接收者的關係
* @param FromUserName
* @param ToUserName
*/
public String initMessage(String FromUserName, String ToUserName) {
MessageText text = new MessageText();
text.setToUserName(FromUserName);
text.setFromUserName(ToUserName);
text.setContent("歡迎關注機械振動工程黨支部");
text.setCreateTime(new Date().getTime());
text.setMsgType("text");
return messageToxml.messageToxml(text);
}
}
三、處理post請求,將信息返回到微信平臺
3.1 在之前的之前的控制下,添加處理post的方法。
@RequestMapping(value = "wxdemo",method=RequestMethod.POST)
public void dopost(HttpServletRequest request,HttpServletResponse response){
response.setCharacterEncoding("utf-8");
PrintWriter out = null;
//將微信請求xml轉爲map格式,獲取所需的參數
Map<String,String> map = MessageUtil.xmlToMap(request);
String ToUserName = map.get("ToUserName");
String FromUserName = map.get("FromUserName");
String MsgType = map.get("MsgType");
String Content = map.get("Content");
String message = null;
//處理文本類型,實現輸入1,回覆相應的封裝的內容
if("text".equals(MsgType)){
if("1".equals(Content)){
TextMessageUtil textMessage = new TextMessageUtil();
message = textMessage.initMessage(FromUserName, ToUserName);
}
}
try {
out = response.getWriter();
out.write(message);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
out.close();
}
四、實現與用戶的交互,回覆用戶輸入的內容,效果如圖
4.1實現代碼:重載發送消息的封裝,將請求的內容傳入,通過post請求發回微信平臺
public class TextMessageUtil implements BaseMessageUtil<MessageText> {
//添加封裝發送消息的方法,重載,將內容傳入
public String initMessage(String FromUserName, String ToUserName,String Content) {
MessageText text = new MessageText();
text.setToUserName(FromUserName);
text.setFromUserName(ToUserName);
text.setContent("您輸入的內容是:"+Content);
text.setCreateTime(new Date().getTime());
text.setMsgType("text");
return messageToxml(text);
}
}
4.2 修改post的方法
@RequestMapping(value = "wxdemo",method=RequestMethod.POST)
public void dopost(HttpServletRequest request,HttpServletResponse response){
response.setCharacterEncoding("utf-8");
PrintWriter out = null;
//將微信請求xml轉爲map格式,獲取所需的參數
Map<String,String> map = MessageUtil.xmlToMap(request);
String ToUserName = map.get("ToUserName");
String FromUserName = map.get("FromUserName");
String MsgType = map.get("MsgType");
String Content = map.get("Content");
String message = null;
//處理文本類型,回覆用戶輸入的內容
if("text".equals(MsgType)){
TextMessageUtil textMessage = new TextMessageUtil();
message = textMessage.initMessage(FromUserName, ToUserName,Content);
}
try {
out = response.getWriter();
out.write(message);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
out.close();
}