• 微信第三方平台消息后台处理


     1 一、微信消息请求路由
     2     //注入,处理微信推送消息的处理器接口
     3       @Autowired
     4       @Qualifier("textHandler")   
     5       private WxMpMessageHandler textHandler;
     6       @Autowired
     7       @Qualifier("viewHandler")  
     8       private WxMpMessageHandler viewHandler;
     9       @Autowired
    10       @Qualifier("clickHandler") 
    11       private WxMpMessageHandler clickHandler;
    12       @Autowired
    13       @Qualifier("subscribeHandler") 
    14       private WxMpMessageHandler subscribeHandler;
    15       @Autowired
    16       @Qualifier("unsubscribeHandler")  
    17       private WxMpMessageHandler unsubscribeHandler; 
    18 
    19 /**
    20        * 初始化路由过滤规则
    21        */
    22       @PostConstruct 
    23       public void init() {
    24         wxMpService = new WxMpServiceImpl();
    25         wxMpMessageRouter = new WxMpMessageRouter(wxMpService);
    26         wxMpMessageRouter
    27             .rule()
    28                 .async(false)
    29                 .msgType(WxConsts.XML_MSG_EVENT).event(WxConsts.EVT_SUBSCRIBE) // 微信推送过来的消息的类型,和发送给微信xml格式消息的消息类型
    30                 .handler(subscribeHandler)
    31                 .end()
    32             .rule()
    33                 .async(false)
    34                 .msgType(WxConsts.XML_MSG_EVENT).event(WxConsts.EVT_UNSUBSCRIBE)
    35                 .handler(unsubscribeHandler)
    36                 .end()
    37             .rule()
    38                 .async(false)
    39                 .msgType(WxConsts.XML_MSG_EVENT).event(WxConsts.EVT_VIEW)
    40                 .handler(viewHandler)
    41                 .end()
    42             .rule()
    43                 .async(false)
    44                 .msgType(WxConsts.XML_MSG_EVENT).event(WxConsts.EVT_CLICK)
    45                 .handler(clickHandler)
    46                 .end()
    47             .rule()
    48                 .async(false)
    49                 .msgType(WxConsts.XML_MSG_TEXT)
    50                 .handler(textHandler)
    51                 .end();
    52       } 
    53  /**
    54        * 消息处理
    55        */
    56       public String getHandlePost(String xmlMsg,String appid)  {
    57           logger.info("消息处理:{}{}",xmlMsg,appid);
    58           WxMpXmlMessage message = XStreamTransformer.fromXml(WxMpXmlMessage.class, xmlMsg);
    59           WxMpXmlOutMessage outMessage = wxMpMessageRouter.route(message,appid);
    60 //          TODO
    61           //日志记录
    62 //          WXJTransLog WXJTransLog = new WXJTransLog();
    63 //          WXJTransLog.setLogid(IDUtils.getMsgId());
    64 //          WXJTransLog.setPlatformid(message.getToUserName());
    65 //          WXJTransLog.setEvent(message.getEvent());
    66 //          WXJTransLog.setEventkey(message.getEventKey());
    67 //          WXJTransLog.setFromusername(message.getFromUserName());
    68 //          WXJTransLog.setMsgtype(message.getMsgType());
    69 //          WXJTransLog.setCreagetime(DateUtil.getDate());
    70 //          WXJTransLog.setTextcontext(message.getContent());
    71 //          if(message.getMsgType().equals(WxConsts.XML_MSG_EVENT)&&message.getEvent().equals(WxConsts.EVT_TEMPLATESENDJOBFINISH)){
    72 //              
    73 //          }else{
    74 //              iWXJTransLogMapper.insertTransLog(WXJTransLog);    
    75 //          }
    76           return outMessage.toXml();
    77       }   

    二、处理微信推送消息的处理器接口

     1 /**
     2  * 处理微信推送消息的处理器接口
     3  *
     4  * @author Daniel Qian
     5  */
     6 public interface WxMpMessageHandler {
     7 
     8   /**
     9    * @param wxMessage
    10    * @param context        上下文,如果handler或interceptor之间有信息要传递,可以用这个
    11    * @param wxMpService
    12    * @param sessionManager
    13    * @return xml格式的消息,如果在异步规则里处理的话,可以返回null
    14    */
    15   public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage,
    16                                       Map<String, Object> context,
    17                                  WxMpService wxMpService,
    18                                       WxSessionManager sessionManager,String appid) throws WxErrorException;
    19 
    20 }

    三、处理微信消息

     1 /**
     2    * 处理微信消息
     3    * @param wxMessage
     4    */
     5   @SuppressWarnings("rawtypes")
     6 public WxMpXmlOutMessage route(final WxMpXmlMessage wxMessage,final String appid) {
     7     if (isDuplicateMessage(wxMessage)) {
     8       // 如果是重复消息,那么就不做处理
     9 //      return null;
    10         return WxMpXmlOutMessage.TEXT().build();
    11     }
    12 
    13     final List<WxMpMessageRouterRule> matchRules = new ArrayList<WxMpMessageRouterRule>();
    14     // 收集匹配的规则
    15     for (final WxMpMessageRouterRule rule : rules) {
    16       if (rule.test(wxMessage)) {
    17         matchRules.add(rule);
    18         if(!rule.isReEnter()) {
    19           break;
    20         }
    21       }
    22     }
    23 
    24     if (matchRules.size() == 0) {
    25         WxMpXmlOutMessage res = null;
    26         return res;
    27     }
    28 
    29     WxMpXmlOutMessage res = null;
    30     final List<Future> futures = new ArrayList<Future>();
    31     for (final WxMpMessageRouterRule rule : matchRules) {
    32       // 返回最后一个非异步的rule的执行结果
    33       if(rule.isAsync()) {
    34         futures.add(
    35             executorService.submit(new Runnable() {
    36               public void run() {
    37                 rule.service(wxMessage, wxMpService, sessionManager, exceptionHandler,appid);
    38               }
    39             })
    40         );
    41       } else {
    42         res = rule.service(wxMessage, wxMpService, sessionManager, exceptionHandler,appid);
    43       }
    44     }
    45     return res;
    46   }

    四、处理微信推送过来的消息rule.service

     1 /**
     2    * 处理微信推送过来的消息
     3    *
     4    * @param wxMessage
     5    * @return true 代表继续执行别的router,false 代表停止执行别的router
     6    */
     7   protected WxMpXmlOutMessage service(WxMpXmlMessage wxMessage,
     8       WxMpService wxMpService,
     9       WxSessionManager sessionManager,
    10       WxErrorExceptionHandler exceptionHandler,String appid) {
    11 
    12     try {
    13 
    14       Map<String, Object> context = new HashMap<String, Object>();
    15       // 如果拦截器不通过
    16       for (WxMpMessageInterceptor interceptor : this.interceptors) {
    17         if (!interceptor.intercept(wxMessage, context, wxMpService, sessionManager)) {
    18           return null;
    19         }
    20       }
    21 
    22       // 交给handler处理
    23       WxMpXmlOutMessage res = null;
    24       for (WxMpMessageHandler handler : this.handlers) {
    25         // 返回最后handler的结果
    26         res = handler.handle(wxMessage, context, wxMpService, sessionManager,appid);
    27       }
    28       return res;
    29     } catch (WxErrorException e) {
    30       exceptionHandler.handle(e);
    31     }
    32     return null;
    33 
    34   }

    五、此时再将之前的handler实现,处理,即可完成微信消息处理

     1 /**
     2  * 关注公众号事件处理
     3  * @author gll
     4  * @version 1.0
     5  */
     6 @Service("subscribeHandler") 
     7 public class SubscribeHandler extends BaseHandler implements WxMpMessageHandler{
     8 
     9     private static final Logger logger = LogManager.getLogger(SubscribeHandler.class);
    10     
    11     @Autowired
    12     private WxdResMessageMapper resMessageMapper;
    13     @Autowired
    14     private WxdMessageMapper messageMapper;
    15     @Autowired
    16     private WxbUserMapper userMapper;
    17     @Autowired
    18     private WxAuthService wxAuthService;    //获取accesstoken接口
  • 相关阅读:
    EasyDSS高性能RTMP、HLS(m3u8)、HTTP-FLV、RTSP流媒体服务器前端源码重构(一)-从零开始搭建 webpack + vue + AdminLTE 多页面脚手架
    采用EasyDSS视频点播服务器搭建企业私有化的音视频多媒体、短视频、视频服务网站与管理后台
    基于EasyNVR摄像机无插件直播方案二次开发实现自己的摄像机IPC-NVR无插件化直播解决方案
    基于EasyNVR摄像机无插件直播流媒体服务器实现类似于单点登录功能的免登录直播功能
    实现RTSP摄像机进行网页直播和微信直播的技术方案:EasyNVR版本免费更新方法
    实现RTSP摄像机硬盘录像机NVR网站网页微信H5直播方案EasyNVR部署问题之:ERR_CONTENT_LENGTH_MISMATCH
    如何自己构建一套EasyNVR这样的无插件流媒体服务器实现摄像机硬盘录像机的网页可视化直播
    浏览器低延时播放监控摄像头RTSP海康大华硬盘录像机NVR视频(EasyNVR播放FLV视频流)
    基于EasyNVR摄像机流媒体服务器实现RTSP或Onvif监控摄像头Web无插件化直播监控
    基于EasyDarwin开源流媒体服务器框架实现EasyNVR H5无插件直播流媒体服务器方案
  • 原文地址:https://www.cnblogs.com/guoziyi/p/6273430.html
Copyright © 2020-2023  润新知