diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpMessageMatcher.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpMessageMatcher.java new file mode 100644 index 00000000..184a5324 --- /dev/null +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpMessageMatcher.java @@ -0,0 +1,17 @@ +package me.chanjar.weixin.cp.api; + +import me.chanjar.weixin.cp.bean.WxCpXmlMessage; + +/** + * 消息匹配器,用在消息路由的时候 + */ +public interface WxCpMessageMatcher { + + /** + * 消息是否匹配某种模式 + * @param message + * @return + */ + public boolean match(WxCpXmlMessage message); + +} diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpMessageRouter.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpMessageRouter.java index d4483eb0..936a2125 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpMessageRouter.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpMessageRouter.java @@ -228,6 +228,8 @@ public class WxCpMessageRouter { private String rContent; + private WxCpMessageMatcher matcher; + private boolean reEnter = false; private Integer agentId; @@ -320,6 +322,16 @@ public class WxCpMessageRouter { return this; } + /** + * 如果消息匹配某个matcher,用在用户需要自定义更复杂的匹配规则的时候 + * @param matcher + * @return + */ + public Rule matcher(WxCpMessageMatcher matcher) { + this.matcher = matcher; + return this; + } + /** * 设置微信消息拦截器 * @param interceptor @@ -403,6 +415,8 @@ public class WxCpMessageRouter { (this.content == null || this.content.equals(wxMessage.getContent() == null ? null : wxMessage.getContent().trim())) && (this.rContent == null || Pattern.matches(this.rContent, wxMessage.getContent() == null ? "" : wxMessage.getContent().trim())) + && + (this.matcher == null || this.matcher.match(wxMessage)) ; } diff --git a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/WxCpMessageRouterTest.java b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/WxCpMessageRouterTest.java index 7394bbfa..aac58a10 100644 --- a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/WxCpMessageRouterTest.java +++ b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/WxCpMessageRouterTest.java @@ -42,6 +42,12 @@ public class WxCpMessageRouterTest { .rule().async(async).eventKey("KEY_1").handler(new WxEchoCpMessageHandler(sb, "KEY_1")).end() .rule().async(async).content("CONTENT_1").handler(new WxEchoCpMessageHandler(sb, "CONTENT_1")).end() .rule().async(async).rContent(".*bc.*").handler(new WxEchoCpMessageHandler(sb, "abcd")).end() + .rule().async(async).matcher(new WxCpMessageMatcher() { + @Override + public boolean match(WxCpXmlMessage message) { + return "strangeformat".equals(message.getFormat()); + } + }).handler(new WxEchoCpMessageHandler(sb, "matcher")).end() .rule().async(async).handler(new WxEchoCpMessageHandler(sb, "ALL")).end(); ; } @@ -92,6 +98,7 @@ public class WxCpMessageRouterTest { Thread.sleep(1000l * 2); } + @DataProvider(name="messages-1") public Object[][] messages2() { WxCpXmlMessage message1 = new WxCpXmlMessage(); @@ -109,9 +116,12 @@ public class WxCpMessageRouterTest { WxCpXmlMessage message5 = new WxCpXmlMessage(); message5.setContent("BLA"); - WxCpXmlMessage message6 = new WxCpXmlMessage(); + WxCpXmlMessage message6 = new WxCpXmlMessage(); message6.setContent("abcd"); - + + WxCpXmlMessage message7 = new WxCpXmlMessage(); + message7.setFormat("strangeformat"); + WxCpXmlMessage c2 = new WxCpXmlMessage(); c2.setMsgType(WxConsts.XML_MSG_TEXT); c2.setEvent(WxConsts.EVT_CLICK); @@ -126,7 +136,8 @@ public class WxCpMessageRouterTest { c4.setEvent(WxConsts.EVT_CLICK); c4.setEventKey("KEY_1"); c4.setContent("CONTENT_1"); - + + return new Object[][] { new Object[] { message1, WxConsts.XML_MSG_TEXT + "," }, new Object[] { message2, WxConsts.EVT_CLICK + "," }, @@ -134,6 +145,7 @@ public class WxCpMessageRouterTest { new Object[] { message4, "CONTENT_1," }, new Object[] { message5, "ALL," }, new Object[] { message6, "abcd," }, + new Object[] { message7, "matcher," }, new Object[] { c2, "COMBINE_2," }, new Object[] { c3, "COMBINE_3," }, new Object[] { c4, "COMBINE_4," } @@ -290,7 +302,6 @@ public class WxCpMessageRouterTest { return null; } - } } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMessageMatcher.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMessageMatcher.java new file mode 100644 index 00000000..3d913f78 --- /dev/null +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMessageMatcher.java @@ -0,0 +1,17 @@ +package me.chanjar.weixin.mp.api; + +import me.chanjar.weixin.mp.bean.WxMpXmlMessage; + +/** + * 消息匹配器,用在消息路由的时候 + */ +public interface WxMpMessageMatcher { + + /** + * 消息是否匹配某种模式 + * @param message + * @return + */ + public boolean match(WxMpXmlMessage message); + +} diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMessageRouter.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMessageRouter.java index 3b413753..d804f59e 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMessageRouter.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMessageRouter.java @@ -225,7 +225,9 @@ public class WxMpMessageRouter { private String content; private String rContent; - + + private WxMpMessageMatcher matcher; + private boolean reEnter = false; private List handlers = new ArrayList(); @@ -306,6 +308,16 @@ public class WxMpMessageRouter { return this; } + /** + * 如果消息匹配某个matcher,用在用户需要自定义更复杂的匹配规则的时候 + * @param matcher + * @return + */ + public Rule matcher(WxMpMessageMatcher matcher) { + this.matcher = matcher; + return this; + } + /** * 设置微信消息拦截器 * @param interceptor @@ -387,6 +399,8 @@ public class WxMpMessageRouter { (this.content == null || this.content.equals(wxMessage.getContent() == null ? null : wxMessage.getContent().trim())) && (this.rContent == null || Pattern.matches(this.rContent, wxMessage.getContent() == null ? "" : wxMessage.getContent().trim())) + && + (this.matcher == null || this.matcher.match(wxMessage)) ; } diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxMpMessageRouterTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxMpMessageRouterTest.java index 0b636985..bcc78edd 100644 --- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxMpMessageRouterTest.java +++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxMpMessageRouterTest.java @@ -42,6 +42,12 @@ public class WxMpMessageRouterTest { .rule().async(async).eventKey("KEY_1").handler(new WxEchoMpMessageHandler(sb, "KEY_1")).end() .rule().async(async).content("CONTENT_1").handler(new WxEchoMpMessageHandler(sb, "CONTENT_1")).end() .rule().async(async).rContent(".*bc.*").handler(new WxEchoMpMessageHandler(sb, "abcd")).end() + .rule().async(async).matcher(new WxMpMessageMatcher() { + @Override + public boolean match(WxMpXmlMessage message) { + return "strangeformat".equals(message.getFormat()); + } + }).handler(new WxEchoMpMessageHandler(sb, "matcher")).end() .rule().async(async).handler(new WxEchoMpMessageHandler(sb, "ALL")).end(); ; } @@ -109,9 +115,12 @@ public class WxMpMessageRouterTest { WxMpXmlMessage message5 = new WxMpXmlMessage(); message5.setContent("BLA"); - WxMpXmlMessage message6 = new WxMpXmlMessage(); + WxMpXmlMessage message6 = new WxMpXmlMessage(); message6.setContent("abcd"); - + + WxMpXmlMessage message7 = new WxMpXmlMessage(); + message7.setFormat("strangeformat"); + WxMpXmlMessage c2 = new WxMpXmlMessage(); c2.setMsgType(WxConsts.XML_MSG_TEXT); c2.setEvent(WxConsts.EVT_CLICK); @@ -134,6 +143,7 @@ public class WxMpMessageRouterTest { new Object[] { message4, "CONTENT_1," }, new Object[] { message5, "ALL," }, new Object[] { message6, "abcd," }, + new Object[] { message7, "matcher," }, new Object[] { c2, "COMBINE_2," }, new Object[] { c3, "COMBINE_3," }, new Object[] { c4, "COMBINE_4," }