weixin4j-base:新增群发卡券消息类型

This commit is contained in:
jinyu 2015-06-08 18:21:43 +08:00
parent b273c59186
commit 3696b813dd
13 changed files with 101 additions and 229 deletions

View File

@ -314,3 +314,7 @@
* 2015-06-04
+ **weixin4j-mp**: 新增查询红包接口
* 2015-06-08
+ **weixin4j-base**: 新增群发卡券消息类型

View File

@ -52,4 +52,8 @@
* 2015-05-07
+ 删除ResponseTuple接口
+ 删除ResponseTuple接口
* 2015-06-08
+ 新增群发卡券消息类型

View File

@ -0,0 +1,47 @@
package com.foxinmy.weixin4j.tuple;
import javax.xml.bind.annotation.XmlElement;
import com.alibaba.fastjson.annotation.JSONField;
/**
* 卡券对象
* <p>
* <font color="red">可用于群发消息</font>
* </p>
*
* @className Card
* @author jy
* @date 2015年6月8日
* @since JDK 1.7
* @see
*/
public class Card implements MassTuple {
private static final long serialVersionUID = 6119453633595102147L;
@Override
public String getMessageType() {
return "wxcard";
}
/**
* 上传后的微信返回的媒体ID
*/
@JSONField(name = "card_id")
@XmlElement(name = "CardId")
private String cardId;
public Card(String cardId) {
this.cardId = cardId;
}
public String getCardId() {
return cardId;
}
@Override
public String toString() {
return "Card [cardId=" + cardId + "]";
}
}

View File

