diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/api/WxConsts.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/api/WxConsts.java index 084c8ee0..8a843e94 100644 --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/api/WxConsts.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/api/WxConsts.java @@ -88,6 +88,7 @@ public class WxConsts { public static final String EVT_PIC_PHOTO_OR_ALBUM = "pic_photo_or_album"; public static final String EVT_PIC_WEIXIN = "pic_weixin"; public static final String EVT_LOCATION_SELECT = "location_select"; + public static final String EVT_TEMPLATESENDJOBFINISH = "TEMPLATESENDJOBFINISH"; /////////////////////// // 上传多媒体文件的类型 diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpService.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpService.java index 4b3a20fc..3beb5406 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpService.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpService.java @@ -306,7 +306,17 @@ public interface WxMpService { * @throws WxErrorException */ public String shortUrl(String long_url) throws WxErrorException; - + + /** + *
+   * 发送模板消息
+   * 详情请见: http://mp.weixin.qq.com/wiki/index.php?title=模板消息接口
+   * 
+ * @param templateMessage + * @throws WxErrorException + */ + public void templateSend(WxMpTemplateMessage templateMessage) throws WxErrorException; + /** * 注入 {@link WxMpConfigStorage} 的实现 * @param wxConfigProvider diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpServiceImpl.java index c40af33d..a2834a9a 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpServiceImpl.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpServiceImpl.java @@ -31,6 +31,7 @@ import java.io.IOException; import java.io.InputStream; import java.io.StringReader; import java.util.List; +import java.util.Map; import java.util.UUID; import java.util.concurrent.atomic.AtomicBoolean; @@ -272,7 +273,12 @@ public class WxMpServiceImpl implements WxMpService { JsonElement tmpJsonElement = Streams.parse(new JsonReader(new StringReader(responseContent))); return tmpJsonElement.getAsJsonObject().get("short_url").getAsString(); } - + + public void templateSend(WxMpTemplateMessage templateMessage) throws WxErrorException { + String url = "https://api.weixin.qq.com/cgi-bin/message/template/send"; + execute(new SimplePostRequestExecutor(), url, templateMessage.toJson()); + } + /** * 向微信端发送请求,在这里执行的策略是当发生access_token过期时才去刷新,然后重新执行请求,而不是全局定时请求 * @param executor diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpTemplateData.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpTemplateData.java new file mode 100644 index 00000000..e328fe85 --- /dev/null +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpTemplateData.java @@ -0,0 +1,49 @@ +package me.chanjar.weixin.mp.bean; + +/** + * @author Daniel Qian + */ +public class WxMpTemplateData { + + private String name; + private String value; + private String color; + + public WxMpTemplateData() { + } + + public WxMpTemplateData(String name, String value) { + this.name = name; + this.value = value; + } + + public WxMpTemplateData(String name, String value, String color) { + this.name = name; + this.value = value; + this.color = color; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getColor() { + return color; + } + public void setColor(String color) { + this.color = color; + } + +} diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpTemplateMessage.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpTemplateMessage.java new file mode 100644 index 00000000..cd6ac5f7 --- /dev/null +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpTemplateMessage.java @@ -0,0 +1,62 @@ +package me.chanjar.weixin.mp.bean; + +import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by qianjia on 14/11/1. + */ +public class WxMpTemplateMessage { + + private String toUser; + private String templateId; + private String url; + private String topColor; + private List datas = new ArrayList(); + + public String getToUser() { + return toUser; + } + + public void setToUser(String toUser) { + this.toUser = toUser; + } + + public String getTemplateId() { + return templateId; + } + + public void setTemplateId(String templateId) { + this.templateId = templateId; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public String getTopColor() { + return topColor; + } + + public void setTopColor(String topColor) { + this.topColor = topColor; + } + + public List getDatas() { + return datas; + } + + public void setDatas(List datas) { + this.datas = datas; + } + + public String toJson() { + return WxMpGsonBuilder.INSTANCE.create().toJson(this); + } +} diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpGsonBuilder.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpGsonBuilder.java index 021b660d..dc2367b6 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpGsonBuilder.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpGsonBuilder.java @@ -22,6 +22,7 @@ public class WxMpGsonBuilder { INSTANCE.registerTypeAdapter(WxMpMassSendResult.class, new WxMpMassSendResultAdapter()); INSTANCE.registerTypeAdapter(WxMpMassUploadResult.class, new WxMpMassUploadResultAdapter()); INSTANCE.registerTypeAdapter(WxMpQrCodeTicket.class, new WxQrCodeTicketAdapter()); + INSTANCE.registerTypeAdapter(WxMpTemplateMessage.class, new WxMpTemplateMessageGsonAdapter()); } public static Gson create() { diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpTemplateMessageGsonAdapter.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpTemplateMessageGsonAdapter.java new file mode 100644 index 00000000..ad603d3b --- /dev/null +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpTemplateMessageGsonAdapter.java @@ -0,0 +1,50 @@ +/* + * KINGSTAR MEDIA SOLUTIONS Co.,LTD. Copyright c 2005-2013. All rights reserved. + * + * This source code is the property of KINGSTAR MEDIA SOLUTIONS LTD. It is intended + * only for the use of KINGSTAR MEDIA application development. Reengineering, reproduction + * arose from modification of the original source, or other redistribution of this source + * is not permitted without written permission of the KINGSTAR MEDIA SOLUTIONS LTD. + */ +package me.chanjar.weixin.mp.util.json; + +import com.google.gson.*; +import me.chanjar.weixin.common.api.WxConsts; +import me.chanjar.weixin.mp.bean.WxMpCustomMessage; +import me.chanjar.weixin.mp.bean.WxMpTemplateData; +import me.chanjar.weixin.mp.bean.WxMpTemplateMessage; + +import java.lang.reflect.Type; + +/** + * @author qianjia + */ +public class WxMpTemplateMessageGsonAdapter implements JsonSerializer { + + public JsonElement serialize(WxMpTemplateMessage message, Type typeOfSrc, JsonSerializationContext context) { + JsonObject messageJson = new JsonObject(); + messageJson.addProperty("touser", message.getToUser()); + messageJson.addProperty("template_id", message.getTemplateId()); + if (message.getUrl() != null) { + messageJson.addProperty("url", message.getUrl()); + } + if (message.getTopColor() != null) { + messageJson.addProperty("topcolor", message.getTopColor()); + } + + JsonObject datas = new JsonObject(); + messageJson.add("data", datas); + + for (WxMpTemplateData data : message.getDatas()) { + JsonObject dataJson = new JsonObject(); + dataJson.addProperty("value", data.getValue()); + if (data.getColor() != null) { + dataJson.addProperty("color", data.getColor()); + } + datas.add(data.getName(), dataJson); + } + + return messageJson; + } + +}