九、快速上手处理微信请求:接收、解析、处理微信后台发送给你服务器的消息(二)

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

 

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