@ -40,10 +40,6 @@ public class File implements NotifyTuple {
return mediaId;
}
public void setMediaId(String mediaId) {
this.mediaId = mediaId;
}
@Override
public String toString() {
return "File [mediaId=" + mediaId + "]";

View File

@ -40,10 +40,6 @@ public class Image implements MassTuple, NotifyTuple {
return mediaId;
}
public void setMediaId(String mediaId) {
this.mediaId = mediaId;
}
@Override
public String toString() {
return "Image [mediaId=" + mediaId + "]";

View File

@ -12,6 +12,7 @@ package com.foxinmy.weixin4j.tuple;
* @see com.foxinmy.weixin4j.tuple.Voice
* @see com.foxinmy.weixin4j.tuple.MpVideo
* @see com.foxinmy.weixin4j.tuple.MpNews
* @see com.foxinmy.weixin4j.tuple.Card
*/
public interface MassTuple extends Tuple {

View File

@ -46,13 +46,13 @@ public class MpArticle implements Serializable {
*/
@JSONField(name = "show_cover_pic")
private String showCoverPic;
/**
* 正文的URL 可为空
*/
@JSONField(name = "content_url")
private String contentUrl;
/**
* 封面图片的URL 可为空
*/
@ -73,10 +73,6 @@ public class MpArticle implements Serializable {
return thumbMediaId;
}
public void setThumbMediaId(String thumbMediaId) {
this.thumbMediaId = thumbMediaId;
}
public String getAuthor() {
return author;
}
@ -89,10 +85,6 @@ public class MpArticle implements Serializable {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getSourceUrl() {
return sourceUrl;
}
@ -105,10 +97,6 @@ public class MpArticle implements Serializable {
return content;
}
public void setContent(String content) {
this.content = content;
}
public String getDigest() {
return digest;
}

View File

@ -40,10 +40,6 @@ public class MpVideo implements MassTuple {
return mediaId;
}
public void setMediaId(String mediaId) {
this.mediaId = mediaId;
}
@Override
public String toString() {
return "MpVideo [mediaId=" + mediaId + "]";

View File

@ -104,10 +104,6 @@ public class Music implements NotifyTuple {
return thumbMediaId;
}
public void setThumbMediaId(String thumbMediaId) {
this.thumbMediaId = thumbMediaId;
}
@Override
public String toString() {
return "Music [title=" + title + ", desc=" + desc + ", musicUrl="

View File

@ -1,6 +1,5 @@
package com.foxinmy.weixin4j.tuple;
import javax.xml.bind.annotation.XmlRootElement;
/**
* 文本对象
@ -14,7 +13,6 @@ import javax.xml.bind.annotation.XmlRootElement;
* @since JDK 1.7
* @see
*/
@XmlRootElement(name = "Content")
public class Text implements MassTuple, NotifyTuple {
private static final long serialVersionUID = 520050144519064503L;

View File

@ -73,10 +73,6 @@ public class Video implements NotifyTuple {
return mediaId;
}
public void setMediaId(String mediaId) {
this.mediaId = mediaId;
}
public String getThumbMediaId() {
return thumbMediaId;
}

View File

@ -1,192 +0,0 @@
package com.foxinmy.weixin4j.dispatcher;
import io.netty.util.internal.logging.InternalLogger;
import io.netty.util.internal.logging.InternalLoggerFactory;
import java.util.HashMap;
import java.util.Map;
import com.foxinmy.weixin4j.message.ImageMessage;
import com.foxinmy.weixin4j.message.LocationMessage;
import com.foxinmy.weixin4j.message.TextMessage;
import com.foxinmy.weixin4j.message.VideoMessage;
import com.foxinmy.weixin4j.message.VoiceMessage;
import com.foxinmy.weixin4j.message.event.LocationEventMessage;
import com.foxinmy.weixin4j.messagekey.WeixinMessageKeyDefiner;
import com.foxinmy.weixin4j.mp.event.KfCloseEventMessage;
import com.foxinmy.weixin4j.mp.event.KfCreateEventMessage;
import com.foxinmy.weixin4j.mp.event.KfSwitchEventMessage;
import com.foxinmy.weixin4j.mp.event.MassEventMessage;
import com.foxinmy.weixin4j.mp.event.ScanEventMessage;
import com.foxinmy.weixin4j.mp.event.TemplatesendjobfinishMessage;
import com.foxinmy.weixin4j.qy.event.BatchjobresultMessage;
import com.foxinmy.weixin4j.qy.event.EnterAgentEventMessage;
import com.foxinmy.weixin4j.type.AccountType;
import com.foxinmy.weixin4j.type.EventType;
import com.foxinmy.weixin4j.type.MessageType;
/**
* 微信消息匹配(不够优雅,待改进)
*
* @className WeixinMessageMatcher
* @author jy
* @date 2015年5月17日
* @since JDK 1.7
* @see com.foxinmy.weixin4j.request.WeixinMessage
* @see com.foxinmy.weixin4j.messagekey.WeixinMessageKeyDefiner
*/
public class WeixinMessageMatcher {
private final InternalLogger logger = InternalLoggerFactory
.getInstance(getClass());
private final Map<String, Class<?>> key2ClassMap;
private final Map<Class<?>, String> class2KeyMap;
private final WeixinMessageKeyDefiner messageKeyDefiner;
public WeixinMessageMatcher(WeixinMessageKeyDefiner messageKeyDefiner) {
this.messageKeyDefiner = messageKeyDefiner;
key2ClassMap = new HashMap<String, Class<?>>();
class2KeyMap = new HashMap<Class<?>, String>();
init0();
init1();
init2();
init3();
logger.info("detected message for events: {}", key2ClassMap.keySet());
}
public WeixinMessageKeyDefiner getMessageKeyDefiner() {
return messageKeyDefiner;
}
private String messageKey(MessageType messageType) {
return messageKeyDefiner.defineMessageKey(messageType.name(), null,
null);
}
private String mpEventMessageKey(EventType eventType) {
return messageKeyDefiner.defineMessageKey(MessageType.event.name(),
eventType.name(), AccountType.MP);
}
private String qyEventMessageKey(EventType eventType) {
return messageKeyDefiner.defineMessageKey(MessageType.event.name(),
eventType.name(), AccountType.QY);
}
private void init0() {
// /////////////////////////////////////////////////
/******************** 普通消息 ********************/
// /////////////////////////////////////////////////
regist(messageKey(MessageType.text), TextMessage.class);
regist(messageKey(MessageType.image), ImageMessage.class);
regist(messageKey(MessageType.voice), VoiceMessage.class);
regist(messageKey(MessageType.video), VideoMessage.class);
regist(messageKey(MessageType.shortvideo), VideoMessage.class);
regist(messageKey(MessageType.location), LocationMessage.class);
}
private void init1() {
// /////////////////////////////////////////////////
/******************** 事件消息 ********************/
// /////////////////////////////////////////////////
for (EventType eventType : new EventType[] { EventType.subscribe,
EventType.unsubscribe }) {
regist(mpEventMessageKey(eventType),
com.foxinmy.weixin4j.mp.event.ScribeEventMessage.class);
}
for (EventType eventType : new EventType[] { EventType.subscribe,
EventType.unsubscribe }) {
regist(qyEventMessageKey(eventType),
com.foxinmy.weixin4j.qy.event.ScribeEventMessage.class);
}
Class<?> clazz = LocationEventMessage.class;
regist(mpEventMessageKey(EventType.location), clazz);
regist(qyEventMessageKey(EventType.location), clazz);
for (EventType eventType : new EventType[] { EventType.click,
EventType.view }) {
clazz = com.foxinmy.weixin4j.message.event.MenuEventMessage.class;
regist(mpEventMessageKey(eventType), clazz);
regist(qyEventMessageKey(eventType), clazz);
}
for (EventType eventType : new EventType[] { EventType.scancode_push,
EventType.scancode_waitmsg }) {
clazz = com.foxinmy.weixin4j.message.event.MenuScanEventMessage.class;
regist(mpEventMessageKey(eventType), clazz);
regist(qyEventMessageKey(eventType), clazz);
}
for (EventType eventType : new EventType[] { EventType.pic_sysphoto,
EventType.pic_photo_or_album, EventType.pic_weixin }) {
clazz = com.foxinmy.weixin4j.message.event.MenuPhotoEventMessage.class;
regist(mpEventMessageKey(eventType), clazz);
regist(qyEventMessageKey(eventType), clazz);
}
clazz = com.foxinmy.weixin4j.message.event.MenuLocationEventMessage.class;
regist(mpEventMessageKey(EventType.location_select), clazz);
regist(qyEventMessageKey(EventType.location_select), clazz);
}
private void init2() {
// /////////////////////////////////////////////////
/******************** 公众平台事件消息 ********************/
// /////////////////////////////////////////////////
regist(mpEventMessageKey(EventType.scan), ScanEventMessage.class);
regist(mpEventMessageKey(EventType.masssendjobfinish),
MassEventMessage.class);
regist(mpEventMessageKey(EventType.templatesendjobfinish),
TemplatesendjobfinishMessage.class);
regist(mpEventMessageKey(EventType.kf_create_session),
KfCreateEventMessage.class);
regist(mpEventMessageKey(EventType.kf_close_session),
KfCloseEventMessage.class);
regist(mpEventMessageKey(EventType.kf_switch_session),
KfSwitchEventMessage.class);
}
private void init3() {
// /////////////////////////////////////////////////
/******************** 企业号事件消息 ********************/
// /////////////////////////////////////////////////
regist(qyEventMessageKey(EventType.batch_job_result),
BatchjobresultMessage.class);
regist(qyEventMessageKey(EventType.enter_agent),
EnterAgentEventMessage.class);
}
/**
* 注册一个消息类型
*
* @param messageKey
* 消息的key
* @param clazz
* 消息类型
*/
public void regist(String messageKey, Class<?> clazz) {
key2ClassMap.put(messageKey, clazz);
class2KeyMap.put(clazz, messageKey);
}
/**
* 匹配到消息
*
* @param keyOrClass
* 消息key或者消息类型
* @return 匹配结果
*/
public boolean match(Object keyOrClass) {
return key2ClassMap.containsKey(keyOrClass)
|| class2KeyMap.containsKey(keyOrClass);
}
/**
* 消息key找到消息类型
*
* @param messageKey
* 消息key
* @return 消息类型
*/
public Class<?> find(String messageKey) {
return key2ClassMap.get(messageKey);
}
}

View File

@ -0,0 +1,42 @@
package com.foxinmy.weixin4j.messagekey;
/**
* 微信消息匹配
*
* @className WeixinMessageMatcher
* @author jy
* @date 2015年5月17日
* @since JDK 1.7
* @see com.foxinmy.weixin4j.request.WeixinMessage
* @see com.foxinmy.weixin4j.messagekey.WeixinMessageKeyDefiner
*/
public interface WeixinMessageMatcher {
/**
* 消息是否匹配
*
* @param messageKeyOrMessageClass
* 消息key或者消息类型
* @return 匹配结果
*/
public boolean match(Object messageKeyOrMessageClass);
/**
* 匹配到消息类型
*
* @param messageKey
* 消息key
* @return 消息类型
*/
public Class<?> match(String messageKey);
/**
* 注册messageClass
*
* @param messageKey
* 消息key
* @param messageClass
* 消息类型
*/
public void regist(String messageKey, Class<?> messageClass);
}