springboot的微信公众号(六)文本消息

这个功能再微信公众号开发文档里面叫做被动回复用户消息;假如说用户触发了某一个业务,然后需要你来推送一些东西的时候用,当然比较多的还是模板消息,比如

这个之后说

我们现在说普通的消息

先看一下微信的开发文档

不难看出,就是说当用户发送消息过来的时候你可以获取到,然后我们返回给微信一个xml类型的数据到response中,即可回复给用户消息

话不多说,上代码,我这里将所有的消息发送放在了service,然后将请求的request转换成了map,后面会贴出这个工具类,

这段代码的前面是之前的接入验证,然后是转换request,然后就是业务逻辑层了

public void wxLogin(HttpServletRequest request,HttpServletResponse response) throws UnsupportedEncodingException{
		//设置编码,不然接收到的消息乱码
		request.setCharacterEncoding("UTF-8");
		response.setCharacterEncoding("UTF-8");
		String signature = request.getParameter("signature");//微信加密签名
		String timestamp = request.getParameter("timestamp");//时间戳
		String nonce = request.getParameter("nonce");//随机数
		String echostr = request.getParameter("echostr");//随机字符串
		PrintWriter out = null;
			//接入验证
			  if(WeiXinUtil.checkSignature(signature, timestamp, nonce)){
				  if (echostr!=null) {
					  System.out.println(echostr);
					  try {
						out = response.getWriter();
					} catch (IOException e) {
						e.printStackTrace();
					}
					  out.write(echostr);//验证成功返回的值
					  return;
				}

//从这里开始
				  Map<String, String> reqXmlData;
				  try {
					  reqXmlData = XMLUtils.parseXmlFromRequest(request);
					  weiXinService.doRequestXmlData(request.getQueryString(), reqXmlData,response);
				  } catch (Exception e) {
					  e.printStackTrace();
				  }
			}
	}

业务逻辑代码

这里首先提取一下request中的参数

String msgType = reqXmlData.get(XMLUtils.c_xml_msg_key_MsgType);//获取消息类型
		String content = reqXmlData.get(XMLUtils.c_xml_msg_key_Content);//获取消息内容
		String event = reqXmlData.get(XMLUtils.c_xml_msg_key_Event);//获取事件类型
		String openId = reqXmlData.get(XMLUtils.c_xml_msg_key_FromUserName);//获取发送者openID
		String formUser = reqXmlData.get(XMLUtils.c_xml_msg_key_ToUserName);//获取接受者ID
		String eventKey = reqXmlData.get(XMLUtils.c_xml_msg_key_EventKey);//获取扫码事件的key

文本消息的类型是text,也就是说用户发送的文本,你被动接收。比如

然后处理

//文本消息
		if(XMLUtils.c_xml_msg_type_text.equals(msgType)){
			doMsg(response, content, openId, formUser);
		}

注意这里的fromUser和openid,当用户发送消息给公众号的时候,用户是发送者,但是我们是给用户回复消息,所以我们是发送者,容易混淆

doMsg

if ("?".equals(content)||"?".equals(content)) {
			MsgUtil.sendTextMsgToUser("帮助命令:1、接收文本消息   2、接收图片消息    3、接收图文消息    "
					+ "4、接收模板消息    5、生成带参数的二维码 ", openId,formUser,response);
		}
		if ("1".equals(content)) {
			MsgUtil.sendTextMsgToUser("文本消息", openId,formUser,response);
		}

我这里写了一个帮助信息,辅助自己测试,你们不清楚可以打断点跟踪一下,看看用户发送来的消息是什么

sendTextMsgToUser这个方法就是将消息封装

/**
	 * 发送文本消息
	 * @param msg
	 * @param toUser
	 */
	public static void sendTextMsgToUser(String msg, String toUser,String formUser,HttpServletResponse resp) {
		TextMsg textMsg = new TextMsg();
		textMsg.setContent(msg);
		textMsg.setToUserName(toUser);
		textMsg.setFromUserName(formUser);
		sendMsg(resp, textMsg);
	}

然后textMsg的消息类,由于这边用到的消息比较多,所以我封装了一个basemsg

import java.util.Date;

/**
 * 
 * @author Administrator
 *
 */
