文中所有提到的自定义注解,全部可以用@Service注解实现,只是要分开写,或者其他方式代替,都可以,主要逻辑没问题就行
文字消息处理类
文字回复其实就是一些针对用户发送的消息做出回复,比如模糊查询分词分组匹配等操作,实现了基础的接口,接口在上文已经介绍过了。
@Override
public MessageDtoOut messageDispose(Map<String,String> wechatMap, long sequence) {
String content = wechatMap.get("Content");//这个值就是用户发送的消息
//拿到消息文本既可以针对性的处理自动回复内容了。
//可以写一个统一的关键词表,来处理不同的操作,包括扫码的时候也会用到它
}
关注接口处理类
@MessageSelector(getMessageType = MessageStaticType.MESSAGE_EVENT_SUBSCRIBE)
public class MessEventSubscribeServiceImpl implements MessageClassifyService {
@Override
public MessageDtoOut messageDispose(Map<String,String> wechatMap, long sequence) {
MessageDtoOut dtoOut = null;
try {
String fromUserName = wechatMap.get("FromUserName");//当前用户的openid
String eventKey = wechatMap.get("EventKey");消息内容
String createTime = wechatMap.get("CreateTime");//消息时间
Date createDate = new Date(Long.valueOf(createTime) * 1000L);//转换
JSONObject userWhchatInfo = wechatUserInfoService.getUserWhchatInfo(city, fromUserName);//获取用户基础信息 前文有介绍
//TODO 此处可以处理自己业务相关的逻辑,已经拿到了微信用户的所有数据,仅限直接关注
return datpp;
} catch (Exception e) {
logger.error("messageDispose:调用关注新街口--系统异常:请求序列:" + sequence, e);
}
} catch (NumberFormatException e) {
logger.error("messageDispose--系统异常:请求序列:" + sequence, e);
}
return null;
}
}
关注参数
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[FromUser]]></FromUserName>
<CreateTime>123456789</CreateTime>
<MsgType><![CDATA[event]]></MsgType>
<Event><![CDATA[subscribe]]></Event>
</xml>
参数 | 描述 |
---|---|
ToUserName | 开发者微信号 |
FromUserName | 发送方帐号(一个OpenID) |
CreateTime | 消息创建时间 (整型) |
MsgType | 消息类型,event |
Event | 事件类型,subscribe |
EventKey | 事件KEY值,qrscene_为前缀,后面为二维码的参数值 |
Ticket | 二维码的ticket,可用来换取二维码图片 |
扫码接口处理类
扫码接口属于一个比较复杂且常用的接口,为什么放最后呢。。。嗯你猜
扫码接口分为 已关注用户扫码、未关注用户扫码;
同样用自定义注解两个接口来实现,还是根据注解跳转到2个类,一个是未关注用户的处理,一个是已关注的。
public interface ScanQrService {
MessageDtoOut qrCodeDispose(Map<String,String> wechatMap, String city, Object object, long sequence);
}
下面是扫码处理逻辑,扫码关注逻辑类似,只不过一般处于业务逻辑需要,要对新关注 用户做一系列记录和判定
@ScanQrCodeSelector(getMessageType = MessageStaticType.SCAN_CODE_MESSAGE_CHULI)
public class ScanQrChuLiServiceImpl implements ScanQrService {
private final static Logger logger = Logger.getLogger(ScanQrChuLiServiceImpl.class);
@Autowired
private AntistopService antistopService;
@Override
public MessageDtoOut qrCodeDispose(Map<String,String> wechatMap, String city, Object object, long sequence) {
logger.info("qrCodeDispose--扫码Web事件处理函数--传入参数:wechatMap = [" + wechatMap + "], city = [" + city + "], object = [" + object + "], sequence = [" + sequence + "]" + "请求序列:" + sequence);
try {
String fromUserName = wechatMap.get("FromUserName");//openid
String eventKey = wechatMap.get("EventKey");//EventKey 微信传递的值,包含二维码信息
if(StringUtils.isBlank(eventKey) || eventKey.length() < 1) return null;
if(eventKey.indexOf("#") == -1) {//此处#号是我方自定义的一种间隔符,当不存在间隔符的时候直接去查关键字,调用关键字回复
String reVal = antistopService.queryPreciseAntistopInfo(eventKey, city);
logger.info("qrCodeDispose:关键字查询结果 = " + reVal);
return new MessageDtoOut(reVal);
}
String type = StringUtils.substringBefore(eventKey, "#");//拆分二维码内容 #前面是活动识别标识,用来跳转不同的类
String val = StringUtils.substringAfter(eventKey, "#");//拆分二维码内容 #后面是自定义传递的数据,一般都是一些分享业务,记录发起者的关键标识
String scanTypeVal = MessageStaticType.BEAN_SCAN_CODE_MESSAGE + type;
logger.info("qrCodeDispose:跳转服务参数 = " + scanTypeVal + "请求序列:" + sequence);
ActWebService actWebService = MessageBeanContextUtil.getmessageTypeBean(scanTypeVal);//调用自定义注解接口
//
//判断接口不存在则调用关键字回复
if(null == actWebService) {
logger.info("qrCodeDispose:未匹配到接口 调用关键字回复 = " + val + "请求序列:" + sequence);
String reVal = antistopService.queryPreciseAntistopInfo(val, city);
logger.info("qrCodeDispose:关键字查询结果 = " + reVal);
return new MessageDtoOut(reVal);
}
//存在则调用接口处理内容
MessageDtoOut dtoOut = actWebService.disposeChuLi(wechatMap, fromUserName, val, city, sequence);
return dtoOut;
} catch (Exception e) {
logger.error("qrCodeDispose:扫码Web事件处理函数--系统异常:请求序列:" + sequence, e);
return null;
}
}