From bf0529412248285e7fa320ddad49ef1970f4ac91 Mon Sep 17 00:00:00 2001 From: Daniel Qian Date: Mon, 1 Dec 2014 16:43:29 +0800 Subject: [PATCH 01/11] update version --- pom.xml | 2 +- weixin-java-common/pom.xml | 2 +- weixin-java-cp/pom.xml | 2 +- weixin-java-mp/pom.xml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/pom.xml b/pom.xml index 96267689..6346e85c 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ 4.0.0 me.chanjar weixin-java-parent - 1.0.5 + 1.0.6-SNAPSHOT pom WeiXin Java Tools - Parent 微信公众号、企业号上级POM diff --git a/weixin-java-common/pom.xml b/weixin-java-common/pom.xml index a1365add..50c905c0 100644 --- a/weixin-java-common/pom.xml +++ b/weixin-java-common/pom.xml @@ -6,7 +6,7 @@ me.chanjar weixin-java-parent - 1.0.5 + 1.0.6-SNAPSHOT weixin-java-common diff --git a/weixin-java-cp/pom.xml b/weixin-java-cp/pom.xml index e0f1d49a..bb7d1df0 100644 --- a/weixin-java-cp/pom.xml +++ b/weixin-java-cp/pom.xml @@ -6,7 +6,7 @@ me.chanjar weixin-java-parent - 1.0.5 + 1.0.6-SNAPSHOT weixin-java-cp diff --git a/weixin-java-mp/pom.xml b/weixin-java-mp/pom.xml index f91e8291..e234fba4 100644 --- a/weixin-java-mp/pom.xml +++ b/weixin-java-mp/pom.xml @@ -6,7 +6,7 @@ me.chanjar weixin-java-parent - 1.0.5 + 1.0.6-SNAPSHOT weixin-java-mp WeiXin Java Tools - MP From e7b184286c8b35ca3925b159ffb263a507cb16d6 Mon Sep 17 00:00:00 2001 From: Daniel Qian Date: Mon, 1 Dec 2014 16:55:03 +0800 Subject: [PATCH 02/11] modify readme --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 9b435d6b..138e4670 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,7 @@ weixin-java-tools me.chanjar weixin-java-mp - 1.0.5 + 1.0.6 ``` @@ -29,7 +29,7 @@ weixin-java-tools me.chanjar weixin-java-cp - 1.0.5 + 1.0.6 ``` From 24b1e9b4eb5dfd96389dcaf8f41ea6751a6a19d6 Mon Sep 17 00:00:00 2001 From: Daniel Qian Date: Mon, 1 Dec 2014 22:00:09 +0800 Subject: [PATCH 03/11] =?UTF-8?q?issue=20#47=20rule=E7=9A=84reEnter?= =?UTF-8?q?=E5=88=A4=E6=96=AD=E6=97=B6=E6=9C=BA=E8=BF=87=E8=BF=9F=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/me/chanjar/weixin/cp/api/WxCpMessageRouter.java | 6 +++--- .../java/me/chanjar/weixin/mp/api/WxMpMessageRouter.java | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) 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 5d5828e5..897702ac 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 @@ -77,6 +77,9 @@ public class WxCpMessageRouter { for (final Rule rule : rules) { if (rule.test(wxMessage)) { matchRules.add(rule); + if(!rule.reEnter) { + break; + } } } @@ -91,9 +94,6 @@ public class WxCpMessageRouter { public void run() { for (final Rule rule : matchRules) { rule.service(wxMessage); - if (!rule.reEnter) { - break; - } } } }); 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 07451d6f..f4122fdc 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 @@ -77,6 +77,9 @@ public class WxMpMessageRouter { for (final Rule rule : rules) { if (rule.test(wxMessage)) { matchRules.add(rule); + if(!rule.reEnter) { + break; + } } } @@ -91,9 +94,6 @@ public class WxMpMessageRouter { public void run() { for (final Rule rule : matchRules) { rule.service(wxMessage); - if (!rule.reEnter) { - break; - } } } }); From f4dc81066f1aea1b190a6c8d42ab20ccd34f4443 Mon Sep 17 00:00:00 2001 From: Daniel Qian Date: Mon, 8 Dec 2014 09:17:14 +0800 Subject: [PATCH 04/11] =?UTF-8?q?issue=20#51=20=E5=8F=91=E9=80=81=E6=A8=A1?= =?UTF-8?q?=E6=9D=BF=E6=B6=88=E6=81=AF=E9=9C=80=E8=A6=81=E8=BF=94=E5=9B=9E?= =?UTF-8?q?=20=E8=8E=B7=E5=BE=97=E7=9A=84messageid?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/me/chanjar/weixin/mp/api/WxMpService.java | 3 ++- .../main/java/me/chanjar/weixin/mp/api/WxMpServiceImpl.java | 6 ++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpService.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpService.java index 8fc70e8e..a6ac3c43 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpService.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpService.java @@ -315,8 +315,9 @@ public interface WxMpService { * * @param templateMessage * @throws WxErrorException + * @return msgid */ - public void templateSend(WxMpTemplateMessage templateMessage) throws WxErrorException; + public String templateSend(WxMpTemplateMessage templateMessage) throws WxErrorException; /** *
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpServiceImpl.java
index 93686ef6..dbf2adc4 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpServiceImpl.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpServiceImpl.java
@@ -286,9 +286,11 @@ public class WxMpServiceImpl implements WxMpService {
     return tmpJsonElement.getAsJsonObject().get("short_url").getAsString();
   }
 
