微信开发之消息的接收与相应--文本消息(五)

一、消息格式

 <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信息

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

选择消息类型:文本

内容:输入要发送给公众号的内容

在右侧可看到效果的预览。

时间: 2024-12-18 12:56:26

微信开发之消息的接收与相应--文本消息(五)的相关文章

java开发微信公众平台(二)-- 消息的接收与回复文本消息

前面完成了服务器的对接,这一篇主要是实现各类消息的接收,并封装成map形式,供后面的使用,以及回复文本消息. 前面介绍的服务器的对接是通过get请求,而微信服务器准发过来用户的信息则是通过post请求,因此我们的方法要在post中实现. 同样,sae在接收微信服务器发过来消息时仍需要验证消息的可靠性,与上一讲中类似,只不过当验证成功后不是返回echostr,而是对 微信服务器发过来的消息进行解析处理. 1 protected void doPost(HttpServletRequest requ

微信公共平台开发-(.net实现)3--发送文本消息

最近,项目这边比较忙,没来得及续写,哎,先吐吐槽吧,在这个周六还得来上班,以后每个周六多要上,一天的滋味真有点受不鸟呀.还不习惯ing... 嗯,别的不说了现在开始接着上次http://www.cnblogs.com/QLJ1314/p/3838058.html  获取ACCESSTOKEN,开始吧,接下来我们就写发送文本消息吧. 首先建立一个微信消息实体类. 1 class wxmessage 2 { 3 public string FromUserName { get; set; } 消息发

微信公众号开发之消息的接收与被动回复消息

原文:http://blog.csdn.net/qczxl/article/details/51580946 微信官方文档 接收普通消息(http://mp.weixin.qq.com/wiki/17/f298879f8fb29ab98b2f2971d42552fd.html) 接收事件推送(http://mp.weixin.qq.com/wiki/7/9f89d962eba4c5924ed95b513ba69d9b.html) 发送被动回复消息(http://mp.weixin.qq.com/

微信公众号开发--消息的接收与被动回复消息

微信官方文档 接收普通消息(http://mp.weixin.qq.com/wiki/17/f298879f8fb29ab98b2f2971d42552fd.html) 接收事件推送(http://mp.weixin.qq.com/wiki/7/9f89d962eba4c5924ed95b513ba69d9b.html) 发送被动回复消息(http://mp.weixin.qq.com/wiki/1/6239b44c206cab9145b1d52c67e6c551.html) 没什么好说的,直接

《微信开发日志》之被动响应多图文消息

被动响应多图文消息官方文档: news消息 <xml> <ToUserName><![CDATA[toUser]]></ToUserName> <FromUserName><![CDATA[fromUser]]></FromUserName> <CreateTime>12345678</CreateTime> <MsgType><![CDATA[news]]></Msg

微信开发:客服接口向用户发送消息

发送文本消息: $access_token = ""; $url='https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token='.$access_token;$content = '{    "touser":"'.$openid.'",    "msgtype":"text",    "text":    { 

详解微信开发者文档——4接收用户其他类型消息并进行自定义处理

http://www.midifan.com/moduleuser-index-427124.htmhttp://www.midifan.com/moduleuser-index-427714.htmhttp://www.midifan.com/moduleuser-index-427697.htmhttp://www.midifan.com/moduleuser-index-427721.htmhttp://www.midifan.com/moduleuser-index-427728.htm

微信公号开发之文本消息技巧:长度限制、换行和表情

微信公众账号文本消息的内容长度限制揭秘 相信不少朋友都遇到过这样的问题:当发送的文本消息内容过长时,微信将不做任何响应.那么到底微信允许的文本消息的最大长度是多少呢?我们又该如何计算文本的长度呢?为什么还有些人反应微信好像支持的文本消息最大长度在1300多呢?这篇文章会彻底解除大家的疑问. 接口文档中对消息长度限制为2048: 可以看到,接口文档中写的很明确:回复的消息内容长度不超过2048字节.那为什么很多人测试反应消息内容长度在1300多字节时,微信就不响应了呢?我想这问题应该在这部分人没有

(6)微信二次开发 之 微信文本消息接口实现

p.p1 { margin: 13.0px 0.0px 13.0px 0.0px; text-align: justify; font: 16.0px SimSun } p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; text-align: justify; font: 10.5px SimSun } span.s1 { font: 16.0px Cambria } span.s2 { font: 16.0px "Times New Roman" } s