diff --git a/README.md b/README.md index bdc3217c..6b1f1f8c 100644 --- a/README.md +++ b/README.md @@ -46,7 +46,7 @@ weixin4j com.foxinmy weixin4j-server - 0.0.1 + 1.0.0 以上依赖如果出现Missing artifact错误 请尝试在eclipse里这么做 diff --git a/weixin4j-server/pom.xml b/weixin4j-server/pom.xml index 4f455158..4acc3715 100644 --- a/weixin4j-server/pom.xml +++ b/weixin4j-server/pom.xml @@ -4,7 +4,7 @@ 4.0.0 com.foxinmy weixin4j-server - 0.0.1 + 1.0.0 weixin4j-server https://github.com/foxinmy/weixin4j/tree/master/weixin4j-server 微信消息netty服务器 diff --git a/weixin4j-server/src/main/java/com/foxinmy/weixin4j/dispatcher/WeixinMessageDispatcher.java b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/dispatcher/WeixinMessageDispatcher.java index e64fa424..409596db 100644 --- a/weixin4j-server/src/main/java/com/foxinmy/weixin4j/dispatcher/WeixinMessageDispatcher.java +++ b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/dispatcher/WeixinMessageDispatcher.java @@ -89,15 +89,15 @@ public class WeixinMessageDispatcher { } public void doDispatch(final ChannelHandlerContext context, - final WeixinRequest request, final String uniqueKey) + final WeixinRequest request, final String messageKey) throws WeixinException { - Class targetClass = messageMatcher.find(uniqueKey); + Class targetClass = messageMatcher.find(messageKey); Object message = request.getOriginalContent(); if (targetClass != null) { message = messageRead(request.getOriginalContent(), targetClass); } MessageHandlerExecutor handlerExecutor = getHandlerExecutor(context, - request, uniqueKey, message); + request, messageKey, message); if (handlerExecutor == null || handlerExecutor.getMessageHandler() == null) { noHandlerFound(context, request, message); @@ -130,7 +130,7 @@ public class WeixinMessageDispatcher { protected MessageHandlerExecutor getHandlerExecutor( ChannelHandlerContext context, WeixinRequest request, - String uniqueKey, Object message) throws WeixinException { + String messageKey, Object message) throws WeixinException { WeixinMessageHandler messageHandler = null; WeixinMessageHandler[] messageHandlers = getMessageHandlers(); if (messageHandlers == null) { @@ -142,7 +142,7 @@ public class WeixinMessageDispatcher { if (!messageMatcher.match(genericType)) { message = messageRead(request.getOriginalContent(), genericType); - messageMatcher.regist(uniqueKey, genericType); + messageMatcher.regist(messageKey, genericType); } if (genericType == message.getClass() && handler.canHandle(request, message)) { diff --git a/weixin4j-server/src/main/java/com/foxinmy/weixin4j/dispatcher/WeixinMessageMatcher.java b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/dispatcher/WeixinMessageMatcher.java index dd8b3c59..d3d9a27b 100644 --- a/weixin4j-server/src/main/java/com/foxinmy/weixin4j/dispatcher/WeixinMessageMatcher.java +++ b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/dispatcher/WeixinMessageMatcher.java @@ -27,8 +27,13 @@ public class WeixinMessageMatcher { private final Logger log = LoggerFactory.getLogger(getClass()); - private final String MP_TAG = "mp"; - private final String QY_TAG = "qy"; + public static final String MESSAGEKEY_MP_TAG = "mp"; + public static final String MESSAGEKEY_SEPARATOR = ":"; + public static final String MESSAGEKEY_MP_SEPARATOR = MESSAGEKEY_MP_TAG + + MESSAGEKEY_SEPARATOR; + public static final String MESSAGEKEY_QY_TAG = "qy"; + public static final String MESSAGEKEY_QY_SEPARATOR = MESSAGEKEY_QY_TAG + + MESSAGEKEY_SEPARATOR; private final Map> key2ClassMap; private final Map, String> class2KeyMap; @@ -47,123 +52,107 @@ public class WeixinMessageMatcher { // ///////////////////////////////////////////////// /******************** 普通消息 ********************/ // ///////////////////////////////////////////////// - String uniqueKey = MessageType.text.name(); + String messageKey = MessageType.text.name(); Class clazz = TextMessage.class; - regist(uniqueKey, clazz); - uniqueKey = MessageType.image.name(); + regist(messageKey, clazz); + messageKey = MessageType.image.name(); clazz = ImageMessage.class; - regist(uniqueKey, clazz); - uniqueKey = MessageType.voice.name(); + regist(messageKey, clazz); + messageKey = MessageType.voice.name(); clazz = VoiceMessage.class; - regist(uniqueKey, clazz); - uniqueKey = MessageType.video.name(); + regist(messageKey, clazz); + messageKey = MessageType.video.name(); clazz = VideoMessage.class; - regist(uniqueKey, clazz); - uniqueKey = MessageType.shortvideo.name(); - regist(uniqueKey, clazz); - uniqueKey = MessageType.location.name(); + regist(messageKey, clazz); + messageKey = MessageType.shortvideo.name(); + regist(messageKey, clazz); + messageKey = MessageType.location.name(); clazz = LocationMessage.class; - regist(uniqueKey, clazz); + regist(messageKey, clazz); } private void init1() { // ///////////////////////////////////////////////// /******************** 事件消息 ********************/ // ///////////////////////////////////////////////// - String uniqueKey; - Class clazz; for (EventType eventType : new EventType[] { EventType.subscribe, EventType.unsubscribe }) { - uniqueKey = String.format("%s:%s", MessageType.event.name(), - eventType.name()); - clazz = com.foxinmy.weixin4j.mp.event.ScribeEventMessage.class; - regist(String.format("%s:%s", MP_TAG, uniqueKey), clazz); + regist(mpEventMessagKey(eventType), + com.foxinmy.weixin4j.mp.event.ScribeEventMessage.class); } for (EventType eventType : new EventType[] { EventType.subscribe, EventType.unsubscribe }) { - uniqueKey = String.format("%s:%s", MessageType.event.name(), - eventType.name()); - clazz = com.foxinmy.weixin4j.qy.event.ScribeEventMessage.class; - regist(String.format("%s:%s", QY_TAG, uniqueKey), clazz); + regist(qyEventMessagKey(eventType), + com.foxinmy.weixin4j.qy.event.ScribeEventMessage.class); } - uniqueKey = String.format("%s:%s", MessageType.event.name(), - EventType.location.name()); - clazz = LocationEventMessage.class; - regist(uniqueKey, clazz); + Class clazz = LocationEventMessage.class; + regist(mpEventMessagKey(EventType.location), clazz); + regist(qyEventMessagKey(EventType.location), clazz); for (EventType eventType : new EventType[] { EventType.click, EventType.view }) { - uniqueKey = String.format("%s:%s", MessageType.event.name(), - eventType.name()); clazz = com.foxinmy.weixin4j.message.event.MenuEventMessage.class; - regist(uniqueKey, clazz); + regist(mpEventMessagKey(eventType), clazz); + regist(qyEventMessagKey(eventType), clazz); } for (EventType eventType : new EventType[] { EventType.scancode_push, EventType.scancode_waitmsg }) { - uniqueKey = String.format("%s:%s", MessageType.event.name(), - eventType.name()); clazz = com.foxinmy.weixin4j.message.event.MenuScanEventMessage.class; - regist(uniqueKey, clazz); + regist(mpEventMessagKey(eventType), clazz); + regist(qyEventMessagKey(eventType), clazz); } for (EventType eventType : new EventType[] { EventType.pic_sysphoto, EventType.pic_photo_or_album, EventType.pic_weixin }) { - uniqueKey = String.format("%s:%s", MessageType.event.name(), - eventType.name()); clazz = com.foxinmy.weixin4j.message.event.MenuPhotoEventMessage.class; - regist(uniqueKey, clazz); + regist(mpEventMessagKey(eventType), clazz); + regist(qyEventMessagKey(eventType), clazz); } - uniqueKey = String.format("%s:%s", MessageType.event.name(), - EventType.location_select.name()); clazz = com.foxinmy.weixin4j.message.event.MenuLocationEventMessage.class; - regist(uniqueKey, clazz); + regist(mpEventMessagKey(EventType.location_select), clazz); + regist(qyEventMessagKey(EventType.location_select), clazz); } private void init2() { // ///////////////////////////////////////////////// /******************** 公众平台事件消息 ********************/ // ///////////////////////////////////////////////// - String uniqueKey = String.format("%s:%s:%s", MP_TAG, - MessageType.event.name(), EventType.scan.name()); - Class clazz = ScanEventMessage.class; - regist(uniqueKey, clazz); - uniqueKey = String.format("%s:%s:%s", MP_TAG, MessageType.event.name(), - EventType.masssendjobfinish.name()); - clazz = MassEventMessage.class; - regist(uniqueKey, clazz); - uniqueKey = String.format("%s:%s:%s", MP_TAG, MessageType.event.name(), - EventType.templatesendjobfinish.name()); - clazz = TemplatesendjobfinishMessage.class; - regist(uniqueKey, clazz); - uniqueKey = String.format("%s:%s:%s", MP_TAG, MessageType.event.name(), - EventType.kf_create_session.name()); - clazz = KfCreateEventMessage.class; - regist(uniqueKey, clazz); - uniqueKey = String.format("%s:%s:%s", MP_TAG, MessageType.event.name(), - EventType.kf_close_session.name()); - clazz = KfCloseEventMessage.class; - regist(uniqueKey, clazz); - uniqueKey = String.format("%s:%s:%s", MP_TAG, MessageType.event.name(), - EventType.kf_switch_session.name()); - clazz = KfSwitchEventMessage.class; - regist(uniqueKey, clazz); + regist(mpEventMessagKey(EventType.scan), ScanEventMessage.class); + regist(mpEventMessagKey(EventType.masssendjobfinish), + MassEventMessage.class); + regist(mpEventMessagKey(EventType.templatesendjobfinish), + TemplatesendjobfinishMessage.class); + regist(mpEventMessagKey(EventType.kf_create_session), + KfCreateEventMessage.class); + regist(mpEventMessagKey(EventType.kf_close_session), + KfCloseEventMessage.class); + regist(mpEventMessagKey(EventType.kf_switch_session), + KfSwitchEventMessage.class); } private void init3() { // ///////////////////////////////////////////////// /******************** 企业号事件消息 ********************/ // ///////////////////////////////////////////////// - String uniqueKey = String.format("%s:%s:%s", QY_TAG, - MessageType.event.name(), EventType.batch_job_result.name()); - Class clazz = BatchjobresultMessage.class; - regist(uniqueKey, clazz); - uniqueKey = String.format("%s:%s:%s", QY_TAG, MessageType.event.name(), - EventType.enter_agent.name()); - clazz = EnterAgentEventMessage.class; - regist(uniqueKey, clazz); + regist(qyEventMessagKey(EventType.batch_job_result), + BatchjobresultMessage.class); + regist(qyEventMessagKey(EventType.enter_agent), + EnterAgentEventMessage.class); } - public void regist(String uniqueKey, Class clazz) { - key2ClassMap.put(uniqueKey, clazz); - class2KeyMap.put(clazz, uniqueKey); + private String mpEventMessagKey(EventType eventType) { + return String.format("%s%s%s%s", MESSAGEKEY_MP_SEPARATOR, + MessageType.event.name(), MESSAGEKEY_SEPARATOR, + eventType.name()); + } + + private String qyEventMessagKey(EventType eventType) { + return String.format("%s%s%s%s", MESSAGEKEY_QY_SEPARATOR, + MessageType.event.name(), MESSAGEKEY_SEPARATOR, + eventType.name()); + } + + public void regist(String messageKey, Class clazz) { + key2ClassMap.put(messageKey, clazz); + class2KeyMap.put(clazz, messageKey); } public boolean match(Object keyOrClass) { @@ -171,7 +160,7 @@ public class WeixinMessageMatcher { || class2KeyMap.containsKey(keyOrClass); } - public Class find(String uniqueKey) { - return key2ClassMap.get(uniqueKey); + public Class find(String messageKey) { + return key2ClassMap.get(messageKey); } } diff --git a/weixin4j-server/src/main/java/com/foxinmy/weixin4j/handler/DebugMessageHandler.java b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/handler/DebugMessageHandler.java index 19dc225e..788811e9 100644 --- a/weixin4j-server/src/main/java/com/foxinmy/weixin4j/handler/DebugMessageHandler.java +++ b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/handler/DebugMessageHandler.java @@ -16,6 +16,7 @@ public class DebugMessageHandler implements WeixinMessageHandler { @Override public boolean canHandle(WeixinRequest request, Object message) throws WeixinException { + System.err.println(message.getClass()); return true; } diff --git a/weixin4j-server/src/main/java/com/foxinmy/weixin4j/socket/WeixinRequestHandler.java b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/socket/WeixinRequestHandler.java index 05b12adc..07246a5b 100644 --- a/weixin4j-server/src/main/java/com/foxinmy/weixin4j/socket/WeixinRequestHandler.java +++ b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/socket/WeixinRequestHandler.java @@ -110,6 +110,6 @@ public class WeixinRequestHandler extends .set(messageHandler.getToUserName()); } messageDispatcher.doDispatch(ctx, request, - messageHandler.getUniqueKey()); + messageHandler.getMessageKey()); } } diff --git a/weixin4j-server/src/main/java/com/foxinmy/weixin4j/xml/CruxMessageHandler.java b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/xml/CruxMessageHandler.java index 4d7d823e..c8a17d0e 100644 --- a/weixin4j-server/src/main/java/com/foxinmy/weixin4j/xml/CruxMessageHandler.java +++ b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/xml/CruxMessageHandler.java @@ -9,6 +9,7 @@ import org.xml.sax.XMLReader; import org.xml.sax.helpers.DefaultHandler; import org.xml.sax.helpers.XMLReaderFactory; +import com.foxinmy.weixin4j.dispatcher.WeixinMessageMatcher; import com.foxinmy.weixin4j.type.MessageType; import com.foxinmy.weixin4j.util.Consts; import com.foxinmy.weixin4j.util.StringUtil; @@ -54,18 +55,21 @@ public class CruxMessageHandler extends DefaultHandler { this.content = new String(ch, start, length); } - public String getUniqueKey() { + public String getMessageKey() { StringBuilder uniqueKey = new StringBuilder(); uniqueKey.append(msgType); if (msgType.equals(MessageType.event.name())) { if (StringUtil.isBlank(agentId)) { - uniqueKey.insert(0, "mp:"); + uniqueKey.insert(0, + WeixinMessageMatcher.MESSAGEKEY_MP_SEPARATOR); } else { - uniqueKey.insert(0, "qy:"); + uniqueKey.insert(0, + WeixinMessageMatcher.MESSAGEKEY_QY_SEPARATOR); } - uniqueKey.append(":").append(eventType); + uniqueKey.append(WeixinMessageMatcher.MESSAGEKEY_SEPARATOR).append( + eventType); } - return uniqueKey.toString(); + return uniqueKey.toString().toLowerCase(); } public String getFromUserName() {