微信開發之消息接收--文本消息(五)


一、消息格式

 <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>
參數 描述
ToUserName 開發者微信號
FromUserName 發送方帳號(一個OpenID)
CreateTime 消息創建時間 (整型)
MsgType text
Content 文本消息內容
MsgId 消息id,64位整型

 

 

 

 

 

 

 

 

二、編寫消息類實體,代碼如下:

     BaseMessage.java   ---基礎消息類

package com.weixin.message;

/**
 * 消息實體類
 * @author Code猿猿
 *
 */
public class BaseMessage {
	
	/**
	 * 開發者微信號
	 */
	public String ToUserName;
	/**
	 * 發送方帳號(一個OpenID)
	 */
	public String FromUserName;
	/**
	 * 消息創建時間 (整型)
	 */
	public long CreateTime;
	/**
	 * text
	 */
	public String MsgType ;
	
	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;
	}
	
}

  TextMessage.java  ---文本消息

package com.weixin.message;

/**
 * 文本消息
 * @author Zhangsy
 *
 */
public class TextMessage extends BaseMessage {

	/**
	 * 文本消息內容
	 */
	public String Content;
	/**
	 * 消息id,64位整型
	 */
	public long MsgId ;
	
	public String getContent() {
		return Content;
	}
	public void setContent(String content) {
		Content = content;
	}
	public long getMsgId() {
		return MsgId;
	}
	public void setMsgId(long msgId) {
		MsgId = msgId;
	}
	
}

三、編寫消息類(讀取xml)

     MessageUtil.java  --》解析接收的xml信息、封裝返回的xml信息

     注意:這里用到了2個JAR包:xstream-1.3.jar、dom4j.jar

package com.weixin.util;

import java.io.IOException;
import java.io.InputStream;
import java.io.Writer;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Pattern;

import javax.servlet.http.HttpServletRequest;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.core.util.QuickWriter;
import com.thoughtworks.xstream.io.HierarchicalStreamWriter;
import com.thoughtworks.xstream.io.xml.PrettyPrintWriter;
import com.thoughtworks.xstream.io.xml.XppDriver;
import com.weixin.message.TextMessage;

/**
 * 對消息的處理
 * @author Code猿猿
 *
 */
public class MessageUtil {
	
	
	/**
	 * text
	 */
	public static final String RESP_MESSAGE_TYPE_TEXT = "text";

	/**
	 * music
	 */
	public static final String RESP_MESSAGE_TYPE_MUSIC = "music";

	/**
	 * news
	 */
	public static final String RESP_MESSAGE_TYPE_NEWS = "news";

	/**
	 * text
	 */
	public static final String REQ_MESSAGE_TYPE_TEXT = "text";

	/**
	 * image
	 */
	public static final String REQ_MESSAGE_TYPE_IMAGE = "image";

	/**
	 * link
	 */
	public static final String REQ_MESSAGE_TYPE_LINK = "link";

	/**
	 * location
	 */
	public static final String REQ_MESSAGE_TYPE_LOCATION = "location";

	/**
	 * voice
	 */
	public static final String REQ_MESSAGE_TYPE_VOICE = "voice";
	
	/**
	 * video
	 */
	public static final String REQ_MESSAGE_TYPE_VIDEO = "video";
	
	/**
	 * shortvideo
	 */
	public static final String REQ_MESSAGE_TYPE_SHORTVIDEO = "shortvideo";

	/**
	 * event
	 */
	public static final String REQ_MESSAGE_TYPE_EVENT = "event";

	/**
	 * subscribe
	 */
	public static final String EVENT_TYPE_SUBSCRIBE = "subscribe";

	/**
	 * unsubscribe
	 */
	public static final String EVENT_TYPE_UNSUBSCRIBE = "unsubscribe";

	/**
	 * CLICK
	 */
	public static final String EVENT_TYPE_CLICK = "CLICK";
	
	
	
