diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/api/WxConsts.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/api/WxConsts.java index 9f9724c00..d8029bf01 100644 --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/api/WxConsts.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/api/WxConsts.java @@ -223,6 +223,7 @@ public class WxConsts { public static final String TEXT = "text"; public static final String VOICE = "voice"; public static final String IMAGE = "image"; + public static final String IMAGES = "images"; public static final String MPVIDEO = "mpvideo"; } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpMassOpenIdsMessage.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpMassOpenIdsMessage.java index ce1d77b62..80e1658c1 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpMassOpenIdsMessage.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpMassOpenIdsMessage.java @@ -36,6 +36,10 @@ public class WxMpMassOpenIdsMessage implements Serializable { private String msgType; private String content; private String mediaId; + /** + * 图片列表 + */ + private List mediaIds; /** * 文章被判定为转载时,是否继续进行群发操作。 */ diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpMassTagMessage.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpMassTagMessage.java index 5e0b638e9..598e5754f 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpMassTagMessage.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpMassTagMessage.java @@ -5,6 +5,7 @@ import me.chanjar.weixin.common.api.WxConsts; import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; import java.io.Serializable; +import java.util.List; /** * 按标签群发的消息. @@ -34,6 +35,10 @@ public class WxMpMassTagMessage implements Serializable { private String msgType; private String content; private String mediaId; + /** + * 图片列表 + */ + private List mediaIds; /** * 是否群发给所有用户. */ diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpMassOpenIdsMessageGsonAdapter.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpMassOpenIdsMessageGsonAdapter.java index 10b1b7271..d8f318494 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpMassOpenIdsMessageGsonAdapter.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpMassOpenIdsMessageGsonAdapter.java @@ -1,11 +1,13 @@ package me.chanjar.weixin.mp.util.json; import com.google.gson.*; + import me.chanjar.weixin.common.api.WxConsts; import me.chanjar.weixin.mp.bean.WxMpMassOpenIdsMessage; import org.apache.commons.lang3.StringUtils; import java.lang.reflect.Type; +import java.util.List; /** * @author someone @@ -39,8 +41,17 @@ public class WxMpMassOpenIdsMessageGsonAdapter implements JsonSerializer mediaIds = message.getMediaIds(); + if (mediaIds != null && !mediaIds.isEmpty() ) { + JsonArray json = new JsonArray(); + mediaIds.forEach(json::add); + sub.add("media_ids", json); + messageJson.add(WxConsts.MassMsgType.IMAGES, sub); + } else { + String mediaId = message.getMediaId(); + sub.addProperty("media_id", mediaId); + messageJson.add(WxConsts.MassMsgType.IMAGE, sub); + } } if (WxConsts.MassMsgType.MPVIDEO.equals(message.getMsgType())) { JsonObject sub = new JsonObject(); @@ -64,4 +75,7 @@ public class WxMpMassOpenIdsMessageGsonAdapter implements JsonSerializer mediaIds = message.getMediaIds(); + if (mediaIds != null && !mediaIds.isEmpty() ) { + JsonArray json = new JsonArray(); + mediaIds.forEach(json::add); + sub.add("media_ids", json); + messageJson.add(WxConsts.MassMsgType.IMAGES, sub); + } else { + String mediaId = message.getMediaId(); + sub.addProperty("media_id", mediaId); + messageJson.add(WxConsts.MassMsgType.IMAGE, sub); + } } if (WxConsts.MassMsgType.MPVIDEO.equals(message.getMsgType())) { JsonObject sub = new JsonObject(); diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpMassMessageServiceImplTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpMassMessageServiceImplTest.java index b31cc748e..4c8b1b670 100644 --- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpMassMessageServiceImplTest.java +++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpMassMessageServiceImplTest.java @@ -1,6 +1,7 @@ package me.chanjar.weixin.mp.api.impl; import com.google.inject.Inject; + import me.chanjar.weixin.common.api.WxConsts; import me.chanjar.weixin.common.bean.result.WxMediaUploadResult; import me.chanjar.weixin.common.error.WxErrorException; @@ -21,6 +22,8 @@ import org.testng.annotations.Test; import java.io.IOException; import java.io.InputStream; +import java.util.ArrayList; +import java.util.List; import static org.testng.Assert.assertNotNull; @@ -38,7 +41,7 @@ public class WxMpMassMessageServiceImplTest { @Test public void testTextMassOpenIdsMessageSend() throws WxErrorException { // 发送群发消息 - TestConfigStorage configProvider = (TestConfigStorage) this.wxService .getWxMpConfigStorage(); + TestConfigStorage configProvider = (TestConfigStorage) this.wxService.getWxMpConfigStorage(); WxMpMassOpenIdsMessage massMessage = new WxMpMassOpenIdsMessage(); massMessage.setMsgType(WxConsts.MassMsgType.TEXT); massMessage.setContent("测试群发消息\n欢迎欢迎\n换行测试\n超链接:Hello World"); @@ -63,6 +66,30 @@ public class WxMpMassMessageServiceImplTest { assertNotNull(massResult.getMsgId()); } + @Test + public void testImagesMassOpenIdsMessageSend() throws WxErrorException { + // 发送群发消息 + List massMsg = new ArrayList<>(); + for (int i = 0; i < 2; i++) { + try (InputStream inputStream = ClassLoader + .getSystemResourceAsStream(i + ".jpeg")) { + WxMediaUploadResult uploadMediaRes = this.wxService.getMaterialService().mediaUpload(WxConsts.MediaFileType.IMAGE, TestConstants.FILE_JPG, inputStream); + assertNotNull(uploadMediaRes); + assertNotNull(uploadMediaRes.getMediaId()); + massMsg.add(uploadMediaRes.getMediaId()); + } catch (IOException e) { + e.printStackTrace(); + } + } + WxMpMassTagMessage massMessage = new WxMpMassTagMessage(); + massMessage.setMsgType(WxConsts.MassMsgType.IMAGE); + massMessage.setMediaIds(new ArrayList<>(massMsg)); + massMessage.setSendAll(true); + WxMpMassSendResult massResult = this.wxService.getMassMessageService().massGroupMessageSend(massMessage); + assertNotNull(massResult); + assertNotNull(massResult.getMsgId()); + } + @Test public void testTextMassGroupMessageSend() throws WxErrorException { WxMpMassTagMessage massMessage = new WxMpMassTagMessage(); @@ -77,7 +104,7 @@ public class WxMpMassMessageServiceImplTest { } @Test(dataProvider = "massMessages") - public void testMediaMassGroupMessageSend(String massMsgType, String mediaId) throws WxErrorException { + public void testMediaMassGroupMessageSend(String massMsgType, String mediaId) throws WxErrorException { WxMpMassTagMessage massMessage = new WxMpMassTagMessage(); massMessage.setMsgType(massMsgType); massMessage.setMediaId(mediaId); @@ -123,7 +150,8 @@ public class WxMpMassMessageServiceImplTest { .mediaUpload(WxConsts.MediaFileType.IMAGE, TestConstants.FILE_JPG, inputStream); assertNotNull(uploadMediaRes); assertNotNull(uploadMediaRes.getMediaId()); - messages[1] = new Object[]{WxConsts.MassMsgType.IMAGE, uploadMediaRes.getMediaId()}; + messages[1] = new Object[]{WxConsts.MassMsgType.IMAGE, uploadMediaRes.getMediaId() + }; } /* diff --git a/weixin-java-mp/src/test/resources/0.jpeg b/weixin-java-mp/src/test/resources/0.jpeg new file mode 100644 index 000000000..1d78d7801 Binary files /dev/null and b/weixin-java-mp/src/test/resources/0.jpeg differ diff --git a/weixin-java-mp/src/test/resources/1.jpeg b/weixin-java-mp/src/test/resources/1.jpeg new file mode 100644 index 000000000..9fc74aec9 Binary files /dev/null and b/weixin-java-mp/src/test/resources/1.jpeg differ