();
private WxMenuRule matchRule;
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/result/WxError.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/result/WxError.java
index 740841b9ae..737f506f69 100644
--- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/result/WxError.java
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/result/WxError.java
@@ -12,6 +12,8 @@
*/
public class WxError implements Serializable {
+ private static final long serialVersionUID = 7869786563361406291L;
+
private int errorCode;
private String errorMsg;
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/result/WxMediaUploadResult.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/result/WxMediaUploadResult.java
index 0ac7fe8a7c..500dc0000a 100644
--- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/result/WxMediaUploadResult.java
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/result/WxMediaUploadResult.java
@@ -5,7 +5,8 @@
import java.io.Serializable;
public class WxMediaUploadResult implements Serializable {
-
+ private static final long serialVersionUID = 330834334738622341L;
+
private String type;
private String mediaId;
private String thumbMediaId;
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/crypto/SHA1.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/crypto/SHA1.java
index a711c590d2..bd6ec15eeb 100644
--- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/crypto/SHA1.java
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/crypto/SHA1.java
@@ -1,11 +1,10 @@
package me.chanjar.weixin.common.util.crypto;
-import org.apache.commons.codec.digest.DigestUtils;
-
-import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
+import org.apache.commons.codec.digest.DigestUtils;
+
/**
* Created by Daniel Qian on 14/10/19.
*/
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/crypto/WxCryptUtil.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/crypto/WxCryptUtil.java
index a9ebfc2c75..a8fa9e15f7 100755
--- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/crypto/WxCryptUtil.java
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/crypto/WxCryptUtil.java
@@ -83,7 +83,7 @@ public String encrypt(String plainText) {
String encryptedXml = encrypt(genRandomStr(), plainText);
// 生成安全签名
- String timeStamp = timeStamp = Long.toString(System.currentTimeMillis() / 1000l);
+ String timeStamp = Long.toString(System.currentTimeMillis() / 1000l);
String nonce = genRandomStr();
try {
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/RequestExecutor.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/RequestExecutor.java
index 5d407cb951..b0d498a345 100644
--- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/RequestExecutor.java
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/RequestExecutor.java
@@ -5,7 +5,6 @@
import org.apache.http.HttpHost;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.impl.client.CloseableHttpClient;
-import org.apache.http.impl.client.HttpClients;
import me.chanjar.weixin.common.exception.WxErrorException;
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/xml/XStreamInitializer.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/xml/XStreamInitializer.java
index d545a796f7..1caa0a068b 100644
--- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/xml/XStreamInitializer.java
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/xml/XStreamInitializer.java
@@ -1,19 +1,15 @@
package me.chanjar.weixin.common.util.xml;
+import java.io.Writer;
+
import com.thoughtworks.xstream.XStream;
-import com.thoughtworks.xstream.converters.basic.DoubleConverter;
-import com.thoughtworks.xstream.converters.basic.FloatConverter;
-import com.thoughtworks.xstream.converters.basic.IntConverter;
import com.thoughtworks.xstream.core.util.QuickWriter;
import com.thoughtworks.xstream.io.HierarchicalStreamWriter;
import com.thoughtworks.xstream.io.xml.PrettyPrintWriter;
import com.thoughtworks.xstream.io.xml.XppDriver;
-import com.thoughtworks.xstream.security.NoTypePermission;
import com.thoughtworks.xstream.security.NullPermission;
import com.thoughtworks.xstream.security.PrimitiveTypePermission;
-import java.io.Writer;
-
public class XStreamInitializer {
public static XStream getInstance() {
diff --git a/weixin-java-cp/pom.xml b/weixin-java-cp/pom.xml
index 2fc13c3d11..38e14fa72e 100644
--- a/weixin-java-cp/pom.xml
+++ b/weixin-java-cp/pom.xml
@@ -4,9 +4,9 @@
xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
4.0.0
- me.chanjar
+ com.github.binarywang
weixin-java-parent
- 1.3.4-SNAPSHOT
+ 1.3.5-SNAPSHOT
weixin-java-cp
@@ -15,7 +15,7 @@
- me.chanjar
+ com.github.binarywang
weixin-java-common
${project.version}
@@ -27,31 +27,26 @@
org.testng
testng
- 6.8.7
test
org.mockito
mockito-all
- 1.9.5
test
com.google.inject
guice
- 3.0
test
org.eclipse.jetty
jetty-server
- 9.3.0.M0
test
org.eclipse.jetty
jetty-servlet
- 9.3.0.M0
test
diff --git a/weixin-java-mp/pom.xml b/weixin-java-mp/pom.xml
index cc761298f5..ada2e442cb 100644
--- a/weixin-java-mp/pom.xml
+++ b/weixin-java-mp/pom.xml
@@ -4,9 +4,9 @@
xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
4.0.0
- me.chanjar
+ com.github.binarywang
weixin-java-parent
- 1.3.4-SNAPSHOT
+ 1.3.5-SNAPSHOT
weixin-java-mp
WeiXin Java Tools - MP
@@ -14,7 +14,7 @@
- me.chanjar
+ com.github.binarywang
weixin-java-common
${project.version}
@@ -26,31 +26,26 @@
org.testng
testng
- 6.8.7
test
org.mockito
mockito-all
- 1.9.5
test
com.google.inject
guice
- 3.0
test
org.eclipse.jetty
jetty-server
- 9.3.0.M0
test
org.eclipse.jetty
jetty-servlet
- 9.3.0.M0
test
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 16ca6bca26..c2c2f21693 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
@@ -351,7 +351,7 @@ public interface WxMpService {
* @throws WxErrorException
*/
public void menuDelete(String menuid) throws WxErrorException;
-
+
/**
*
* 自定义菜单查询接口
@@ -361,7 +361,7 @@ public interface WxMpService {
* @throws WxErrorException
*/
public WxMenu menuGet() throws WxErrorException;
-
+
/**
*
* 测试个性化菜单匹配结果
@@ -723,7 +723,7 @@ public interface WxMpService {
/**
* 统一下单(详见http://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1)
* 在发起微信支付前,需要调用统一下单接口,获取"预支付交易会话标识"
- *
+ *
* @param parameters
* All required/optional parameters for weixin payment
* @return
@@ -737,10 +737,10 @@ public interface WxMpService {
* @param parameters
* the required or optional parameters
* @return
- * @throws WxErrorException
+ * @throws WxErrorException
*/
- Map getJSSDKPayInfo(Map parameters) throws WxErrorException;
-
+ Map getJSSDKPayInfo(Map parameters) throws WxErrorException;
+
/**
* 该接口调用“统一下单”接口,并拼装JSSDK发起支付请求需要的参数
* 详见http://mp.weixin.qq.com/wiki/7/aaa137b55fb2e0456bf8dd9148dd613f.html#.E5.8F.91.E8.B5.B7.E4.B8.80.E4.B8.AA.E5.BE.AE.E4.BF.A1.E6.94.AF.E4.BB.98.E8.AF.B7.E6.B1.82
@@ -752,7 +752,7 @@ public interface WxMpService {
* @param ip 发起支付的客户端IP
* @param notifyUrl 通知地址
* @return
- * @throws WxErrorException
+ * @throws WxErrorException
* @deprecated Use me.chanjar.weixin.mp.api.WxMpService.getJSSDKPayInfo(Map) instead
*/
@Deprecated
@@ -773,7 +773,7 @@ public interface WxMpService {
* @return
*/
WxMpPayCallback getJSSDKCallbackData(String xmlData);
-
+
/**
* 微信支付-申请退款
* 详见 https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_4
@@ -784,10 +784,10 @@ public interface WxMpService {
* total_fee
* refund_fee
* @return 退款操作结果
- * @throws WxErrorException
+ * @throws WxErrorException
*/
public WxMpPayRefundResult refundPay(Map parameters) throws WxErrorException;
-
+
/**
*
* 计算Map键值对是否和签名相符,
@@ -914,7 +914,7 @@ public WxMpCardResult queryCardCode(String cardId, String code, boolean checkCon
*/
public void markCardCode(String code, String cardId, String openId, boolean isMark) throws
WxErrorException;
-
+
/**
* 查看卡券详情接口
* 详见 https://mp.weixin.qq.com/wiki/14/8dd77aeaee85f922db5f8aa6386d385e.html#.E6.9F.A5.E7.9C.8B.E5.8D.A1.E5.88.B8.E8.AF.A6.E6.83.85
@@ -925,4 +925,26 @@ public void markCardCode(String code, String cardId, String openId, boolean isMa
* @throws WxErrorException
*/
public String getCardDetail(String cardId) throws WxErrorException;
+
+ /*
+ *
+ * 预览接口
+ * 详情请见:http://mp.weixin.qq.com/wiki/15/40b6865b893947b764e2de8e4a1fb55f.html#.E9.A2.84.E8.A7.88.E6.8E.A5.E5.8F.A3.E3.80.90.E8.AE.A2.E9.98.85.E5.8F.B7.E4.B8.8E.E6.9C.8D.E5.8A.A1.E5.8F.B7.E8.AE.A4.E8.AF.81.E5.90.8E.E5.9D.87.E5.8F.AF.E7.94.A8.E3.80.91
+ *
+ * @param wxMpMassPreviewMessage
+ * @return wxMpMassSendResult
+ * @throws WxErrorException
+ */
+ public WxMpMassSendResult massMessagePreview(WxMpMassPreviewMessage wxMpMassPreviewMessage) throws Exception;
+
+ /*
+ *
+ * 上传图文消息内的图片获取URL
+ * 详情请见:http://mp.weixin.qq.com/wiki/15/40b6865b893947b764e2de8e4a1fb55f.html#.E4.B8.8A.E4.BC.A0.E5.9B.BE.E6.96.87.E6.B6.88.E6.81.AF.E5.86.85.E7.9A.84.E5.9B.BE.E7.89.87.E8.8E.B7.E5.8F.96URL.E3.80.90.E8.AE.A2.E9.98.85.E5.8F.B7.E4.B8.8E.E6.9C.8D.E5.8A.A1.E5.8F.B7.E8.AE.A4.E8.AF.81.E5.90.8E.E5.9D.87.E5.8F.AF.E7.94.A8.E3.80.91
+ *
+ * @param file
+ * @return WxMediaImgUploadResult 返回图片url
+ * @throws WxErrorException
+ */
+ public WxMediaImgUploadResult mediaImgUpload(File file) 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 1805b27107..cbfa7dec14 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
@@ -1259,4 +1259,17 @@ public String getCardDetail(String cardId) throws WxErrorException {
return responseContent;
}
+ @Override
+ public WxMpMassSendResult massMessagePreview(WxMpMassPreviewMessage wxMpMassPreviewMessage) throws Exception {
+ String url = "https://api.weixin.qq.com/cgi-bin/message/mass/preview";
+ String responseContent = execute(new SimplePostRequestExecutor(), url, wxMpMassPreviewMessage.toJson());
+ return WxMpMassSendResult.fromJson(responseContent);
+ }
+
+ @Override
+ public WxMediaImgUploadResult mediaImgUpload(File file) throws WxErrorException {
+ String url = "https://api.weixin.qq.com/cgi-bin/media/uploadimg";
+ return execute(new MediaImgUploadRequestExecutor(), url, file);
+ }
+
}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpMassPreviewMessage.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpMassPreviewMessage.java
new file mode 100644
index 0000000000..154195dbb7
--- /dev/null
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpMassPreviewMessage.java
@@ -0,0 +1,68 @@
+package me.chanjar.weixin.mp.bean;
+
+import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
+
+import java.io.Serializable;
+
+/**
+ * @author miller
+ */
+public class WxMpMassPreviewMessage implements Serializable {
+ private String toWxUsername;
+ private String msgType;
+ private String content;
+ private String mediaId;
+
+ public WxMpMassPreviewMessage() {
+ super();
+ }
+
+ public String getToWxUsername() {
+ return toWxUsername;
+ }
+
+ public void setToWxUsername(String toWxUsername) {
+ this.toWxUsername = toWxUsername;
+ }
+
+ public String getMsgType() {
+ return msgType;
+ }
+
+ /**
+ *
+ * 请使用
+ * {@link me.chanjar.weixin.common.api.WxConsts#MASS_MSG_IMAGE}
+ * {@link me.chanjar.weixin.common.api.WxConsts#MASS_MSG_NEWS}
+ * {@link me.chanjar.weixin.common.api.WxConsts#MASS_MSG_TEXT}
+ * {@link me.chanjar.weixin.common.api.WxConsts#MASS_MSG_VIDEO}
+ * {@link me.chanjar.weixin.common.api.WxConsts#MASS_MSG_VOICE}
+ * 如果msgtype和media_id不匹配的话,会返回系统繁忙的错误
+ *
+ *
+ * @param msgType
+ */
+ public void setMsgType(String msgType) {
+ this.msgType = msgType;
+ }
+
+ public String getContent() {
+ return content;
+ }
+
+ public void setContent(String content) {
+ this.content = content;
+ }
+
+ public String getMediaId() {
+ return mediaId;
+ }
+
+ public void setMediaId(String mediaId) {
+ this.mediaId = mediaId;
+ }
+
+ public String toJson() {
+ return WxMpGsonBuilder.INSTANCE.create().toJson(this);
+ }
+}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMediaImgUploadResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMediaImgUploadResult.java
new file mode 100644
index 0000000000..3e5ff6b2fd
--- /dev/null
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMediaImgUploadResult.java
@@ -0,0 +1,24 @@
+package me.chanjar.weixin.mp.bean.result;
+
+import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
+
+import java.io.Serializable;
+
+/**
+ * @author miller
+ */
+public class WxMediaImgUploadResult implements Serializable {
+ private String url;
+
+ public static WxMediaImgUploadResult fromJson(String json) {
+ return WxMpGsonBuilder.create().fromJson(json, WxMediaImgUploadResult.class);
+ }
+
+ public String getUrl() {
+ return url;
+ }
+
+ public void setUrl(String url) {
+ this.url = url;
+ }
+}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpMassSendResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpMassSendResult.java
index adf6ebbc5b..dd12a53a98 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpMassSendResult.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpMassSendResult.java
@@ -20,6 +20,7 @@ public class WxMpMassSendResult implements Serializable {
private String errorCode;
private String errorMsg;
private String msgId;
+ private String msgDataId;
public String getErrorCode() {
return errorCode;
@@ -44,7 +45,15 @@ public String getMsgId() {
public void setMsgId(String msgId) {
this.msgId = msgId;
}
-
+
+ public String getMsgDataId() {
+ return msgDataId;
+ }
+
+ public void setMsgDataId(String msgDataId) {
+ this.msgDataId = msgDataId;
+ }
+
public static WxMpMassSendResult fromJson(String json) {
return WxMpGsonBuilder.create().fromJson(json, WxMpMassSendResult.class);
}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/http/MediaImgUploadRequestExecutor.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/http/MediaImgUploadRequestExecutor.java
new file mode 100644
index 0000000000..bdbc8f6728
--- /dev/null
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/http/MediaImgUploadRequestExecutor.java
@@ -0,0 +1,51 @@
+package me.chanjar.weixin.mp.util.http;
+
+import me.chanjar.weixin.common.bean.result.WxError;
+import me.chanjar.weixin.common.exception.WxErrorException;
+import me.chanjar.weixin.common.util.http.RequestExecutor;
+import me.chanjar.weixin.common.util.http.Utf8ResponseHandler;
+import me.chanjar.weixin.mp.bean.result.WxMediaImgUploadResult;
+import org.apache.http.HttpEntity;
+import org.apache.http.HttpHost;
+import org.apache.http.client.ClientProtocolException;
+import org.apache.http.client.config.RequestConfig;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.entity.ContentType;
+import org.apache.http.entity.mime.HttpMultipartMode;
+import org.apache.http.entity.mime.MultipartEntityBuilder;
+import org.apache.http.impl.client.CloseableHttpClient;
+
+import java.io.File;
+import java.io.IOException;
+
+/**
+ * @author miller
+ */
+public class MediaImgUploadRequestExecutor implements RequestExecutor {
+ @Override
+ public WxMediaImgUploadResult execute(CloseableHttpClient httpclient, HttpHost httpProxy, String uri, File data) throws WxErrorException, ClientProtocolException, IOException {
+ HttpPost httpPost = new HttpPost(uri);
+ if (httpProxy != null) {
+ RequestConfig config = RequestConfig.custom().setProxy(httpProxy).build();
+ httpPost.setConfig(config);
+ }
+ if (data != null) {
+ HttpEntity entity = MultipartEntityBuilder
+ .create()
+ .addBinaryBody("media", data)
+ .setMode(HttpMultipartMode.RFC6532)
+ .build();
+ httpPost.setEntity(entity);
+ httpPost.setHeader("Content-Type", ContentType.MULTIPART_FORM_DATA.toString());
+ }
+ try (CloseableHttpResponse response = httpclient.execute(httpPost)) {
+ String responseContent = Utf8ResponseHandler.INSTANCE.handleResponse(response);
+ WxError error = WxError.fromJson(responseContent);
+ if (error.getErrorCode() != 0) {
+ throw new WxErrorException(error);
+ }
+ return WxMediaImgUploadResult.fromJson(responseContent);
+ }
+ }
+}
\ No newline at end of file
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMediaImgUploadResultGsonAdapter.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMediaImgUploadResultGsonAdapter.java
new file mode 100644
index 0000000000..39746ccd61
--- /dev/null
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMediaImgUploadResultGsonAdapter.java
@@ -0,0 +1,22 @@
+package me.chanjar.weixin.mp.util.json;
+
+import com.google.gson.*;
+import me.chanjar.weixin.common.util.json.GsonHelper;
+import me.chanjar.weixin.mp.bean.result.WxMediaImgUploadResult;
+
+import java.lang.reflect.Type;
+
+/**
+ * @author miller
+ */
+public class WxMediaImgUploadResultGsonAdapter implements JsonDeserializer {
+ @Override
+ public WxMediaImgUploadResult deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
+ WxMediaImgUploadResult wxMediaImgUploadResult = new WxMediaImgUploadResult();
+ JsonObject jsonObject = json.getAsJsonObject();
+ if (null != jsonObject.get("url") && !jsonObject.get("url").isJsonNull()) {
+ wxMediaImgUploadResult.setUrl(GsonHelper.getAsString(jsonObject.get("url")));
+ }
+ return wxMediaImgUploadResult;
+ }
+}
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 316f22f546..a451673d99 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
@@ -40,6 +40,8 @@ public class WxMpGsonBuilder {
INSTANCE.registerTypeAdapter(WxMpMaterialFileBatchGetResult.WxMaterialFileBatchGetNewsItem.class, new WxMpMaterialFileBatchGetGsonItemAdapter());
INSTANCE.registerTypeAdapter(WxMpCardResult.class, new WxMpCardResultGsonAdapter());
INSTANCE.registerTypeAdapter(WxMpCard.class, new WxMpCardGsonAdapter());
+ INSTANCE.registerTypeAdapter(WxMpMassPreviewMessage.class, new WxMpMassPreviewMessageGsonAdapter());
+ INSTANCE.registerTypeAdapter(WxMediaImgUploadResult.class, new WxMediaImgUploadResultGsonAdapter());
}
public static Gson create() {
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpMassPreviewMessageGsonAdapter.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpMassPreviewMessageGsonAdapter.java
new file mode 100644
index 0000000000..fd3e52df3e
--- /dev/null
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpMassPreviewMessageGsonAdapter.java
@@ -0,0 +1,48 @@
+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 me.chanjar.weixin.common.api.WxConsts;
+import me.chanjar.weixin.mp.bean.WxMpMassPreviewMessage;
+
+import java.lang.reflect.Type;
+
+/**
+ * @author miller
+ */
+public class WxMpMassPreviewMessageGsonAdapter implements JsonSerializer {
+ @Override
+ public JsonElement serialize(WxMpMassPreviewMessage wxMpMassPreviewMessage, Type type, JsonSerializationContext jsonSerializationContext) {
+ JsonObject jsonObject = new JsonObject();
+ jsonObject.addProperty("towxname", wxMpMassPreviewMessage.getToWxUsername());
+ if (WxConsts.MASS_MSG_NEWS.equals(wxMpMassPreviewMessage.getMsgType())) {
+ JsonObject news = new JsonObject();
+ news.addProperty("media_id", wxMpMassPreviewMessage.getMediaId());
+ jsonObject.add(WxConsts.MASS_MSG_NEWS, news);
+ }
+ if (WxConsts.MASS_MSG_TEXT.equals(wxMpMassPreviewMessage.getMsgType())) {
+ JsonObject sub = new JsonObject();
+ sub.addProperty("content", wxMpMassPreviewMessage.getContent());
+ jsonObject.add(WxConsts.MASS_MSG_TEXT, sub);
+ }
+ if (WxConsts.MASS_MSG_VOICE.equals(wxMpMassPreviewMessage.getMsgType())) {
+ JsonObject sub = new JsonObject();
+ sub.addProperty("media_id", wxMpMassPreviewMessage.getMediaId());
+ jsonObject.add(WxConsts.MASS_MSG_VOICE, sub);
+ }
+ if (WxConsts.MASS_MSG_IMAGE.equals(wxMpMassPreviewMessage.getMsgType())) {
+ JsonObject sub = new JsonObject();
+ sub.addProperty("media_id", wxMpMassPreviewMessage.getMediaId());
+ jsonObject.add(WxConsts.MASS_MSG_IMAGE, sub);
+ }
+ if (WxConsts.MASS_MSG_VIDEO.equals(wxMpMassPreviewMessage.getMsgType())) {
+ JsonObject sub = new JsonObject();
+ sub.addProperty("media_id", wxMpMassPreviewMessage.getMediaId());
+ jsonObject.add(WxConsts.MASS_MSG_VIDEO, sub);
+ }
+ jsonObject.addProperty("msgtype", wxMpMassPreviewMessage.getMsgType());
+ return jsonObject;
+ }
+}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpMassSendResultAdapter.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpMassSendResultAdapter.java
index 99fc02b89b..658ac358ff 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpMassSendResultAdapter.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpMassSendResultAdapter.java
@@ -34,6 +34,9 @@ public WxMpMassSendResult deserialize(JsonElement json, Type typeOfT, JsonDeseri
if (sendResultJsonObject.get("msg_id") != null && !sendResultJsonObject.get("msg_id").isJsonNull()) {
sendResult.setMsgId(GsonHelper.getAsString(sendResultJsonObject.get("msg_id")));
}
+ if (sendResultJsonObject.get("msg_data_id") != null && !sendResultJsonObject.get("msg_data_id").isJsonNull()) {
+ sendResult.setMsgDataId(GsonHelper.getAsString(sendResultJsonObject.get("msg_data_id")));
+ }
return sendResult;
}