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"
+ + ""
+ + ""
+ + ""
+ + ""
+ + ""
+ + ""
+ + ""
+ + "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;