九、快速上手處理微信請求:接收、解析、處理微信後臺發送給你服務器的消息(二)

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章