zoukankan      html  css  js  c++  java
  • 微信开发之消息接收--文本消息(五)

    一、消息格式

     <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

    选择消息类型:文本

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

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

  • 相关阅读:
    MySQL 中无法 insert 文件路径 中的 backward slash的解决方法
    生成颜色代码的 Java程序
    公积金贷款不受影响 组合贷款有特殊
    ADOMD.NET Client Object架构
    心情•笔记20061231
    微软所谓的"无人工介入的自动的机器翻译系统"
    游戏中的微软
    商业智能的个人理解
    无日
    从电影死亡笔记看商业智能在治安领域的应用
  • 原文地址:https://www.cnblogs.com/codejackanapes/p/5470842.html
Copyright © 2011-2022 走看看