diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/cp/bean/article/MpnewsArticle.java b/weixin-java-common/src/main/java/me/chanjar/weixin/cp/bean/article/MpnewsArticle.java
new file mode 100644
index 00000000..7904da20
--- /dev/null
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/cp/bean/article/MpnewsArticle.java
@@ -0,0 +1,139 @@
+package me.chanjar.weixin.cp.bean.article;
+
+/**
+ *
+ * Created by BinaryWang on 2017/3/27.
+ *
+ * @author Binary Wang
+ */
+public class MpnewsArticle {
+ private String title;
+ private String thumbMediaId;
+ private String author;
+ private String contentSourceUrl;
+ private String content;
+ private String digest;
+ private String showCoverPic;
+
+ private MpnewsArticle(Builder builder) {
+ setTitle(builder.title);
+ setThumbMediaId(builder.thumbMediaId);
+ setAuthor(builder.author);
+ setContentSourceUrl(builder.contentSourceUrl);
+ setContent(builder.content);
+ setDigest(builder.digest);
+ setShowCoverPic(builder.showCoverPic);
+ }
+
+ public static Builder newBuilder() {
+ return new Builder();
+ }
+
+ public String getTitle() {
+ return title;
+ }
+
+ public void setTitle(String title) {
+ this.title = title;
+ }
+
+ public String getThumbMediaId() {
+ return thumbMediaId;
+ }
+
+ public void setThumbMediaId(String thumbMediaId) {
+ this.thumbMediaId = thumbMediaId;
+ }
+
+ public String getAuthor() {
+ return author;
+ }
+
+ public void setAuthor(String author) {
+ this.author = author;
+ }
+
+ public String getContentSourceUrl() {
+ return contentSourceUrl;
+ }
+
+ public void setContentSourceUrl(String contentSourceUrl) {
+ this.contentSourceUrl = contentSourceUrl;
+ }
+
+ public String getContent() {
+ return content;
+ }
+
+ public void setContent(String content) {
+ this.content = content;
+ }
+
+ public String getDigest() {
+ return digest;
+ }
+
+ public void setDigest(String digest) {
+ this.digest = digest;
+ }
+
+ public String getShowCoverPic() {
+ return showCoverPic;
+ }
+
+ public void setShowCoverPic(String showCoverPic) {
+ this.showCoverPic = showCoverPic;
+ }
+
+ public static final class Builder {
+ private String title;
+ private String thumbMediaId;
+ private String author;
+ private String contentSourceUrl;
+ private String content;
+ private String digest;
+ private String showCoverPic;
+
+ private Builder() {
+ }
+
+ public Builder title(String title) {
+ this.title = title;
+ return this;
+ }
+
+ public Builder thumbMediaId(String thumbMediaId) {
+ this.thumbMediaId = thumbMediaId;
+ return this;
+ }
+
+ public Builder author(String author) {
+ this.author = author;
+ return this;
+ }
+
+ public Builder contentSourceUrl(String contentSourceUrl) {
+ this.contentSourceUrl = contentSourceUrl;
+ return this;
+ }
+
+ public Builder content(String content) {
+ this.content = content;
+ return this;
+ }
+
+ public Builder digest(String digest) {
+ this.digest = digest;
+ return this;
+ }
+
+ public Builder showCoverPic(String showCoverPic) {
+ this.showCoverPic = showCoverPic;
+ return this;
+ }
+
+ public MpnewsArticle build() {
+ return new MpnewsArticle(this);
+ }
+ }
+}
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/cp/bean/article/NewArticle.java b/weixin-java-common/src/main/java/me/chanjar/weixin/cp/bean/article/NewArticle.java
new file mode 100644
index 00000000..d4c056d5
--- /dev/null
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/cp/bean/article/NewArticle.java
@@ -0,0 +1,49 @@
+package me.chanjar.weixin.cp.bean.article;
+
+/**
+ *
+ * Created by BinaryWang on 2017/3/27.
+ *
+ *
+ * @author Binary Wang
+ */
+public class NewArticle {
+
+ private String title;
+ private String description;
+ private String url;
+ private String picUrl;
+
+ public String getTitle() {
+ return this.title;
+ }
+
+ public void setTitle(String title) {
+ this.title = title;
+ }
+
+ public String getDescription() {
+ return this.description;
+ }
+
+ public void setDescription(String description) {
+ this.description = description;
+ }
+
+ public String getUrl() {
+ return this.url;
+ }
+
+ public void setUrl(String url) {
+ this.url = url;
+ }
+
+ public String getPicUrl() {
+ return this.picUrl;
+ }
+
+ public void setPicUrl(String picUrl) {
+ this.picUrl = picUrl;
+ }
+
+}
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpMessage.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpMessage.java
index c25c170b..324df209 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpMessage.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpMessage.java
@@ -1,5 +1,7 @@
package me.chanjar.weixin.cp.bean;
+import me.chanjar.weixin.cp.bean.article.MpnewsArticle;
+import me.chanjar.weixin.cp.bean.article.NewArticle;
import me.chanjar.weixin.cp.bean.messagebuilder.*;
import me.chanjar.weixin.cp.util.json.WxCpGsonBuilder;
@@ -28,7 +30,16 @@ public class WxCpMessage implements Serializable {
private String musicUrl;
private String hqMusicUrl;
private String safe;
- private List articles = new ArrayList<>();
+ private List articles = new ArrayList<>();
+ private List mpnewsArticles = new ArrayList<>();
+
+ public List getMpnewsArticles() {
+ return mpnewsArticles;
+ }
+
+ public void setMpnewsArticles(List mpnewsArticles) {
+ this.mpnewsArticles = mpnewsArticles;
+ }
/**
* 获得文本消息builder
@@ -65,6 +76,13 @@ public class WxCpMessage implements Serializable {
return new NewsBuilder();
}
+ /**
+ * 获得mpnews图文消息builder
+ */
+ public static MpnewsBuilder MPNEWS() {
+ return new MpnewsBuilder();
+ }
+
/**
* 获得文件消息builder
*/
@@ -117,9 +135,10 @@ public class WxCpMessage implements Serializable {
* {@link me.chanjar.weixin.common.api.WxConsts#CUSTOM_MSG_MUSIC}
* {@link me.chanjar.weixin.common.api.WxConsts#CUSTOM_MSG_VIDEO}
* {@link me.chanjar.weixin.common.api.WxConsts#CUSTOM_MSG_NEWS}
+ * {@link me.chanjar.weixin.common.api.WxConsts#CUSTOM_MSG_MPNEWS}
*
*
- * @param msgType
+ * @param msgType 消息类型
*/
public void setMsgType(String msgType) {
this.msgType = msgType;
@@ -189,11 +208,11 @@ public class WxCpMessage implements Serializable {
this.hqMusicUrl = hqMusicUrl;
}
- public List getArticles() {
+ public List getArticles() {
return this.articles;
}
- public void setArticles(List articles) {
+ public void setArticles(List articles) {
this.articles = articles;
}
@@ -201,45 +220,4 @@ public class WxCpMessage implements Serializable {
return WxCpGsonBuilder.INSTANCE.create().toJson(this);
}
- public static class WxArticle {
-
- private String title;
- private String description;
- private String url;
- private String picUrl;
-
- public String getTitle() {
- return this.title;
- }
-
- public void setTitle(String title) {
- this.title = title;
- }
-
- public String getDescription() {
- return this.description;
- }
-
- public void setDescription(String description) {
- this.description = description;
- }
-
- public String getUrl() {
- return this.url;
- }
-
- public void setUrl(String url) {
- this.url = url;
- }
-
- public String getPicUrl() {
- return this.picUrl;
- }
-
- public void setPicUrl(String picUrl) {
- this.picUrl = picUrl;
- }
-
- }
-
}
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/messagebuilder/MpnewsBuilder.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/messagebuilder/MpnewsBuilder.java
new file mode 100644
index 00000000..21ab2549
--- /dev/null
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/messagebuilder/MpnewsBuilder.java
@@ -0,0 +1,48 @@
+package me.chanjar.weixin.cp.bean.messagebuilder;
+
+import me.chanjar.weixin.common.api.WxConsts;
+import me.chanjar.weixin.cp.bean.WxCpMessage;
+import me.chanjar.weixin.cp.bean.article.MpnewsArticle;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * mpnews类型的图文消息builder
+ *
+ * 用法:
+ * WxCustomMessage m = WxCustomMessage.MPNEWS().addArticle(article).toUser(...).build();
+ *
+ *
+ * @author Binary Wang
+ */
+public final class MpnewsBuilder extends BaseBuilder {
+ private List articles = new ArrayList<>();
+
+ private String mediaId;
+
+ public MpnewsBuilder() {
+ this.msgType = WxConsts.CUSTOM_MSG_MPNEWS;
+ }
+
+ public MpnewsBuilder mediaId(String mediaId) {
+ this.mediaId = mediaId;
+ return this;
+ }
+
+ public MpnewsBuilder addArticle(MpnewsArticle article) {
+ this.articles.add(article);
+ return this;
+ }
+
+ @Override
+ public WxCpMessage build() {
+ WxCpMessage m = super.build();
+ m.setMpnewsArticles(this.articles);
+ if (this.mediaId != null) {
+ m.setMediaId(this.mediaId);
+ }
+
+ return m;
+ }
+}
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/messagebuilder/NewsBuilder.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/messagebuilder/NewsBuilder.java
index 8ea90872..e0df095e 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/messagebuilder/NewsBuilder.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/messagebuilder/NewsBuilder.java
@@ -2,6 +2,7 @@ package me.chanjar.weixin.cp.bean.messagebuilder;
import me.chanjar.weixin.common.api.WxConsts;
import me.chanjar.weixin.cp.bean.WxCpMessage;
+import me.chanjar.weixin.cp.bean.article.NewArticle;
import java.util.ArrayList;
import java.util.List;
@@ -17,13 +18,13 @@ import java.util.List;
*/
public final class NewsBuilder extends BaseBuilder {
- private List articles = new ArrayList<>();
+ private List articles = new ArrayList<>();
public NewsBuilder() {
this.msgType = WxConsts.CUSTOM_MSG_NEWS;
}
- public NewsBuilder addArticle(WxCpMessage.WxArticle article) {
+ public NewsBuilder addArticle(NewArticle article) {
this.articles.add(article);
return this;
}
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/util/json/WxCpMessageGsonAdapter.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/util/json/WxCpMessageGsonAdapter.java
index 7bf09c71..949709ab 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/util/json/WxCpMessageGsonAdapter.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/util/json/WxCpMessageGsonAdapter.java
@@ -11,6 +11,8 @@ package me.chanjar.weixin.cp.util.json;
import com.google.gson.*;
import me.chanjar.weixin.common.api.WxConsts;
import me.chanjar.weixin.cp.bean.WxCpMessage;
+import me.chanjar.weixin.cp.bean.article.MpnewsArticle;
+import me.chanjar.weixin.cp.bean.article.NewArticle;
import org.apache.commons.lang3.StringUtils;
import java.lang.reflect.Type;
@@ -71,7 +73,7 @@ public class WxCpMessageGsonAdapter implements JsonSerializer {
if (WxConsts.CUSTOM_MSG_NEWS.equals(message.getMsgType())) {
JsonObject newsJsonObject = new JsonObject();
JsonArray articleJsonArray = new JsonArray();
- for (WxCpMessage.WxArticle article : message.getArticles()) {
+ for (NewArticle article : message.getArticles()) {
JsonObject articleJson = new JsonObject();
articleJson.addProperty("title", article.getTitle());
articleJson.addProperty("description", article.getDescription());
@@ -83,6 +85,29 @@ public class WxCpMessageGsonAdapter implements JsonSerializer {
messageJson.add("news", newsJsonObject);
}
+ if (WxConsts.CUSTOM_MSG_MPNEWS.equals(message.getMsgType())) {
+ JsonObject newsJsonObject = new JsonObject();
+ if (message.getMediaId() != null) {
+ newsJsonObject.addProperty("media_id", message.getMediaId());
+ }else {
+ JsonArray articleJsonArray = new JsonArray();
+ for (MpnewsArticle article : message.getMpnewsArticles()) {
+ JsonObject articleJson = new JsonObject();
+ articleJson.addProperty("title", article.getTitle());
+ articleJson.addProperty("thumb_media_id", article.getThumbMediaId());
+ articleJson.addProperty("author", article.getAuthor());
+ articleJson.addProperty("content_source_url", article.getContentSourceUrl());
+ articleJson.addProperty("content", article.getContent());
+ articleJson.addProperty("digest", article.getDigest());
+ articleJson.addProperty("show_cover_pic", article.getShowCoverPic());
+ articleJsonArray.add(articleJson);
+ }
+
+ newsJsonObject.add("articles", articleJsonArray);
+ }
+ messageJson.add("mpnews", newsJsonObject);
+ }
+
return messageJson;
}
diff --git a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/bean/WxCpMessageTest.java b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/bean/WxCpMessageTest.java
index 12b62e34..5f93aba9 100644
--- a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/bean/WxCpMessageTest.java
+++ b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/bean/WxCpMessageTest.java
@@ -1,7 +1,8 @@
package me.chanjar.weixin.cp.bean;
import me.chanjar.weixin.common.api.WxConsts;
-import me.chanjar.weixin.cp.bean.WxCpMessage.WxArticle;
+import me.chanjar.weixin.cp.bean.article.NewArticle;
+import me.chanjar.weixin.cp.bean.article.MpnewsArticle;
import org.testng.Assert;
import org.testng.annotations.Test;
@@ -68,14 +69,14 @@ public class WxCpMessageTest {
reply.setToUser("OPENID");
reply.setMsgType(WxConsts.CUSTOM_MSG_NEWS);
- WxArticle article1 = new WxArticle();
+ NewArticle article1 = new NewArticle();
article1.setUrl("URL");
article1.setPicUrl("PIC_URL");
article1.setDescription("Is Really A Happy Day");
article1.setTitle("Happy Day");
reply.getArticles().add(article1);
- WxArticle article2 = new WxArticle();
+ NewArticle article2 = new NewArticle();
article2.setUrl("URL");
article2.setPicUrl("PIC_URL");
article2.setDescription("Is Really A Happy Day");
@@ -87,13 +88,13 @@ public class WxCpMessageTest {
}
public void testNewsBuild() {
- WxArticle article1 = new WxArticle();
+ NewArticle article1 = new NewArticle();
article1.setUrl("URL");
article1.setPicUrl("PIC_URL");
article1.setDescription("Is Really A Happy Day");
article1.setTitle("Happy Day");
- WxArticle article2 = new WxArticle();
+ NewArticle article2 = new NewArticle();
article2.setUrl("URL");
article2.setPicUrl("PIC_URL");
article2.setDescription("Is Really A Happy Day");
@@ -104,4 +105,39 @@ public class WxCpMessageTest {
Assert.assertEquals(reply.toJson(), "{\"touser\":\"OPENID\",\"msgtype\":\"news\",\"news\":{\"articles\":[{\"title\":\"Happy Day\",\"description\":\"Is Really A Happy Day\",\"url\":\"URL\",\"picurl\":\"PIC_URL\"},{\"title\":\"Happy Day\",\"description\":\"Is Really A Happy Day\",\"url\":\"URL\",\"picurl\":\"PIC_URL\"}]}}");
}
+ public void testMpnewsBuild_with_articles() {
+ MpnewsArticle article1 = MpnewsArticle.newBuilder()
+ .title("Happy Day")
+ .author("aaaaaa")
+ .content("hahaha")
+ .contentSourceUrl("nice url")
+ .digest("digest")
+ .showCoverPic("heihei")
+ .thumbMediaId("thumb")
+ .build();
+
+ MpnewsArticle article2 = MpnewsArticle.newBuilder()
+ .title("Happy Day")
+ .author("aaaaaa")
+ .content("hahaha")
+ .contentSourceUrl("nice url")
+ .digest("digest")
+ .showCoverPic("heihei")
+ .thumbMediaId("thumb")
+ .build();
+
+ WxCpMessage reply = WxCpMessage.MPNEWS().toUser("OPENID").addArticle(article1).addArticle(article2).build();
+
+ Assert.assertEquals(reply.toJson(), "{\"touser\":\"OPENID\",\"msgtype\":\"mpnews\"," +
+ "\"mpnews\":{\"articles\":[{\"title\":\"Happy Day\",\"thumb_media_id\":\"thumb\",\"author\":\"aaaaaa\",\"content_source_url\":\"nice url\",\"content\":\"hahaha\",\"digest\":\"digest\",\"show_cover_pic\":\"heihei\"}," +
+ "{\"title\":\"Happy Day\",\"thumb_media_id\":\"thumb\",\"author\":\"aaaaaa\",\"content_source_url\":\"nice url\",\"content\":\"hahaha\",\"digest\":\"digest\",\"show_cover_pic\":\"heihei\"}]}}");
+ }
+
+ public void testMpnewsBuild_with_media_id() {
+ WxCpMessage reply = WxCpMessage.MPNEWS().toUser("OPENID").mediaId("mmm").build();
+
+ Assert.assertEquals(reply.toJson(),
+ "{\"touser\":\"OPENID\",\"msgtype\":\"mpnews\",\"mpnews\":{\"media_id\":\"mmm\"}}");
+ }
+
}