上篇讲了使用策略模式处理复杂的消息,除了消息类型在微信用户和公众号产生交互的过程中,用户的一些操作(如:点击、关注/取消关注、扫描带参数二维码、上报地理位置等)微信服务器回通过事件的形式进行通知到我们的开发服务器,而开发者可以在某些事件推送后进行相应的处理回复。本篇就讲事件如何处理。
根据各种事件类型,创建EventType枚举类,定义各种事件类型的枚举值,
/** * 事件类型枚举 */ public enum EventType { /** * 关注 */ SUBSCRIBE, /** * 取消关注 */ UNSUBSCRIBE, /** * 用户已关注时的事件推送 */ SCAN, /** * 上报地理位置事件 */ LOCATION, /** * 自定义菜单事件(点击菜单拉取消息时的事件推送) */ CLICK, /** * 点击菜单跳转链接时的事件推送 */ VIEW, /** * 推送模版消息 */ TEMPLATESENDJOBFINISH; /** * 根据名称获取事件类型枚举对象 * * @param eventType 事件名称 * @return */ public static EventType eventType(String eventType) { for (EventType type : EventType.values()) { if (type.name().toLowerCase().equals(eventType.toLowerCase())) { return type; } } return CLICK; } } 复制代码
创建事件接口Event,增加获取事件源、获取事件处理的数据、执行回调方法
import java.util.Map; /** * 事件接口 */ public interface Event { /** * 获取事件源 * * @return */ Object getSource(); /** * 获取事件处理的数据 * * @return */ Map<String, Object> getMessage(); /** * 执行回调 * * @param message 回调消息 * @return */ String callback(String message); } 复制代码
创建事件源接口EventSource
/** * 事件源接口 */ public interface EventSource { /** * 增加事件监听器 * * @param eventListener 事件监听 */ void addListener(EventListener eventListener); /** * 通知事件监听器 */ void notifyListener(); } 复制代码
创建事件监听接口EventListener
import com.ctsi.sddx.constants.EventType; /** * 事件监听接口 */ public interface EventListener { /** * 事件处理方法 * * @param event 事件 * @return */ String handleEvent(Event event); /** * 获取事件类型 * * @return */ EventType getEvent(); } 复制代码
以关注事件为例子,创建关注事件处理类,当event是subscribe关注时文字回复“欢迎关注XXX公众号!!!”
import com.ctsi.sddx.bean.message.TextMessage; import com.ctsi.sddx.constants.EventType; import com.ctsi.sddx.event.Event; import com.ctsi.sddx.event.EventListener; import java.util.Map; /** * @Author : lizzu * @create 2022/10/3 20:01 * 关注事件处理类 */ public class SubscribeListener implements EventListener { @Override public String handleEvent(Event event) { Map<String, Object> message = event.getMessage(); String eventType = message.get("Event").toString(); if (EventType.eventType(eventType) == EventType.SUBSCRIBE) { return TextMessage.ofSendMsg(message, "欢迎关注XXX公众号!!!").toXml(); } return "success"; } @Override public EventType getEvent() { return EventType.SUBSCRIBE; } } 复制代码
事件源处理类
/** * 事件源接口 */ public interface EventSource { /** * 增加事件监听器 * * @param eventListener 事件监听 */ void addListener(EventListener eventListener); /** * 通知事件监听器 */ void notifyListener(); } 复制代码
事件消息处理service类EventMessageService 实现IMessage接口。
import cn.org.spring.wechar.event.MessageSource; import cn.org.spring.wechar.event.listener.ClickListener; import org.springframework.stereotype.Service; import java.util.Map; /** * 事件消息处理service类 */ @Service public class EventMessageService implements IMessage { @Override public String handler(Map<String, Object> param) { MessageSource source = new MessageSource(); //其他事件进行add处理即可 source.addListener(new ClickListener()); source.addListener(new SubscribeListener()); return source.setParam(param); } } 复制代码
增加事件处理配置
import com.ctsi.sddx.constants.MessageType; import com.ctsi.sddx.context.ContextMessageFactory; import com.ctsi.sddx.service.message.EventMessageService; import com.ctsi.sddx.service.message.ImageMessageService; import com.ctsi.sddx.service.message.TextMessageService; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; /** * @Author : lizzu * @create 2022/10/3 13:50 * 消息配置类 */ @Configuration public class MessageConfig { private ApplicationContext applicationContext; public MessageConfig(ApplicationContext applicationContext) { this.applicationContext = applicationContext; } @Bean public ContextMessageFactory getContextMessageFactory() { ContextMessageFactory contextMessageFactory = new ContextMessageFactory(); contextMessageFactory.builder(MessageType.IMAGE, applicationContext.getBean(ImageMessageService.class)) .builder(MessageType.TEXT, applicationContext.getBean(TextMessageService.class)) .builder(MessageType.EVENT, applicationContext.getBean(EventMessageService.class));//增加事件处理 return contextMessageFactory; } } 复制代码
测试:
网络异常,图片无法展示
|
到此事件处理基本操作已经讲完,后面可以根据需要增加对应的事件监听操作即可。
下一篇:
模板消息管理