上篇讲了使用策略模式处理复杂的消息,除了消息类型在微信用户和公众号产生交互的过程中,用户的一些操作(如:点击、关注/取消关注、扫描带参数二维码、上报地理位置等)微信服务器回通过事件的形式进行通知到我们的开发服务器,而开发者可以在某些事件推送后进行相应的处理回复。本篇就讲事件如何处理。
根据各种事件类型,创建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;
}
}
测试:
到此事件处理基本操作已经讲完,后面可以根据需要增加对应的事件监听操作即可。
下一篇:
模板消息管理