前文介绍了如何回复关键字,下面介绍一些其他类型消息常见的处理方式
[TOC]
开始开发——关键字回复
功能描述
当我们公众号发送一些关键词的时候,公众号会回复自动回复有关关键词的信息。
实现思路
- 消息类型为文本样式
- 接收的客服端消息中要包含该关键字
代码开发
为便于扩展,将消息处理的方法写到服务层,新建收发信息的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)
二、在测试号管理中再次扫描二维码关注