@@ -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," } | ||||