這裏的回覆實際上分成了兩種類型: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屬性。
接下來添加我們的業務邏輯:
效果圖:
爲了更好的理解,文章中是直接在代碼裏判斷關鍵字的,如果我們做的是較完整和正式的應用,應該把關鍵字相關信息都存儲到數據庫中,再查找 ,而且也不應該把所有邏輯都放到控制器中判斷,更應該抽取到業務層中。