| @@ -2,6 +2,7 @@ package cn.binarywang.wx.miniapp.api; | |||
| import cn.binarywang.wx.miniapp.bean.WxMaKefuMessage; | |||
| import cn.binarywang.wx.miniapp.bean.WxMaTemplateMessage; | |||
| import cn.binarywang.wx.miniapp.bean.WxMaUniformMessage; | |||
| import me.chanjar.weixin.common.error.WxErrorException; | |||
| /** | |||
| @@ -14,6 +15,7 @@ import me.chanjar.weixin.common.error.WxErrorException; | |||
| public interface WxMaMsgService { | |||
| String KEFU_MESSAGE_SEND_URL = "https://api.weixin.qq.com/cgi-bin/message/custom/send"; | |||
| String TEMPLATE_MSG_SEND_URL = "https://api.weixin.qq.com/cgi-bin/message/wxopen/template/send"; | |||
| String UNIFORM_MSG_SEND_URL = "https://api.weixin.qq.com/cgi-bin/message/wxopen/template/uniform_send"; | |||
| /** | |||
| * <pre> | |||
| @@ -32,4 +34,14 @@ public interface WxMaMsgService { | |||
| * </pre> | |||
| */ | |||
| void sendTemplateMsg(WxMaTemplateMessage templateMessage) throws WxErrorException; | |||
| /** | |||
| * <pre> | |||
| * 下发小程序和公众号统一的服务消息 | |||
| * 详情请见: <a href="https://developers.weixin.qq.com/miniprogram/dev/api/open-api/uniform-message/sendUniformMessage.html">下发小程序和公众号统一的服务消息</a> | |||
| * 接口url格式:https://api.weixin.qq.com/cgi-bin/message/wxopen/template/uniform_send?access_token=ACCESS_TOKEN | |||
| * </pre> | |||
| */ | |||
| void sendUniformMsg(WxMaUniformMessage uniformMessage) throws WxErrorException; | |||
| } | |||
| @@ -4,6 +4,7 @@ import cn.binarywang.wx.miniapp.api.WxMaMsgService; | |||
| import cn.binarywang.wx.miniapp.api.WxMaService; | |||
| import cn.binarywang.wx.miniapp.bean.WxMaKefuMessage; | |||
| import cn.binarywang.wx.miniapp.bean.WxMaTemplateMessage; | |||
| import cn.binarywang.wx.miniapp.bean.WxMaUniformMessage; | |||
| import cn.binarywang.wx.miniapp.constant.WxMaConstants; | |||
| import com.google.gson.JsonObject; | |||
| import com.google.gson.JsonParser; | |||
| @@ -36,4 +37,13 @@ public class WxMaMsgServiceImpl implements WxMaMsgService { | |||
| } | |||
| } | |||
| @Override | |||
| public void sendUniformMsg(WxMaUniformMessage uniformMessage) throws WxErrorException { | |||
| String responseContent = this.wxMaService.post(UNIFORM_MSG_SEND_URL, uniformMessage.toJson()); | |||
| JsonObject jsonObject = JSON_PARSER.parse(responseContent).getAsJsonObject(); | |||
| if (jsonObject.get(WxMaConstants.ERRCODE).getAsInt() != 0) { | |||
| throw new WxErrorException(WxError.fromJson(responseContent)); | |||
| } | |||
| } | |||
| } | |||
| @@ -0,0 +1,32 @@ | |||
| package cn.binarywang.wx.miniapp.bean; | |||
| import lombok.Data; | |||
| import lombok.NoArgsConstructor; | |||
| /** | |||
| * <pre> | |||
| * | |||
| * Created by Binary Wang on 2018/9/23. | |||
| * </pre> | |||
| * | |||
| * @author <a href="https://github.com/binarywang">Binary Wang</a> | |||
| */ | |||
| @Data | |||
| @NoArgsConstructor | |||
| public class WxMaTemplateData { | |||
| private String name; | |||
| private String value; | |||
| private String color; | |||
| public WxMaTemplateData(String name, String value) { | |||
| this.name = name; | |||
| this.value = value; | |||
| } | |||
| public WxMaTemplateData(String name, String value, String color) { | |||
| this.name = name; | |||
| this.value = value; | |||
| this.color = color; | |||
| } | |||
| } | |||
| @@ -73,7 +73,7 @@ public class WxMaTemplateMessage implements Serializable { | |||
| * 描述: 模板内容,不填则下发空模板 | |||
| * </pre> | |||
| */ | |||
| private List<Data> data; | |||
| private List<WxMaTemplateData> data; | |||
| /** | |||
| * 模板内容字体的颜色,不填默认黑色. | |||
| @@ -95,7 +95,7 @@ public class WxMaTemplateMessage implements Serializable { | |||
| */ | |||
| private String emphasisKeyword; | |||
| public WxMaTemplateMessage addData(Data datum) { | |||
| public WxMaTemplateMessage addData(WxMaTemplateData datum) { | |||
| if (this.data == null) { | |||
| this.data = new ArrayList<>(); | |||
| } | |||
| @@ -108,24 +108,4 @@ public class WxMaTemplateMessage implements Serializable { | |||
| return WxMaGsonBuilder.create().toJson(this); | |||
| } | |||
| @lombok.Data | |||
| @NoArgsConstructor | |||
| public static class Data { | |||
| private String name; | |||
| private String value; | |||
| private String color; | |||
| public Data(String name, String value) { | |||
| this.name = name; | |||
| this.value = value; | |||
| } | |||
| public Data(String name, String value, String color) { | |||
| this.name = name; | |||
| this.value = value; | |||
| this.color = color; | |||
| } | |||
| } | |||
| } | |||
| @@ -0,0 +1,108 @@ | |||
| package cn.binarywang.wx.miniapp.bean; | |||
| import java.io.Serializable; | |||
| import java.util.ArrayList; | |||
| import java.util.List; | |||
| import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder; | |||
| import lombok.AllArgsConstructor; | |||
| import lombok.Builder; | |||
| import lombok.Data; | |||
| import lombok.Getter; | |||
| import lombok.NoArgsConstructor; | |||
| import lombok.Setter; | |||
| /** | |||
| * 模板消息. | |||
| * 参考 https://mp.weixin.qq.com/debug/wxadoc/dev/api/notice.html#接口说明 模板消息部分 | |||
| * | |||
| * @author <a href="https://github.com/binarywang">Binary Wang</a> | |||
| */ | |||
| @Getter | |||
| @Setter | |||
| @NoArgsConstructor | |||
| @AllArgsConstructor | |||
| @Builder | |||
| public class WxMaUniformMessage implements Serializable { | |||
| private static final long serialVersionUID = 5063374783759519418L; | |||
| /** | |||
| * 是否发送公众号模版消息,否则发送小程序模版消息. | |||
| */ | |||
| private boolean isMpTemplateMsg; | |||
| /** | |||
| * 用户openid. | |||
| * 可以是小程序的openid,也可以是mp_template_msg.appid对应的公众号的openid | |||
| */ | |||
| private String toUser; | |||
| /** | |||
| * 公众号appid,要求与小程序有绑定且同主体. | |||
| */ | |||
| private String appid; | |||
| /** | |||
| * 公众号或小程序模板ID. | |||
| */ | |||
| private String templateId; | |||
| /** | |||
| * 公众号模板消息所要跳转的url. | |||
| */ | |||
| private String url; | |||
| /** | |||
| * 小程序页面路径. | |||
| */ | |||
| private String page; | |||
| /** | |||
| * 小程序模板消息formid. | |||
| */ | |||
| private String formId; | |||
| /** | |||
| * 公众号模板消息所要跳转的小程序,小程序的必须与公众号具有绑定关系. | |||
| */ | |||
| private MiniProgram miniProgram; | |||
| /** | |||
| * 小程序模板数据. | |||
| */ | |||
| private List<WxMaTemplateData> data; | |||
| /** | |||
| * 模板需要放大的关键词,不填则默认无放大. | |||
| */ | |||
| private String emphasisKeyword; | |||
| public WxMaUniformMessage addData(WxMaTemplateData datum) { | |||
| if (this.data == null) { | |||
| this.data = new ArrayList<>(); | |||
| } | |||
| this.data.add(datum); | |||
| return this; | |||
| } | |||
| public String toJson() { | |||
| return WxMaGsonBuilder.create().toJson(this); | |||
| } | |||
| @Data | |||
| @NoArgsConstructor | |||
| @AllArgsConstructor | |||
| public static class MiniProgram implements Serializable { | |||
| private static final long serialVersionUID = -7945254706501974849L; | |||
| private String appid; | |||
| private String pagePath; | |||
| /** | |||
| * 是否使用path,否则使用pagepath. | |||
| * 加入此字段是基于微信官方接口变化多端的考虑 | |||
| */ | |||
| private boolean usePath = false; | |||
| } | |||
| } | |||
| @@ -1,6 +1,7 @@ | |||
| package cn.binarywang.wx.miniapp.util.json; | |||
| import cn.binarywang.wx.miniapp.bean.WxMaTemplateMessage; | |||
| import cn.binarywang.wx.miniapp.bean.WxMaUniformMessage; | |||
| import cn.binarywang.wx.miniapp.bean.analysis.WxMaRetainInfo; | |||
| import cn.binarywang.wx.miniapp.bean.analysis.WxMaUserPortrait; | |||
| import cn.binarywang.wx.miniapp.bean.analysis.WxMaVisitDistribution; | |||
| @@ -18,6 +19,7 @@ public class WxMaGsonBuilder { | |||
| static { | |||
| INSTANCE.disableHtmlEscaping(); | |||
| INSTANCE.registerTypeAdapter(WxMaTemplateMessage.class, new WxMaTemplateMessageGsonAdapter()); | |||
| INSTANCE.registerTypeAdapter(WxMaUniformMessage.class, new WxMaUniformMessageGsonAdapter()); | |||
| INSTANCE.registerTypeAdapter(WxMaCodeCommitRequest.class, new WxMaCodeCommitRequestGsonAdapter()); | |||
| INSTANCE.registerTypeAdapter(WxMaCodeVersionDistribution.class, new WxMaCodeVersionDistributionGsonAdapter()); | |||
| INSTANCE.registerTypeAdapter(WxMaVisitDistribution.class, new WxMaVisitDistributionGsonAdapter()); | |||
| @@ -1,13 +1,14 @@ | |||
| package cn.binarywang.wx.miniapp.util.json; | |||
| import java.lang.reflect.Type; | |||
| import cn.binarywang.wx.miniapp.bean.WxMaTemplateData; | |||
| import cn.binarywang.wx.miniapp.bean.WxMaTemplateMessage; | |||
| 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 <a href="https://github.com/binarywang">Binary Wang</a> | |||
| */ | |||
| @@ -26,10 +27,6 @@ public class WxMaTemplateMessageGsonAdapter implements JsonSerializer<WxMaTempla | |||
| messageJson.addProperty("form_id", message.getFormId()); | |||
| } | |||
| if (message.getPage() != null) { | |||
| messageJson.addProperty("page", message.getPage()); | |||
| } | |||
| if (message.getColor() != null) { | |||
| messageJson.addProperty("color", message.getColor()); | |||
| } | |||
| @@ -45,7 +42,7 @@ public class WxMaTemplateMessageGsonAdapter implements JsonSerializer<WxMaTempla | |||
| return messageJson; | |||
| } | |||
| for (WxMaTemplateMessage.Data datum : message.getData()) { | |||
| for (WxMaTemplateData datum : message.getData()) { | |||
| JsonObject dataJson = new JsonObject(); | |||
| dataJson.addProperty("value", datum.getValue()); | |||
| if (datum.getColor() != null) { | |||
| @@ -0,0 +1,98 @@ | |||
| package cn.binarywang.wx.miniapp.util.json; | |||
| import java.lang.reflect.Type; | |||
| import cn.binarywang.wx.miniapp.bean.WxMaTemplateData; | |||
| import cn.binarywang.wx.miniapp.bean.WxMaUniformMessage; | |||
| import com.google.gson.JsonElement; | |||
| import com.google.gson.JsonObject; | |||
| import com.google.gson.JsonSerializationContext; | |||
| import com.google.gson.JsonSerializer; | |||
| /** | |||
| * @author <a href="https://github.com/binarywang">Binary Wang</a> | |||
| */ | |||
| public class WxMaUniformMessageGsonAdapter implements JsonSerializer<WxMaUniformMessage> { | |||
| @Override | |||
| public JsonElement serialize(WxMaUniformMessage message, Type typeOfSrc, JsonSerializationContext context) { | |||
| JsonObject messageJson = new JsonObject(); | |||
| messageJson.addProperty("touser", message.getToUser()); | |||
| if (message.isMpTemplateMsg()) { | |||
| JsonObject msg = new JsonObject(); | |||
| if (message.getAppid() != null) { | |||
| msg.addProperty("appid", message.getAppid()); | |||
| } | |||
| msg.addProperty("template_id", message.getTemplateId()); | |||
| if (message.getUrl() != null) { | |||
| msg.addProperty("url", message.getUrl()); | |||
| } | |||
| final WxMaUniformMessage.MiniProgram miniProgram = message.getMiniProgram(); | |||
| if (miniProgram != null) { | |||
| JsonObject miniProgramJson = new JsonObject(); | |||
| miniProgramJson.addProperty("appid", miniProgram.getAppid()); | |||
| if (miniProgram.isUsePath()) { | |||
| miniProgramJson.addProperty("path", miniProgram.getPagePath()); | |||
| } else { | |||
| miniProgramJson.addProperty("pagepath", miniProgram.getPagePath()); | |||
| } | |||
| msg.add("miniprogram", miniProgramJson); | |||
| } | |||
| if (message.getData() != null) { | |||
| JsonObject data = new JsonObject(); | |||
| for (WxMaTemplateData templateData : message.getData()) { | |||
| JsonObject dataJson = new JsonObject(); | |||
| dataJson.addProperty("value", templateData.getValue()); | |||
| if (templateData.getColor() != null) { | |||
| dataJson.addProperty("color", templateData.getColor()); | |||
| } | |||
| data.add(templateData.getName(), dataJson); | |||
| } | |||
| msg.add("data", data); | |||
| } | |||
| messageJson.add("mp_template_msg", msg); | |||
| return messageJson; | |||
| } | |||
| //小程序模版消息 | |||
| JsonObject msg = new JsonObject(); | |||
| msg.addProperty("template_id", message.getTemplateId()); | |||
| if (message.getPage() != null) { | |||
| msg.addProperty("page", message.getPage()); | |||
| } | |||
| if (message.getFormId() != null) { | |||
| msg.addProperty("form_id", message.getFormId()); | |||
| } | |||
| JsonObject data = new JsonObject(); | |||
| msg.add("data", data); | |||
| if (message.getData() != null) { | |||
| for (WxMaTemplateData templateData : message.getData()) { | |||
| JsonObject dataJson = new JsonObject(); | |||
| dataJson.addProperty("value", templateData.getValue()); | |||
| if (templateData.getColor() != null) { | |||
| dataJson.addProperty("color", templateData.getColor()); | |||
| } | |||
| data.add(templateData.getName(), dataJson); | |||
| } | |||
| } | |||
| if (message.getEmphasisKeyword() != null) { | |||
| msg.addProperty("emphasis_keyword", message.getEmphasisKeyword()); | |||
| } | |||
| messageJson.add("weapp_template_msg", msg); | |||
| return messageJson; | |||
| } | |||
| } | |||
| @@ -1,17 +1,20 @@ | |||
| package cn.binarywang.wx.miniapp.api.impl; | |||
| import java.text.SimpleDateFormat; | |||
| import java.util.Date; | |||
| import org.testng.annotations.*; | |||
| import cn.binarywang.wx.miniapp.api.WxMaService; | |||
| import cn.binarywang.wx.miniapp.bean.WxMaKefuMessage; | |||
| import cn.binarywang.wx.miniapp.bean.WxMaTemplateData; | |||
| import cn.binarywang.wx.miniapp.bean.WxMaTemplateMessage; | |||
| import cn.binarywang.wx.miniapp.bean.WxMaUniformMessage; | |||
| 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.error.WxErrorException; | |||
| import org.testng.annotations.*; | |||
| import java.text.SimpleDateFormat; | |||
| import java.util.Date; | |||
| /** | |||
| * 测试消息相关接口 | |||
| @@ -45,15 +48,33 @@ public class WxMaMsgServiceImplTest { | |||
| .formId("FORMID") | |||
| .page("index") | |||
| .data(Lists.newArrayList( | |||
| new WxMaTemplateMessage.Data("keyword1", "339208499", "#173177"), | |||
| new WxMaTemplateMessage.Data("keyword2", dateFormat.format(new Date()), "#173177"), | |||
| new WxMaTemplateMessage.Data("keyword3", "粤海喜来登酒店", "#173177"), | |||
| new WxMaTemplateMessage.Data("keyword4", "广州市天河区天河路208号", "#173177"))) | |||
| new WxMaTemplateData("keyword1", "339208499", "#173177"), | |||
| new WxMaTemplateData("keyword2", dateFormat.format(new Date()), "#173177"), | |||
| new WxMaTemplateData("keyword3", "粤海喜来登酒店", "#173177"), | |||
| new WxMaTemplateData("keyword4", "广州市天河区天河路208号", "#173177"))) | |||
| .templateId(config.getTemplateId()) | |||
| .emphasisKeyword("keyword1.DATA") | |||
| .build(); | |||
| //templateMessage.addData( new WxMaTemplateMessage.Data("keyword1", "339208499", "#173177")); | |||
| //templateMessage.addData( new WxMaTemplateData("keyword1", "339208499", "#173177")); | |||
| this.wxService.getMsgService().sendTemplateMsg(templateMessage); | |||
| } | |||
| @Test | |||
| public void testSendUniformMsg() throws WxErrorException { | |||
| TestConfig config = (TestConfig) this.wxService.getWxMaConfig(); | |||
| WxMaUniformMessage message = WxMaUniformMessage.builder() | |||
| .isMpTemplateMsg(false) | |||
| .toUser(config.getOpenid()) | |||
| .page("page/page/index") | |||
| .templateId("TEMPLATE_ID") | |||
| .formId("FORMID") | |||
| .emphasisKeyword("keyword1.DATA") | |||
| .build(); | |||
| message.addData(new WxMaTemplateData("keyword1", "339208499")) | |||
| .addData(new WxMaTemplateData("keyword2", "2015年01月05日 12:30")) | |||
| .addData(new WxMaTemplateData("keyword3", "腾讯微信总部")) | |||
| .addData(new WxMaTemplateData("keyword4", "广州市海珠区新港中路397号")); | |||
| this.wxService.getMsgService().sendUniformMsg(message); | |||
| } | |||
| } | |||
| @@ -1,9 +1,10 @@ | |||
| package cn.binarywang.wx.miniapp.bean; | |||
| import org.testng.annotations.*; | |||
| import com.google.common.collect.Lists; | |||
| import org.testng.annotations.Test; | |||
| import static org.testng.AssertJUnit.assertEquals; | |||
| import static org.testng.AssertJUnit.*; | |||
| /** | |||
| * @author <a href="https://github.com/binarywang">Binary Wang</a> | |||
| @@ -17,10 +18,10 @@ public class WxMaTemplateMessageTest { | |||
| .formId("FORMID") | |||
| .page("index") | |||
| .data(Lists.newArrayList( | |||
| new WxMaTemplateMessage.Data("keyword1", "339208499", "#173177"), | |||
| new WxMaTemplateMessage.Data("keyword2", "2015年01月05日12:30", "#173177"), | |||
| new WxMaTemplateMessage.Data("keyword3", "粤海喜来登酒店", "#173177"), | |||
| new WxMaTemplateMessage.Data("keyword4", "广州市天河区天河路208号", "#173177"))) | |||
| new WxMaTemplateData("keyword1", "339208499", "#173177"), | |||
| new WxMaTemplateData("keyword2", "2015年01月05日12:30", "#173177"), | |||
| new WxMaTemplateData("keyword3", "粤海喜来登酒店", "#173177"), | |||
| new WxMaTemplateData("keyword4", "广州市天河区天河路208号", "#173177"))) | |||
| .templateId("TEMPLATE_ID") | |||
| .emphasisKeyword("keyword1.DATA") | |||
| .build(); | |||
| @@ -1,9 +1,20 @@ | |||
| package cn.binarywang.wx.miniapp.demo; | |||
| import java.io.File; | |||
| import java.io.IOException; | |||
| import java.io.InputStream; | |||
| import java.util.Map; | |||
| import java.util.concurrent.locks.ReentrantLock; | |||
| import org.eclipse.jetty.server.Server; | |||
| import org.eclipse.jetty.servlet.ServletHandler; | |||
| import org.eclipse.jetty.servlet.ServletHolder; | |||
| import cn.binarywang.wx.miniapp.api.WxMaService; | |||
| import cn.binarywang.wx.miniapp.api.impl.WxMaServiceImpl; | |||
| import cn.binarywang.wx.miniapp.bean.WxMaKefuMessage; | |||
| import cn.binarywang.wx.miniapp.bean.WxMaMessage; | |||
| import cn.binarywang.wx.miniapp.bean.WxMaTemplateData; | |||
| import cn.binarywang.wx.miniapp.bean.WxMaTemplateMessage; | |||
| import cn.binarywang.wx.miniapp.config.WxMaConfig; | |||
| import cn.binarywang.wx.miniapp.constant.WxMaConstants; | |||
| @@ -14,15 +25,6 @@ import com.google.common.collect.Lists; | |||
| import me.chanjar.weixin.common.bean.result.WxMediaUploadResult; | |||
| import me.chanjar.weixin.common.error.WxErrorException; | |||
| import me.chanjar.weixin.common.session.WxSessionManager; | |||
| import org.eclipse.jetty.server.Server; | |||
| import org.eclipse.jetty.servlet.ServletHandler; | |||
| import org.eclipse.jetty.servlet.ServletHolder; | |||
| import java.io.File; | |||
| import java.io.IOException; | |||
| import java.io.InputStream; | |||
| import java.util.Map; | |||
| import java.util.concurrent.locks.ReentrantLock; | |||
| /** | |||
| * @author <a href="https://github.com/binarywang">Binary Wang</a> | |||
| @@ -96,7 +98,7 @@ public class WxMaDemoServer { | |||
| throws WxErrorException { | |||
| service.getMsgService().sendTemplateMsg(WxMaTemplateMessage.builder() | |||
| .templateId(templateId).data(Lists.newArrayList( | |||
| new WxMaTemplateMessage.Data("keyword1", "339208499", "#173177"))) | |||
| new WxMaTemplateData("keyword1", "339208499", "#173177"))) | |||
| .toUser(wxMessage.getFromUser()) | |||
| .formId("自己替换可用的formid") | |||
| .build()); | |||
| @@ -0,0 +1,112 @@ | |||
| package cn.binarywang.wx.miniapp.util.json; | |||
| import org.testng.annotations.*; | |||
| import cn.binarywang.wx.miniapp.bean.WxMaTemplateData; | |||
| import cn.binarywang.wx.miniapp.bean.WxMaUniformMessage; | |||
| import com.google.gson.JsonParser; | |||
| import static org.assertj.core.api.Assertions.assertThat; | |||
| /** | |||
| * <pre> | |||
| * | |||
| * Created by Binary Wang on 2018/9/23. | |||
| * </pre> | |||
| * | |||
| * @author <a href="https://github.com/binarywang">Binary Wang</a> | |||
| */ | |||
| public class WxMaUniformMessageGsonAdapterTest { | |||
| @Test | |||
| public void testSerialize_mp() { | |||
| WxMaUniformMessage message = WxMaUniformMessage.builder() | |||
| .isMpTemplateMsg(true) | |||
| .toUser("OPENID") | |||
| .appid("APPID") | |||
| .templateId("TEMPLATE_ID") | |||
| .url("http://weixin.qq.com/download") | |||
| .miniProgram(new WxMaUniformMessage.MiniProgram("xiaochengxuappid12345", "index?foo=bar", false)) | |||
| .build(); | |||
| message.addData(new WxMaTemplateData("first", "恭喜你购买成功!", "#173177")) | |||
| .addData(new WxMaTemplateData("keyword1", "巧克力", "#173177")) | |||
| .addData(new WxMaTemplateData("keyword2", "39.8元", "#173177")) | |||
| .addData(new WxMaTemplateData("keyword3", "2014年9月22日", "#173177")) | |||
| .addData(new WxMaTemplateData("remark", "欢迎再次购买!", "#173177")); | |||
| assertThat(message.toJson()).isEqualTo(new JsonParser().parse("{\n" + | |||
| " \"touser\":\"OPENID\",\n" + | |||
| " \"mp_template_msg\":{\n" + | |||
| " \"appid\":\"APPID\",\n" + | |||
| " \"template_id\":\"TEMPLATE_ID\",\n" + | |||
| " \"url\":\"http://weixin.qq.com/download\",\n" + | |||
| " \"miniprogram\":{\n" + | |||
| " \"appid\":\"xiaochengxuappid12345\",\n" + | |||
| " \"pagepath\":\"index?foo=bar\"\n" + | |||
| " },\n" + | |||
| " \"data\":{\n" + | |||
| " \"first\":{\n" + | |||
| " \"value\":\"恭喜你购买成功!\",\n" + | |||
| " \"color\":\"#173177\"\n" + | |||
| " },\n" + | |||
| " \"keyword1\":{\n" + | |||
| " \"value\":\"巧克力\",\n" + | |||
| " \"color\":\"#173177\"\n" + | |||
| " },\n" + | |||
| " \"keyword2\":{\n" + | |||
| " \"value\":\"39.8元\",\n" + | |||
| " \"color\":\"#173177\"\n" + | |||
| " },\n" + | |||
| " \"keyword3\":{\n" + | |||
| " \"value\":\"2014年9月22日\",\n" + | |||
| " \"color\":\"#173177\"\n" + | |||
| " },\n" + | |||
| " \"remark\":{\n" + | |||
| " \"value\":\"欢迎再次购买!\",\n" + | |||
| " \"color\":\"#173177\"\n" + | |||
| " }\n" + | |||
| " }\n" + | |||
| " }\n" + | |||
| "}").getAsJsonObject().toString()); | |||
| } | |||
| @Test | |||
| public void testSerialize_ma() { | |||
| WxMaUniformMessage message = WxMaUniformMessage.builder() | |||
| .isMpTemplateMsg(false) | |||
| .toUser("OPENID") | |||
| .page("page/page/index") | |||
| .templateId("TEMPLATE_ID") | |||
| .formId("FORMID") | |||
| .emphasisKeyword("keyword1.DATA") | |||
| .build(); | |||
| message.addData(new WxMaTemplateData("keyword1", "339208499")) | |||
| .addData(new WxMaTemplateData("keyword2", "2015年01月05日 12:30")) | |||
| .addData(new WxMaTemplateData("keyword3", "腾讯微信总部")) | |||
| .addData(new WxMaTemplateData("keyword4", "广州市海珠区新港中路397号")); | |||
| assertThat(message.toJson()).isEqualTo(new JsonParser().parse("{\n" + | |||
| " \"touser\":\"OPENID\",\n" + | |||
| " \"weapp_template_msg\":{\n" + | |||
| " \"template_id\":\"TEMPLATE_ID\",\n" + | |||
| " \"page\":\"page/page/index\",\n" + | |||
| " \"form_id\":\"FORMID\",\n" + | |||
| " \"data\":{\n" + | |||
| " \"keyword1\":{\n" + | |||
| " \"value\":\"339208499\"\n" + | |||
| " },\n" + | |||
| " \"keyword2\":{\n" + | |||
| " \"value\":\"2015年01月05日 12:30\"\n" + | |||
| " },\n" + | |||
| " \"keyword3\":{\n" + | |||
| " \"value\":\"腾讯微信总部\"\n" + | |||
| " },\n" + | |||
| " \"keyword4\":{\n" + | |||
| " \"value\":\"广州市海珠区新港中路397号\"\n" + | |||
| " }\n" + | |||
| " },\n" + | |||
| " \"emphasis_keyword\":\"keyword1.DATA\"\n" + | |||
| " }\n" + | |||
| "}").getAsJsonObject().toString()); | |||
| } | |||
| } | |||