微信第三方平台消息后台處理


 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接口

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM