(二)微信公众号消息的接收与回应

 上一篇文章微信公众号环境搭建与开发接入链接(https://blog.csdn.net/swiftly_654123/article/details/82724218

上一篇文章接入微信公众平台的时候用的是GET请求来校验我们写的方法。而当我们接收消息的时候,微信发送的是POST请求,并以XML的格式发送与接收数据。

消息接收与响应的详情请参考官方开发文档:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140453

由官方文档可以看到微信给我们发送的消息是xml结构的,下面是普通文本消息的xml包结构:

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

 

其中,各标签所包含的内容,在官方文档中说的很详细:

因为微信发送的消息是POST请求,所以我们就在上篇文章的servlet中编写doPost方法以接收微信发送的内容,因为微信给我们发送的内容是xml结构,所以我们需要将xml结构的类型转换成我们熟悉的集合类型。反之,可以将我们熟悉的集合类型转换成xml结构类型,并返回给微信公众平台。

项目结构:

  1. 将接收的xml结构类型转换成集合对象map类型

     创建一个新的工具类MessageUtil  需要的jar包dom4j和xstream

       /**
	 * 将xml类型转换为Map类型
	 * @Title: xmlToMap
	 * @Description: TODO
	 * @param: @param request
	 * @param: @return
	 * @param: @throws Exception
	 * @return: Map<String,String>   
	 * @throws
	 */
	@SuppressWarnings("unchecked")
	public static Map<String,String> xmlToMap(HttpServletRequest req) throws Exception {
		Map<String, String> map = new HashMap<String,String>();
		//从dom4j的jar包中,拿到SAXReader对象
		SAXReader reader = new SAXReader();
		//从request中获取输入流
		InputStream stream = req.getInputStream();
		//从reader对象中,读取输入流
		Document doc = reader.read(stream);
		//获取xml文档的根元素
		Element root = doc.getRootElement();
		//获得根元素下的所有节点
		List<Element> list = root.elements();
		//遍历list对象,并将结果存到集合中
		for (Element e : list) {
			map.put(e.getName(), e.getText());
		}
		stream.close();
		return map;
		
	}
	
	/**
	 * 将text消息对象转为xml
	 * @Title: textMessageToXml
	 * @Description: TODO
	 * @param: @param textMessage
	 * @param: @return   
	 * @return: String   
	 * @throws
	 */
	public static String textMessageToXml (TextMessage textMessage) {
		XStream xstream = new XStream();	
		xstream.alias("xml", textMessage.getClass());
		return xstream.toXML(textMessage);
	}

 TextMessage类

        private String ToUserName;
	private String FromUserName;
	private String CreateTime;
	private String MsgType;
	private String Content;
	private String MsgId;
	
	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 String getCreateTime() {
		return CreateTime;
	}
	public void setCreateTime(String createTime) {
		CreateTime = createTime;
	}
	public String getMsgType() {
		return MsgType;
	}
	public void setMsgType(String msgType) {
		MsgType = msgType;
	}
	public String getContent() {
		return Content;
	}
	public void setContent(String content) {
		Content = content;
	}
	public String getMsgId() {
		return MsgId;
	}
	public void setMsgId(String msgId) {
		MsgId = msgId;
	}

 WeiXinServlet类:新增doPost方法

        @Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		req.setCharacterEncoding("UTF-8");
		resp.setCharacterEncoding("UTF-8");
		PrintWriter out = resp.getWriter();
		String str = null;
		try {
			Map<String, String> map = MessageUtil.xmlToMap(req);//将接收的消息转换为map类型
			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");
			
			if("text".equals(msgType)) {  //判断是否是文本类型
				TextMessage message = new TextMessage();
				message.setFromUserName(toUserName); //原来接收消息用户变为发送消息用户
				message.setToUserName(fromUserName);
				message.setCreateTime(new Date().getTime()+"");
				message.setMsgType("text");
				message.setContent("你好:"+fromUserName+"\n我是:"+toUserName
						+"\n你发送的消息类型是:"+msgType
						+"\n你发送的内容是:"+content
						+"\n你发送的时间为:"+createTime
						+"\n我回复的时间为:"+message.getCreateTime()
						+"\n消息id是:"+msgId
						);
				str = MessageUtil.textMessageToXml(message);//将发送的消息对象转换为xml字符串
			}
			
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		out.print(str);
		out.close();
	}

 这样我们就成功的完成了文本消息的接收和发送了。效果如下:

首先进入微信公众平台,点击左侧【开发——开发者工具】,选择【公众平台测试账号】找到测试号二维码扫描关注:

 

猜你喜欢

转载自blog.csdn.net/swiftly_654123/article/details/82726015