public class TextMsg extends BaseMessage {
	private String Content;
	private String MsgId;
	public TextMsg(){
		this.setMsgType("text");
		this.setCreateTime(new Date().getTime());
	}
	public String getContent() {
		return Content;
	}
	public void setContent(String content) {
		Content = content;
	}
	public String getMsgId() {
		return MsgId;
	}
	public void setMsgId(String msgId) {
		MsgId = msgId;
	}
	
}
public class BaseMessage {
	private String ToUserName;
	private String FromUserName;
	private long CreateTime;
	private 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;
	}
}

文本消息主要包含这些东西就行,你只需要把这些属性封装即可

然后是

/**
	 * 抽取的发送消息的方法
	 * @param resp
	 * @param msg
	 */
	private static void sendMsg(HttpServletResponse response, BaseMessage msg) {
		//将封装的消息转为xml
		String textMessageToXml = XMLUtils.textMessageToXml(msg);
		logger.info("发送的消息是-------"+textMessageToXml);
		PrintWriter out=null;
		try {
			out = response.getWriter();
			//写入返回的response中
			out.println(textMessageToXml);
		} catch (IOException e) {
			logger.error("发送微信消息失败",e);
			e.printStackTrace();
		}finally{
			//注意关流,不然会发送失败
			out.close();
		}
	}

这个注释很清楚了,就不再多说了

发送成功的日志消息

如果失败就按照返回错误码排查

下面贴出来xmlutil工具类


import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

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

import com.example.weixin.demo.message.BaseMessage;
import com.example.weixin.demo.message.News;
import com.thoughtworks.xstream.XStream;

/**
 * 
 * @author Administrator
 *
 */
public abstract class XMLUtils {
	// xml消息体的key定义
	public static final String c_xml_msg_key_ToUserName ="ToUserName";
	public static final String c_xml_msg_key_FromUserName ="FromUserName";
	public static final String c_xml_msg_key_CreateTime="CreateTime";
	public static final String c_xml_msg_key_MsgType ="MsgType";
	public static final String c_xml_msg_key_Event ="Event";
	public static final String c_xml_msg_key_EventKey="EventKey";
	public static final String c_xml_msg_key_Ticket="Ticket";

	// xml消息类型定义
	public static final String c_xml_msg_type_event = "event";
	public static final String c_xml_msg_type_text = "text";
	public static final String c_xml_msg_type_location = "location";

	// 事件类型定义
	public static final String c_xml_msg_event_photo = "pic_photo_or_album";
	public static final String c_xml_msg_event_subscribe = "subscribe";
	public static final String c_xml_msg_event_unsubscribe = "unsubscribe";
	public static final String c_xml_msg_event_scan = "SCAN";
	public static final String c_xml_msg_event_click = "CLICK";
	public static final String c_xml_msg_key_Content = "Content";

