@@ -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()); | |||
} | |||
} |