正文
不多比比,直接说正文;
我文本消息的处理封装在了TextService的实现类TextServiceImpl中,在这其中我封装了关键字的回复处理和传情功能,关键字回复还好理解,就是根据你发送的信息,我判断是否包含某些关键字,如果包含的话就会回复一些相对应的信息;传情功能则是我自己设计的一个小功能,灵感来自于百度传情。
用户可以向公众号发送一段带有传情印记的话,譬如“[传情]林佳,我爱你!”,后台接收之后判断如果带有传情标记,则认定为是创建一条传情消息,创建完成之后,这条消息会被保存,然后返回给用户一个32位的字符串钥匙,任何用户都可以通过向公众号回复这一钥匙来获取相对应的这一段话。
文本消息的处理还是相对比较简单的,分为接收,检索,设置结果,返回结果集;其中接收部分已经在控制层做了处理,业务层负责的则是信息的检索和结果集的返回;
package com.wx.service.impl;
import java.util.List;
import java.util.Map;
import com.wx.dao.KeyWordDao;
import com.wx.dao.KeyWordDaoImpl;
import com.wx.model.WxCall;
import com.wx.model.WxKey;
import com.wx.service.TextMsgService;
import com.wx.service.TransmitEmotionService;
import com.wx.util.MessageUtil;
import life.book.util.Utils;
/**
* User:Jiahengfei --> 17515250730@163.com
* create by 2018年5月4日 from Eclipse.
* describe:文本消息处理服务实现类
*/
public class TextMsgServiceImpl implements TextMsgService{
private KeyWordDao dao = new KeyWordDaoImpl();
private TransmitEmotionService transmit = new TransmitEmotionServiceImpl();
@Override
public String dispose(Map<String, String> map) {
String response = null;
boolean isChuanqing = false;
//特殊功能优先检索
if (response == null && isTransmit(map.get("Content"))) {
//发布传情消息[判断前部检索是否生效-判断是否携带传情标志]
response = transmit.transmit(map);
}
if (response == null && map.get("Content").length()==32 && Utils.chineseStrNumber(map.get("Content"))==0) {
//(大概率)获取传情消息,收到的是否是32位的key[判断前部检索是否生效-判断消息长度是否为32位-判断是否包含中文字符]
isChuanqing = true;
response = transmit.obtain(map);
}
//关键字检索
if (response==null) {
int result = search(map.get("Content"));
if (result!=-1) {
List<WxCall> calls = dao.selectCallBy(result);
response = MessageUtil.Default.text(map, calls.get(Utils.gainNumber(calls.size())).getCall());
}
}
//功能关键字检索[判断前部检索是否生效-判断传情是否生效]
return response == null ? (isChuanqing ? MessageUtil.Default.text(map, "无效的传情码!") : MessageUtil.Default.text(map, "啊?")) : response;
}
/**
* 检索字符中是否包含关键字
* @param content 字符
* @return -1为不包含,其他值为包含的关键字的id
*/
private int search(String content){
List<WxKey> keys = dao.selectKey();
for (WxKey wxKey : keys) {
if (content.indexOf(wxKey.getKeyword()) != -1) {
return wxKey.getId();
}
}
return -1;
}
/**
* 判断是否为传情功能
* @param content 收到的字符串
*/
private boolean isTransmit(String content){
if (content.length()>5) {
if ("[传情]".equals(content.substring(0,4)) || "【传情】".equals(content.substring(0,4))) {
return true;
}else return false;
}else return false;
}
}
dao层的代码就不贴出来了,就是一些基本的增删改查。对两张表的维护;
毕竟只是实现了两个简单功能,代码量也不是很多,也很好理解;
我放到这里一个我的公众号。因为一开始写的时候好多功能都是在测试版中写的,不过我的公众号是个人版,有许多接口权限不足,没法使用。不过就这写关于文本信息的处理还是能用的;有兴趣的可以测试一下;
传情功能没问题,可以随便实验,不过关键字功能因为我时间有限,库中的关键字不是很多,所以就把所有的关键字都贴出来,可以在这个范围之内和公众号聊天;