diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/tp/message/WxCpTpMessageHandler.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/tp/message/WxCpTpMessageHandler.java index 9ab718180..eea6bd966 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/tp/message/WxCpTpMessageHandler.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/tp/message/WxCpTpMessageHandler.java @@ -2,6 +2,7 @@ package me.chanjar.weixin.cp.tp.message; import me.chanjar.weixin.common.error.WxErrorException; import me.chanjar.weixin.common.session.WxSessionManager; +import me.chanjar.weixin.cp.bean.message.WxCpTpXmlMessage; import me.chanjar.weixin.cp.bean.message.WxCpXmlMessage; import me.chanjar.weixin.cp.bean.message.WxCpXmlOutMessage; import me.chanjar.weixin.cp.tp.service.WxCpTpService; @@ -25,7 +26,7 @@ public interface WxCpTpMessageHandler { * @return xml格式的消息 ,如果在异步规则里处理的话,可以返回null * @throws WxErrorException the wx error exception */ - WxCpXmlOutMessage handle(WxCpXmlMessage wxMessage, + WxCpXmlOutMessage handle(WxCpTpXmlMessage wxMessage, Map context, WxCpTpService wxCpService, WxSessionManager sessionManager) throws WxErrorException; diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/tp/message/WxCpTpMessageInterceptor.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/tp/message/WxCpTpMessageInterceptor.java index fe5ceefa0..62975951b 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/tp/message/WxCpTpMessageInterceptor.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/tp/message/WxCpTpMessageInterceptor.java @@ -2,6 +2,7 @@ package me.chanjar.weixin.cp.tp.message; import me.chanjar.weixin.common.error.WxErrorException; import me.chanjar.weixin.common.session.WxSessionManager; +import me.chanjar.weixin.cp.bean.message.WxCpTpXmlMessage; import me.chanjar.weixin.cp.bean.message.WxCpXmlMessage; import me.chanjar.weixin.cp.tp.service.WxCpTpService; @@ -24,7 +25,7 @@ public interface WxCpTpMessageInterceptor { * @return true代表OK ,false代表不OK * @throws WxErrorException the wx error exception */ - boolean intercept(WxCpXmlMessage wxMessage, + boolean intercept(WxCpTpXmlMessage wxMessage, Map context, WxCpTpService wxCpService, WxSessionManager sessionManager) throws WxErrorException; diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/tp/message/WxCpTpMessageRouter.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/tp/message/WxCpTpMessageRouter.java index 147f324db..ad9d0ff0a 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/tp/message/WxCpTpMessageRouter.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/tp/message/WxCpTpMessageRouter.java @@ -9,6 +9,7 @@ import me.chanjar.weixin.common.session.InternalSession; import me.chanjar.weixin.common.session.InternalSessionManager; import me.chanjar.weixin.common.session.WxSessionManager; import me.chanjar.weixin.common.util.LogExceptionHandler; +import me.chanjar.weixin.cp.bean.message.WxCpTpXmlMessage; import me.chanjar.weixin.cp.bean.message.WxCpXmlMessage; import me.chanjar.weixin.cp.bean.message.WxCpXmlOutMessage; import me.chanjar.weixin.cp.message.WxCpMessageRouterRule; @@ -131,7 +132,7 @@ public class WxCpTpMessageRouter { /** * 处理微信消息. */ - public WxCpXmlOutMessage route(final WxCpXmlMessage wxMessage, final Map context) { + public WxCpXmlOutMessage route(final WxCpTpXmlMessage wxMessage, final Map context) { if (isMsgDuplicated(wxMessage)) { // 如果是重复消息,那么就不做处理 return null; @@ -165,7 +166,7 @@ public class WxCpTpMessageRouter { } else { res = rule.service(wxMessage, context, this.wxCpService, this.sessionManager, this.exceptionHandler); // 在同步操作结束,session访问结束 - log.debug("End session access: async=false, sessionId={}", wxMessage.getFromUserName()); + log.debug("End session access: async=false, sessionId={}", wxMessage.getSuiteId()); sessionEndAccess(wxMessage); } } @@ -175,7 +176,7 @@ public class WxCpTpMessageRouter { for (Future future : futures) { try { future.get(); - log.debug("End session access: async=true, sessionId={}", wxMessage.getFromUserName()); + log.debug("End session access: async=true, sessionId={}", wxMessage.getSuiteId()); // 异步操作结束,session访问结束 sessionEndAccess(wxMessage); } catch (InterruptedException e) { @@ -193,30 +194,22 @@ public class WxCpTpMessageRouter { /** * 处理微信消息. */ - public WxCpXmlOutMessage route(final WxCpXmlMessage wxMessage) { + public WxCpXmlOutMessage route(final WxCpTpXmlMessage wxMessage) { return this.route(wxMessage, new HashMap<>(2)); } - private boolean isMsgDuplicated(WxCpXmlMessage wxMessage) { + private boolean isMsgDuplicated(WxCpTpXmlMessage wxMessage) { StringBuilder messageId = new StringBuilder(); - if (wxMessage.getMsgId() == null) { - messageId.append(wxMessage.getCreateTime()) - .append("-").append(StringUtils.trimToEmpty(String.valueOf(wxMessage.getAgentId()))) - .append("-").append(wxMessage.getFromUserName()) - .append("-").append(StringUtils.trimToEmpty(wxMessage.getEventKey())) - .append("-").append(StringUtils.trimToEmpty(wxMessage.getEvent())); - } else { - messageId.append(wxMessage.getMsgId()) - .append("-").append(wxMessage.getCreateTime()) - .append("-").append(wxMessage.getFromUserName()); + if (StringUtils.isNotEmpty(wxMessage.getSuiteId())) { + messageId.append("-").append(wxMessage.getSuiteId()); } - if (StringUtils.isNotEmpty(wxMessage.getUserId())) { - messageId.append("-").append(wxMessage.getUserId()); + if (StringUtils.isNotEmpty(wxMessage.getInfoType())) { + messageId.append("-").append(wxMessage.getInfoType()); } - if (StringUtils.isNotEmpty(wxMessage.getChangeType())) { - messageId.append("-").append(wxMessage.getChangeType()); + if (StringUtils.isNotEmpty(wxMessage.getTimeStamp())) { + messageId.append("-").append(wxMessage.getTimeStamp()); } return this.messageDuplicateChecker.isDuplicate(messageId.toString()); @@ -225,8 +218,8 @@ public class WxCpTpMessageRouter { /** * 对session的访问结束. */ - private void sessionEndAccess(WxCpXmlMessage wxMessage) { - InternalSession session = ((InternalSessionManager) this.sessionManager).findSession(wxMessage.getFromUserName()); + private void sessionEndAccess(WxCpTpXmlMessage wxMessage) { + InternalSession session = ((InternalSessionManager) this.sessionManager).findSession(wxMessage.getSuiteId()); if (session != null) { session.endAccess(); } diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/tp/message/WxCpTpMessageRouterRule.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/tp/message/WxCpTpMessageRouterRule.java index 8494978e2..fa21a1451 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/tp/message/WxCpTpMessageRouterRule.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/tp/message/WxCpTpMessageRouterRule.java @@ -4,6 +4,7 @@ import lombok.Data; import me.chanjar.weixin.common.api.WxErrorExceptionHandler; import me.chanjar.weixin.common.error.WxErrorException; import me.chanjar.weixin.common.session.WxSessionManager; +import me.chanjar.weixin.cp.bean.message.WxCpTpXmlMessage; import me.chanjar.weixin.cp.bean.message.WxCpXmlMessage; import me.chanjar.weixin.cp.bean.message.WxCpXmlOutMessage; import me.chanjar.weixin.cp.message.WxCpMessageMatcher; @@ -24,29 +25,17 @@ public class WxCpTpMessageRouterRule { private boolean async = true; - private String fromUser; - - private String msgType; - - private String event; - - private String eventKey; - - private String eventKeyRegex; - - private String content; - - private String rContent; - private WxCpMessageMatcher matcher; private boolean reEnter = false; - private Integer agentId; - private List handlers = new ArrayList<>(); private List interceptors = new ArrayList<>(); + private String suiteId; + private String infoType; + private String authCode; + private String suiteTicket; /** * Instantiates a new Wx cp message router rule. @@ -68,94 +57,6 @@ public class WxCpTpMessageRouterRule { return this; } - /** - * 如果agentId匹配 - * - * @param agentId the agent id - * @return the wx cp message router rule - */ - public WxCpTpMessageRouterRule agentId(Integer agentId) { - this.agentId = agentId; - return this; - } - - /** - * 如果msgType等于某值 - * - * @param msgType the msg type - * @return the wx cp message router rule - */ - public WxCpTpMessageRouterRule msgType(String msgType) { - this.msgType = msgType; - return this; - } - - /** - * 如果event等于某值 - * - * @param event the event - * @return the wx cp message router rule - */ - public WxCpTpMessageRouterRule event(String event) { - this.event = event; - return this; - } - - /** - * 如果eventKey等于某值 - * - * @param eventKey the event key - * @return the wx cp message router rule - */ - public WxCpTpMessageRouterRule eventKey(String eventKey) { - this.eventKey = eventKey; - return this; - } - - /** - * 如果eventKey匹配该正则表达式 - * - * @param regex the regex - * @return the wx cp message router rule - */ - public WxCpTpMessageRouterRule eventKeyRegex(String regex) { - this.eventKeyRegex = regex; - return this; - } - - /** - * 如果content等于某值 - * - * @param content the content - * @return the wx cp message router rule - */ - public WxCpTpMessageRouterRule content(String content) { - this.content = content; - return this; - } - - /** - * 如果content匹配该正则表达式 - * - * @param regex the regex - * @return the wx cp message router rule - */ - public WxCpTpMessageRouterRule rContent(String regex) { - this.rContent = regex; - return this; - } - - /** - * 如果fromUser等于某值 - * - * @param fromUser the from user - * @return the wx cp message router rule - */ - public WxCpTpMessageRouterRule fromUser(String fromUser) { - this.fromUser = fromUser; - return this; - } - /** * 如果消息匹配某个matcher,用在用户需要自定义更复杂的匹配规则的时候 * @@ -243,25 +144,15 @@ public class WxCpTpMessageRouterRule { * @param wxMessage the wx message * @return the boolean */ - protected boolean test(WxCpXmlMessage wxMessage) { + protected boolean test(WxCpTpXmlMessage wxMessage) { return - (this.fromUser == null || this.fromUser.equals(wxMessage.getFromUserName())) + (this.suiteId == null || this.suiteId.equals(wxMessage.getSuiteId())) && - (this.agentId == null || this.agentId.equals(wxMessage.getAgentId())) + (this.infoType == null || this.infoType.equals(wxMessage.getInfoType())) && - (this.msgType == null || this.msgType.equalsIgnoreCase(wxMessage.getMsgType())) + (this.suiteTicket == null || this.suiteTicket.equalsIgnoreCase(wxMessage.getSuiteTicket())) && - (this.event == null || this.event.equalsIgnoreCase(wxMessage.getEvent())) - && - (this.eventKey == null || this.eventKey.equalsIgnoreCase(wxMessage.getEventKey())) - && - (this.eventKeyRegex == null || Pattern.matches(this.eventKeyRegex, StringUtils.trimToEmpty(wxMessage.getEventKey()))) - && - (this.content == null || this.content.equals(StringUtils.trimToNull(wxMessage.getContent()))) - && - (this.rContent == null || Pattern.matches(this.rContent, StringUtils.trimToEmpty(wxMessage.getContent()))) - && - (this.matcher == null || this.matcher.match(wxMessage)) + (this.authCode == null || this.authCode.equalsIgnoreCase(wxMessage.getAuthCode())) ; } @@ -275,12 +166,11 @@ public class WxCpTpMessageRouterRule { * @param exceptionHandler the exception handler * @return true 代表继续执行别的router,false 代表停止执行别的router */ - protected WxCpXmlOutMessage service(WxCpXmlMessage wxMessage, + protected WxCpXmlOutMessage service(WxCpTpXmlMessage wxMessage, Map context, WxCpTpService wxCpService, WxSessionManager sessionManager, WxErrorExceptionHandler exceptionHandler) { - if (context == null) { context = new HashMap<>(2); }