这里的回复实际上分成了两种类型:1.关注时马上回复 2.根据关键字来回复
在上一次我们完成的效果是用户发送什么内容就直接回复相同的内容, 所以关键字的话只需要根据用户发送的内容来做相关的判断即可。
关键字回复
代码:
/**
* 微信消息处理
*/
@RequestMapping(value="/intoWechat",method=RequestMethod.POST,produces= {MediaType.TEXT_XML_VALUE})
@ResponseBody
public Object handleMessage(@RequestBody InMsgEntity msg) {
//创建消息相应对象
OutMsgEntity out=new OutMsgEntity();
//把原来的发送方设置为接收方
out.setToUserName(msg.getFromUserName());
//把原来的接收方设置为发送方
out.setFromUserName(msg.getToUserName());
//获取接受的消息类型
String msgType=msg.getMsgType();
//设置消息相应类型
out.setMsgType(msgType);
//设置消息创建时间
out.setCreateTime(new Date().getTime());
//根据类型设置不同消息数据
if("text".equals(msgType)) {
//用户发送的内容
String inContent=msg.getContent();
//公众号回复的内容
String outContent=null;
//关键字判断
if(inContent.contains("安生")) {
outContent="安生毕业于河南省中原工业大学";
}else if(inContent.contains("中原工业大学")) {
outContent="中原工业大学隶属河南省和教育部共建高校,原名中原工学院,于2022年更名为中原工业大学";
}else {
//用户发什么就回什么
outContent=inContent;
}
out.setContent(outContent);
}else if("image".contentEquals(msgType)) {
out.setMediaId(new String[] {msg.getMediaId()});
}
System.out.println(out.toString());
return out;
}
效果图:
事件推送
我们上次使用到的都是用户发送信息过来,我们才回复的。但是,如果是关注的时候需要马上回复,就要使用到事件消息,实际上,微信已经提供给我们很多的事件。
打开开发文档,选择"消息管理"的"接收事件推送":
可以看到,主要有这些事件,我们便可根据不同的事件来做不同的处理:
1 关注/取消关注事件
2 扫描带参数二维码事件
3 上报地理位置事件
4 自定义菜单事件
5 点击菜单拉取消息时的事件推送
6 点击菜单跳转链接时的事件推送
关注时回复
现在我们来使用关注/取消关注事件
用户在关注与取消关注公众号时,微信会把这个事件推送到开发者填写的URL。
方便开发者给用户下发欢迎消息或者做一些帐号的解绑操作。
事件推送的xml参数介绍:
事件和消息都是推送到我们的URL上,怎么区分他们也很简单,通过MsgType这个属性,
那么进一步再区分是关注还是取消关注,根据Event属性即可。
所以,我们在原来的InMsgEntity类,再添加一个Event属性。
接下来添加我们的业务逻辑:
效果图:
为了更好的理解,文章中是直接在代码里判断关键字的,如果我们做的是较完整和正式的应用,应该把关键字相关信息都存储到数据库中,再查找 ,而且也不应该把所有逻辑都放到控制器中判断,更应该抽取到业务层中。