微信公众号快速开发(三)多种消息类型处理

前文介绍了如何回复关键字,下面介绍一些其他类型消息常见的处理方式

[TOC]

开始开发——关键字回复

功能描述

当我们公众号发送一些关键词的时候,公众号会回复自动回复有关关键词的信息。

实现思路

  1. 消息类型为文本样式
  2. 接收的客服端消息中要包含该关键字

代码开发

为便于扩展,将消息处理的方法写到服务层,新建收发信息的dto

一、便于扩展为不同类型的消息,修改收发消息的封装,改用dto模式

  • 基础消息实体类 MsgSendEntity.java
@Data
@XmlAccessorType(XmlAccessType.FIELD) // 映射类中的所有字段到XML
public class MsgSendEntity {
    /**
     * 公有部分
     */
    //  开发者微信号
    @XmlElement(name = "ToUserName") // 指定名称映射
    private String toUserName;

    // 发送方帐号(一个OpenID)
    @XmlElement(name = "FromUserName")
    private String fromUserName;

    // 消息创建时间 (整型)
    @XmlElement(name = "CreateTime")
    private Long createTime;

    // 消息类型
    @XmlElement(name = "MsgType")
    private String msgType;

    // 消息id,64位整型
    @XmlElement(name = "MsgId")
    private Long msgId;

}
复制代码

MsgReplyEntity.java

@Data
@XmlAccessorType(XmlAccessType.FIELD)
public class MsgReplyEntity {
    //  用户的OpenID
    @XmlElement(name = "ToUserName")
    private String toUserName;

    // 测试号的微信号
    @XmlElement(name = "fromUserName")
    private String FromUserName;

    // 消息创建时间 (整型)
    @XmlElement(name = "CreateTime")
    private Long createTime;

    // 消息类型
    @XmlElement(name = "MsgType")
    private String msgType;

    // 文本消息内容
    @XmlElement(name = "Content")
    private String content;
}
复制代码
  • 新建消息实体类的dto MsgSendDto.java
@Data
@XmlRootElement(name = "xml") // 根节点
@XmlAccessorType(XmlAccessType.FIELD) // 映射类中的所有字段到XML
public class MsgSendDto extends MsgSendEntity {

    // 文本消息内容
    @XmlElement(name = "Content")
    private String content;
}
复制代码

MsgReplyDto.java

@Data
@XmlRootElement(name="xml")
@XmlAccessorType(XmlAccessType.FIELD)
public class MsgReplyDto extends MsgReplyEntity {

}
复制代码

二、抽取消息处理的服务类与消息处理的方法到服务层

@Service
public class MsgHandleServiceImpl implements IMsgHandleService {
	
    @Override
    public MsgReplyEntity handle(MsgSendEntity msgSend) {
        WeChatUtil.getLogger().info("客户端接收的内容为:{}"+msgSend);

        // 服务端消息回复的实体类
        MsgReplyEntity msgReply = new MsgReplyEntity();
        // 根据接收的信息回复,接收和发送方相反
        msgReply.setFromUserName(msgSend.getToUserName());
        msgReply.setToUserName(msgSend.getFromUserName());
        msgReply.setCreateTime(new Date().getTime());

        String msgType = msgSend.getMsgType();
        String contentReply = null;
        // 处理不同类型的消息
        if (msgType.equals(WeChatConstants.MSG_TYPE_TEXT)) {
            // 默认回复相同的类型消息
            msgReply.setMsgType(msgType);
            String contentSend = msgSend.getContent();

            // 关键词处理
            if (contentSend.contains("你好")) {
                contentReply = "你好吗\r\nhow are you";
            } else if (contentSend.contains("哈哈")||contentSend.contains("haha")) {
                contentReply = "我也喜欢哈哈大笑";
            } else if (contentSend.contains("chet")){
                msgReply.setMsgType(WeChatConstants.MSG_TYPE_NEWS);
                //设置图文个数
                msgReply.setArticleCount(1);
                //设置图文明细列表
                ArticleItem item = new ArticleItem();
                item.setTitle("chet的github博客");
                item.setPicUrl("https://chetwhy.github.io/");
                item.setDescription("chet的掘金博客");
                item.setUrl("https://juejin.im/timeline");
                msgReply.setItem(new ArticleItem[]{item});
            }else {
                // 非关键字,原样返回
                contentReply = msgSend.getContent();
            }
            msgReply.setContent(contentReply);
        }
        
        WeChatUtil.getLogger().info("服务端回复的内容为:{}"+msgReply);
        return msgReply;
    }
}
复制代码

三、封装的常量类

public class WeChatConstants {

    /**
     * 公众号appid
     */
    public static String APP_ID = "wxa02348cd5ec17d28"; 

    /**
     * AppSecret
     */
    public static String APPSECRET = "2ffbf0ff3516af025942ec8ca67f27d8"; 

    /**
     * 公众号配置相关
     */
    public static final String URL = "ups.tiaodu.cn";
    public static final String TOKEN = "123qwe";

    /**
     * 消息类型
     */
    public static final String MSG_TYPE_TEXT = "text";
    public static final String MSG_TYPE_NEWS = "news";
}
复制代码

测试样例

在手机微信或电脑微信直接发送带【关键字】的信息即可

开始开发——订阅事件

功能描述

微信公众号有多种不同事件信息,包括其触发事件的类型,响应处理。最常见的,当我们点击关注某公众号之后,公众号将自动推送给我们介绍信息后者活动宣传等。

实现思路

一、查看接收事件推送的文档,以关注/取消关注事件为例

二、根据参数描述,为MsgSendEntity添加相应实例变量

三、在原消息基础上,添加事件的逻辑判断

代码开发

1为MsgSendEntity添加事件属性

...
public class MsgSendEntity {
    ...
    // 事件类型 subscribe(订阅)、unsubscribe(取消订阅)、CLICK(点击菜单)
    @XmlElement(name = "Event")
    private String event;
}    
复制代码

2增加常量类

public class WeChatConstants {
    ...
        
    public static final String MSG_TYPE_EVENT = "event";
    public static final String MSG_TYPE_EVENT_SUBSCRIBE = "subscribe";
}    
复制代码

3消息处理方法,增加判断逻辑

@Service
public class MsgHandleServiceImpl {

    public MsgReplyEntity handle(MsgSendEntity msgSend) {
        ...
           
        // 处理不同类型的消息
        if (msgType.equals(WeChatConstants.MSG_TYPE_TEXT)) {
            ...
        }else if(msgType.equals(WeChatConstants.MSG_TYPE_EVENT)){
            // 订阅事件
            if(msgSend.getEvent().equals(WeChatConstants.MSG_TYPE_EVENT_SUBSCRIBE)){
                msgReply.setMsgType(WeChatConstants.MSG_TYPE_TEXT);
                msgReply.setContent("感谢关注chetwhy![亲亲]\r\n现在回复【chet】\r\n马上查阅java博客![大兵]");
            }
        }

        WeChatUtil.getLogger().info("服务端回复的内容为:{}"+msgReply);
        return msgReply;
    }
}
复制代码

测试样例

一、先取消对测试公众的关注(断点调试依然可以看到消息类型为event)

二、在测试号管理中再次扫描二维码关注

猜你喜欢

转载自juejin.im/post/5d2c94cff265da1b8f1af399