SpringCloud Alibaba 开发微信公众号 (事件处理)

177 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第9天,点击查看活动详情

上篇讲了使用策略模式处理复杂的消息,除了消息类型在微信用户和公众号产生交互的过程中,用户的一些操作(如:点击、关注/取消关注、扫描带参数二维码、上报地理位置等)微信服务器回通过事件的形式进行通知到我们的开发服务器,而开发者可以在某些事件推送后进行相应的处理回复。本篇就讲事件如何处理。

根据各种事件类型,创建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;
    }
}

测试:

8654F828ABC1AF1161EE3007C504BCCA.jpg

到此事件处理基本操作已经讲完,后面可以根据需要增加对应的事件监听操作即可。

下一篇:

模板消息管理