	/**
	 * 请求xml转为map
	 * @param request
	 * @return
	 * @throws Exception
	 */
	public static Map<String,String> parseXmlFromRequest(HttpServletRequest request) throws Exception{
		SAXReader saxReader = new SAXReader();
		Document document = saxReader.read(request.getInputStream());
		List<Element> elements = document.getRootElement().elements();
		Map<String,String> msgMap = new HashMap<>();
		for(int m=0,len=elements.size();m<len;m++){
			Element element = elements.get(m);
			msgMap.put(element.getName(),element.getText());
		}
		return msgMap;
	}
	/**
	 * map转为xml
	 * @param map
	 * @return
	 * @throws Exception
	 */
	public static String parseMapToXml(Map<String, String> map) throws Exception{
		Document document = DocumentHelper.createDocument();
		Element rootElement = document.addElement("xml");
		for (Map.Entry<String, String> me : map.entrySet()) {
			Element empName = rootElement.addElement(me.getKey());
			empName.setText(me.getValue());
		}
		return document.asXML();
	}
	/**
	 * 消息类转为xml
	 * @param msg
	 * @return
	 */
	public static String textMessageToXml(BaseMessage msg){
		XStream xstream = new XStream();
		xstream.alias("xml", msg.getClass());
		return xstream.toXML(msg);
	}
	/**
	 * 新闻消息转为xml
	 * @param msg
	 * @return
	 */
	public static String newsMessageToXml(BaseMessage msg){
		XStream xstream = new XStream();
		xstream.alias("xml", msg.getClass());
		xstream.alias("item",new News().getClass());
		return xstream.toXML(msg);
	}
}

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Spring Boot 是一个用于快速构建基于 Java 的应用程序的开源框架。微信公众号是微信平台提供的一种服务,允许开发者在微信上创建自己的公众号,从而能够与用户进行交互、提供信息、进行营销等。 使用 Spring Boot 构建微信公众号意味着我们可以利用 Spring Boot 的优势快速开发和部署我们的公众号应用。Spring Boot 提供了丰富的特性和功能,例如自动配置、快速启动、内嵌 Servlet 容器等,使得我们能够以更高效的方式开发微信公众号应用程序。 在使用 Spring Boot 构建微信公众号时,我们可以利用微信公众平台提供的开发接口和 SDK,与微信服务器进行交互。该接口和 SDK 提供了丰富的功能,例如接收和回复消息、获取用户信息、上传素材、推送模板消息等。我们可以通过编写相应的代码,与微信服务器进行通信,并实现自定义的业务逻辑。 使用 Spring Boot 构建微信公众号还可以结合其他技术和框架,例如 Spring MVC、Spring Data JPA 等,来实现更复杂的功能。我们可以利用 Spring MVC 来处理微信服务器的请求,使用 Spring Data JPA 来操作数据库存储用户信息等。这些技术和框架的集成可以提高开发效率和代码质量。 总之,使用 Spring Boot 构建微信公众号能够帮助我们快速开发和部署应用,同时利用 Spring Boot 提供的特性和功能,使得开发过程更加高效和简化。 ### 回答2: Spring Boot是一个用于构建独立的、生产级的Spring应用程序的框架。它简化了Spring应用程序的配置和部署过程,并提供了许多默认配置,让开发者可以专注于业务逻辑的实现。 微信公众号是基于微信开放平台的一种应用,开发者可以通过微信公众号来与用户进行交互。使用微信公众号可以实现发送消息、接收消息、拉取用户信息等功能。通过集成Spring Boot框架,可以更加方便地开发和管理微信公众号应用。 使用Spring Boot开发微信公众号,可以通过Spring框架的依赖注入和控制反转等功能,更加灵活地管理公众号的业务逻辑和组件。开发者可以定义不同的Controller来处理用户的请求,并通过注解来实现自动装配和依赖管理。此外,Spring Boot还提供了许多自动配置的功能,使得开发者可以快速构建、测试和部署微信公众号应用。 Spring Boot还支持与微信公众平台的API进行交互,开发者可以通过SDK或自定义开发来实现微信公众号的各种功能。例如,可以使用SDK提供的API来发送消息、获取用户信息、创建菜单等。 总之,通过使用Spring Boot框架,开发者可以更加高效地开发和管理微信公众号应用,减少了繁琐的配置和部署过程,提高了开发效率和代码质量。 ### 回答3: Spring Boot 是一个基于 Spring 框架的开源项目,用于快速构建、运行和部署应用程序。微信公众号是基于微信平台的一种社交媒体营销工具,被广泛用于企业的宣传推广、客户互动等方面。那么,Spring Boot 如何与微信公众号结合呢? 首先,我们可以通过 Spring Boot 提供的 Web 应用程序开发框架,结合微信公众号的开发文档和接口,编写实现微信公众号功能的后端代码。通过使用 Spring Boot 的 MVC 架构,我们可以定义处理微信公众号各种请求的控制器,并利用 Spring 的依赖注入特性,调用微信公众号提供的接口实现相关功能。 其次,Spring Boot 提供了丰富的开箱即用的插件和组件,可以方便地集成第三方库和工具。我们可以利用 Spring Boot 的插件,快速集成微信公众号的 SDK 或 API,简化开发过程。同时,Spring Boot 还提供了很多自动配置选项,可以减少开发者的配置工作,提高开发效率。 另外,通过使用 Spring Boot 的自动化部署特性,我们可以将微信公众号的后端应用程序快速打包为可执行的 JAR 文件,并使用常用的部署或容器工具(如 Docker、Tomcat 等)进行部署和运行。这样,我们可以轻松地将微信公众号应用程序部署到云端,实现高可用性和扩展性。 总之,Spring Boot 提供了一个便捷、快速、可靠的开发框架,可以与微信公众号无缝结合,帮助开发者快速构建和部署功能丰富的微信公众号应用程序。无论是小型企业还是大型企业,利用 Spring Boot 可以极大地简化微信公众号的开发和运维工作,提升开发效率和用户体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值