diff --git a/weixin-java-miniapp/pom.xml b/weixin-java-miniapp/pom.xml
index c7424479..abfe9e60 100644
--- a/weixin-java-miniapp/pom.xml
+++ b/weixin-java-miniapp/pom.xml
@@ -61,6 +61,11 @@
joda-time
test
+
+ org.assertj
+ assertj-guava
+ test
+
redis.clients
jedis
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaKefuMessage.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaKefuMessage.java
index 772fb092..268e579b 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaKefuMessage.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaKefuMessage.java
@@ -1,8 +1,12 @@
package cn.binarywang.wx.miniapp.bean;
import cn.binarywang.wx.miniapp.builder.ImageBuilder;
+import cn.binarywang.wx.miniapp.builder.LinkBuilder;
import cn.binarywang.wx.miniapp.builder.TextBuilder;
-import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder;
+import com.google.gson.GsonBuilder;
+import com.google.gson.annotations.SerializedName;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
import lombok.Data;
import java.io.Serializable;
@@ -16,13 +20,59 @@ import java.io.Serializable;
public class WxMaKefuMessage implements Serializable {
private static final long serialVersionUID = -9196732086954365246L;
+ @SerializedName("touser")
private String toUser;
+
+ @SerializedName("msgtype")
private String msgType;
- private String content;
- private String mediaId;
- private String thumbMediaId;
- private String title;
- private String description;
+
+ @SerializedName("text")
+ private KfText text;
+
+ @SerializedName("image")
+ private KfImage image;
+
+ @SerializedName("link")
+ private KfLink link;
+
+ @SerializedName("miniprogrampage")
+ private KfMaPage maPage;
+
+ @Data
+ @AllArgsConstructor
+ public static class KfText {
+ private String content;
+ }
+
+ @Data
+ @AllArgsConstructor
+ public static class KfImage {
+ @SerializedName("media_id")
+ private String mediaId;
+ }
+
+ @Data
+ @Builder
+ public static class KfLink {
+ private String title;
+ private String description;
+ private String url;
+
+ @SerializedName("thumb_url")
+ private String thumbUrl;
+ }
+
+ @Data
+ @Builder
+ public static class KfMaPage {
+ private String title;
+
+ @SerializedName("pagepath")
+ private String pagePath;
+
+ @SerializedName("thumb_media_id")
+ private String thumbMediaId;
+ }
/**
* 获得文本消息builder.
@@ -38,8 +88,15 @@ public class WxMaKefuMessage implements Serializable {
return new ImageBuilder();
}
+ /**
+ * 获得图文链接消息builder.
+ */
+ public static LinkBuilder newLinkBuilder() {
+ return new LinkBuilder();
+ }
+
public String toJson() {
- return WxMaGsonBuilder.create().toJson(this);
+ return new GsonBuilder().create().toJson(this);
}
}
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaWxcodeLimit.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaWxcodeLimit.java
index 79a91ea6..5a3e6724 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaWxcodeLimit.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaWxcodeLimit.java
@@ -31,8 +31,9 @@ public class WxMaWxcodeLimit extends AbstractWxMaQrcodeWrapper implements Serial
return WxMaGsonBuilder.create().fromJson(json, WxMaWxcodeLimit.class);
}
+ @Override
public String toString() {
return super.toString();
- }
-
+ }
+
}
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/builder/ImageBuilder.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/builder/ImageBuilder.java
index d4bd0688..659028e9 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/builder/ImageBuilder.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/builder/ImageBuilder.java
@@ -4,6 +4,8 @@ import cn.binarywang.wx.miniapp.bean.WxMaKefuMessage;
import cn.binarywang.wx.miniapp.constant.WxMaConstants;
/**
+ * 图片消息builder.
+ *
* @author Binary Wang
*/
public final class ImageBuilder extends BaseBuilder {
@@ -21,7 +23,7 @@ public final class ImageBuilder extends BaseBuilder {
@Override
public WxMaKefuMessage build() {
WxMaKefuMessage m = super.build();
- m.setMediaId(this.mediaId);
+ m.setImage(new WxMaKefuMessage.KfImage(this.mediaId));
return m;
}
}
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/builder/LinkBuilder.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/builder/LinkBuilder.java
new file mode 100644
index 00000000..3f3a7fd5
--- /dev/null
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/builder/LinkBuilder.java
@@ -0,0 +1,52 @@
+package cn.binarywang.wx.miniapp.builder;
+
+import cn.binarywang.wx.miniapp.bean.WxMaKefuMessage;
+import cn.binarywang.wx.miniapp.constant.WxMaConstants;
+
+/**
+ * 图文链接builder
+ *
+ * @author Binary Wang
+ */
+public class LinkBuilder extends BaseBuilder {
+ private String title;
+ private String description;
+ private String url;
+ private String thumbUrl;
+
+ public LinkBuilder() {
+ this.msgType = WxMaConstants.KefuMsgType.IMAGE;
+ }
+
+ public LinkBuilder title(String title) {
+ this.title = title;
+ return this;
+ }
+
+ public LinkBuilder description(String description) {
+ this.description = description;
+ return this;
+ }
+
+ public LinkBuilder url(String url) {
+ this.url = url;
+ return this;
+ }
+
+ public LinkBuilder thumbUrl(String thumbUrl) {
+ this.thumbUrl = thumbUrl;
+ return this;
+ }
+
+ @Override
+ public WxMaKefuMessage build() {
+ WxMaKefuMessage m = super.build();
+ m.setLink(WxMaKefuMessage.KfLink.builder().title(this.title)
+ .description(this.description)
+ .url(this.url)
+ .thumbUrl(this.thumbUrl)
+ .build()
+ );
+ return m;
+ }
+}
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/builder/TextBuilder.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/builder/TextBuilder.java
index 35c58a67..67d0f37a 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/builder/TextBuilder.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/builder/TextBuilder.java
@@ -4,6 +4,8 @@ import cn.binarywang.wx.miniapp.bean.WxMaKefuMessage;
import cn.binarywang.wx.miniapp.constant.WxMaConstants;
/**
+ * 文本消息builder.
+ *
* @author Binary Wang
*/
public final class TextBuilder extends BaseBuilder {
@@ -21,7 +23,7 @@ public final class TextBuilder extends BaseBuilder {
@Override
public WxMaKefuMessage build() {
WxMaKefuMessage m = super.build();
- m.setContent(this.content);
+ m.setText(new WxMaKefuMessage.KfText(this.content));
return m;
}
}
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/constant/WxMaConstants.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/constant/WxMaConstants.java
index ccc492d1..1ea3595e 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/constant/WxMaConstants.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/constant/WxMaConstants.java
@@ -2,29 +2,29 @@ package cn.binarywang.wx.miniapp.constant;
/**
*
- * 小程序常量
+ * 小程序常量.
*
*
* @author Binary Wang
*/
public class WxMaConstants {
/**
- * 微信接口返回的参数errcode
+ * 微信接口返回的参数errcode.
*/
public static final String ERRCODE = "errcode";
/**
- * 素材类型
+ * 素材类型.
*/
public static class MediaType {
/**
- * 图片
+ * 图片.
*/
public static final String IMAGE = "image";
}
/**
- * 消息格式
+ * 消息格式.
*/
public static class MsgDataFormat {
public static final String XML = "XML";
@@ -32,32 +32,40 @@ public class WxMaConstants {
}
/**
- * 客服消息的消息类型
+ * 客服消息的消息类型.
*/
public static class KefuMsgType {
/**
- * 文本消息
+ * 文本消息.
*/
public static final String TEXT = "text";
/**
- * 图片消息
+ * 图片消息.
*/
public static final String IMAGE = "image";
+ /**
+ * 图文链接.
+ */
+ public static final String LINK = "link";
+ /**
+ * 小程序卡片消息.
+ */
+ public static final String MA_PAGE = "miniprogrampage";
}
public static final class ErrorCode {
/**
- * 40001 获取access_token时AppSecret错误,或者access_token无效
+ * 40001 获取access_token时AppSecret错误,或者access_token无效.
*/
public static final int ERR_40001 = 40001;
/**
- * 42001 access_token超时
+ * 42001 access_token超时.
*/
public static final int ERR_42001 = 42001;
/**
- * 40014 不合法的access_token,请开发者认真比对access_token的有效性(如是否过期)
+ * 40014 不合法的access_token,请开发者认真比对access_token的有效性(如是否过期).
*/
public static final int ERR_40014 = 40014;
}
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/util/json/WxMaGsonBuilder.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/util/json/WxMaGsonBuilder.java
index 4eb3a8ad..5a08a39a 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/util/json/WxMaGsonBuilder.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/util/json/WxMaGsonBuilder.java
@@ -1,6 +1,5 @@
package cn.binarywang.wx.miniapp.util.json;
-import cn.binarywang.wx.miniapp.bean.WxMaKefuMessage;
import cn.binarywang.wx.miniapp.bean.WxMaTemplateMessage;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
@@ -13,7 +12,6 @@ public class WxMaGsonBuilder {
static {
INSTANCE.disableHtmlEscaping();
- INSTANCE.registerTypeAdapter(WxMaKefuMessage.class, new WxMaKefuMessageGsonAdapter());
INSTANCE.registerTypeAdapter(WxMaTemplateMessage.class, new WxMaTemplateMessageGsonAdapter());
}
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/util/json/WxMaKefuMessageGsonAdapter.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/util/json/WxMaKefuMessageGsonAdapter.java
deleted file mode 100644
index d6a242d8..00000000
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/util/json/WxMaKefuMessageGsonAdapter.java
+++ /dev/null
@@ -1,38 +0,0 @@
-package cn.binarywang.wx.miniapp.util.json;
-
-import cn.binarywang.wx.miniapp.bean.WxMaKefuMessage;
-import cn.binarywang.wx.miniapp.constant.WxMaConstants;
-import com.google.gson.JsonElement;
-import com.google.gson.JsonObject;
-import com.google.gson.JsonSerializationContext;
-import com.google.gson.JsonSerializer;
-
-import java.lang.reflect.Type;
-
-/**
- * @author Binary Wang
- */
-public class WxMaKefuMessageGsonAdapter implements JsonSerializer {
-
- @Override
- public JsonElement serialize(WxMaKefuMessage message, Type typeOfSrc, JsonSerializationContext context) {
- JsonObject messageJson = new JsonObject();
- messageJson.addProperty("touser", message.getToUser());
- messageJson.addProperty("msgtype", message.getMsgType());
-
- if (WxMaConstants.KefuMsgType.TEXT.equals(message.getMsgType())) {
- JsonObject text = new JsonObject();
- text.addProperty("content", message.getContent());
- messageJson.add("text", text);
- }
-
- if (WxMaConstants.KefuMsgType.IMAGE.equals(message.getMsgType())) {
- JsonObject image = new JsonObject();
- image.addProperty("media_id", message.getMediaId());
- messageJson.add("image", image);
- }
-
- return messageJson;
- }
-
-}
diff --git a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaMsgServiceImplTest.java b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaMsgServiceImplTest.java
index 774db32b..8ad7a728 100644
--- a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaMsgServiceImplTest.java
+++ b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaMsgServiceImplTest.java
@@ -7,16 +7,14 @@ import cn.binarywang.wx.miniapp.test.ApiTestModule;
import cn.binarywang.wx.miniapp.test.TestConfig;
import com.google.common.collect.Lists;
import com.google.inject.Inject;
-import me.chanjar.weixin.common.api.WxConsts;
import me.chanjar.weixin.common.exception.WxErrorException;
-import org.testng.annotations.Guice;
-import org.testng.annotations.Test;
+import org.testng.annotations.*;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
- * 测试客服相关接口
+ * 测试消息相关接口
*
* @author Binary Wang
*/
@@ -25,26 +23,14 @@ import java.util.Date;
public class WxMaMsgServiceImplTest {
@Inject
- protected WxMaService wxService;
-
- public void testSendKefuMpNewsMessage() throws WxErrorException {
- TestConfig configStorage = (TestConfig) this.wxService
- .getWxMaConfig();
- WxMaKefuMessage message = new WxMaKefuMessage();
- message.setMsgType(WxConsts.KefuMsgType.MPNEWS);
- message.setToUser(configStorage.getOpenid());
-
- this.wxService.getMsgService().sendKefuMsg(message);
- }
+ private WxMaService wxService;
public void testSendKefuMessage() throws WxErrorException {
- TestConfig config = (TestConfig) this.wxService
- .getWxMaConfig();
- WxMaKefuMessage message = new WxMaKefuMessage();
- message.setMsgType(WxConsts.KefuMsgType.TEXT);
- message.setToUser(config.getOpenid());
- message.setContent(
- "欢迎欢迎,热烈欢迎\n换行测试\n超链接:Hello World");
+ TestConfig config = (TestConfig) this.wxService.getWxMaConfig();
+ WxMaKefuMessage message = WxMaKefuMessage.newTextBuilder()
+ .toUser(config.getOpenid())
+ .content("欢迎欢迎,热烈欢迎\n换行测试\n超链接:Hello World")
+ .build();
this.wxService.getMsgService().sendKefuMsg(message);
}
diff --git a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/bean/WxMaKefuMessageTest.java b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/bean/WxMaKefuMessageTest.java
index 667ab2de..c8c4f2ac 100644
--- a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/bean/WxMaKefuMessageTest.java
+++ b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/bean/WxMaKefuMessageTest.java
@@ -1,8 +1,8 @@
package cn.binarywang.wx.miniapp.bean;
-import me.chanjar.weixin.common.api.WxConsts;
-import org.testng.Assert;
-import org.testng.annotations.Test;
+import org.testng.annotations.*;
+
+import static org.assertj.core.api.Assertions.assertThat;
/**
* @author Binary Wang
@@ -10,30 +10,35 @@ import org.testng.annotations.Test;
@Test
public class WxMaKefuMessageTest {
- public void testTextReply() {
- WxMaKefuMessage reply = new WxMaKefuMessage();
- reply.setToUser("OPENID");
- reply.setMsgType(WxConsts.KefuMsgType.TEXT);
- reply.setContent("sfsfdsdf");
- Assert.assertEquals(reply.toJson(), "{\"touser\":\"OPENID\",\"msgtype\":\"text\",\"text\":{\"content\":\"sfsfdsdf\"}}");
- }
-
- public void testTextBuild() {
- WxMaKefuMessage reply = WxMaKefuMessage.newTextBuilder().toUser("OPENID").content("sfsfdsdf").build();
- Assert.assertEquals(reply.toJson(), "{\"touser\":\"OPENID\",\"msgtype\":\"text\",\"text\":{\"content\":\"sfsfdsdf\"}}");
+ public void testTextBuilder() {
+ WxMaKefuMessage reply = WxMaKefuMessage.newTextBuilder()
+ .toUser("OPENID")
+ .content("sfsfdsdf")
+ .build();
+ assertThat(reply.toJson())
+ .isEqualTo("{\"touser\":\"OPENID\",\"msgtype\":\"text\",\"text\":{\"content\":\"sfsfdsdf\"}}");
}
- public void testImageReply() {
- WxMaKefuMessage reply = new WxMaKefuMessage();
- reply.setToUser("OPENID");
- reply.setMsgType(WxConsts.KefuMsgType.IMAGE);
- reply.setMediaId("MEDIA_ID");
- Assert.assertEquals(reply.toJson(), "{\"touser\":\"OPENID\",\"msgtype\":\"image\",\"image\":{\"media_id\":\"MEDIA_ID\"}}");
+ public void testImageBuilder() {
+ WxMaKefuMessage reply = WxMaKefuMessage.newImageBuilder()
+ .toUser("OPENID")
+ . mediaId("MEDIA_ID")
+ .build();
+ assertThat(reply.toJson())
+ .isEqualTo( "{\"touser\":\"OPENID\",\"msgtype\":\"image\",\"image\":{\"media_id\":\"MEDIA_ID\"}}");
}
- public void testImageBuild() {
- WxMaKefuMessage reply = WxMaKefuMessage.newImageBuilder().toUser("OPENID").mediaId("MEDIA_ID").build();
- Assert.assertEquals(reply.toJson(), "{\"touser\":\"OPENID\",\"msgtype\":\"image\",\"image\":{\"media_id\":\"MEDIA_ID\"}}");
+ public void testLinkBuilder() {
+ WxMaKefuMessage reply = WxMaKefuMessage.newLinkBuilder()
+ .toUser("OPENID")
+ .url("url")
+ .description("description")
+ .title("title")
+ .thumbUrl("thumbUrl")
+ .build();
+ assertThat(reply.toJson())
+ .isEqualTo( "{\"touser\":\"OPENID\",\"msgtype\":\"image\"," +
+ "\"link\":{\"title\":\"title\",\"description\":\"description\",\"url\":\"url\",\"thumb_url\":\"thumbUrl\"}}");
}