@@ -1,24 +1,28 @@ | |||
package cn.binarywang.wx.miniapp.bean; | |||
import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder; | |||
import lombok.Builder; | |||
import lombok.Data; | |||
import lombok.*; | |||
import java.io.Serializable; | |||
import java.util.ArrayList; | |||
import java.util.List; | |||
/** | |||
* 模板消息. | |||
* 参考 https://mp.weixin.qq.com/debug/wxadoc/dev/api/notice.html#接口说明 模板消息部分 | |||
* | |||
* @author <a href="https://github.com/binarywang">Binary Wang</a> | |||
*/ | |||
@Data | |||
@Getter | |||
@Setter | |||
@NoArgsConstructor | |||
@AllArgsConstructor | |||
@Builder | |||
public class WxMaTemplateMessage implements Serializable { | |||
private static final long serialVersionUID = 5063374783759519418L; | |||
/** | |||
* 接收者(用户)的 openid. | |||
* <pre> | |||
* 参数:touser | |||
* 是否必填: 是 | |||
@@ -28,6 +32,7 @@ public class WxMaTemplateMessage implements Serializable { | |||
private String toUser; | |||
/** | |||
* 所需下发的模板消息的id. | |||
* <pre> | |||
* 参数:template_id | |||
* 是否必填: 是 | |||
@@ -37,6 +42,7 @@ public class WxMaTemplateMessage implements Serializable { | |||
private String templateId; | |||
/** | |||
* 点击模板卡片后的跳转页面,仅限本小程序内的页面. | |||
* <pre> | |||
* 参数:page | |||
* 是否必填: 否 | |||
@@ -46,6 +52,7 @@ public class WxMaTemplateMessage implements Serializable { | |||
private String page; | |||
/** | |||
* 表单提交场景下,为 submit 事件带上的 formId;支付场景下,为本次支付的 prepay_id. | |||
* <pre> | |||
* 参数:form_id | |||
* 是否必填: 是 | |||
@@ -55,16 +62,17 @@ public class WxMaTemplateMessage implements Serializable { | |||
private String formId; | |||
/** | |||
* 模板内容,不填则下发空模板. | |||
* <pre> | |||
* 参数:data | |||
* 是否必填: 是 | |||
* 描述: 模板内容,不填则下发空模板 | |||
* </pre> | |||
*/ | |||
@Builder.Default | |||
private final List<Data> data = new ArrayList<>(); | |||
private List<Data> data; | |||
/** | |||
* 模板内容字体的颜色,不填默认黑色. | |||
* <pre> | |||
* 参数:color | |||
* 是否必填: 否 | |||
@@ -74,6 +82,7 @@ public class WxMaTemplateMessage implements Serializable { | |||
private String color; | |||
/** | |||
* 模板需要放大的关键词,不填则默认无放大. | |||
* <pre> | |||
* 参数:emphasis_keyword | |||
* 是否必填: 否 | |||
@@ -82,6 +91,15 @@ public class WxMaTemplateMessage implements Serializable { | |||
*/ | |||
private String emphasisKeyword; | |||
public WxMaTemplateMessage addData(Data datum) { | |||
if (this.data == null) { | |||
this.data = new ArrayList<>(); | |||
} | |||
this.data.add(datum); | |||
return this; | |||
} | |||
public String toJson() { | |||
return WxMaGsonBuilder.create().toJson(this); | |||
} | |||
@@ -66,7 +66,7 @@ public class WxMaMsgServiceImplTest { | |||
.templateId(config.getTemplateId()) | |||
.emphasisKeyword("keyword1.DATA") | |||
.build(); | |||
//templateMessage.addData( new WxMaTemplateMessage.Data("keyword1", "339208499", "#173177")); | |||
this.wxService.getMsgService().sendTemplateMsg(templateMessage); | |||
} | |||
@@ -1,7 +1,6 @@ | |||
package me.chanjar.weixin.mp.bean.template; | |||
import lombok.Builder; | |||
import lombok.Data; | |||
import lombok.*; | |||
import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; | |||
import java.io.Serializable; | |||
@@ -9,46 +8,56 @@ import java.util.ArrayList; | |||
import java.util.List; | |||
/** | |||
* 模板消息. | |||
* 参考 http://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1433751277&token=&lang=zh_CN 发送模板消息接口部分 | |||
* | |||
* @author <a href="https://github.com/binarywang">Binary Wang</a> | |||
*/ | |||
@Data | |||
@Getter | |||
@Setter | |||
@NoArgsConstructor | |||
@AllArgsConstructor | |||
@Builder | |||
public class WxMpTemplateMessage implements Serializable { | |||
private static final long serialVersionUID = 5063374783759519418L; | |||
/** | |||
* 接收者openid | |||
* 接收者openid. | |||
*/ | |||
private String toUser; | |||
/** | |||
* 模板ID | |||
* 模板ID. | |||
*/ | |||
private String templateId; | |||
/** | |||
* 模板跳转链接. | |||
* <pre> | |||
* 跳小程序所需数据,不需跳小程序可不用传该数据 | |||
* url和miniprogram都是非必填字段,若都不传则模板无跳转;若都传,会优先跳转至小程序。 | |||
* 开发者可根据实际需要选择其中一种跳转方式即可。当用户的微信客户端版本不支持跳小程序时,将会跳转至url。 | |||
* </pre> | |||
*/ | |||
private String url; | |||
/** | |||
* 模板跳转链接 | |||
* 跳小程序所需数据,不需跳小程序可不用传该数据. | |||
* | |||
* @see #url | |||
*/ | |||
private MiniProgram miniProgram; | |||
/** | |||
* 模板数据 | |||
* 模板数据. | |||
*/ | |||
@Builder.Default | |||
private final List<WxMpTemplateData> data = new ArrayList<>(); | |||
private List<WxMpTemplateData> data; | |||
public void addWxMpTemplateData(WxMpTemplateData datum) { | |||
public WxMpTemplateMessage addData(WxMpTemplateData datum) { | |||
if (this.data == null) { | |||
this.data = new ArrayList<>(); | |||
} | |||
this.data.add(datum); | |||
return this; | |||
} | |||
public String toJson() { | |||
@@ -56,17 +65,13 @@ public class WxMpTemplateMessage implements Serializable { | |||
} | |||
@Data | |||
@NoArgsConstructor | |||
@AllArgsConstructor | |||
public static class MiniProgram implements Serializable { | |||
private static final long serialVersionUID = -7945254706501974849L; | |||
private String appid; | |||
private String pagePath; | |||
public MiniProgram(String appid, String pagePath) { | |||
this.appid = appid; | |||
this.pagePath = pagePath; | |||
} | |||
} | |||
} |
@@ -10,8 +10,9 @@ import me.chanjar.weixin.mp.bean.template.WxMpTemplateData; | |||
import me.chanjar.weixin.mp.bean.template.WxMpTemplateIndustry; | |||
import me.chanjar.weixin.mp.bean.template.WxMpTemplateMessage; | |||
import org.apache.commons.lang3.RandomStringUtils; | |||
import org.testng.*; | |||
import org.testng.annotations.*; | |||
import org.testng.Assert; | |||
import org.testng.annotations.Guice; | |||
import org.testng.annotations.Test; | |||
import java.text.SimpleDateFormat; | |||
import java.util.Date; | |||
@@ -37,12 +38,12 @@ public class WxMpTemplateMsgServiceImplTest { | |||
.getWxMpConfigStorage(); | |||
WxMpTemplateMessage templateMessage = WxMpTemplateMessage.builder() | |||
.toUser(configStorage.getOpenid()) | |||
.templateId(configStorage.getTemplateId()).build(); | |||
templateMessage.addWxMpTemplateData( | |||
new WxMpTemplateData("first", dateFormat.format(new Date()), "#FF00FF")); | |||
templateMessage.addWxMpTemplateData( | |||
new WxMpTemplateData("remark", RandomStringUtils.randomAlphanumeric(100), "#FF00FF")); | |||
templateMessage.setUrl(" "); | |||
.templateId(configStorage.getTemplateId()) | |||
.url(" ") | |||
.build(); | |||
templateMessage.addData(new WxMpTemplateData("first", dateFormat.format(new Date()), "#FF00FF")) | |||
.addData(new WxMpTemplateData("remark", RandomStringUtils.randomAlphanumeric(100), "#FF00FF")); | |||
String msgId = this.wxService.getTemplateMsgService().sendTemplateMsg(templateMessage); | |||
Assert.assertNotNull(msgId); | |||
System.out.println(msgId); | |||
@@ -1,8 +1,8 @@ | |||
package me.chanjar.weixin.mp.bean.template; | |||
import org.testng.annotations.*; | |||
import org.testng.annotations.Test; | |||
import static org.testng.AssertJUnit.*; | |||
import static org.testng.AssertJUnit.assertEquals; | |||
/** | |||
* <pre> | |||
@@ -13,7 +13,7 @@ import static org.testng.AssertJUnit.*; | |||
*/ | |||
public class WxMpTemplateMessageTest { | |||
@Test | |||
public void testToJson() throws Exception { | |||
public void testToJson() { | |||
WxMpTemplateMessage tm = WxMpTemplateMessage.builder() | |||
.toUser("OPENID") | |||
.templateId("ngqIpbwh8bUfcSsECmogfXcV14J0tQlEpBO27izEYtY") | |||
@@ -21,9 +21,9 @@ public class WxMpTemplateMessageTest { | |||
.url("http://weixin.qq.com/download") | |||
.build(); | |||
tm.addWxMpTemplateData( | |||
tm.addData( | |||
new WxMpTemplateData("first", "haahah", "#FF00FF")); | |||
tm.addWxMpTemplateData( | |||
tm.addData( | |||
new WxMpTemplateData("remark", "heihei", "#FF00FF")); | |||
assertEquals(tm.toJson(), "{\"touser\":\"OPENID\",\"template_id\":\"ngqIpbwh8bUfcSsECmogfXcV14J0tQlEpBO27izEYtY\",\"url\":\"http://weixin.qq.com/download\",\"miniprogram\":{\"appid\":\"xiaochengxuappid12345\",\"pagepath\":\"index?foo=bar\"},\"data\":{\"first\":{\"value\":\"haahah\",\"color\":\"#FF00FF\"},\"remark\":{\"value\":\"heihei\",\"color\":\"#FF00FF\"}}}"); | |||