(微信公众号)如何接收和回复文本消息

本文详细介绍了微信公众号的数据交互流程,包括用户与公众号之间的消息发送与接收机制,并提供了实现文本消息处理与回复的具体代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.数据交互原理

    首先,我们要明白,普通微信用户向公众号发送信息,然后公众号服务器回复一条消息的整个过程,数据是怎样传递的。

    1)用户向微信服务器发送请求

    2)微信服务器向公众号服务器发一条xml数据包

    3)公众号服务器解析这个xml数据包,进行逻辑处理,处理结果再打包成xml文件返回给微信服务器

    4)微信服务器再将信息返回给微信客户端

2.接收文本消息

    微信服务器向公众号服务器发送的xml文件内容如下:

ToUserName:开发者微信号
FromUserName:发送方帐号(一个OpenID)
CreateTime:消息创建时间 (整型)
MsgType:text
Content:文本消息内容
MsgId:消息id,64位整型

    我们在服务器这边首先是要将xml文件进行解析,创建一个工具类MessageUtil,然后编写一个xmlToMap()方法

   

/*
	 * xml转为map集合
	 */
	public static Map<String,String> xmlToMap(HttpServletRequest request) throws IOException, DocumentException{
		Map<String,String> map=new HashMap<String,String>();
		SAXReader reader=new SAXReader();
		
		InputStream ins=request.getInputStream();
		Document doc=reader.read(ins);
		
		Element root=doc.getRootElement();
		List<Element> list=root.elements();
		for(Element e:list){
			map.put(e.getName(), e.getText());
		}
		ins.close();
		return map;
	}

    在公众号服务器url对应的servlet里,我们可以重写一下doPost()方法,借助上述方法将xml文件的内容取出

Map<String,String> map=MessageUtil.xmlToMap(req);
			String toUserName=map.get("ToUserName");
			String fromUserName=map.get("FromUserName");
			String msgType=map.get("MsgType");
			String content=map.get("Content");

3.回复文本消息

ToUserName:接收方帐号(收到的OpenID)
FromUserName:开发者微信号
CreateTime:消息创建时间 (整型)
MsgType:text
Content:回复的消息内容(换行:在content中能够换行,微信客户端就支持换行显示)

    首先,我们创建一个文本消息类TextMessage,包含以上内容,

    第二,在MessageUtil工具类中,创建一个方法,将文本消息对象转换为xml文件

/*
	 * 将文本消息对象转换为xml
	 */
	public static String textMessageToXml(TextMessage textMessage){
		XStream xstream=new XStream(new DomDriver("UTF-8"));
		xstream.alias("xml",textMessage.getClass());
		return xstream.toXML(textMessage);
	}

    第三,在工具类中,创建一个方法,组装文本消息的内容

public static String initText(String toUserName,String fromUserName,String content){
		TextMessage text=new TextMessage();
		text.setFromUserName(toUserName);
		text.setToUserName(fromUserName);
		text.setMsgType(MESSAGE_TEXT);
		text.setCreateTime((new Date().getTime()));
		text.setContent(content);
		return textMessageToXml(text);
	}

    最后,我们根据接收的消息的类型和内容,判断回复什么样的内容。重写doPost()方法

protected void doPost(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		
		req.setCharacterEncoding("UTF-8");
		resp.setCharacterEncoding("UTF-8");
		
		PrintWriter out=resp.getWriter();
		try {
			Map<String,String> map=MessageUtil.xmlToMap(req);
			String toUserName=map.get("ToUserName");
			String fromUserName=map.get("FromUserName");
			String msgType=map.get("MsgType");
			String content=map.get("Content");

			String message=null;
			String str=null;
			if(MessageUtil.MESSAGE_TEXT.equals(msgType)){
				
				if("1".equals(content)){
					message=MessageUtil.initText(toUserName, fromUserName, MessageUtil.firstMenu());
				} else if("2".equals(content)){
					message=MessageUtil.initNewsMessage(toUserName, fromUserName);
				} else if("3".equals(content)){
					message=MessageUtil.initImageMessage(toUserName, fromUserName);
				} else if("?".equals(content)||"?".equals(content)){
					message=MessageUtil.initText(toUserName, fromUserName, MessageUtil.menuText());
				}
	
			} else if(MessageUtil.MESSAGE_EVENT.equals(msgType)){
				
				String eventType=map.get("Event");
				if(MessageUtil.MESSAGE_SUBSCRIBE.equals(eventType)){
					message=MessageUtil.initText(toUserName, fromUserName, MessageUtil.menuText());
				}
			}
			out.print(message);
			
		} catch (DocumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally{
			out.close();
		}
	}

其中在工具类中

public static final String MESSAGE_TEXT="text";



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值