@@ -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_PHOTO_OR_ALBUM = "pic_photo_or_album"; | ||||
public static final String EVT_PIC_WEIXIN = "pic_weixin"; | public static final String EVT_PIC_WEIXIN = "pic_weixin"; | ||||
public static final String EVT_LOCATION_SELECT = "location_select"; | public static final String EVT_LOCATION_SELECT = "location_select"; | ||||
public static final String EVT_TEMPLATESENDJOBFINISH = "TEMPLATESENDJOBFINISH"; | |||||
/////////////////////// | /////////////////////// | ||||
// 上传多媒体文件的类型 | // 上传多媒体文件的类型 | ||||
@@ -306,7 +306,17 @@ public interface WxMpService { | |||||
* @throws WxErrorException | * @throws WxErrorException | ||||
*/ | */ | ||||
public String shortUrl(String long_url) throws WxErrorException; | public String shortUrl(String long_url) throws WxErrorException; | ||||
/** | |||||
* <pre> | |||||
* 发送模板消息 | |||||
* 详情请见: http://mp.weixin.qq.com/wiki/index.php?title=模板消息接口 | |||||
* </pre> | |||||
* @param templateMessage | |||||
* @throws WxErrorException | |||||
*/ | |||||
public void templateSend(WxMpTemplateMessage templateMessage) throws WxErrorException; | |||||
/** | /** | ||||
* 注入 {@link WxMpConfigStorage} 的实现 | * 注入 {@link WxMpConfigStorage} 的实现 | ||||
* @param wxConfigProvider | * @param wxConfigProvider | ||||
@@ -31,6 +31,7 @@ import java.io.IOException; | |||||
import java.io.InputStream; | import java.io.InputStream; | ||||
import java.io.StringReader; | import java.io.StringReader; | ||||
import java.util.List; | import java.util.List; | ||||
import java.util.Map; | |||||
import java.util.UUID; | import java.util.UUID; | ||||
import java.util.concurrent.atomic.AtomicBoolean; | import java.util.concurrent.atomic.AtomicBoolean; | ||||
@@ -272,7 +273,12 @@ public class WxMpServiceImpl implements WxMpService { | |||||
JsonElement tmpJsonElement = Streams.parse(new JsonReader(new StringReader(responseContent))); | JsonElement tmpJsonElement = Streams.parse(new JsonReader(new StringReader(responseContent))); | ||||
return tmpJsonElement.getAsJsonObject().get("short_url").getAsString(); | 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过期时才去刷新,然后重新执行请求,而不是全局定时请求 | * 向微信端发送请求,在这里执行的策略是当发生access_token过期时才去刷新,然后重新执行请求,而不是全局定时请求 | ||||
* @param executor | * @param executor | ||||
@@ -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; | |||||
} | |||||
} |
@@ -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<WxMpTemplateData> datas = new ArrayList<WxMpTemplateData>(); | |||||
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<WxMpTemplateData> getDatas() { | |||||
return datas; | |||||
} | |||||
public void setDatas(List<WxMpTemplateData> datas) { | |||||
this.datas = datas; | |||||
} | |||||
public String toJson() { | |||||
return WxMpGsonBuilder.INSTANCE.create().toJson(this); | |||||
} | |||||
} |
@@ -22,6 +22,7 @@ public class WxMpGsonBuilder { | |||||
INSTANCE.registerTypeAdapter(WxMpMassSendResult.class, new WxMpMassSendResultAdapter()); | INSTANCE.registerTypeAdapter(WxMpMassSendResult.class, new WxMpMassSendResultAdapter()); | ||||
INSTANCE.registerTypeAdapter(WxMpMassUploadResult.class, new WxMpMassUploadResultAdapter()); | INSTANCE.registerTypeAdapter(WxMpMassUploadResult.class, new WxMpMassUploadResultAdapter()); | ||||
INSTANCE.registerTypeAdapter(WxMpQrCodeTicket.class, new WxQrCodeTicketAdapter()); | INSTANCE.registerTypeAdapter(WxMpQrCodeTicket.class, new WxQrCodeTicketAdapter()); | ||||
INSTANCE.registerTypeAdapter(WxMpTemplateMessage.class, new WxMpTemplateMessageGsonAdapter()); | |||||
} | } | ||||
public static Gson create() { | public static Gson create() { | ||||
@@ -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<WxMpTemplateMessage> { | |||||
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; | |||||
} | |||||
} |