当前位置:   article > 正文

微信公众平台开发(10)--接收并回复用户消息(被动回复)_wxmpmessagerouter

wxmpmessagerouter

点此查看 微信公众号/微信网页/微信支付/企业微信/小程序开发合集及源代码下载

1. 用户消息的类型

用户消息是指关注我们公众号的用户,发送给公众号的各类消息。例如:

  • 用户关注了公众号
  • 用户取消关注公众号
  • 用户给公众号发送文本消息
  • 用户给公众号发送图片消息
  • 用户给公众号发送位置消息
  • 用户点击自定义菜单click类型按钮(click类型按钮点击后会将按钮key值作为参数)
  • 用户点击自定义菜单view类型按钮(view类型按钮点击后跳转指定URL)

我们可以接收各种类型的消息,并进行被动回复。

2. 消息路由器与消息处理器

消息处理器比较容易理解,就是接受消息并返回应答消息。

消息路由器,是设置路由规则的,路由规则是指消息类型与消息处理器之间的对应关系。通过消息路由器,我们可以自定义哪种消息由哪一个消息处理器处理。

我们在配置类中定义消息路由器,注意为了方便演示,我们简化了路由规则,只设置了最简单的一条规则:即所有消息都交给myMesssageHandler消息处理器负责。

	/**
	 * 注入消息处理器
	 */
	@Autowired
	private MyMessageHandler myMesssageHandler;

	/**
	 * 配置消息路由器
	 */
	@Bean
	public WxMpMessageRouter wxMessageRouter() {
		WxMpMessageRouter router = new WxMpMessageRouter(wxMpService());
		router.rule().async(false).handler(myMesssageHandler).end();
		return router;
	}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

然后定义消息处理器组件,通过@Component注解为类注册一个组件。


/**
 * 消息处理器
 */
@Component
public class MyMessageHandler implements WxMpMessageHandler {

	@Override
	public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, Map<String, Object> context, WxMpService wxMpService, WxSessionManager sessionManager) throws WxErrorException {
		return null;
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

3. 接受并回复消息

上面的代码中,我们通过消息路由器,设置了所有消息均由MyMessageHandler 处理,所以我们在MyMessageHandler 中编写代码回复消息即可。

	@Override
	public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, Map<String, Object> context, WxMpService wxMpService, WxSessionManager sessionManager) throws WxErrorException {
		System.out.println(wxMessage.toString());
		String resultMsg = "";
		if (wxMessage.getEvent() == null) {
			if (wxMessage.getMsgType().equals("text")) {
				resultMsg = "您发送了文本消息";
			} else if (wxMessage.getMsgType().equals("image")) {
				resultMsg = "您发送了图片消息";
			} else if (wxMessage.getMsgType().equals("location")) {
				resultMsg = "您发送了位置消息";
			}
		} else if (wxMessage.getEvent().equals("CLICK")) {
			resultMsg = "您点击了自定义菜单的按钮:"+wxMessage.getEventKey();
		} else if (wxMessage.getEvent().equals("VIEW")) {
			resultMsg = "您点击了自定义菜单的网页跳转";
		} else if (wxMessage.getEvent().equals("subscribe")) {
			resultMsg = "您订阅了公众号";
		} else if (wxMessage.getEvent().equals("unsubscribe")) {
			resultMsg = "您取消订阅了公众号";
		} else {
			resultMsg = "其他类型";
		}
		WxMpXmlOutTextMessage out = WxMpXmlOutMessage.TEXT().content(resultMsg).fromUser(wxMessage.getToUser()).toUser(wxMessage.getFromUser()).build();
		return out;
	}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

通过代码能很直观的看出,我们可以通过wxMessage.getEvent()获取用户与公众号交互类型,然后通过wxMessage.getMsgType()获取用户发送的消息类型。

最后我们通过WxMpXmlOutTextMessage 类型的对象回复消息。

4. 发送方与接收方

在回复消息代码中,有如下1行:

WxMpXmlOutMessage.TEXT().content(resultMsg).fromUser(wxMessage.getToUser()).toUser(wxMessage.getFromUser()).build();
  • 1

我们将回复消息的fromUser设为接收消息的toUser,将回复消息的toUser设为接收消息的fromUser。

这个不难理解,接收消息是用户发送给公众号的,所以toUser是公众号,fromUser是发送消息的用户。

当我们回复消息的时候正好是反过来的,公众号发送给对应用户,所以有如上代码。

5. 小结

在实际项目开发中,如果逻辑比较复杂,可以通过路由器设置多个处理器,分别处理不同的消息。

当然也可以在一个消息处理器中处理多种消息,本质上也没啥区别。

拓展下的话,此处使用了经典的策略模式,感兴趣的同学可以去了解下。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/274165
推荐阅读
相关标签
  

闽ICP备14008679号