| @@ -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); | |||||
| } | |||||
| @@ -228,6 +228,8 @@ public class WxCpMessageRouter { | |||||
| private String rContent; | private String rContent; | ||||
| private WxCpMessageMatcher matcher; | |||||
| private boolean reEnter = false; | private boolean reEnter = false; | ||||
| private Integer agentId; | private Integer agentId; | ||||
| @@ -320,6 +322,16 @@ public class WxCpMessageRouter { | |||||
| return this; | return this; | ||||
| } | } | ||||
| /** | |||||
| * 如果消息匹配某个matcher,用在用户需要自定义更复杂的匹配规则的时候 | |||||
| * @param matcher | |||||
| * @return | |||||
| */ | |||||
| public Rule matcher(WxCpMessageMatcher matcher) { | |||||
| this.matcher = matcher; | |||||
| return this; | |||||
| } | |||||
| /** | /** | ||||
| * 设置微信消息拦截器 | * 设置微信消息拦截器 | ||||
| * @param interceptor | * @param interceptor | ||||
| @@ -403,6 +415,8 @@ public class WxCpMessageRouter { | |||||
| (this.content == null || this.content.equals(wxMessage.getContent() == null ? null : wxMessage.getContent().trim())) | (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.rContent == null || Pattern.matches(this.rContent, wxMessage.getContent() == null ? "" : wxMessage.getContent().trim())) | ||||
| && | |||||
| (this.matcher == null || this.matcher.match(wxMessage)) | |||||
| ; | ; | ||||
| } | } | ||||
| @@ -42,6 +42,12 @@ public class WxCpMessageRouterTest { | |||||
| .rule().async(async).eventKey("KEY_1").handler(new WxEchoCpMessageHandler(sb, "KEY_1")).end() | .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).content("CONTENT_1").handler(new WxEchoCpMessageHandler(sb, "CONTENT_1")).end() | ||||
| .rule().async(async).rContent(".*bc.*").handler(new WxEchoCpMessageHandler(sb, "abcd")).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(); | .rule().async(async).handler(new WxEchoCpMessageHandler(sb, "ALL")).end(); | ||||
| ; | ; | ||||
| } | } | ||||
| @@ -92,6 +98,7 @@ public class WxCpMessageRouterTest { | |||||
| Thread.sleep(1000l * 2); | Thread.sleep(1000l * 2); | ||||
| } | } | ||||
| @DataProvider(name="messages-1") | @DataProvider(name="messages-1") | ||||
| public Object[][] messages2() { | public Object[][] messages2() { | ||||
| WxCpXmlMessage message1 = new WxCpXmlMessage(); | WxCpXmlMessage message1 = new WxCpXmlMessage(); | ||||
| @@ -109,9 +116,12 @@ public class WxCpMessageRouterTest { | |||||
| WxCpXmlMessage message5 = new WxCpXmlMessage(); | WxCpXmlMessage message5 = new WxCpXmlMessage(); | ||||
| message5.setContent("BLA"); | message5.setContent("BLA"); | ||||
| WxCpXmlMessage message6 = new WxCpXmlMessage(); | |||||
| WxCpXmlMessage message6 = new WxCpXmlMessage(); | |||||
| message6.setContent("abcd"); | message6.setContent("abcd"); | ||||
| WxCpXmlMessage message7 = new WxCpXmlMessage(); | |||||
| message7.setFormat("strangeformat"); | |||||
| WxCpXmlMessage c2 = new WxCpXmlMessage(); | WxCpXmlMessage c2 = new WxCpXmlMessage(); | ||||
| c2.setMsgType(WxConsts.XML_MSG_TEXT); | c2.setMsgType(WxConsts.XML_MSG_TEXT); | ||||
| c2.setEvent(WxConsts.EVT_CLICK); | c2.setEvent(WxConsts.EVT_CLICK); | ||||
| @@ -126,7 +136,8 @@ public class WxCpMessageRouterTest { | |||||
| c4.setEvent(WxConsts.EVT_CLICK); | c4.setEvent(WxConsts.EVT_CLICK); | ||||
| c4.setEventKey("KEY_1"); | c4.setEventKey("KEY_1"); | ||||
| c4.setContent("CONTENT_1"); | c4.setContent("CONTENT_1"); | ||||
| return new Object[][] { | return new Object[][] { | ||||
| new Object[] { message1, WxConsts.XML_MSG_TEXT + "," }, | new Object[] { message1, WxConsts.XML_MSG_TEXT + "," }, | ||||
| new Object[] { message2, WxConsts.EVT_CLICK + "," }, | new Object[] { message2, WxConsts.EVT_CLICK + "," }, | ||||
| @@ -134,6 +145,7 @@ public class WxCpMessageRouterTest { | |||||
| new Object[] { message4, "CONTENT_1," }, | new Object[] { message4, "CONTENT_1," }, | ||||
| new Object[] { message5, "ALL," }, | new Object[] { message5, "ALL," }, | ||||
| new Object[] { message6, "abcd," }, | new Object[] { message6, "abcd," }, | ||||
| new Object[] { message7, "matcher," }, | |||||
| new Object[] { c2, "COMBINE_2," }, | new Object[] { c2, "COMBINE_2," }, | ||||
| new Object[] { c3, "COMBINE_3," }, | new Object[] { c3, "COMBINE_3," }, | ||||
| new Object[] { c4, "COMBINE_4," } | new Object[] { c4, "COMBINE_4," } | ||||
| @@ -290,7 +302,6 @@ public class WxCpMessageRouterTest { | |||||
| return null; | return null; | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| @@ -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); | |||||
| } | |||||
| @@ -225,7 +225,9 @@ public class WxMpMessageRouter { | |||||
| private String content; | private String content; | ||||
| private String rContent; | private String rContent; | ||||
| private WxMpMessageMatcher matcher; | |||||
| private boolean reEnter = false; | private boolean reEnter = false; | ||||
| private List<WxMpMessageHandler> handlers = new ArrayList<WxMpMessageHandler>(); | private List<WxMpMessageHandler> handlers = new ArrayList<WxMpMessageHandler>(); | ||||
| @@ -306,6 +308,16 @@ public class WxMpMessageRouter { | |||||
| return this; | return this; | ||||
| } | } | ||||
| /** | |||||
| * 如果消息匹配某个matcher,用在用户需要自定义更复杂的匹配规则的时候 | |||||
| * @param matcher | |||||
| * @return | |||||
| */ | |||||
| public Rule matcher(WxMpMessageMatcher matcher) { | |||||
| this.matcher = matcher; | |||||
| return this; | |||||
| } | |||||
| /** | /** | ||||
| * 设置微信消息拦截器 | * 设置微信消息拦截器 | ||||
| * @param interceptor | * @param interceptor | ||||
| @@ -387,6 +399,8 @@ public class WxMpMessageRouter { | |||||
| (this.content == null || this.content.equals(wxMessage.getContent() == null ? null : wxMessage.getContent().trim())) | (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.rContent == null || Pattern.matches(this.rContent, wxMessage.getContent() == null ? "" : wxMessage.getContent().trim())) | ||||
| && | |||||
| (this.matcher == null || this.matcher.match(wxMessage)) | |||||
| ; | ; | ||||
| } | } | ||||
| @@ -42,6 +42,12 @@ public class WxMpMessageRouterTest { | |||||
| .rule().async(async).eventKey("KEY_1").handler(new WxEchoMpMessageHandler(sb, "KEY_1")).end() | .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).content("CONTENT_1").handler(new WxEchoMpMessageHandler(sb, "CONTENT_1")).end() | ||||
| .rule().async(async).rContent(".*bc.*").handler(new WxEchoMpMessageHandler(sb, "abcd")).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(); | .rule().async(async).handler(new WxEchoMpMessageHandler(sb, "ALL")).end(); | ||||
| ; | ; | ||||
| } | } | ||||
| @@ -109,9 +115,12 @@ public class WxMpMessageRouterTest { | |||||
| WxMpXmlMessage message5 = new WxMpXmlMessage(); | WxMpXmlMessage message5 = new WxMpXmlMessage(); | ||||
| message5.setContent("BLA"); | message5.setContent("BLA"); | ||||
| WxMpXmlMessage message6 = new WxMpXmlMessage(); | |||||
| WxMpXmlMessage message6 = new WxMpXmlMessage(); | |||||
| message6.setContent("abcd"); | message6.setContent("abcd"); | ||||
| WxMpXmlMessage message7 = new WxMpXmlMessage(); | |||||
| message7.setFormat("strangeformat"); | |||||
| WxMpXmlMessage c2 = new WxMpXmlMessage(); | WxMpXmlMessage c2 = new WxMpXmlMessage(); | ||||
| c2.setMsgType(WxConsts.XML_MSG_TEXT); | c2.setMsgType(WxConsts.XML_MSG_TEXT); | ||||
| c2.setEvent(WxConsts.EVT_CLICK); | c2.setEvent(WxConsts.EVT_CLICK); | ||||
| @@ -134,6 +143,7 @@ public class WxMpMessageRouterTest { | |||||
| new Object[] { message4, "CONTENT_1," }, | new Object[] { message4, "CONTENT_1," }, | ||||
| new Object[] { message5, "ALL," }, | new Object[] { message5, "ALL," }, | ||||
| new Object[] { message6, "abcd," }, | new Object[] { message6, "abcd," }, | ||||
| new Object[] { message7, "matcher," }, | |||||
| new Object[] { c2, "COMBINE_2," }, | new Object[] { c2, "COMBINE_2," }, | ||||
| new Object[] { c3, "COMBINE_3," }, | new Object[] { c3, "COMBINE_3," }, | ||||
| new Object[] { c4, "COMBINE_4," } | new Object[] { c4, "COMBINE_4," } | ||||