From b69aa77fbc2bff8dff2f82ec3a9cf0bfe845d7a8 Mon Sep 17 00:00:00 2001 From: Daniel Qian Date: Tue, 21 Oct 2014 18:03:24 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A2=AB=E5=8A=A8=E5=93=8D=E5=BA=94=E6=B6=88?= =?UTF-8?q?=E6=81=AF=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../enterprise/api/WxCpMessageHandler.java | 4 ++-- .../enterprise/api/WxCpMessageRouter.java | 10 ++++----- .../enterprise/bean/WxCpXmlMessage.java | 15 +++++++++++-- ...ssage.java => WxCpXmlOutImageMessage.java} | 4 ++-- ...OutMessage.java => WxCpXmlOutMessage.java} | 4 ++-- ...essage.java => WxCpXmlOutMewsMessage.java} | 4 ++-- ...ssage.java => WxCpXmlOutMusicMessage.java} | 4 ++-- ...essage.java => WxCpXmlOutTextMessage.java} | 4 ++-- ...ssage.java => WxCpXmlOutVideoMessage.java} | 4 ++-- ...ssage.java => WxCpXmlOutVoiceMessage.java} | 4 ++-- .../bean/outxmlbuilder/BaseBuilder.java | 4 ++-- .../bean/outxmlbuilder/ImageBuilder.java | 8 +++---- .../bean/outxmlbuilder/MusicBuilder.java | 8 +++---- .../bean/outxmlbuilder/NewsBuilder.java | 10 ++++----- .../bean/outxmlbuilder/TextBuilder.java | 8 +++---- .../bean/outxmlbuilder/VideoBuilder.java | 8 +++---- .../bean/outxmlbuilder/VoiceBuilder.java | 8 +++---- .../enterprise/util/xml/XmlTransformer.java | 15 +++++++------ .../enterprise/api/WxCpMessageRouterTest.java | 7 +++---- ...t.java => WxCpXmlOutImageMessageTest.java} | 8 +++---- ...t.java => WxCpXmlOutMusicMessageTest.java} | 8 +++---- ...st.java => WxCpXmlOutNewsMessageTest.java} | 12 +++++------ ...st.java => WxCpXmlOutTextMessageTest.java} | 8 +++---- ...t.java => WxCpXmlOutVideoMessageTest.java} | 8 +++---- ...t.java => WxCpXmlOutVoiceMessageTest.java} | 8 +++---- .../enterprise/demo/WxCpTestServlet.java | 21 ++++++++++++------- 26 files changed, 104 insertions(+), 102 deletions(-) rename weixin-java-enterprise/src/main/java/me/chanjar/weixin/enterprise/bean/{WxXmlOutImageMessage.java => WxCpXmlOutImageMessage.java} (88%) rename weixin-java-enterprise/src/main/java/me/chanjar/weixin/enterprise/bean/{WxXmlOutMessage.java => WxCpXmlOutMessage.java} (98%) rename weixin-java-enterprise/src/main/java/me/chanjar/weixin/enterprise/bean/{WxXmlOutMewsMessage.java => WxCpXmlOutMewsMessage.java} (95%) rename weixin-java-enterprise/src/main/java/me/chanjar/weixin/enterprise/bean/{WxXmlOutMusicMessage.java => WxCpXmlOutMusicMessage.java} (96%) rename weixin-java-enterprise/src/main/java/me/chanjar/weixin/enterprise/bean/{WxXmlOutTextMessage.java => WxCpXmlOutTextMessage.java} (88%) rename weixin-java-enterprise/src/main/java/me/chanjar/weixin/enterprise/bean/{WxXmlOutVideoMessage.java => WxCpXmlOutVideoMessage.java} (95%) rename weixin-java-enterprise/src/main/java/me/chanjar/weixin/enterprise/bean/{WxXmlOutVoiceMessage.java => WxCpXmlOutVoiceMessage.java} (88%) rename weixin-java-enterprise/src/test/java/me/chanjar/weixin/enterprise/bean/{WxXmlOutImageMessageTest.java => WxCpXmlOutImageMessageTest.java} (82%) rename weixin-java-enterprise/src/test/java/me/chanjar/weixin/enterprise/bean/{WxXmlOutMusicMessageTest.java => WxCpXmlOutMusicMessageTest.java} (90%) rename weixin-java-enterprise/src/test/java/me/chanjar/weixin/enterprise/bean/{WxXmlOutNewsMessageTest.java => WxCpXmlOutNewsMessageTest.java} (88%) rename weixin-java-enterprise/src/test/java/me/chanjar/weixin/enterprise/bean/{WxXmlOutTextMessageTest.java => WxCpXmlOutTextMessageTest.java} (82%) rename weixin-java-enterprise/src/test/java/me/chanjar/weixin/enterprise/bean/{WxXmlOutVideoMessageTest.java => WxCpXmlOutVideoMessageTest.java} (88%) rename weixin-java-enterprise/src/test/java/me/chanjar/weixin/enterprise/bean/{WxXmlOutVoiceMessageTest.java => WxCpXmlOutVoiceMessageTest.java} (81%) diff --git a/weixin-java-enterprise/src/main/java/me/chanjar/weixin/enterprise/api/WxCpMessageHandler.java b/weixin-java-enterprise/src/main/java/me/chanjar/weixin/enterprise/api/WxCpMessageHandler.java index fabf0d293..41376f94d 100644 --- a/weixin-java-enterprise/src/main/java/me/chanjar/weixin/enterprise/api/WxCpMessageHandler.java +++ b/weixin-java-enterprise/src/main/java/me/chanjar/weixin/enterprise/api/WxCpMessageHandler.java @@ -3,7 +3,7 @@ package me.chanjar.weixin.enterprise.api; import java.util.Map; import me.chanjar.weixin.enterprise.bean.WxCpXmlMessage; -import me.chanjar.weixin.enterprise.bean.WxXmlOutMessage; +import me.chanjar.weixin.enterprise.bean.WxCpXmlOutMessage; /** * 处理微信推送消息的处理器接口 @@ -18,6 +18,6 @@ public interface WxCpMessageHandler { * @param context 上下文,如果handler或interceptor之间有信息要传递,可以用这个 * @return xml格式的消息,如果在异步规则里处理的话,可以返回null */ - public WxXmlOutMessage handle(WxCpXmlMessage wxMessage, Map context); + public WxCpXmlOutMessage handle(WxCpXmlMessage wxMessage, Map context); } diff --git a/weixin-java-enterprise/src/main/java/me/chanjar/weixin/enterprise/api/WxCpMessageRouter.java b/weixin-java-enterprise/src/main/java/me/chanjar/weixin/enterprise/api/WxCpMessageRouter.java index 682cfb161..27b22bcb4 100644 --- a/weixin-java-enterprise/src/main/java/me/chanjar/weixin/enterprise/api/WxCpMessageRouter.java +++ b/weixin-java-enterprise/src/main/java/me/chanjar/weixin/enterprise/api/WxCpMessageRouter.java @@ -9,7 +9,7 @@ import java.util.concurrent.Executors; import java.util.regex.Pattern; import me.chanjar.weixin.enterprise.bean.WxCpXmlMessage; -import me.chanjar.weixin.enterprise.bean.WxXmlOutMessage; +import me.chanjar.weixin.enterprise.bean.WxCpXmlOutMessage; /** *
@@ -57,7 +57,7 @@ public class WxCpMessageRouter {
    * 处理微信消息
    * @param wxMessage
    */
