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