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