| @@ -17,7 +17,6 @@ public class WxConsts { | |||
| public static final String XML_MSG_LOCATION = "location"; | |||
| public static final String XML_MSG_LINK = "link"; | |||
| public static final String XML_MSG_EVENT = "event"; | |||
| public static final String XML_TRANSFER_CUSTOMER_SERVICE = "transfer_customer_service"; | |||
| /////////////////////// | |||
| // 客服消息的消息类型 | |||
| @@ -28,49 +27,8 @@ public class WxConsts { | |||
| public static final String CUSTOM_MSG_VIDEO = "video"; | |||
| public static final String CUSTOM_MSG_MUSIC = "music"; | |||
| public static final String CUSTOM_MSG_NEWS = "news"; | |||
| /////////////////////// | |||
| // 群发消息的消息类型 | |||
| /////////////////////// | |||
| public static final String MASS_MSG_NEWS = "mpnews"; | |||
| public static final String MASS_MSG_TEXT = "text"; | |||
| public static final String MASS_MSG_VOICE = "voice"; | |||
| public static final String MASS_MSG_IMAGE = "image"; | |||
| public static final String MASS_MSG_VIDEO = "mpvideo"; | |||
| /////////////////////// | |||
| // 群发消息后微信端推送给服务器的反馈消息 | |||
| /////////////////////// | |||
| public static final String MASS_ST_SUCCESS = "send success"; | |||
| public static final String MASS_ST_FAIL = "send fail"; | |||
| public static final String MASS_ST_涉嫌广告 = "err(10001)"; | |||
| public static final String MASS_ST_涉嫌政治 = "err(20001)"; | |||
| public static final String MASS_ST_涉嫌社会 = "err(20004)"; | |||
| public static final String MASS_ST_涉嫌色情 = "err(20002)"; | |||
| public static final String MASS_ST_涉嫌违法犯罪 = "err(20006)"; | |||
| public static final String MASS_ST_涉嫌欺诈 = "err(20008)"; | |||
| public static final String MASS_ST_涉嫌版权 = "err(20013)"; | |||
| public static final String MASS_ST_涉嫌互推_互相宣传 = "err(22000)"; | |||
| public static final String MASS_ST_涉嫌其他 = "err(21000)"; | |||
| /** | |||
| * 群发反馈消息代码所对应的文字描述 | |||
| */ | |||
| public static final Map<String, String> MASS_ST_2_DESC = new HashMap<String, String>(); | |||
| static { | |||
| MASS_ST_2_DESC.put(MASS_ST_SUCCESS, "发送成功"); | |||
| MASS_ST_2_DESC.put(MASS_ST_FAIL, "发送失败"); | |||
| MASS_ST_2_DESC.put(MASS_ST_涉嫌广告, "涉嫌广告"); | |||
| MASS_ST_2_DESC.put(MASS_ST_涉嫌政治, "涉嫌政治"); | |||
| MASS_ST_2_DESC.put(MASS_ST_涉嫌社会, "涉嫌社会"); | |||
| MASS_ST_2_DESC.put(MASS_ST_涉嫌色情, "涉嫌色情"); | |||
| MASS_ST_2_DESC.put(MASS_ST_涉嫌违法犯罪, "涉嫌违法犯罪"); | |||
| MASS_ST_2_DESC.put(MASS_ST_涉嫌欺诈, "涉嫌欺诈"); | |||
| MASS_ST_2_DESC.put(MASS_ST_涉嫌版权, "涉嫌版权"); | |||
| MASS_ST_2_DESC.put(MASS_ST_涉嫌互推_互相宣传, "涉嫌互推_互相宣传"); | |||
| MASS_ST_2_DESC.put(MASS_ST_涉嫌其他, "涉嫌其他"); | |||
| } | |||
| public static final String CUSTOM_MSG_FILE = "file"; | |||
| /////////////////////// | |||
| // 微信端推送过来的事件类型 | |||
| /////////////////////// | |||
| @@ -6,7 +6,7 @@ import java.io.InputStream; | |||
| import java.util.List; | |||
| import me.chanjar.weixin.enterprise.bean.*; | |||
| import me.chanjar.weixin.enterprise.bean.WxDepartment; | |||
| import me.chanjar.weixin.enterprise.bean.WxCpDepartment; | |||
| import me.chanjar.weixin.enterprise.bean.result.WxMediaUploadResult; | |||
| import me.chanjar.weixin.enterprise.bean.result.WxUser; | |||
| import me.chanjar.weixin.enterprise.exception.WxErrorException; | |||
| @@ -91,7 +91,7 @@ public interface WxCpService { | |||
| * @param message | |||
| * @throws WxErrorException | |||
| */ | |||
| public void messageSend(WxCustomMessage message) throws WxErrorException; | |||
| public void messageSend(WxCpMessage message) throws WxErrorException; | |||
| /** | |||
| * <pre> | |||
| @@ -131,7 +131,7 @@ public interface WxCpService { | |||
| * @param name 分组名字(30个字符以内) | |||
| * @throws WxErrorException | |||
| */ | |||
| public WxDepartment departmentCreate(String name) throws WxErrorException; | |||
| public WxCpDepartment departmentCreate(String name) throws WxErrorException; | |||
| /** | |||
| * <pre> | |||
| @@ -141,7 +141,7 @@ public interface WxCpService { | |||
| * @return | |||
| * @throws WxErrorException | |||
| */ | |||
| public List<WxDepartment> departmentGet() throws WxErrorException; | |||
| public List<WxCpDepartment> departmentGet() throws WxErrorException; | |||
| /** | |||
| * <pre> | |||
| @@ -153,7 +153,7 @@ public interface WxCpService { | |||
| * @param group 要更新的group,group的id,name必须设置 | |||
| * @throws WxErrorException | |||
| */ | |||
| public void departmentUpdate(WxDepartment group) throws WxErrorException; | |||
| public void departmentUpdate(WxCpDepartment group) throws WxErrorException; | |||
| /** | |||
| * <pre> | |||
| @@ -163,7 +163,7 @@ public interface WxCpService { | |||
| * @param department | |||
| * @throws WxErrorException | |||
| */ | |||
| public void departmentDelete(WxDepartment department) throws WxErrorException; | |||
| public void departmentDelete(WxCpDepartment department) throws WxErrorException; | |||
| public void userCreate(WxUser user) throws WxErrorException; | |||
| @@ -9,7 +9,6 @@ import java.util.UUID; | |||
| import java.util.concurrent.atomic.AtomicBoolean; | |||
| import me.chanjar.weixin.enterprise.bean.*; | |||
| import me.chanjar.weixin.enterprise.util.crypto.WxCryptUtil; | |||
| import me.chanjar.weixin.enterprise.util.http.SimpleGetRequestExecutor; | |||
| import me.chanjar.weixin.enterprise.util.crypto.SHA1; | |||
| import org.apache.commons.lang3.StringUtils; | |||
| @@ -20,7 +19,7 @@ import org.apache.http.impl.client.BasicResponseHandler; | |||
| import org.apache.http.impl.client.CloseableHttpClient; | |||
| import org.apache.http.impl.client.HttpClients; | |||
| import me.chanjar.weixin.enterprise.bean.WxDepartment; | |||
| import me.chanjar.weixin.enterprise.bean.WxCpDepartment; | |||
| import me.chanjar.weixin.enterprise.bean.result.WxError; | |||
| import me.chanjar.weixin.enterprise.bean.result.WxMediaUploadResult; | |||
| import me.chanjar.weixin.enterprise.bean.result.WxUser; | |||
| @@ -98,8 +97,8 @@ public class WxCpServiceImpl implements WxCpService { | |||
| } | |||
| } | |||
| public void messageSend(WxCustomMessage message) throws WxErrorException { | |||
| String url = "https://api.weixin.qq.com/cgi-bin/message/custom/send"; | |||
| public void messageSend(WxCpMessage message) throws WxErrorException { | |||
| String url = "https://qyapi.weixin.qq.com/cgi-bin/message/send"; | |||
| execute(new SimplePostRequestExecutor(), url, message.toJson()); | |||
| } | |||
| @@ -143,7 +142,7 @@ public class WxCpServiceImpl implements WxCpService { | |||
| } | |||
| public WxDepartment departmentCreate(String name) throws WxErrorException { | |||
| public WxCpDepartment departmentCreate(String name) throws WxErrorException { | |||
| // TODO | |||
| String url = "https://api.weixin.qq.com/cgi-bin/groups/create"; | |||
| JsonObject json = new JsonObject(); | |||
| @@ -155,16 +154,16 @@ public class WxCpServiceImpl implements WxCpService { | |||
| new SimplePostRequestExecutor(), | |||
| url, | |||
| json.toString()); | |||
| return WxDepartment.fromJson(responseContent); | |||
| return WxCpDepartment.fromJson(responseContent); | |||
| } | |||
| public void departmentUpdate(WxDepartment group) throws WxErrorException { | |||
| public void departmentUpdate(WxCpDepartment group) throws WxErrorException { | |||
| // TODO | |||
| String url = "https://api.weixin.qq.com/cgi-bin/groups/update"; | |||
| execute(new SimplePostRequestExecutor(), url, group.toJson()); | |||
| } | |||
| public List<WxDepartment> departmentGet() throws WxErrorException { | |||
| public List<WxCpDepartment> departmentGet() throws WxErrorException { | |||
| // TODO | |||
| String url = "https://api.weixin.qq.com/cgi-bin/groups/get"; | |||
| String responseContent = execute(new SimpleGetRequestExecutor(), url, null); | |||
| @@ -174,11 +173,11 @@ public class WxCpServiceImpl implements WxCpService { | |||
| */ | |||
| JsonElement tmpJsonElement = Streams.parse(new JsonReader(new StringReader(responseContent))); | |||
| return WxGsonBuilder.INSTANCE.create() | |||
| .fromJson(tmpJsonElement.getAsJsonObject().get("groups"), new TypeToken<List<WxDepartment>>() { | |||
| .fromJson(tmpJsonElement.getAsJsonObject().get("groups"), new TypeToken<List<WxCpDepartment>>() { | |||
| }.getType()); | |||
| } | |||
| public void departmentDelete(WxDepartment department) throws WxErrorException { | |||
| public void departmentDelete(WxCpDepartment department) throws WxErrorException { | |||
| // TODO | |||
| } | |||
| @@ -82,4 +82,17 @@ public class WxInMemoryCpConfigStorage implements WxCpConfigStorage { | |||
| public void setAgentId(String agentId) { | |||
| this.agentId = agentId; | |||
| } | |||
| @Override | |||
| public String toString() { | |||
| return "WxInMemoryCpConfigStorage{" + | |||
| "corpId='" + corpId + '\'' + | |||
| ", corpSecret='" + corpSecret + '\'' + | |||
| ", token='" + token + '\'' + | |||
| ", accessToken='" + accessToken + '\'' + | |||
| ", aesKey='" + aesKey + '\'' + | |||
| ", agentId='" + agentId + '\'' + | |||
| ", expiresIn=" + expiresIn + | |||
| '}'; | |||
| } | |||
| } | |||
| @@ -7,7 +7,7 @@ import me.chanjar.weixin.enterprise.util.json.WxGsonBuilder; | |||
| * @author Daniel Qian | |||
| * | |||
| */ | |||
| public class WxDepartment { | |||
| public class WxCpDepartment { | |||
| private long id = -1; | |||
| private String name; | |||
| @@ -31,8 +31,8 @@ public class WxDepartment { | |||
| this.count = count; | |||
| } | |||
| public static WxDepartment fromJson(String json) { | |||
| return WxGsonBuilder.create().fromJson(json, WxDepartment.class); | |||
| public static WxCpDepartment fromJson(String json) { | |||
| return WxGsonBuilder.create().fromJson(json, WxCpDepartment.class); | |||
| } | |||
| public String toJson() { | |||
| @@ -4,12 +4,7 @@ import java.util.ArrayList; | |||
| import java.util.List; | |||
| import me.chanjar.weixin.enterprise.api.WxConsts; | |||
| import me.chanjar.weixin.enterprise.bean.custombuilder.ImageBuilder; | |||
| import me.chanjar.weixin.enterprise.bean.custombuilder.MusicBuilder; | |||
| import me.chanjar.weixin.enterprise.bean.custombuilder.NewsBuilder; | |||
| import me.chanjar.weixin.enterprise.bean.custombuilder.TextBuilder; | |||
| import me.chanjar.weixin.enterprise.bean.custombuilder.VideoBuilder; | |||
| import me.chanjar.weixin.enterprise.bean.custombuilder.VoiceBuilder; | |||
| import me.chanjar.weixin.enterprise.bean.messagebuilder.*; | |||
| import me.chanjar.weixin.enterprise.util.json.WxGsonBuilder; | |||
| /** | |||
| @@ -17,9 +12,12 @@ import me.chanjar.weixin.enterprise.util.json.WxGsonBuilder; | |||
| * @author Daniel Qian | |||
| * | |||
| */ | |||
| public class WxCustomMessage { | |||
| public class WxCpMessage { | |||
| private String toUser; | |||
| private String toParty; | |||
| private String toTag; | |||
| private String agentId; | |||
| private String msgType; | |||
| private String content; | |||
| private String mediaId; | |||
| @@ -36,6 +34,31 @@ public class WxCustomMessage { | |||
| public void setToUser(String toUser) { | |||
| this.toUser = toUser; | |||
| } | |||
| public String getToParty() { | |||
| return toParty; | |||
| } | |||
| public void setToParty(String toParty) { | |||
| this.toParty = toParty; | |||
| } | |||
| public String getToTag() { | |||
| return toTag; | |||
| } | |||
| public void setToTag(String toTag) { | |||
| this.toTag = toTag; | |||
| } | |||
| public String getAgentId() { | |||
| return agentId; | |||
| } | |||
| public void setAgentId(String agentId) { | |||
| this.agentId = agentId; | |||
| } | |||
| public String getMsgType() { | |||
| return msgType; | |||
| } | |||
| @@ -189,5 +212,13 @@ public class WxCustomMessage { | |||
| public static NewsBuilder NEWS() { | |||
| return new NewsBuilder(); | |||
| } | |||
| /** | |||
| * 获得文件消息builder | |||
| * @return | |||
| */ | |||
| public static FileBuilder FILE() { | |||
| return new FileBuilder(); | |||
| } | |||
| } | |||
| @@ -1,20 +0,0 @@ | |||
| package me.chanjar.weixin.enterprise.bean.custombuilder; | |||
| import me.chanjar.weixin.enterprise.bean.WxCustomMessage; | |||
| public class BaseBuilder<T> { | |||
| protected String msgType; | |||
| protected String toUser; | |||
| public T toUser(String toUser) { | |||
| this.toUser = toUser; | |||
| return (T) this; | |||
| } | |||
| public WxCustomMessage build() { | |||
| WxCustomMessage m = new WxCustomMessage(); | |||
| m.setMsgType(this.msgType); | |||
| m.setToUser(this.toUser); | |||
| return m; | |||
| } | |||
| } | |||
| @@ -0,0 +1,42 @@ | |||
| package me.chanjar.weixin.enterprise.bean.messagebuilder; | |||
| import me.chanjar.weixin.enterprise.bean.WxCpMessage; | |||
| public class BaseBuilder<T> { | |||
| protected String msgType; | |||
| protected String agentId; | |||
| protected String toUser; | |||
| protected String toParty; | |||
| protected String toTag; | |||
| public T agentId(String agentId) { | |||
| this.agentId = agentId; | |||
| return (T) this; | |||
| } | |||
| public T toUser(String toUser) { | |||
| this.toUser = toUser; | |||
| return (T) this; | |||
| } | |||
| public T toParty(String toParty) { | |||
| this.toParty = toParty; | |||
| return (T) this; | |||
| } | |||
| public T toTag(String toTag) { | |||
| this.toTag = toTag; | |||
| return (T) this; | |||
| } | |||
| public WxCpMessage build() { | |||
| WxCpMessage m = new WxCpMessage(); | |||
| m.setAgentId(this.agentId); | |||
| m.setMsgType(this.msgType); | |||
| m.setToUser(this.toUser); | |||
| m.setToParty(this.toParty); | |||
| m.setToTag(this.toTag); | |||
| return m; | |||
| } | |||
| } | |||
| @@ -0,0 +1,31 @@ | |||
| package me.chanjar.weixin.enterprise.bean.messagebuilder; | |||
| import me.chanjar.weixin.enterprise.api.WxConsts; | |||
| import me.chanjar.weixin.enterprise.bean.WxCpMessage; | |||
| /** | |||
| * 获得消息builder | |||
| * <pre> | |||
| * 用法: WxCustomMessage m = WxCustomMessage.FILE().mediaId(...).toUser(...).build(); | |||
| * </pre> | |||
| * @author Daniel Qian | |||
| * | |||
| */ | |||
| public final class FileBuilder extends BaseBuilder<FileBuilder> { | |||
| private String mediaId; | |||
| public FileBuilder() { | |||
| this.msgType = WxConsts.CUSTOM_MSG_FILE; | |||
| } | |||
| public FileBuilder mediaId(String media_id) { | |||
| this.mediaId = media_id; | |||
| return this; | |||
| } | |||
| public WxCpMessage build() { | |||
| WxCpMessage m = super.build(); | |||
| m.setMediaId(this.mediaId); | |||
| return m; | |||
| } | |||
| } | |||
| @@ -1,7 +1,7 @@ | |||
| package me.chanjar.weixin.enterprise.bean.custombuilder; | |||
| package me.chanjar.weixin.enterprise.bean.messagebuilder; | |||
| import me.chanjar.weixin.enterprise.api.WxConsts; | |||
| import me.chanjar.weixin.enterprise.bean.WxCustomMessage; | |||
| import me.chanjar.weixin.enterprise.bean.WxCpMessage; | |||
| /** | |||
| * 获得消息builder | |||
| @@ -23,8 +23,8 @@ public final class ImageBuilder extends BaseBuilder<ImageBuilder> { | |||
| return this; | |||
| } | |||
| public WxCustomMessage build() { | |||
| WxCustomMessage m = super.build(); | |||
| public WxCpMessage build() { | |||
| WxCpMessage m = super.build(); | |||
| m.setMediaId(this.mediaId); | |||
| return m; | |||
| } | |||
| @@ -1,7 +1,7 @@ | |||
| package me.chanjar.weixin.enterprise.bean.custombuilder; | |||
| package me.chanjar.weixin.enterprise.bean.messagebuilder; | |||
| import me.chanjar.weixin.enterprise.api.WxConsts; | |||
| import me.chanjar.weixin.enterprise.bean.WxCustomMessage; | |||
| import me.chanjar.weixin.enterprise.bean.WxCpMessage; | |||
| /** | |||
| * 音乐消息builder | |||
| @@ -52,8 +52,8 @@ public final class MusicBuilder extends BaseBuilder<MusicBuilder> { | |||
| return this; | |||
| } | |||
| public WxCustomMessage build() { | |||
| WxCustomMessage m = super.build(); | |||
| public WxCpMessage build() { | |||
| WxCpMessage m = super.build(); | |||
| m.setMusicUrl(this.musicUrl); | |||
| m.setHqMusicUrl(this.hqMusicUrl); | |||
| m.setTitle(title); | |||
| @@ -1,10 +1,10 @@ | |||
| package me.chanjar.weixin.enterprise.bean.custombuilder; | |||
| package me.chanjar.weixin.enterprise.bean.messagebuilder; | |||
| import java.util.ArrayList; | |||
| import java.util.List; | |||
| import me.chanjar.weixin.enterprise.api.WxConsts; | |||
| import me.chanjar.weixin.enterprise.bean.WxCustomMessage; | |||
| import me.chanjar.weixin.enterprise.bean.WxCpMessage; | |||
| /** | |||
| * 图文消息builder | |||
| @@ -17,19 +17,19 @@ import me.chanjar.weixin.enterprise.bean.WxCustomMessage; | |||
| */ | |||
| public final class NewsBuilder extends BaseBuilder<NewsBuilder> { | |||
| private List<WxCustomMessage.WxArticle> articles = new ArrayList<WxCustomMessage.WxArticle>(); | |||
| private List<WxCpMessage.WxArticle> articles = new ArrayList<WxCpMessage.WxArticle>(); | |||
| public NewsBuilder() { | |||
| this.msgType = WxConsts.CUSTOM_MSG_NEWS; | |||
| } | |||
| public NewsBuilder addArticle(WxCustomMessage.WxArticle article) { | |||
| public NewsBuilder addArticle(WxCpMessage.WxArticle article) { | |||
| this.articles.add(article); | |||
| return this; | |||
| } | |||
| public WxCustomMessage build() { | |||
| WxCustomMessage m = super.build(); | |||
| public WxCpMessage build() { | |||
| WxCpMessage m = super.build(); | |||
| m.setArticles(this.articles); | |||
| return m; | |||
| } | |||
| @@ -1,7 +1,7 @@ | |||
| package me.chanjar.weixin.enterprise.bean.custombuilder; | |||
| package me.chanjar.weixin.enterprise.bean.messagebuilder; | |||
| import me.chanjar.weixin.enterprise.api.WxConsts; | |||
| import me.chanjar.weixin.enterprise.bean.WxCustomMessage; | |||
| import me.chanjar.weixin.enterprise.bean.WxCpMessage; | |||
| /** | |||
| * 文本消息builder | |||
| @@ -23,8 +23,8 @@ public final class TextBuilder extends BaseBuilder<TextBuilder> { | |||
| return this; | |||
| } | |||
| public WxCustomMessage build() { | |||
| WxCustomMessage m = super.build(); | |||
| public WxCpMessage build() { | |||
| WxCpMessage m = super.build(); | |||
| m.setContent(this.content); | |||
| return m; | |||
| } | |||
| @@ -1,7 +1,7 @@ | |||
| package me.chanjar.weixin.enterprise.bean.custombuilder; | |||
| package me.chanjar.weixin.enterprise.bean.messagebuilder; | |||
| import me.chanjar.weixin.enterprise.api.WxConsts; | |||
| import me.chanjar.weixin.enterprise.bean.WxCustomMessage; | |||
| import me.chanjar.weixin.enterprise.bean.WxCpMessage; | |||
| /** | |||
| * 视频消息builder | |||
| @@ -47,8 +47,8 @@ public final class VideoBuilder extends BaseBuilder<VideoBuilder> { | |||
| return this; | |||
| } | |||
| public WxCustomMessage build() { | |||
| WxCustomMessage m = super.build(); | |||
| public WxCpMessage build() { | |||
| WxCpMessage m = super.build(); | |||
| m.setMediaId(this.mediaId); | |||
| m.setTitle(title); | |||
| m.setDescription(description); | |||
| @@ -1,7 +1,7 @@ | |||
| package me.chanjar.weixin.enterprise.bean.custombuilder; | |||
| package me.chanjar.weixin.enterprise.bean.messagebuilder; | |||
| import me.chanjar.weixin.enterprise.api.WxConsts; | |||
| import me.chanjar.weixin.enterprise.bean.WxCustomMessage; | |||
| import me.chanjar.weixin.enterprise.bean.WxCpMessage; | |||
| /** | |||
| * 语音消息builder | |||
| @@ -23,8 +23,8 @@ public final class VoiceBuilder extends BaseBuilder<VoiceBuilder> { | |||
| return this; | |||
| } | |||
| public WxCustomMessage build() { | |||
| WxCustomMessage m = super.build(); | |||
| public WxCpMessage build() { | |||
| WxCpMessage m = super.build(); | |||
| m.setMediaId(this.mediaId); | |||
| return m; | |||
| } | |||
| @@ -11,26 +11,36 @@ package me.chanjar.weixin.enterprise.util.json; | |||
| import java.lang.reflect.Type; | |||
| import me.chanjar.weixin.enterprise.api.WxConsts; | |||
| import me.chanjar.weixin.enterprise.bean.WxCustomMessage; | |||
| import me.chanjar.weixin.enterprise.bean.WxCpMessage; | |||
| import com.google.gson.JsonArray; | |||
| import com.google.gson.JsonElement; | |||
| import com.google.gson.JsonObject; | |||
| import com.google.gson.JsonSerializationContext; | |||
| import com.google.gson.JsonSerializer; | |||
| import org.apache.commons.lang3.StringUtils; | |||
| /** | |||
| * | |||
| * @author Daniel Qian | |||
| * | |||
| */ | |||
| public class WxCustomMessageGsonAdapter implements JsonSerializer<WxCustomMessage> { | |||
| public class WxCpMessageGsonAdapter implements JsonSerializer<WxCpMessage> { | |||
| public JsonElement serialize(WxCustomMessage message, Type typeOfSrc, JsonSerializationContext context) { | |||
| public JsonElement serialize(WxCpMessage message, Type typeOfSrc, JsonSerializationContext context) { | |||
| JsonObject messageJson = new JsonObject(); | |||
| messageJson.addProperty("touser", message.getToUser()); | |||
| messageJson.addProperty("agentid", message.getAgentId()); | |||
| messageJson.addProperty("msgtype", message.getMsgType()); | |||
| if (StringUtils.isNotBlank(message.getToUser())) { | |||
| messageJson.addProperty("touser", message.getToUser()); | |||
| } | |||
| if (StringUtils.isNotBlank(message.getToParty())) { | |||
| messageJson.addProperty("toparty", message.getToUser()); | |||
| } | |||
| if (StringUtils.isNotBlank(message.getToTag())) { | |||
| messageJson.addProperty("totag", message.getToUser()); | |||
| } | |||
| if (WxConsts.CUSTOM_MSG_TEXT.equals(message.getMsgType())) { | |||
| JsonObject text = new JsonObject(); | |||
| text.addProperty("content", message.getContent()); | |||
| @@ -43,6 +53,12 @@ public class WxCustomMessageGsonAdapter implements JsonSerializer<WxCustomMessag | |||
| messageJson.add("image", image); | |||
| } | |||
| if (WxConsts.CUSTOM_MSG_FILE.equals(message.getMsgType())) { | |||
| JsonObject image = new JsonObject(); | |||
| image.addProperty("media_id", message.getMediaId()); | |||
| messageJson.add("file", image); | |||
| } | |||
| if (WxConsts.CUSTOM_MSG_VOICE.equals(message.getMsgType())) { | |||
| JsonObject voice = new JsonObject(); | |||
| voice.addProperty("media_id", message.getMediaId()); | |||
| @@ -70,7 +86,7 @@ public class WxCustomMessageGsonAdapter implements JsonSerializer<WxCustomMessag | |||
| if (WxConsts.CUSTOM_MSG_NEWS.equals(message.getMsgType())) { | |||
| JsonArray articleJsonArray = new JsonArray(); | |||
| for (WxCustomMessage.WxArticle article : message.getArticles()) { | |||
| for (WxCpMessage.WxArticle article : message.getArticles()) { | |||
| JsonObject articleJson = new JsonObject(); | |||
| articleJson.addProperty("title", article.getTitle()); | |||
| articleJson.addProperty("description", article.getDescription()); | |||
| @@ -10,7 +10,7 @@ package me.chanjar.weixin.enterprise.util.json; | |||
| import java.lang.reflect.Type; | |||
| import me.chanjar.weixin.enterprise.bean.WxDepartment; | |||
| import me.chanjar.weixin.enterprise.bean.WxCpDepartment; | |||
| import com.google.gson.JsonDeserializationContext; | |||
| import com.google.gson.JsonDeserializer; | |||
| @@ -25,9 +25,9 @@ import com.google.gson.JsonSerializer; | |||
| * @author Daniel Qian | |||
| * | |||
| */ | |||
| public class WxGroupGsonAdapter implements JsonSerializer<WxDepartment>, JsonDeserializer<WxDepartment> { | |||
| public class WxGroupGsonAdapter implements JsonSerializer<WxCpDepartment>, JsonDeserializer<WxCpDepartment> { | |||
| public JsonElement serialize(WxDepartment group, Type typeOfSrc, JsonSerializationContext context) { | |||
| public JsonElement serialize(WxCpDepartment group, Type typeOfSrc, JsonSerializationContext context) { | |||
| JsonObject json = new JsonObject(); | |||
| JsonObject groupJson = new JsonObject(); | |||
| groupJson.addProperty("name", group.getName()); | |||
| @@ -37,8 +37,8 @@ public class WxGroupGsonAdapter implements JsonSerializer<WxDepartment>, JsonDes | |||
| return json; | |||
| } | |||
| public WxDepartment deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { | |||
| WxDepartment group = new WxDepartment(); | |||
| public WxCpDepartment deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { | |||
| WxCpDepartment group = new WxCpDepartment(); | |||
| JsonObject groupJson = json.getAsJsonObject(); | |||
| if (json.getAsJsonObject().get("group") != null) { | |||
| groupJson = json.getAsJsonObject().get("group").getAsJsonObject(); | |||
| @@ -12,12 +12,12 @@ public class WxGsonBuilder { | |||
| static { | |||
| INSTANCE.disableHtmlEscaping(); | |||
| INSTANCE.registerTypeAdapter(WxCustomMessage.class, new WxCustomMessageGsonAdapter()); | |||
| INSTANCE.registerTypeAdapter(WxCpMessage.class, new WxCpMessageGsonAdapter()); | |||
| INSTANCE.registerTypeAdapter(WxMenu.class, new WxMenuGsonAdapter()); | |||
| INSTANCE.registerTypeAdapter(WxMassNews.class, new WxMassNewsGsonAdapter()); | |||
| INSTANCE.registerTypeAdapter(WxMassGroupMessage.class, new WxMassMessageGsonAdapter()); | |||
| INSTANCE.registerTypeAdapter(WxMassOpenIdsMessage.class, new WxMassOpenIdsMessageGsonAdapter()); | |||
| INSTANCE.registerTypeAdapter(WxDepartment.class, new WxGroupGsonAdapter()); | |||
| INSTANCE.registerTypeAdapter(WxCpDepartment.class, new WxGroupGsonAdapter()); | |||
| INSTANCE.registerTypeAdapter(WxUser.class, new WxUserGsonAdapter()); | |||
| INSTANCE.registerTypeAdapter(WxUserList.class, new WxUserListGsonAdapter()); | |||
| INSTANCE.registerTypeAdapter(WxAccessToken.class, new WxAccessTokenAdapter()); | |||
| @@ -42,20 +42,43 @@ public class ApiTestModule implements Module { | |||
| @XmlAccessorType(XmlAccessType.FIELD) | |||
| public static class WxXmlCpConfigStorage extends WxInMemoryCpConfigStorage { | |||
| protected String openId; | |||
| protected String userId; | |||
| public String getOpenId() { | |||
| return openId; | |||
| protected String departmentId; | |||
| protected String tagId; | |||
| public String getUserId() { | |||
| return userId; | |||
| } | |||
| public void setUserId(String userId) { | |||
| this.userId = userId; | |||
| } | |||
| public void setOpenId(String openId) { | |||
| this.openId = openId; | |||
| public String getDepartmentId() { | |||
| return departmentId; | |||
| } | |||
| public void setDepartmentId(String departmentId) { | |||
| this.departmentId = departmentId; | |||
| } | |||
| public String getTagId() { | |||
| return tagId; | |||
| } | |||
| public void setTagId(String tagId) { | |||
| this.tagId = tagId; | |||
| } | |||
| @Override | |||
| public String toString() { | |||
| return "SimpleWxConfigProvider [corpId=" + corpId + ", corpSecret=" + corpSecret + ", accessToken=" + accessToken | |||
| + ", expiresIn=" + expiresIn + ", token=" + token + ", openId=" + openId + "]"; | |||
| return super.toString() + " > WxXmlCpConfigStorage{" + | |||
| "userId='" + userId + '\'' + | |||
| ", departmentId='" + departmentId + '\'' + | |||
| ", tagId='" + tagId + '\'' + | |||
| '}'; | |||
| } | |||
| } | |||
| } | |||
| @@ -0,0 +1,42 @@ | |||
| package me.chanjar.weixin.enterprise.api; | |||
| import me.chanjar.weixin.enterprise.bean.WxCpMessage; | |||
| import org.testng.annotations.Guice; | |||
| import org.testng.annotations.Test; | |||
| import me.chanjar.weixin.enterprise.exception.WxErrorException; | |||
| import com.google.inject.Inject; | |||
| /*** | |||
| * 测试发送客服消息 | |||
| * @author Daniel Qian | |||
| * | |||
| */ | |||
| @Test(groups="customMessageAPI", dependsOnGroups = "baseAPI") | |||
| @Guice(modules = ApiTestModule.class) | |||
| public class WxCpMessageAPITest { | |||
| @Inject | |||
| protected WxCpServiceImpl wxService; | |||
| public void testSendCustomMessage() throws WxErrorException { | |||
| ApiTestModule.WxXmlCpConfigStorage configStorage = (ApiTestModule.WxXmlCpConfigStorage) wxService.wxCpConfigStorage; | |||
| WxCpMessage message1 = new WxCpMessage(); | |||
| message1.setAgentId(configStorage.getAgentId()); | |||
| message1.setMsgType(WxConsts.CUSTOM_MSG_TEXT); | |||
| message1.setToUser(configStorage.getUserId()); | |||
| message1.setContent("欢迎欢迎,热烈欢迎\n换行测试\n超链接:<a href=\"http://www.baidu.com\">Hello World</a>"); | |||
| wxService.messageSend(message1); | |||
| WxCpMessage message2 = WxCpMessage | |||
| .TEXT() | |||
| .agentId(configStorage.getAgentId()) | |||
| .toUser(configStorage.getUserId()) | |||
| .content("欢迎欢迎,热烈欢迎\n换行测试\n超链接:<a href=\"http://www.baidu.com\">Hello World</a>") | |||
| .build(); | |||
| wxService.messageSend(message2); | |||
| } | |||
| } | |||
| @@ -1,33 +0,0 @@ | |||
| package me.chanjar.weixin.enterprise.api; | |||
| import org.testng.annotations.Guice; | |||
| import org.testng.annotations.Test; | |||
| import me.chanjar.weixin.enterprise.bean.WxCustomMessage; | |||
| import me.chanjar.weixin.enterprise.exception.WxErrorException; | |||
| import com.google.inject.Inject; | |||
| /*** | |||
| * 测试发送客服消息 | |||
| * @author Daniel Qian | |||
| * | |||
| */ | |||
| @Test(groups="customMessageAPI", dependsOnGroups = "baseAPI") | |||
| @Guice(modules = ApiTestModule.class) | |||
| public class WxCustomMessageAPITest { | |||
| @Inject | |||
| protected WxCpServiceImpl wxService; | |||
| public void testSendCustomMessage() throws WxErrorException { | |||
| ApiTestModule.WxXmlCpConfigStorage configStorage = (ApiTestModule.WxXmlCpConfigStorage) wxService.wxCpConfigStorage; | |||
| WxCustomMessage message = new WxCustomMessage(); | |||
| message.setMsgType(WxConsts.CUSTOM_MSG_TEXT); | |||
| message.setToUser(configStorage.getOpenId()); | |||
| message.setContent("欢迎欢迎,热烈欢迎\n换行测试\n超链接:<a href=\"http://www.baidu.com\">Hello World</a>"); | |||
| wxService.messageSend(message); | |||
| } | |||
| } | |||
| @@ -2,7 +2,7 @@ package me.chanjar.weixin.enterprise.api; | |||
| import java.util.List; | |||
| import me.chanjar.weixin.enterprise.bean.WxDepartment; | |||
| import me.chanjar.weixin.enterprise.bean.WxCpDepartment; | |||
| import org.testng.Assert; | |||
| import org.testng.annotations.Guice; | |||
| import org.testng.annotations.Test; | |||
| @@ -23,19 +23,19 @@ public class WxGroupAPITest { | |||
| @Inject | |||
| protected WxCpServiceImpl wxService; | |||
| protected WxDepartment group; | |||
| protected WxCpDepartment group; | |||
| public void testGroupCreate() throws WxErrorException { | |||
| WxDepartment res = wxService.departmentCreate("测试分组1"); | |||
| WxCpDepartment res = wxService.departmentCreate("测试分组1"); | |||
| Assert.assertEquals(res.getName(), "测试分组1"); | |||
| } | |||
| @Test(dependsOnMethods="testGroupCreate") | |||
| public void testGroupGet() throws WxErrorException { | |||
| List<WxDepartment> groupList = wxService.departmentGet(); | |||
| List<WxCpDepartment> groupList = wxService.departmentGet(); | |||
| Assert.assertNotNull(groupList); | |||
| Assert.assertTrue(groupList.size() > 0); | |||
| for (WxDepartment g : groupList) { | |||
| for (WxCpDepartment g : groupList) { | |||
| group = g; | |||
| Assert.assertNotNull(g.getName()); | |||
| } | |||
| @@ -1,17 +1,16 @@ | |||
| package me.chanjar.weixin.enterprise.bean; | |||
| import me.chanjar.weixin.enterprise.bean.WxCustomMessage; | |||
| import org.testng.Assert; | |||
| import org.testng.annotations.Test; | |||
| import me.chanjar.weixin.enterprise.api.WxConsts; | |||
| import me.chanjar.weixin.enterprise.bean.WxCustomMessage.WxArticle; | |||
| import me.chanjar.weixin.enterprise.bean.WxCpMessage.WxArticle; | |||
| @Test | |||
| public class WxCustomMessageTest { | |||
| public class WxCpMessageTest { | |||
| public void testTextReply() { | |||
| WxCustomMessage reply = new WxCustomMessage(); | |||
| WxCpMessage reply = new WxCpMessage(); | |||
| reply.setToUser("OPENID"); | |||
| reply.setMsgType(WxConsts.CUSTOM_MSG_TEXT); | |||
| reply.setContent("sfsfdsdf"); | |||
| @@ -19,12 +18,12 @@ public class WxCustomMessageTest { | |||
| } | |||
| public void testTextBuild() { | |||
| WxCustomMessage reply = WxCustomMessage.TEXT().toUser("OPENID").content("sfsfdsdf").build(); | |||
| WxCpMessage reply = WxCpMessage.TEXT().toUser("OPENID").content("sfsfdsdf").build(); | |||
| Assert.assertEquals(reply.toJson(), "{\"touser\":\"OPENID\",\"msgtype\":\"text\",\"text\":{\"content\":\"sfsfdsdf\"}}"); | |||
| } | |||
| public void testImageReply() { | |||
| WxCustomMessage reply = new WxCustomMessage(); | |||
| WxCpMessage reply = new WxCpMessage(); | |||
| reply.setToUser("OPENID"); | |||
| reply.setMsgType(WxConsts.CUSTOM_MSG_IMAGE); | |||
| reply.setMediaId("MEDIA_ID"); | |||
| @@ -32,12 +31,12 @@ public class WxCustomMessageTest { | |||
| } | |||
| public void testImageBuild() { | |||
| WxCustomMessage reply = WxCustomMessage.IMAGE().toUser("OPENID").mediaId("MEDIA_ID").build(); | |||
| WxCpMessage reply = WxCpMessage.IMAGE().toUser("OPENID").mediaId("MEDIA_ID").build(); | |||
| Assert.assertEquals(reply.toJson(), "{\"touser\":\"OPENID\",\"msgtype\":\"image\",\"image\":{\"media_id\":\"MEDIA_ID\"}}"); | |||
| } | |||
| public void testVoiceReply() { | |||
| WxCustomMessage reply = new WxCustomMessage(); | |||
| WxCpMessage reply = new WxCpMessage(); | |||
| reply.setToUser("OPENID"); | |||
| reply.setMsgType(WxConsts.CUSTOM_MSG_VOICE); | |||
| reply.setMediaId("MEDIA_ID"); | |||
| @@ -45,12 +44,12 @@ public class WxCustomMessageTest { | |||
| } | |||
| public void testVoiceBuild() { | |||
| WxCustomMessage reply = WxCustomMessage.VOICE().toUser("OPENID").mediaId("MEDIA_ID").build(); | |||
| WxCpMessage reply = WxCpMessage.VOICE().toUser("OPENID").mediaId("MEDIA_ID").build(); | |||
| Assert.assertEquals(reply.toJson(), "{\"touser\":\"OPENID\",\"msgtype\":\"voice\",\"voice\":{\"media_id\":\"MEDIA_ID\"}}"); | |||
| } | |||
| public void testVideoReply() { | |||
| WxCustomMessage reply = new WxCustomMessage(); | |||
| WxCpMessage reply = new WxCpMessage(); | |||
| reply.setToUser("OPENID"); | |||
| reply.setMsgType(WxConsts.CUSTOM_MSG_VIDEO); | |||
| reply.setMediaId("MEDIA_ID"); | |||
| @@ -61,12 +60,12 @@ public class WxCustomMessageTest { | |||
| } | |||
| public void testVideoBuild() { | |||
| WxCustomMessage reply = WxCustomMessage.VIDEO().toUser("OPENID").title("TITLE").mediaId("MEDIA_ID").thumbMediaId("MEDIA_ID").description("DESCRIPTION").build(); | |||
| WxCpMessage reply = WxCpMessage.VIDEO().toUser("OPENID").title("TITLE").mediaId("MEDIA_ID").thumbMediaId("MEDIA_ID").description("DESCRIPTION").build(); | |||
| Assert.assertEquals(reply.toJson(), "{\"touser\":\"OPENID\",\"msgtype\":\"video\",\"video\":{\"media_id\":\"MEDIA_ID\",\"thumb_media_id\":\"MEDIA_ID\",\"title\":\"TITLE\",\"description\":\"DESCRIPTION\"}}"); | |||
| } | |||
| public void testMusicReply() { | |||
| WxCustomMessage reply = new WxCustomMessage(); | |||
| WxCpMessage reply = new WxCpMessage(); | |||
| reply.setToUser("OPENID"); | |||
| reply.setMsgType(WxConsts.CUSTOM_MSG_MUSIC); | |||
| reply.setThumbMediaId("MEDIA_ID"); | |||
| @@ -78,7 +77,7 @@ public class WxCustomMessageTest { | |||
| } | |||
| public void testMusicBuild() { | |||
| WxCustomMessage reply = WxCustomMessage.MUSIC() | |||
| WxCpMessage reply = WxCpMessage.MUSIC() | |||
| .toUser("OPENID") | |||
| .title("TITLE") | |||
| .thumbMediaId("MEDIA_ID") | |||
| @@ -90,7 +89,7 @@ public class WxCustomMessageTest { | |||
| } | |||
| public void testNewsReply() { | |||
| WxCustomMessage reply = new WxCustomMessage(); | |||
| WxCpMessage reply = new WxCpMessage(); | |||
| reply.setToUser("OPENID"); | |||
| reply.setMsgType(WxConsts.CUSTOM_MSG_NEWS); | |||
| @@ -125,7 +124,7 @@ public class WxCustomMessageTest { | |||
| article2.setDescription("Is Really A Happy Day"); | |||
| article2.setTitle("Happy Day"); | |||
| WxCustomMessage reply = WxCustomMessage.NEWS().toUser("OPENID").addArticle(article1).addArticle(article2).build(); | |||
| WxCpMessage reply = WxCpMessage.NEWS().toUser("OPENID").addArticle(article1).addArticle(article2).build(); | |||
| Assert.assertEquals(reply.toJson(), "{\"touser\":\"OPENID\",\"msgtype\":\"news\",\"articles\":[{\"title\":\"Happy Day\",\"description\":\"Is Really A Happy Day\",\"url\":\"URL\",\"picurl\":\"PIC_URL\"},{\"title\":\"Happy Day\",\"description\":\"Is Really A Happy Day\",\"url\":\"URL\",\"picurl\":\"PIC_URL\"}]}"); | |||
| } | |||