Parcourir la source

:art: #2851【公众号】群发消息支持多图片群发

唐英鹏 il y a 2 ans
Parent
commit
512975fb86

+ 1 - 0
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";
   }
 

+ 4 - 0
weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpMassOpenIdsMessage.java

@@ -37,6 +37,10 @@ public class WxMpMassOpenIdsMessage implements Serializable {
   private String content;
   private String mediaId;
   /**
+   * 图片列表
+   */
+  private List<String> mediaIds;
+  /**
    * 文章被判定为转载时,是否继续进行群发操作。
    */
   private boolean sendIgnoreReprint = false;

+ 5 - 0
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;
 
 /**
  * 按标签群发的消息.
@@ -35,6 +36,10 @@ public class WxMpMassTagMessage implements Serializable {
   private String content;
   private String mediaId;
   /**
+   * 图片列表
+   */
+  private List<String> mediaIds;
+  /**
    * 是否群发给所有用户.
    */
   private boolean isSendAll = false;

+ 16 - 2
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<WxMpMas
     }
     if (WxConsts.MassMsgType.IMAGE.equals(message.getMsgType())) {
       JsonObject sub = new JsonObject();
-      sub.addProperty("media_id", message.getMediaId());
-      messageJson.add(WxConsts.MassMsgType.IMAGE, sub);
+      List<String> 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<WxMpMas
     return messageJson;
   }
 
+  public static void main(String[] args) {
+
+  }
 }

+ 14 - 6
weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpMassTagMessageGsonAdapter.java

@@ -1,14 +1,13 @@
 package me.chanjar.weixin.mp.util.json;
 
-import com.google.gson.JsonElement;
-import com.google.gson.JsonObject;
-import com.google.gson.JsonSerializationContext;
-import com.google.gson.JsonSerializer;
+import com.google.gson.*;
+
 import me.chanjar.weixin.common.api.WxConsts;
 import me.chanjar.weixin.mp.bean.WxMpMassTagMessage;
 import org.apache.commons.lang3.StringUtils;
 
 import java.lang.reflect.Type;
+import java.util.List;
 
 /**
  * 群发消息json转换适配器.
@@ -47,8 +46,17 @@ public class WxMpMassTagMessageGsonAdapter implements JsonSerializer<WxMpMassTag
     }
     if (WxConsts.MassMsgType.IMAGE.equals(message.getMsgType())) {
       JsonObject sub = new JsonObject();
-      sub.addProperty("media_id", message.getMediaId());
-      messageJson.add(WxConsts.MassMsgType.IMAGE, sub);
+      List<String> 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();

+ 31 - 3
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超链接:<a href=\"http://www.baidu.com\">Hello World</a>");
@@ -64,6 +67,30 @@ public class WxMpMassMessageServiceImplTest {
   }
 
   @Test
+  public void testImagesMassOpenIdsMessageSend() throws WxErrorException {
+    // 发送群发消息
+    List<String> 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();
     massMessage.setMsgType(WxConsts.MassMsgType.TEXT);
@@ -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()
+      };
     }
 
     /*

BIN
weixin-java-mp/src/test/resources/0.jpeg


BIN
weixin-java-mp/src/test/resources/1.jpeg