-  public WxXmlOutMessage route(final WxCpXmlMessage wxMessage) {
+  public WxCpXmlOutMessage route(final WxCpXmlMessage wxMessage) {
     final List matchRules = new ArrayList();
     // 收集匹配的规则
     for (final Rule rule : rules) {
@@ -86,7 +86,7 @@ public class WxCpMessageRouter {
       return null;
     }
     
-    WxXmlOutMessage res = null;
+    WxCpXmlOutMessage res = null;
     for (final Rule rule : matchRules) {
       // 返回最后一个匹配规则的结果
       res = rule.service(wxMessage);
@@ -270,7 +270,7 @@ public class WxCpMessageRouter {
      * @param wxMessage
      * @return true 代表继续执行别的router,false 代表停止执行别的router
      */
-    protected WxXmlOutMessage service(WxCpXmlMessage wxMessage) {
+    protected WxCpXmlOutMessage service(WxCpXmlMessage wxMessage) {
       Map context = new HashMap();
       // 如果拦截器不通过
       for (WxCpMessageInterceptor interceptor : this.interceptors) {
@@ -280,7 +280,7 @@ public class WxCpMessageRouter {
       }
       
       // 交给handler处理
-      WxXmlOutMessage res = null;
+      WxCpXmlOutMessage res = null;
       for (WxCpMessageHandler handler : this.handlers) {
         // 返回最后handler的结果
         res = handler.handle(wxMessage, context);
diff --git a/weixin-java-enterprise/src/main/java/me/chanjar/weixin/enterprise/bean/WxCpXmlMessage.java b/weixin-java-enterprise/src/main/java/me/chanjar/weixin/enterprise/bean/WxCpXmlMessage.java
index 0f4311d84..740d2e810 100644
--- a/weixin-java-enterprise/src/main/java/me/chanjar/weixin/enterprise/bean/WxCpXmlMessage.java
+++ b/weixin-java-enterprise/src/main/java/me/chanjar/weixin/enterprise/bean/WxCpXmlMessage.java
@@ -34,6 +34,9 @@ public class WxCpXmlMessage {
   // 以下都是微信推送过来的消息的xml的element所对应的属性
   ///////////////////////
 
+  @XmlElement(name="AgentID")
+  private Integer agentId;
+
   @XmlElement(name = "ToUserName")
   @XmlJavaTypeAdapter(AdapterCDATA.class)
   private String toUserName;
@@ -161,6 +164,14 @@ public class WxCpXmlMessage {
   @XmlElement(name = "SendLocationInfo")
   private SendLocationInfo sendLocationInfo = new SendLocationInfo();
 
+  public Integer getAgentId() {
+    return agentId;
+  }
+
+  public void setAgentId(Integer agentId) {
+    this.agentId = agentId;
+  }
+
   public String getToUserName() {
     return toUserName;
   }
@@ -380,7 +391,7 @@ public class WxCpXmlMessage {
     this.fromUserName = fromUserName;
   }
 
-  public static WxCpXmlMessage fromXml(String xml) {
+  protected static WxCpXmlMessage fromXml(String xml) {
     try {
       return XmlTransformer.fromXml(WxCpXmlMessage.class, xml);
     } catch (JAXBException e) {
@@ -388,7 +399,7 @@ public class WxCpXmlMessage {
     }
   }
 
-  public static WxCpXmlMessage fromXml(InputStream is) {
+  protected static WxCpXmlMessage fromXml(InputStream is) {
     try {
       return XmlTransformer.fromXml(WxCpXmlMessage.class, is);
     } catch (JAXBException e) {
diff --git a/weixin-java-enterprise/src/main/java/me/chanjar/weixin/enterprise/bean/WxXmlOutImageMessage.java b/weixin-java-enterprise/src/main/java/me/chanjar/weixin/enterprise/bean/WxCpXmlOutImageMessage.java
similarity index 88%
rename from weixin-java-enterprise/src/main/java/me/chanjar/weixin/enterprise/bean/WxXmlOutImageMessage.java
rename to weixin-java-enterprise/src/main/java/me/chanjar/weixin/enterprise/bean/WxCpXmlOutImageMessage.java
index f8c7df631..255a0f16a 100644
--- a/weixin-java-enterprise/src/main/java/me/chanjar/weixin/enterprise/bean/WxXmlOutImageMessage.java
+++ b/weixin-java-enterprise/src/main/java/me/chanjar/weixin/enterprise/bean/WxCpXmlOutImageMessage.java
@@ -11,13 +11,13 @@ import me.chanjar.weixin.enterprise.util.xml.MediaIdMarshaller;
 
 @XmlRootElement(name = "xml")
 @XmlAccessorType(XmlAccessType.FIELD)
-public class WxXmlOutImageMessage extends WxXmlOutMessage {
+public class WxCpXmlOutImageMessage extends WxCpXmlOutMessage {
   
   @XmlElement(name="Image")
   @XmlJavaTypeAdapter(MediaIdMarshaller.class)
   private String mediaId;
 
-  public WxXmlOutImageMessage() {
+  public WxCpXmlOutImageMessage() {
     this.msgType = WxConsts.XML_MSG_IMAGE;
   }
   
diff --git a/weixin-java-enterprise/src/main/java/me/chanjar/weixin/enterprise/bean/WxXmlOutMessage.java b/weixin-java-enterprise/src/main/java/me/chanjar/weixin/enterprise/bean/WxCpXmlOutMessage.java
similarity index 98%
rename from weixin-java-enterprise/src/main/java/me/chanjar/weixin/enterprise/bean/WxXmlOutMessage.java
rename to weixin-java-enterprise/src/main/java/me/chanjar/weixin/enterprise/bean/WxCpXmlOutMessage.java
index 2793d512d..726c0fa05 100644
--- a/weixin-java-enterprise/src/main/java/me/chanjar/weixin/enterprise/bean/WxXmlOutMessage.java
+++ b/weixin-java-enterprise/src/main/java/me/chanjar/weixin/enterprise/bean/WxCpXmlOutMessage.java
@@ -20,7 +20,7 @@ import me.chanjar.weixin.enterprise.util.xml.XmlTransformer;
 
 @XmlRootElement(name = "xml")
 @XmlAccessorType(XmlAccessType.FIELD)
-public class WxXmlOutMessage {
+public class WxCpXmlOutMessage {
 
   @XmlElement(name="ToUserName")
   @XmlJavaTypeAdapter(AdapterCDATA.class)
@@ -69,7 +69,7 @@ public class WxXmlOutMessage {
     this.msgType = msgType;
   }
   
-  public String toXml() {
+  protected String toXml() {
     try {
       return XmlTransformer.toXml((Class)this.getClass(), this);
     } catch (JAXBException e) {
diff --git a/weixin-java-enterprise/src/main/java/me/chanjar/weixin/enterprise/bean/WxXmlOutMewsMessage.java b/weixin-java-enterprise/src/main/java/me/chanjar/weixin/enterprise/bean/WxCpXmlOutMewsMessage.java
similarity index 95%
rename from weixin-java-enterprise/src/main/java/me/chanjar/weixin/enterprise/bean/WxXmlOutMewsMessage.java
rename to weixin-java-enterprise/src/main/java/me/chanjar/weixin/enterprise/bean/WxCpXmlOutMewsMessage.java
index d241afc31..e645ddfc8 100644
--- a/weixin-java-enterprise/src/main/java/me/chanjar/weixin/enterprise/bean/WxXmlOutMewsMessage.java
+++ b/weixin-java-enterprise/src/main/java/me/chanjar/weixin/enterprise/bean/WxCpXmlOutMewsMessage.java
@@ -15,7 +15,7 @@ import me.chanjar.weixin.enterprise.util.xml.AdapterCDATA;
 
 @XmlRootElement(name = "xml")
 @XmlAccessorType(XmlAccessType.FIELD)
-public class WxXmlOutMewsMessage extends WxXmlOutMessage {
+public class WxCpXmlOutMewsMessage extends WxCpXmlOutMessage {
 
   @XmlElement(name = "ArticleCount")
   protected int articleCount;
@@ -24,7 +24,7 @@ public class WxXmlOutMewsMessage extends WxXmlOutMessage {
   @XmlElement(name = "item")
   protected final List articles = new ArrayList();
   
-  public WxXmlOutMewsMessage() {
+  public WxCpXmlOutMewsMessage() {
     this.msgType = WxConsts.XML_MSG_NEWS;
   }
 
diff --git a/weixin-java-enterprise/src/main/java/me/chanjar/weixin/enterprise/bean/WxXmlOutMusicMessage.java b/weixin-java-enterprise/src/main/java/me/chanjar/weixin/enterprise/bean/WxCpXmlOutMusicMessage.java
similarity index 96%
rename from weixin-java-enterprise/src/main/java/me/chanjar/weixin/enterprise/bean/WxXmlOutMusicMessage.java
rename to weixin-java-enterprise/src/main/java/me/chanjar/weixin/enterprise/bean/WxCpXmlOutMusicMessage.java
index 9199fd085..56cad10c3 100644
--- a/weixin-java-enterprise/src/main/java/me/chanjar/weixin/enterprise/bean/WxXmlOutMusicMessage.java
+++ b/weixin-java-enterprise/src/main/java/me/chanjar/weixin/enterprise/bean/WxCpXmlOutMusicMessage.java
@@ -11,12 +11,12 @@ import me.chanjar.weixin.enterprise.util.xml.AdapterCDATA;
 
 @XmlRootElement(name = "xml")
 @XmlAccessorType(XmlAccessType.FIELD)
-public class WxXmlOutMusicMessage extends WxXmlOutMessage {
+public class WxCpXmlOutMusicMessage extends WxCpXmlOutMessage {
 
   @XmlElement(name = "Music")
   protected final Music music = new Music();
 
-  public WxXmlOutMusicMessage() {
+  public WxCpXmlOutMusicMessage() {
     this.msgType = WxConsts.XML_MSG_MUSIC;
   }
 
diff --git a/weixin-java-enterprise/src/main/java/me/chanjar/weixin/enterprise/bean/WxXmlOutTextMessage.java b/weixin-java-enterprise/src/main/java/me/chanjar/weixin/enterprise/bean/WxCpXmlOutTextMessage.java
similarity index 88%
rename from weixin-java-enterprise/src/main/java/me/chanjar/weixin/enterprise/bean/WxXmlOutTextMessage.java
rename to weixin-java-enterprise/src/main/java/me/chanjar/weixin/enterprise/bean/WxCpXmlOutTextMessage.java
index d3854fb6a..cb7e1fc68 100644
--- a/weixin-java-enterprise/src/main/java/me/chanjar/weixin/enterprise/bean/WxXmlOutTextMessage.java
+++ b/weixin-java-enterprise/src/main/java/me/chanjar/weixin/enterprise/bean/WxCpXmlOutTextMessage.java
@@ -11,13 +11,13 @@ import me.chanjar.weixin.enterprise.util.xml.AdapterCDATA;
 
 @XmlRootElement(name = "xml")
 @XmlAccessorType(XmlAccessType.FIELD)
-public class WxXmlOutTextMessage extends WxXmlOutMessage {
+public class WxCpXmlOutTextMessage extends WxCpXmlOutMessage {
   
   @XmlElement(name="Content")
   @XmlJavaTypeAdapter(AdapterCDATA.class)
   private String content;
 
-  public WxXmlOutTextMessage() {
+  public WxCpXmlOutTextMessage() {
     this.msgType = WxConsts.XML_MSG_TEXT;
   }
   
diff --git a/weixin-java-enterprise/src/main/java/me/chanjar/weixin/enterprise/bean/WxXmlOutVideoMessage.java b/weixin-java-enterprise/src/main/java/me/chanjar/weixin/enterprise/bean/WxCpXmlOutVideoMessage.java
similarity index 95%
rename from weixin-java-enterprise/src/main/java/me/chanjar/weixin/enterprise/bean/WxXmlOutVideoMessage.java
rename to weixin-java-enterprise/src/main/java/me/chanjar/weixin/enterprise/bean/WxCpXmlOutVideoMessage.java
index 1c8c46413..8f04206a7 100644
--- a/weixin-java-enterprise/src/main/java/me/chanjar/weixin/enterprise/bean/WxXmlOutVideoMessage.java
+++ b/weixin-java-enterprise/src/main/java/me/chanjar/weixin/enterprise/bean/WxCpXmlOutVideoMessage.java
@@ -11,12 +11,12 @@ import me.chanjar.weixin.enterprise.util.xml.AdapterCDATA;
 
 @XmlRootElement(name = "xml")
 @XmlAccessorType(XmlAccessType.FIELD)
-public class WxXmlOutVideoMessage extends WxXmlOutMessage {
+public class WxCpXmlOutVideoMessage extends WxCpXmlOutMessage {
 
   @XmlElement(name = "Video")
   protected final Video video = new Video();
 
-  public WxXmlOutVideoMessage() {
+  public WxCpXmlOutVideoMessage() {
     this.msgType = WxConsts.XML_MSG_VIDEO;
   }
 
diff --git a/weixin-java-enterprise/src/main/java/me/chanjar/weixin/enterprise/bean/WxXmlOutVoiceMessage.java b/weixin-java-enterprise/src/main/java/me/chanjar/weixin/enterprise/bean/WxCpXmlOutVoiceMessage.java
similarity index 88%
rename from weixin-java-enterprise/src/main/java/me/chanjar/weixin/enterprise/bean/WxXmlOutVoiceMessage.java
rename to weixin-java-enterprise/src/main/java/me/chanjar/weixin/enterprise/bean/WxCpXmlOutVoiceMessage.java
index aa2b6d0d0..29db6a36d 100644
--- a/weixin-java-enterprise/src/main/java/me/chanjar/weixin/enterprise/bean/WxXmlOutVoiceMessage.java
+++ b/weixin-java-enterprise/src/main/java/me/chanjar/weixin/enterprise/bean/WxCpXmlOutVoiceMessage.java
@@ -11,13 +11,13 @@ import me.chanjar.weixin.enterprise.util.xml.MediaIdMarshaller;
 
 @XmlRootElement(name = "xml")
 @XmlAccessorType(XmlAccessType.FIELD)
-public class WxXmlOutVoiceMessage extends WxXmlOutMessage {
+public class WxCpXmlOutVoiceMessage extends WxCpXmlOutMessage {
   
   @XmlElement(name="Voice")
   @XmlJavaTypeAdapter(MediaIdMarshaller.class)
   private String mediaId;
 
-  public WxXmlOutVoiceMessage() {
+  public WxCpXmlOutVoiceMessage() {
     this.msgType = WxConsts.XML_MSG_VOICE;
   }
   
diff --git a/weixin-java-enterprise/src/main/java/me/chanjar/weixin/enterprise/bean/outxmlbuilder/BaseBuilder.java b/weixin-java-enterprise/src/main/java/me/chanjar/weixin/enterprise/bean/outxmlbuilder/BaseBuilder.java
index cba5e1ef5..8498fa0e8 100644
--- a/weixin-java-enterprise/src/main/java/me/chanjar/weixin/enterprise/bean/outxmlbuilder/BaseBuilder.java
+++ b/weixin-java-enterprise/src/main/java/me/chanjar/weixin/enterprise/bean/outxmlbuilder/BaseBuilder.java
@@ -1,6 +1,6 @@
 package me.chanjar.weixin.enterprise.bean.outxmlbuilder;
 
-import me.chanjar.weixin.enterprise.bean.WxXmlOutMessage;
+import me.chanjar.weixin.enterprise.bean.WxCpXmlOutMessage;
 
 public abstract class BaseBuilder {
   
@@ -20,7 +20,7 @@ public abstract class BaseBuilder {
 
   public abstract ValueType build();
   
-  public void setCommon(WxXmlOutMessage m) {
+  public void setCommon(WxCpXmlOutMessage m) {
     m.setToUserName(this.toUserName);
     m.setFromUserName(this.fromUserName);
     m.setCreateTime(System.currentTimeMillis() / 1000l);
diff --git a/weixin-java-enterprise/src/main/java/me/chanjar/weixin/enterprise/bean/outxmlbuilder/ImageBuilder.java b/weixin-java-enterprise/src/main/java/me/chanjar/weixin/enterprise/bean/outxmlbuilder/ImageBuilder.java
index 7a7497a00..4ffb3423a 100644
--- a/weixin-java-enterprise/src/main/java/me/chanjar/weixin/enterprise/bean/outxmlbuilder/ImageBuilder.java
+++ b/weixin-java-enterprise/src/main/java/me/chanjar/weixin/enterprise/bean/outxmlbuilder/ImageBuilder.java
@@ -1,12 +1,12 @@
 package me.chanjar.weixin.enterprise.bean.outxmlbuilder;
 
-import me.chanjar.weixin.enterprise.bean.WxXmlOutImageMessage;
+import me.chanjar.weixin.enterprise.bean.WxCpXmlOutImageMessage;
 
 /**
  * 图片消息builder
  * @author Daniel Qian
  */
-public final class ImageBuilder extends BaseBuilder {
+public final class ImageBuilder extends BaseBuilder {
 
   private String mediaId;
 
@@ -15,8 +15,8 @@ public final class ImageBuilder extends BaseBuilder {
+public final class MusicBuilder extends BaseBuilder {
 
   private String title;
   private String description;
@@ -40,8 +40,8 @@ public final class MusicBuilder extends BaseBuilder {
+public final class NewsBuilder extends BaseBuilder {
 
   protected final List articles = new ArrayList();
   
@@ -19,8 +19,8 @@ public final class NewsBuilder extends BaseBuilder {
+public final class TextBuilder extends BaseBuilder {
   private String content;
 
   public TextBuilder content(String content) {
@@ -15,8 +15,8 @@ public final class TextBuilder extends BaseBuilder {
+public final class VideoBuilder extends BaseBuilder {
 
   private String mediaId;
   private String title;
@@ -26,8 +26,8 @@ public final class VideoBuilder extends BaseBuilder {
+public final class VoiceBuilder extends BaseBuilder {
 
   private String mediaId;
 
@@ -15,8 +15,8 @@ public final class VoiceBuilder extends BaseBuilder context) {
+      public WxCpXmlOutMessage handle(WxCpXmlMessage wxMessage, Map context) {
         return null;
       }
     }).end();
@@ -149,7 +148,7 @@ public class WxCpMessageRouterTest {
     }
 
     @Override
-    public WxXmlOutMessage handle(WxCpXmlMessage wxMessage, Map context) {
+    public WxCpXmlOutMessage handle(WxCpXmlMessage wxMessage, Map context) {
       sb.append(this.echoStr).append(',');
       return null;
     }
diff --git a/weixin-java-enterprise/src/test/java/me/chanjar/weixin/enterprise/bean/WxXmlOutImageMessageTest.java b/weixin-java-enterprise/src/test/java/me/chanjar/weixin/enterprise/bean/WxCpXmlOutImageMessageTest.java
similarity index 82%
rename from weixin-java-enterprise/src/test/java/me/chanjar/weixin/enterprise/bean/WxXmlOutImageMessageTest.java
rename to weixin-java-enterprise/src/test/java/me/chanjar/weixin/enterprise/bean/WxCpXmlOutImageMessageTest.java
index eb0f2f0a9..63c473a4e 100644
--- a/weixin-java-enterprise/src/test/java/me/chanjar/weixin/enterprise/bean/WxXmlOutImageMessageTest.java
+++ b/weixin-java-enterprise/src/test/java/me/chanjar/weixin/enterprise/bean/WxCpXmlOutImageMessageTest.java
@@ -1,15 +1,13 @@
 package me.chanjar.weixin.enterprise.bean;
 
-import me.chanjar.weixin.enterprise.bean.WxXmlOutImageMessage;
-import me.chanjar.weixin.enterprise.bean.WxXmlOutMessage;
 import org.testng.Assert;
 import org.testng.annotations.Test;
 
 @Test
-public class WxXmlOutImageMessageTest {
+public class WxCpXmlOutImageMessageTest {
 
   public void test() {
-    WxXmlOutImageMessage m = new WxXmlOutImageMessage();
+    WxCpXmlOutImageMessage m = new WxCpXmlOutImageMessage();
     m.setMediaId("ddfefesfsdfef");
     m.setCreateTime(1122l);
     m.setFromUserName("from");
@@ -28,7 +26,7 @@ public class WxXmlOutImageMessageTest {
   }
   
   public void testBuild() {
-    WxXmlOutImageMessage m = WxXmlOutMessage.IMAGE().mediaId("ddfefesfsdfef").fromUser("from").toUser("to").build();
+    WxCpXmlOutImageMessage m = WxCpXmlOutMessage.IMAGE().mediaId("ddfefesfsdfef").fromUser("from").toUser("to").build();
     String expected = "" 
         + ""
         + ""
diff --git a/weixin-java-enterprise/src/test/java/me/chanjar/weixin/enterprise/bean/WxXmlOutMusicMessageTest.java b/weixin-java-enterprise/src/test/java/me/chanjar/weixin/enterprise/bean/WxCpXmlOutMusicMessageTest.java
similarity index 90%
rename from weixin-java-enterprise/src/test/java/me/chanjar/weixin/enterprise/bean/WxXmlOutMusicMessageTest.java
rename to weixin-java-enterprise/src/test/java/me/chanjar/weixin/enterprise/bean/WxCpXmlOutMusicMessageTest.java
index 0a135e186..f14ecda19 100644
--- a/weixin-java-enterprise/src/test/java/me/chanjar/weixin/enterprise/bean/WxXmlOutMusicMessageTest.java
+++ b/weixin-java-enterprise/src/test/java/me/chanjar/weixin/enterprise/bean/WxCpXmlOutMusicMessageTest.java
@@ -1,15 +1,13 @@
 package me.chanjar.weixin.enterprise.bean;
 
-import me.chanjar.weixin.enterprise.bean.WxXmlOutMessage;
-import me.chanjar.weixin.enterprise.bean.WxXmlOutMusicMessage;
 import org.testng.Assert;
 import org.testng.annotations.Test;
 
 @Test
-public class WxXmlOutMusicMessageTest {
+public class WxCpXmlOutMusicMessageTest {
 
   public void test() {
-    WxXmlOutMusicMessage m = new WxXmlOutMusicMessage();
+    WxCpXmlOutMusicMessage m = new WxCpXmlOutMusicMessage();
     m.setTitle("title");
     m.setDescription("ddfff");
     m.setHqMusicUrl("hQMusicUrl");
@@ -38,7 +36,7 @@ public class WxXmlOutMusicMessageTest {
   }
   
   public void testBuild() {
-    WxXmlOutMusicMessage m = WxXmlOutMessage.MUSIC()
+    WxCpXmlOutMusicMessage m = WxCpXmlOutMessage.MUSIC()
           .fromUser("fromUser")
           .toUser("toUser")
           .title("title")
diff --git a/weixin-java-enterprise/src/test/java/me/chanjar/weixin/enterprise/bean/WxXmlOutNewsMessageTest.java b/weixin-java-enterprise/src/test/java/me/chanjar/weixin/enterprise/bean/WxCpXmlOutNewsMessageTest.java
similarity index 88%
rename from weixin-java-enterprise/src/test/java/me/chanjar/weixin/enterprise/bean/WxXmlOutNewsMessageTest.java
rename to weixin-java-enterprise/src/test/java/me/chanjar/weixin/enterprise/bean/WxCpXmlOutNewsMessageTest.java
index f46ceac63..98e6d0a19 100644
--- a/weixin-java-enterprise/src/test/java/me/chanjar/weixin/enterprise/bean/WxXmlOutNewsMessageTest.java
+++ b/weixin-java-enterprise/src/test/java/me/chanjar/weixin/enterprise/bean/WxCpXmlOutNewsMessageTest.java
@@ -1,20 +1,18 @@
 package me.chanjar.weixin.enterprise.bean;
 
-import me.chanjar.weixin.enterprise.bean.WxXmlOutMessage;
-import me.chanjar.weixin.enterprise.bean.WxXmlOutMewsMessage;
 import org.testng.Assert;
 import org.testng.annotations.Test;
 
 @Test
-public class WxXmlOutNewsMessageTest {
+public class WxCpXmlOutNewsMessageTest {
 
   public void test() {
-    WxXmlOutMewsMessage m = new WxXmlOutMewsMessage();
+    WxCpXmlOutMewsMessage m = new WxCpXmlOutMewsMessage();
     m.setCreateTime(1122l);
     m.setFromUserName("fromUser");
     m.setToUserName("toUser");
     
-    WxXmlOutMewsMessage.Item item = new WxXmlOutMewsMessage.Item();
+    WxCpXmlOutMewsMessage.Item item = new WxCpXmlOutMewsMessage.Item();
     item.setDescription("description");
     item.setPicUrl("picUrl");
     item.setTitle("title");
@@ -48,13 +46,13 @@ public class WxXmlOutNewsMessageTest {
   }
   
   public void testBuild() {
-    WxXmlOutMewsMessage.Item item = new WxXmlOutMewsMessage.Item();
+    WxCpXmlOutMewsMessage.Item item = new WxCpXmlOutMewsMessage.Item();
     item.setDescription("description");
     item.setPicUrl("picUrl");
     item.setTitle("title");
     item.setUrl("url");
     
-    WxXmlOutMewsMessage m = WxXmlOutMessage.NEWS()
+    WxCpXmlOutMewsMessage m = WxCpXmlOutMessage.NEWS()
           .fromUser("fromUser")
           .toUser("toUser")
           .addArticle(item)
diff --git a/weixin-java-enterprise/src/test/java/me/chanjar/weixin/enterprise/bean/WxXmlOutTextMessageTest.java b/weixin-java-enterprise/src/test/java/me/chanjar/weixin/enterprise/bean/WxCpXmlOutTextMessageTest.java
similarity index 82%
rename from weixin-java-enterprise/src/test/java/me/chanjar/weixin/enterprise/bean/WxXmlOutTextMessageTest.java
rename to weixin-java-enterprise/src/test/java/me/chanjar/weixin/enterprise/bean/WxCpXmlOutTextMessageTest.java
index c6c8f92a8..de1710423 100644
--- a/weixin-java-enterprise/src/test/java/me/chanjar/weixin/enterprise/bean/WxXmlOutTextMessageTest.java
+++ b/weixin-java-enterprise/src/test/java/me/chanjar/weixin/enterprise/bean/WxCpXmlOutTextMessageTest.java
@@ -1,15 +1,13 @@
 package me.chanjar.weixin.enterprise.bean;
 
-import me.chanjar.weixin.enterprise.bean.WxXmlOutMessage;
-import me.chanjar.weixin.enterprise.bean.WxXmlOutTextMessage;
 import org.testng.Assert;
 import org.testng.annotations.Test;
 
 @Test
-public class WxXmlOutTextMessageTest {
+public class WxCpXmlOutTextMessageTest {
 
   public void test() {
-    WxXmlOutTextMessage m = new WxXmlOutTextMessage();
+    WxCpXmlOutTextMessage m = new WxCpXmlOutTextMessage();
     m.setContent("content");
     m.setCreateTime(1122l);
     m.setFromUserName("from");
@@ -28,7 +26,7 @@ public class WxXmlOutTextMessageTest {
   }
   
   public void testBuild() {
-    WxXmlOutTextMessage m = WxXmlOutMessage.TEXT().content("content").fromUser("from").toUser("to").build();
+    WxCpXmlOutTextMessage m = WxCpXmlOutMessage.TEXT().content("content").fromUser("from").toUser("to").build();
     String expected = "" 
         + ""
         + ""
diff --git a/weixin-java-enterprise/src/test/java/me/chanjar/weixin/enterprise/bean/WxXmlOutVideoMessageTest.java b/weixin-java-enterprise/src/test/java/me/chanjar/weixin/enterprise/bean/WxCpXmlOutVideoMessageTest.java
similarity index 88%
rename from weixin-java-enterprise/src/test/java/me/chanjar/weixin/enterprise/bean/WxXmlOutVideoMessageTest.java
rename to weixin-java-enterprise/src/test/java/me/chanjar/weixin/enterprise/bean/WxCpXmlOutVideoMessageTest.java
index 4fdb6f36f..c351df5e6 100644
--- a/weixin-java-enterprise/src/test/java/me/chanjar/weixin/enterprise/bean/WxXmlOutVideoMessageTest.java
+++ b/weixin-java-enterprise/src/test/java/me/chanjar/weixin/enterprise/bean/WxCpXmlOutVideoMessageTest.java
@@ -1,15 +1,13 @@
 package me.chanjar.weixin.enterprise.bean;
 
-import me.chanjar.weixin.enterprise.bean.WxXmlOutMessage;
-import me.chanjar.weixin.enterprise.bean.WxXmlOutVideoMessage;
 import org.testng.Assert;
 import org.testng.annotations.Test;
 
 @Test
-public class WxXmlOutVideoMessageTest {
+public class WxCpXmlOutVideoMessageTest {
 
   public void test() {
-    WxXmlOutVideoMessage m = new WxXmlOutVideoMessage();
+    WxCpXmlOutVideoMessage m = new WxCpXmlOutVideoMessage();
     m.setMediaId("media_id");
     m.setTitle("title");
     m.setDescription("ddfff");
@@ -34,7 +32,7 @@ public class WxXmlOutVideoMessageTest {
   }
   
   public void testBuild() {
-    WxXmlOutVideoMessage m = WxXmlOutMessage.VIDEO()
+    WxCpXmlOutVideoMessage m = WxCpXmlOutMessage.VIDEO()
           .mediaId("media_id")
           .fromUser("fromUser")
           .toUser("toUser")
diff --git a/weixin-java-enterprise/src/test/java/me/chanjar/weixin/enterprise/bean/WxXmlOutVoiceMessageTest.java b/weixin-java-enterprise/src/test/java/me/chanjar/weixin/enterprise/bean/WxCpXmlOutVoiceMessageTest.java
similarity index 81%
rename from weixin-java-enterprise/src/test/java/me/chanjar/weixin/enterprise/bean/WxXmlOutVoiceMessageTest.java
rename to weixin-java-enterprise/src/test/java/me/chanjar/weixin/enterprise/bean/WxCpXmlOutVoiceMessageTest.java
index a0da16098..401b844ba 100644
--- a/weixin-java-enterprise/src/test/java/me/chanjar/weixin/enterprise/bean/WxXmlOutVoiceMessageTest.java
+++ b/weixin-java-enterprise/src/test/java/me/chanjar/weixin/enterprise/bean/WxCpXmlOutVoiceMessageTest.java
@@ -1,15 +1,13 @@
 package me.chanjar.weixin.enterprise.bean;
 
-import me.chanjar.weixin.enterprise.bean.WxXmlOutMessage;
-import me.chanjar.weixin.enterprise.bean.WxXmlOutVoiceMessage;
 import org.testng.Assert;
 import org.testng.annotations.Test;
 
 @Test
-public class WxXmlOutVoiceMessageTest {
+public class WxCpXmlOutVoiceMessageTest {
 
   public void test() {
-    WxXmlOutVoiceMessage m = new WxXmlOutVoiceMessage();
+    WxCpXmlOutVoiceMessage m = new WxCpXmlOutVoiceMessage();
     m.setMediaId("ddfefesfsdfef");
     m.setCreateTime(1122l);
     m.setFromUserName("from");
@@ -28,7 +26,7 @@ public class WxXmlOutVoiceMessageTest {
   }
   
   public void testBuild() {
-    WxXmlOutVoiceMessage m = WxXmlOutMessage.VOICE().mediaId("ddfefesfsdfef").fromUser("from").toUser("to").build();
+    WxCpXmlOutVoiceMessage m = WxCpXmlOutMessage.VOICE().mediaId("ddfefesfsdfef").fromUser("from").toUser("to").build();
     String expected = "" 
         + ""
         + ""
diff --git a/weixin-java-enterprise/src/test/java/me/chanjar/weixin/enterprise/demo/WxCpTestServlet.java b/weixin-java-enterprise/src/test/java/me/chanjar/weixin/enterprise/demo/WxCpTestServlet.java
index 3389047c4..31303d13a 100644
--- a/weixin-java-enterprise/src/test/java/me/chanjar/weixin/enterprise/demo/WxCpTestServlet.java
+++ b/weixin-java-enterprise/src/test/java/me/chanjar/weixin/enterprise/demo/WxCpTestServlet.java
@@ -2,10 +2,9 @@ package me.chanjar.weixin.enterprise.demo;
 
 import me.chanjar.weixin.enterprise.api.*;
 import me.chanjar.weixin.enterprise.bean.WxCpXmlMessage;
-import me.chanjar.weixin.enterprise.bean.WxXmlOutMessage;
-import me.chanjar.weixin.enterprise.bean.WxXmlOutTextMessage;
+import me.chanjar.weixin.enterprise.bean.WxCpXmlOutMessage;
+import me.chanjar.weixin.enterprise.bean.WxCpXmlOutTextMessage;
 import me.chanjar.weixin.enterprise.util.crypto.WxCryptUtil;
-import org.apache.commons.io.IOUtils;
 import org.apache.commons.lang3.StringUtils;
 
 import javax.servlet.ServletException;
@@ -38,10 +37,13 @@ public class WxCpTestServlet extends HttpServlet {
       wxCpService.setWxCpConfigStorage(config);
 
       WxCpMessageHandler handler = new WxCpMessageHandler() {
-        @Override public WxXmlOutMessage handle(WxCpXmlMessage wxMessage, Map context) {
-          WxXmlOutTextMessage m
-              = WxXmlOutMessage.TEXT().content("测试加密消息").fromUser(wxMessage.getToUserName())
-              .toUser(wxMessage.getFromUserName()).build();
+        @Override public WxCpXmlOutMessage handle(WxCpXmlMessage wxMessage, Map context) {
+          WxCpXmlOutTextMessage m = WxCpXmlOutMessage
+                  .TEXT()
+                  .content("测试加密消息")
+                  .fromUser(wxMessage.getToUserName())
+                  .toUser(wxMessage.getFromUserName())
+              .build();
           return m;
         }
       };
@@ -85,8 +87,11 @@ public class WxCpTestServlet extends HttpServlet {
 
     WxCpXmlMessage inMessage = WxCpXmlMessage.fromEncryptedXml(request.getInputStream(), wxCpConfigStorage, timestamp, nonce, msgSignature);
 
-//    WxXmlOutMessage outMessage = wxCpMessageRouter.route(inMessage);
+    WxCpXmlOutMessage outMessage = wxCpMessageRouter.route(inMessage);
 
+    if (outMessage != null) {
+      response.getWriter().write(outMessage.toEncryptedXml(wxCpConfigStorage));
+    }
 
     return;
   }