diff --git a/README.md b/README.md index 9b435d6b7..138e4670c 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 ``` diff --git a/pom.xml b/pom.xml index 962676894..65107a6bc 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 pom WeiXin Java Tools - Parent 微信公众号、企业号上级POM diff --git a/weixin-java-common/pom.xml b/weixin-java-common/pom.xml index a1365add7..0e14fcaeb 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 weixin-java-common diff --git a/weixin-java-cp/pom.xml b/weixin-java-cp/pom.xml index e0f1d49a4..2ec3e36af 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 weixin-java-cp 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 5d5828e50..bf5bf86e9 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; + } } } @@ -84,28 +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); - if (!rule.reEnter) { - break; - } - } - } - }); - 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-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 c83d4b554..2e0738c72 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(); diff --git a/weixin-java-mp/pom.xml b/weixin-java-mp/pom.xml index f91e82919..2f757cfa2 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 weixin-java-mp WeiXin Java Tools - MP 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 07451d6f1..e904e41b0 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; + } } } @@ -84,28 +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); - if (!rule.reEnter) { - break; - } - } - } - }); - 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; 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 8fc70e8e3..a6ac3c43e 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 93686ef63..dbf2adc40 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 {
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 c8e859c0c..aa79c43f4 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/bean/WxMpXmlMessage.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlMessage.java
index 8ed9e5677..2470aff4e 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);
     }
   }
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 2849a796e..408548430 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 5b9a98453..a00774692 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())) {
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 346681cb5..3885ec32f 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");
+  }
+
 }
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 0d7b126d4..8fc8008f7 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 c99cd8b34..4a88ede9d 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;