	public static Map<String,String> parseXml(HttpServletRequest request){
		
		Map<String,String> messageMap=new HashMap<String, String>();
		
		InputStream inputStream=null;
		try {
			//讀取request Stream信息
			inputStream=request.getInputStream();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		SAXReader reader = new SAXReader();
		Document document=null;
		try {
			document = reader.read(inputStream);
		} catch (DocumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		Element root=document.getRootElement();
		List<Element> elementsList=root.elements();
		
		for(Element e:elementsList){
			messageMap.put(e.getName(),e.getText());
		}
		try {
			inputStream.close();
			inputStream=null;
		} catch (IOException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
		
		return messageMap;
	}
	
	
	/**
	 * 轉換文本消息
	 * 
	 * @param textMessage
	 *           
	 * @return xml
	 */
	public static String textMessageToXml(TextMessage textMessage) {
		xstream.alias("xml", textMessage.getClass());
		return xstream.toXML(textMessage);
	}

	/**
	 * 
	 * 定義xstream讓value自動加上CDATA標簽
	 */
	private static XStream xstream = new XStream(new XppDriver() {
		public HierarchicalStreamWriter createWriter(Writer out) {
			return new PrettyPrintWriter(out) {
				boolean cdata = false;
				@SuppressWarnings("unchecked")
				public void startNode(String name, Class clazz) {

					if (!name.equals("xml")) {
						char[] arr = name.toCharArray();
						if (arr[0] >= 'a' && arr[0] <= 'z') {
							// arr[0] -= 'a' - 'A';
							arr[0] = (char) ((int) arr[0] - 32);
						}
						name = new String(arr);
					}

					super.startNode(name, clazz);

				}

				@Override
				public void setValue(String text) {

					if (text != null && !"".equals(text)) {
						Pattern patternInt = Pattern
								.compile("[0-9]*(\\.?)[0-9]*");
						Pattern patternFloat = Pattern.compile("[0-9]+");
						if (patternInt.matcher(text).matches()
								|| patternFloat.matcher(text).matches()) {
							cdata = false;
						} else {
							cdata = true;
						}
					}
					super.setValue(text);
				}

				protected void writeText(QuickWriter writer, String text) {

					if (cdata) {
						writer.write("<![CDATA[");
						writer.write(text);
						writer.write("]]>");
					} else {
						writer.write(text);
					}
				}
			};
		}

	});
	

}

四、修改Servlet中的Post方法,加入如下代碼:

/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		
		request.setCharacterEncoding("UTF-8");
		response.setCharacterEncoding("UTF-8");
		
		Map<String,String> message=MessageUtil.parseXml(request);
		
		String messageType=message.get("MsgType");
		
		if(messageType.equals(MessageUtil.REQ_MESSAGE_TYPE_TEXT)){
			//接收的是文本消息
			
			//打印接收所有參數
			System.out.println("ToUserName:"+message.get("ToUserName"));
			System.out.println("FromUserName:"+message.get("FromUserName"));
			System.out.println("CreateTime:"+message.get("CreateTime"));
			System.out.println("MsgType:"+message.get("MsgType"));
			System.out.println("Content:"+message.get("Content"));
			System.out.println("MsgId:"+message.get("MsgId"));
			
			String req_content=message.get("Content");
			
			String res_content="";
			
			//組裝回復消息 
			//我們做個小實驗
			//接收內容:你好  回復:你好
			//接收內容:大家好  回復:大家好
			//接收內容:同志們好  回復:為人民服務
			if("你好".equals(req_content)){
				res_content="你好";
			}else if ("大家好".equals(req_content)){
				res_content="大家好";
			}else if("同志們好".equals(req_content)){
				res_content="為人民服務";
			}else{
				//否則原樣輸出輸入內容
				res_content=req_content;
			}
			
			TextMessage textMessage=new TextMessage();
			textMessage.setToUserName(message.get("FromUserName")); //這里的ToUserName 是剛才接收xml中的FromUserName textMessage.setFromUserName(message.get("ToUserName")); //這里的FromUserName 是剛才接收xml中的ToUserName 這里一定要注意,否則會出錯
			textMessage.setCreateTime(new Date().getTime());
			textMessage.setContent(res_content);
			textMessage.setMsgType(messageType);
			
			String xml=MessageUtil.textMessageToXml(textMessage);
			
			System.out.println("xml:"+xml);
			
			PrintWriter out = response.getWriter();
			out.print(xml);
		    out.close();
		}

五、部署測試

向公眾號發送信息,看是否能夠正常返回信息。

給各位推薦一個在線測試的平台:http://debug.fangbei.org/

操作步驟:

錄入我們接入微信平台的URL和TOKEN

選擇消息類型:文本

內容:輸入要發送給公眾號的內容

在右側可看到效果的預覽。

 


免責聲明!

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



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