文中所有提到的自定義註解,全部可以用@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;
}
}