-  public void templateSend(WxMpTemplateMessage templateMessage) throws WxErrorException {
+  public String templateSend(WxMpTemplateMessage templateMessage) throws WxErrorException {
     String url = "https://api.weixin.qq.com/cgi-bin/message/template/send";
-    execute(new SimplePostRequestExecutor(), url, templateMessage.toJson());
+    String responseContent = execute(new SimplePostRequestExecutor(), url, templateMessage.toJson());
+    JsonElement tmpJsonElement = Streams.parse(new JsonReader(new StringReader(responseContent)));
+    return tmpJsonElement.getAsJsonObject().get("msgid").getAsString();
   }
 
   public WxMpSemanticQueryResult semanticQuery(WxMpSemanticQuery semanticQuery) throws WxErrorException {

From c5b9d568e50080074a83042b6bfc5d92afb5d4b4 Mon Sep 17 00:00:00 2001
From: Daniel Qian 
Date: Tue, 9 Dec 2014 12:10:19 +0800
Subject: [PATCH 05/11] =?UTF-8?q?issue=20#47=20=E5=90=8C=E6=AD=A5=E8=A7=84?=
 =?UTF-8?q?=E5=88=99=E5=90=8C=E6=AD=A5=E6=89=A7=E8=A1=8C=EF=BC=8C=E5=BC=82?=
 =?UTF-8?q?=E6=AD=A5=E8=A7=84=E5=88=99=E5=BC=82=E6=AD=A5=E6=89=A7=E8=A1=8C?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../weixin/cp/api/WxCpMessageRouter.java      | 26 +++++++------------
 .../weixin/mp/api/WxMpMessageRouter.java      | 26 +++++++------------
 2 files changed, 18 insertions(+), 34 deletions(-)

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 897702ac..bf5bf86e 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
@@ -87,25 +87,17 @@ public class WxCpMessageRouter {
       return null;
     }
 
-    if (matchRules.get(0).async) {
-      // 只要第一个是异步的,那就异步执行
-      // 在另一个线程里执行
-      executorService.submit(new Runnable() {
-        public void run() {
-          for (final Rule rule : matchRules) {
-            rule.service(wxMessage);
-          }
-        }
-      });
-      return null;
-    }
-
     WxCpXmlOutMessage res = null;
     for (final Rule rule : matchRules) {
-      // 返回最后一个匹配规则的结果
-      res = rule.service(wxMessage);
-      if (!rule.reEnter) {
-        break;
+      // 返回最后一个非异步的rule的执行结果
+      if(rule.async) {
+        executorService.submit(new Runnable() {
+          public void run() {
+            rule.service(wxMessage);
+          }
+        });
+      } else {
+        res = rule.service(wxMessage);
       }
     }
     return res;
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 f4122fdc..e904e41b 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
@@ -87,25 +87,17 @@ public class WxMpMessageRouter {
       return null;
     }
     
-    if (matchRules.get(0).async) {
-      // 只要第一个是异步的,那就异步执行
-      // 在另一个线程里执行
-      executorService.execute(new Runnable() {
-        public void run() {
-          for (final Rule rule : matchRules) {
-            rule.service(wxMessage);
-          }
-        }
-      });
-      return null;
-    }
-    
     WxMpXmlOutMessage res = null;
     for (final Rule rule : matchRules) {
-      // 返回最后一个匹配规则的结果
-      res = rule.service(wxMessage);
-      if (!rule.reEnter) {
-        break;
+      // 返回最后一个非异步的rule的执行结果
+      if(rule.async) {
+        executorService.submit(new Runnable() {
+          public void run() {
+            rule.service(wxMessage);
+          }
+        });
+      } else {
+        res = rule.service(wxMessage);
       }
     }
     return res;

From 28312a71a057f88180325241f236f2225b9b2339 Mon Sep 17 00:00:00 2001
From: Daniel Qian 
Date: Mon, 15 Dec 2014 09:03:14 +0800
Subject: [PATCH 06/11] =?UTF-8?q?issue=20#54=20=E4=BC=81=E4=B8=9A=E5=8F=B7?=
 =?UTF-8?q?oauth2=E8=8E=B7=E5=BE=97=E7=94=A8=E6=88=B7=E4=BF=A1=E6=81=AFurl?=
 =?UTF-8?q?=E6=8B=BC=E6=8E=A5=E9=94=99=E8=AF=AF?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../src/main/java/me/chanjar/weixin/cp/api/WxCpServiceImpl.java | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpServiceImpl.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpServiceImpl.java
index c83d4b55..2e0738c7 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpServiceImpl.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpServiceImpl.java
@@ -335,7 +335,7 @@ public class WxCpServiceImpl implements WxCpService {
     String url = "https://qyapi.weixin.qq.com/cgi-bin/user/getuserinfo?";
     url += "access_token=" + wxCpConfigStorage.getAccessToken();
     url += "&code=" + code;
-    url += "agendid=" + wxCpConfigStorage.getAgentId();
+    url += "&agendid=" + wxCpConfigStorage.getAgentId();
 
     try {
       RequestExecutor executor = new SimpleGetRequestExecutor();

From c6b5ce63e90a7d427c37385c79b516ab45f06913 Mon Sep 17 00:00:00 2001
From: Daniel Qian 
Date: Fri, 19 Dec 2014 12:14:03 +0800
Subject: [PATCH 07/11] =?UTF-8?q?fix=20#53=20=E6=A8=A1=E6=9D=BF=20?=
 =?UTF-8?q?=E6=B6=88=E6=81=AF=E5=8F=91=E9=80=81=E5=90=8E=EF=BC=8C=E5=BE=AE?=
 =?UTF-8?q?=E4=BF=A1=E6=9C=8D=E5=8A=A1=E6=8E=A8=E9=80=81=E7=9A=84=E5=8F=91?=
 =?UTF-8?q?=E9=80=81=E7=8A=B6=E6=80=81=E7=9A=84xml=E7=BB=93=E6=9E=84?=
 =?UTF-8?q?=E4=BF=A1=E6=81=AF=E5=86=85=E7=9A=84msgID=20=E6=B2=A1=E6=9C=89?=
 =?UTF-8?q?=E8=A2=ABWxMpXmlMessage=20=E8=AF=86=E5=88=AB?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../main/java/me/chanjar/weixin/mp/bean/WxMpXmlMessage.java | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlMessage.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlMessage.java
index 8ed9e567..d50bd899 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlMessage.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlMessage.java
@@ -381,6 +381,8 @@ public class WxMpXmlMessage {
 
   public static WxMpXmlMessage fromXml(String xml) {
     try {
+      // 操蛋的微信,模板消息推送成功的消息是MsgID,其他消息推送过来是MsgId
+      xml = xml.replaceAll("", "").replaceAll("", "");
       return XmlTransformer.fromXml(WxMpXmlMessage.class, xml);
     } catch (JAXBException e) {
       throw new RuntimeException(e);
@@ -389,8 +391,8 @@ public class WxMpXmlMessage {
 
   public static WxMpXmlMessage fromXml(InputStream is) {
     try {
-      return XmlTransformer.fromXml(WxMpXmlMessage.class, is);
-    } catch (JAXBException e) {
+      return fromXml(IOUtils.toString(is, "UTF-8"));
+    } catch (IOException e) {
       throw new RuntimeException(e);
     }
   }

From b47cd3a18a9951210f0afbb2f41c9d78830b6170 Mon Sep 17 00:00:00 2001
From: Daniel Qian 
Date: Fri, 19 Dec 2014 12:20:41 +0800
Subject: [PATCH 08/11] =?UTF-8?q?fix=20#56=20=E5=88=86=E7=BB=84=E7=BE=A4?=
 =?UTF-8?q?=E5=8F=91=E6=B6=88=E6=81=AF=E6=B2=A1=E6=9C=89=20is=5Fto=5Fall?=
 =?UTF-8?q?=20=E5=AD=97=E6=AE=B5?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../chanjar/weixin/mp/bean/WxMpMassGroupMessage.java   | 10 +++++++---
 .../chanjar/weixin/mp/util/json/WxMpGsonBuilder.java   |  2 +-
 ...apter.java => WxMpMassGroupMessageGsonAdapter.java} |  9 +++++++--
 3 files changed, 15 insertions(+), 6 deletions(-)
 rename weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/{WxMpMassMessageGsonAdapter.java => WxMpMassGroupMessageGsonAdapter.java} (88%)

diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpMassGroupMessage.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpMassGroupMessage.java
index c8e859c0..aa79c43f 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpMassGroupMessage.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpMassGroupMessage.java
@@ -9,7 +9,7 @@ import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
  */
 public class WxMpMassGroupMessage {
   
-  private long groupId;
+  private Long groupId;
   private String msgtype;
   private String content;
   private String mediaId;
@@ -58,11 +58,15 @@ public class WxMpMassGroupMessage {
     return WxMpGsonBuilder.INSTANCE.create().toJson(this);
   }
 
-  public long getGroupId() {
+  public Long getGroupId() {
     return groupId;
   }
 
-  public void setGroupId(long groupId) {
+  /**
+   * 如果不设置则就意味着发给所有用户
+   * @param groupId
+   */
+  public void setGroupId(Long groupId) {
     this.groupId = groupId;
   }
 
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpGsonBuilder.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpGsonBuilder.java
index 2849a796..40854843 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpGsonBuilder.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpGsonBuilder.java
@@ -14,7 +14,7 @@ public class WxMpGsonBuilder {
     INSTANCE.disableHtmlEscaping();
     INSTANCE.registerTypeAdapter(WxMpCustomMessage.class, new WxMpCustomMessageGsonAdapter());
     INSTANCE.registerTypeAdapter(WxMpMassNews.class, new WxMpMassNewsGsonAdapter());
-    INSTANCE.registerTypeAdapter(WxMpMassGroupMessage.class, new WxMpMassMessageGsonAdapter());
+    INSTANCE.registerTypeAdapter(WxMpMassGroupMessage.class, new WxMpMassGroupMessageGsonAdapter());
     INSTANCE.registerTypeAdapter(WxMpMassOpenIdsMessage.class, new WxMpMassOpenIdsMessageGsonAdapter());
     INSTANCE.registerTypeAdapter(WxMpGroup.class, new WxMpGroupGsonAdapter());
     INSTANCE.registerTypeAdapter(WxMpUser.class, new WxUserGsonAdapter());
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpMassMessageGsonAdapter.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpMassGroupMessageGsonAdapter.java
similarity index 88%
rename from weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpMassMessageGsonAdapter.java
rename to weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpMassGroupMessageGsonAdapter.java
index 5b9a9845..a0077469 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpMassMessageGsonAdapter.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpMassGroupMessageGsonAdapter.java
@@ -22,13 +22,18 @@ import java.lang.reflect.Type;
  * @author qianjia
  *
  */
-public class WxMpMassMessageGsonAdapter implements JsonSerializer {
+public class WxMpMassGroupMessageGsonAdapter implements JsonSerializer {
 
   public JsonElement serialize(WxMpMassGroupMessage message, Type typeOfSrc, JsonSerializationContext context) {
     JsonObject messageJson = new JsonObject();
     
     JsonObject filter = new JsonObject();
-    filter.addProperty("group_id", message.getGroupId());
+    if(null == message.getGroupId()) {
+      filter.addProperty("is_to_all", true);
+    } else {
+      filter.addProperty("is_to_all", false);
+      filter.addProperty("group_id", message.getGroupId());
+    }
     messageJson.add("filter", filter);
     
     if (WxConsts.MASS_MSG_NEWS.equals(message.getMsgtype())) {

From 75ca8241e75bf6a680312df16390d17ca13b6c22 Mon Sep 17 00:00:00 2001
From: Daniel Qian 
Date: Wed, 24 Dec 2014 13:55:19 +0800
Subject: [PATCH 09/11] close #53

---
 .../weixin/mp/bean/WxMpXmlMessage.java        |  2 +-
 .../weixin/mp/bean/WxMpXmlMessageTest.java    | 83 ++++++++++++++++++-
 2 files changed, 83 insertions(+), 2 deletions(-)

diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlMessage.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlMessage.java
index d50bd899..2470aff4 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlMessage.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlMessage.java
@@ -382,7 +382,7 @@ public class WxMpXmlMessage {
   public static WxMpXmlMessage fromXml(String xml) {
     try {
       // 操蛋的微信,模板消息推送成功的消息是MsgID,其他消息推送过来是MsgId
-      xml = xml.replaceAll("", "").replaceAll("", "");
+      xml = xml.replaceAll("", "").replaceAll("", "");
       return XmlTransformer.fromXml(WxMpXmlMessage.class, xml);
     } catch (JAXBException e) {
       throw new RuntimeException(e);
diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/WxMpXmlMessageTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/WxMpXmlMessageTest.java
index 346681cb..3885ec32 100644
--- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/WxMpXmlMessageTest.java
+++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/WxMpXmlMessageTest.java
@@ -87,5 +87,86 @@ public class WxMpXmlMessageTest {
     Assert.assertEquals(wxMessage.getSendLocationInfo().getLabel(), " 广州市海珠区客村艺苑路 106号");
     Assert.assertEquals(wxMessage.getSendLocationInfo().getPoiname(), "wo de poi");
   }
-  
+
+  public void testFromXml2() {
+
+    String xml = ""
+        + ""
+        + " "
+        + "1348831860"
+        + ""
+        + ""
+        + "1234567890123456"
+        + ""
+        + ""
+        + ""
+        + ""
+        + "23.134521"
+        + "113.358803"
+        + "20"
+        + ""
+        + ""
+        + ""
+        + "<![CDATA[公众平台官网链接]]>"
+        + ""
+        + ""
+        + ""
+        + "23.137466"
+        + "113.352425"
+        + "119.385040"
+        + ""
+        + " "
+        + " "
+        + ""
+        + ""
+        + " 1\n"
+        + " "
+        + "  "
+        + "   "
+        + "  "
+        + " "
+        + ""
+        + ""
+        + "  \n"
+        + "  \n"
+        + "  \n"
+        + "  \n"
+        + "  \n"
+        + ""
+        + "";
+    WxMpXmlMessage wxMessage = WxMpXmlMessage.fromXml(xml);
+    Assert.assertEquals(wxMessage.getToUserName(), "toUser");
+    Assert.assertEquals(wxMessage.getFromUserName(), "fromUser");
+    Assert.assertEquals(wxMessage.getCreateTime(), new Long(1348831860l));
+    Assert.assertEquals(wxMessage.getMsgType(), WxConsts.XML_MSG_TEXT);
+    Assert.assertEquals(wxMessage.getContent(), "this is a test");
+    Assert.assertEquals(wxMessage.getMsgId(), new Long(1234567890123456l));
+    Assert.assertEquals(wxMessage.getPicUrl(), "this is a url");
+    Assert.assertEquals(wxMessage.getMediaId(), "media_id");
+    Assert.assertEquals(wxMessage.getFormat(), "Format");
+    Assert.assertEquals(wxMessage.getThumbMediaId(), "thumb_media_id");
+    Assert.assertEquals(wxMessage.getLocationX(), new Double(23.134521d));
+    Assert.assertEquals(wxMessage.getLocationY(), new Double(113.358803d));
+    Assert.assertEquals(wxMessage.getScale(), new Double(20));
+    Assert.assertEquals(wxMessage.getLabel(), "位置信息");
+    Assert.assertEquals(wxMessage.getDescription(), "公众平台官网链接");
+    Assert.assertEquals(wxMessage.getUrl(), "url");
+    Assert.assertEquals(wxMessage.getTitle(), "公众平台官网链接");
+    Assert.assertEquals(wxMessage.getEvent(), "subscribe");
+    Assert.assertEquals(wxMessage.getEventKey(), "qrscene_123123");
+    Assert.assertEquals(wxMessage.getTicket(), "TICKET");
+    Assert.assertEquals(wxMessage.getLatitude(), new Double(23.137466));
+    Assert.assertEquals(wxMessage.getLongitude(), new Double(113.352425));
+    Assert.assertEquals(wxMessage.getPrecision(), new Double(119.385040));
+    Assert.assertEquals(wxMessage.getScanCodeInfo().getScanType(), "qrcode");
+    Assert.assertEquals(wxMessage.getScanCodeInfo().getScanResult(), "1");
+    Assert.assertEquals(wxMessage.getSendPicsInfo().getCount(), new Long(1l));
+    Assert.assertEquals(wxMessage.getSendPicsInfo().getPicList().get(0).getPicMd5Sum(), "1b5f7c23b5bf75682a53e7b6d163e185");
+    Assert.assertEquals(wxMessage.getSendLocationInfo().getLocationX(), "23");
+    Assert.assertEquals(wxMessage.getSendLocationInfo().getLocationY(), "113");
+    Assert.assertEquals(wxMessage.getSendLocationInfo().getScale(), "15");
+    Assert.assertEquals(wxMessage.getSendLocationInfo().getLabel(), " 广州市海珠区客村艺苑路 106号");
+    Assert.assertEquals(wxMessage.getSendLocationInfo().getPoiname(), "wo de poi");
+  }
+
 }

From 295a4561901f681aff18876b73ac43409dbf0c34 Mon Sep 17 00:00:00 2001
From: Daniel Qian 
Date: Tue, 30 Dec 2014 09:37:38 +0800
Subject: [PATCH 10/11] =?UTF-8?q?=E5=8E=9F=E6=9D=A5=E7=9A=84=E7=B1=BB?=
 =?UTF-8?q?=E5=90=8D=E5=86=99=E9=94=99=E4=BA=86?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../test/java/me/chanjar/weixin/mp/demo/WxMpDemoServer.java   | 2 +-
 .../{WxMpEndpointServlt.java => WxMpEndpointServlet.java}     | 4 ++--
 2 files changed, 3 insertions(+), 3 deletions(-)
 rename weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/{WxMpEndpointServlt.java => WxMpEndpointServlet.java} (95%)

diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/WxMpDemoServer.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/WxMpDemoServer.java
index 0d7b126d..8fc8008f 100644
--- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/WxMpDemoServer.java
+++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/WxMpDemoServer.java
@@ -30,7 +30,7 @@ public class WxMpDemoServer {
     ServletHandler servletHandler = new ServletHandler();
     server.setHandler(servletHandler);
 
-    ServletHolder endpointServletHolder = new ServletHolder(new WxMpEndpointServlt(wxMpConfigStorage, wxMpService, wxMpMessageRouter));
+    ServletHolder endpointServletHolder = new ServletHolder(new WxMpEndpointServlet(wxMpConfigStorage, wxMpService, wxMpMessageRouter));
     servletHandler.addServletWithMapping(endpointServletHolder, "/*");
 
     ServletHolder oauthServletHolder = new ServletHolder(new WxMpOAuth2Servlet(wxMpService));
diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/WxMpEndpointServlt.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/WxMpEndpointServlet.java
similarity index 95%
rename from weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/WxMpEndpointServlt.java
rename to weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/WxMpEndpointServlet.java
index c99cd8b3..4a88ede9 100644
--- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/WxMpEndpointServlt.java
+++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/WxMpEndpointServlet.java
@@ -22,13 +22,13 @@ import java.util.Map;
 /**
  * @author Daniel Qian
  */
-public class WxMpEndpointServlt extends HttpServlet {
+public class WxMpEndpointServlet extends HttpServlet {
 
   protected WxMpConfigStorage wxMpConfigStorage;
   protected WxMpService wxMpService;
   protected WxMpMessageRouter wxMpMessageRouter;
 
-  public WxMpEndpointServlt(WxMpConfigStorage wxMpConfigStorage, WxMpService wxMpService,
+  public WxMpEndpointServlet(WxMpConfigStorage wxMpConfigStorage, WxMpService wxMpService,
       WxMpMessageRouter wxMpMessageRouter) {
     this.wxMpConfigStorage = wxMpConfigStorage;
     this.wxMpService = wxMpService;

From 976655386d6a83306274e7887ab132db1adf901e Mon Sep 17 00:00:00 2001
From: Daniel Qian 
Date: Tue, 30 Dec 2014 09:38:40 +0800
Subject: [PATCH 11/11] upgrade to 1.0.6

---
 pom.xml                    | 2 +-
 weixin-java-common/pom.xml | 2 +-
 weixin-java-cp/pom.xml     | 2 +-
 weixin-java-mp/pom.xml     | 2 +-
 4 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/pom.xml b/pom.xml
index 6346e85c..65107a6b 100644
--- a/pom.xml
+++ b/pom.xml
@@ -5,7 +5,7 @@
     4.0.0
     me.chanjar
     weixin-java-parent
-    1.0.6-SNAPSHOT
+    1.0.6
     pom
     WeiXin Java Tools - Parent
     微信公众号、企业号上级POM
diff --git a/weixin-java-common/pom.xml b/weixin-java-common/pom.xml
index 50c905c0..0e14fcae 100644
--- a/weixin-java-common/pom.xml
+++ b/weixin-java-common/pom.xml
@@ -6,7 +6,7 @@
     
         me.chanjar
         weixin-java-parent
-        1.0.6-SNAPSHOT
+        1.0.6
     
 
     weixin-java-common
diff --git a/weixin-java-cp/pom.xml b/weixin-java-cp/pom.xml
index bb7d1df0..2ec3e36a 100644
--- a/weixin-java-cp/pom.xml
+++ b/weixin-java-cp/pom.xml
@@ -6,7 +6,7 @@
     
         me.chanjar
         weixin-java-parent
-        1.0.6-SNAPSHOT
+        1.0.6
     
 
     weixin-java-cp
diff --git a/weixin-java-mp/pom.xml b/weixin-java-mp/pom.xml
index e234fba4..2f757cfa 100644
--- a/weixin-java-mp/pom.xml
+++ b/weixin-java-mp/pom.xml
@@ -6,7 +6,7 @@
     
         me.chanjar
         weixin-java-parent
-        1.0.6-SNAPSHOT
+        1.0.6
     
     weixin-java-mp
     WeiXin Java Tools - MP