diff --git a/weixin4j-server/src/main/java/com/foxinmy/weixin4j/message/ImageMessage.java b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/message/ImageMessage.java new file mode 100644 index 00000000..8c2899ba --- /dev/null +++ b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/message/ImageMessage.java @@ -0,0 +1,52 @@ +package com.foxinmy.weixin4j.message; + +import javax.xml.bind.annotation.XmlElement; + +import com.foxinmy.weixin4j.request.WeixinMessage; +import com.foxinmy.weixin4j.type.MessageType; + +/** + * 图片消息 + * + * @className ImageMessage + * @author jy.hu + * @date 2014年4月6日 + * @since JDK 1.7 + * @see 订阅号、服务号的图片消息 + * @see 企业号的图片消息 + */ +public class ImageMessage extends WeixinMessage { + + private static final long serialVersionUID = 8430800898756567016L; + + public ImageMessage() { + super(MessageType.image.name()); + } + + /** + * 图片链接 + */ + @XmlElement(name = "PicUrl") + private String picUrl; + /** + * 图片消息媒体id,可以调用多媒体文件下载接口拉取数据。 + */ + @XmlElement(name = "MediaId") + private String mediaId; + + public String getPicUrl() { + return picUrl; + } + + public String getMediaId() { + return mediaId; + } + + @Override + public String toString() { + return "ImageMessage [picUrl=" + picUrl + ", mediaId=" + mediaId + ", " + + super.toString() + "]"; + } +} diff --git a/weixin4j-server/src/main/java/com/foxinmy/weixin4j/message/LinkMessage.java b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/message/LinkMessage.java new file mode 100644 index 00000000..810a310a --- /dev/null +++ b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/message/LinkMessage.java @@ -0,0 +1,59 @@ +package com.foxinmy.weixin4j.message; + +import javax.xml.bind.annotation.XmlElement; + +import com.foxinmy.weixin4j.request.WeixinMessage; +import com.foxinmy.weixin4j.type.MessageType; + +/** + * 链接消息 + * + * @className LinkMessage + * @author jy.hu + * @date 2014年4月6日 + * @since JDK 1.7 + * @see 订阅号、服务号的链接消息 + */ +public class LinkMessage extends WeixinMessage { + + private static final long serialVersionUID = 754952745115497030L; + + public LinkMessage() { + super(MessageType.link.name()); + } + + /** + * 消息标题 + */ + @XmlElement(name = "Title") + private String title; + /** + * 消息描述 + */ + @XmlElement(name = "Description") + private String description; + /** + * 消息链接 + */ + @XmlElement(name = "Url") + private String url; + + public String getTitle() { + return title; + } + + public String getDescription() { + return description; + } + + public String getUrl() { + return url; + } + + @Override + public String toString() { + return "LinkMessage [title=" + title + ", description=" + description + + ", url=" + url + ", " + super.toString() + "]"; + } +} diff --git a/weixin4j-server/src/main/java/com/foxinmy/weixin4j/message/LocationMessage.java b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/message/LocationMessage.java new file mode 100644 index 00000000..34422979 --- /dev/null +++ b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/message/LocationMessage.java @@ -0,0 +1,70 @@ +package com.foxinmy.weixin4j.message; + +import javax.xml.bind.annotation.XmlElement; + +import com.foxinmy.weixin4j.request.WeixinMessage; +import com.foxinmy.weixin4j.type.MessageType; + +/** + * 地理位置消息 + * + * @className LocationMessage + * @author jy.hu + * @date 2014年4月6日 + * @since JDK 1.7 + * @see 订阅号、服务号的地理位置消息 + * @see 企业号的地理位置消息 + */ +public class LocationMessage extends WeixinMessage { + + private static final long serialVersionUID = 2866021596599237334L; + + public LocationMessage() { + super(MessageType.location.name()); + } + + /** + * 地理位置维度 + */ + @XmlElement(name = "Location_X") + private double x; + /** + * 地理位置经度 + */ + @XmlElement(name = "Location_Y") + private double y; + /** + * 地图缩放大小 + */ + @XmlElement(name = "Scale") + private double scale; + /** + * 地理位置信息 + */ + @XmlElement(name = "Label") + private String label; + + public double getX() { + return x; + } + + public double getY() { + return y; + } + + public double getScale() { + return scale; + } + + public String getLabel() { + return label; + } + + @Override + public String toString() { + return "LocationMessage [x=" + x + ", y=" + y + ", scale=" + scale + + ", label=" + label + ", " + super.toString() + "]"; + } +} diff --git a/weixin4j-server/src/main/java/com/foxinmy/weixin4j/message/README.md b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/message/README.md new file mode 100644 index 00000000..d273f850 --- /dev/null +++ b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/message/README.md @@ -0,0 +1,10 @@ +普通消息 +------- + +当普通微信用户向公众账号发消息时,微信服务器将POST消息的XML数据包到开发者填写的URL上。 + +微信服务器在五秒内收不到响应会断掉连接,并且重新发起请求,总共重试三次 + +关于重试的消息排重,推荐使用msgid排重。 + +假如服务器无法保证在五秒内处理并回复,可以直接回复空串,微信服务器不会对此作任何处理,并且不会发起重试。 \ No newline at end of file diff --git a/weixin4j-server/src/main/java/com/foxinmy/weixin4j/message/TextMessage.java b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/message/TextMessage.java new file mode 100644 index 00000000..22e4fdbc --- /dev/null +++ b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/message/TextMessage.java @@ -0,0 +1,43 @@ +package com.foxinmy.weixin4j.message; + +import javax.xml.bind.annotation.XmlElement; + +import com.foxinmy.weixin4j.request.WeixinMessage; +import com.foxinmy.weixin4j.type.MessageType; + +/** + * 文本消息 + * + * @className TextMessage + * @author jy.hu + * @date 2014年4月6日 + * @since JDK 1.7 + * @see 订阅号、服务号的文本消息 + * @see 企业号的文本消息 + */ +public class TextMessage extends WeixinMessage { + + private static final long serialVersionUID = -7018053906644190260L; + + public TextMessage() { + super(MessageType.text.name()); + } + + /** + * 消息内容 + */ + @XmlElement(name = "Content") + private String content; + + public String getContent() { + return content; + } + + @Override + public String toString() { + return "TextMessage [content=" + content + ", " + super.toString() + + "]"; + } +} \ No newline at end of file diff --git a/weixin4j-server/src/main/java/com/foxinmy/weixin4j/message/VideoMessage.java b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/message/VideoMessage.java new file mode 100644 index 00000000..2ab0aab8 --- /dev/null +++ b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/message/VideoMessage.java @@ -0,0 +1,52 @@ +package com.foxinmy.weixin4j.message; + +import javax.xml.bind.annotation.XmlElement; + +import com.foxinmy.weixin4j.request.WeixinMessage; +import com.foxinmy.weixin4j.type.MessageType; + +/** + * 视频消息 + * + * @className VideoMessage + * @author jy.hu + * @date 2014年4月6日 + * @since JDK 1.7 + * @see 订阅号、服务号的视频消息 + * @see 企业号的视频消息 + */ +public class VideoMessage extends WeixinMessage { + + private static final long serialVersionUID = -1013075358679078381L; + + public VideoMessage() { + super(MessageType.video.name()); + } + + /** + * 视频消息媒体id,可以调用多媒体文件下载接口拉取数据。 + */ + @XmlElement(name = "MediaId") + private String mediaId; + /** + * 视频消息缩略图的媒体id,可以调用多媒体文件下载接口拉取数据。 + */ + @XmlElement(name = "ThumbMediaId") + private String thumbMediaId; + + public String getMediaId() { + return mediaId; + } + + public String getThumbMediaId() { + return thumbMediaId; + } + + @Override + public String toString() { + return "VideoMessage [mediaId=" + mediaId + ", thumbMediaId=" + + thumbMediaId + ", " + super.toString() + "]"; + } +} diff --git a/weixin4j-server/src/main/java/com/foxinmy/weixin4j/message/VoiceMessage.java b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/message/VoiceMessage.java new file mode 100644 index 00000000..6bc5f9e1 --- /dev/null +++ b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/message/VoiceMessage.java @@ -0,0 +1,65 @@ +package com.foxinmy.weixin4j.message; + +import javax.xml.bind.annotation.XmlElement; + +import com.foxinmy.weixin4j.request.WeixinMessage; +import com.foxinmy.weixin4j.type.MessageType; + +/** + * 语音消息 + *

+ * 开通语音识别功能,用户每次发送语音给公众号时,微信会在推送的语音消息XML数据包中,赋值到Recongnition字段. + *

+ * + * @className VoiceMessage + * @author jy.hu + * @date 2014年4月6日 + * @since JDK 1.7 + * @see 订阅号、服务号的语音消息 + * @see 企业号的语音消息 + */ +public class VoiceMessage extends WeixinMessage { + + private static final long serialVersionUID = -7988380977182214003L; + + public VoiceMessage() { + super(MessageType.voice.name()); + } + + /** + * 语音消息媒体id,可以调用多媒体文件下载接口拉取数据。 + */ + @XmlElement(name = "MediaId") + private String mediaId; + /** + * 语音格式,如amr,speex等 + */ + @XmlElement(name = "Format") + private String format; + /** + * 语音识别结果,UTF8编码 + */ + @XmlElement(name = "Recognition") + private String recognition; + + public String getRecognition() { + return recognition; + } + + public String getMediaId() { + return mediaId; + } + + public String getFormat() { + return format; + } + + @Override + public String toString() { + return "VoiceMessage [mediaId=" + mediaId + ", format=" + format + + ", recognition=" + recognition + ", " + super.toString() + + "]"; + } +} diff --git a/weixin4j-server/src/main/java/com/foxinmy/weixin4j/message/event/EventMessage.java b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/message/event/EventMessage.java new file mode 100644 index 00000000..ffb53ec0 --- /dev/null +++ b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/message/event/EventMessage.java @@ -0,0 +1,45 @@ +package com.foxinmy.weixin4j.message.event; + +import javax.xml.bind.annotation.XmlElement; + +import com.foxinmy.weixin4j.request.WeixinMessage; +import com.foxinmy.weixin4j.type.MessageType; + +/** + * 事件消息基类 + * + * @className EventMessage + * @author jy.hu + * @date 2014年4月6日 + * @since JDK 1.7 + * @see 订阅号、服务号的事件推送 + * @see 企业号的事件消息 + */ +public class EventMessage extends WeixinMessage { + + private static final long serialVersionUID = 7703667223814088865L; + + public EventMessage(String eventType) { + super(MessageType.event.name()); + this.eventType = eventType; + } + + /** + * 事件类型 + * + * @see com.foxinmy.weixin4j.type.EventType + */ + @XmlElement(name = "Event") + private String eventType; + + public String getEventType() { + return eventType; + } + + @Override + public String toString() { + return "eventType=" + eventType + ", " + super.toString(); + } +} diff --git a/weixin4j-server/src/main/java/com/foxinmy/weixin4j/message/event/LocationEventMessage.java b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/message/event/LocationEventMessage.java new file mode 100644 index 00000000..186befa0 --- /dev/null +++ b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/message/event/LocationEventMessage.java @@ -0,0 +1,60 @@ +package com.foxinmy.weixin4j.message.event; + +import javax.xml.bind.annotation.XmlElement; + +import com.foxinmy.weixin4j.type.EventType; + +/** + * 上报地理位置事件 + * + * @className LocationEventMessage + * @author jy.hu + * @date 2014年4月6日 + * @since JDK 1.7 + * @see 订阅号、服务号的上报地理位置事件 + * @see 企业号的上报地理位置事件 + */ +public class LocationEventMessage extends EventMessage { + + private static final long serialVersionUID = -2030716800669824861L; + + public LocationEventMessage() { + super(EventType.location.name()); + } + /** + * 地理位置纬度 + */ + @XmlElement(name="Latitude") + private String latitude; + /** + * 地理位置经度 + */ + @XmlElement(name="Longitude") + private String longitude; + /** + * 地理位置精度 + */ + @XmlElement(name="Precision") + private String precision; + + public String getLatitude() { + return latitude; + } + + public String getLongitude() { + return longitude; + } + + public String getPrecision() { + return precision; + } + + @Override + public String toString() { + return "LocationEventMessage [latitude=" + latitude + ", longitude=" + + longitude + ", precision=" + precision + ", " + + super.toString() + "]"; + } +} diff --git a/weixin4j-server/src/main/java/com/foxinmy/weixin4j/message/event/MenuEventMessage.java b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/message/event/MenuEventMessage.java new file mode 100644 index 00000000..15f72ae4 --- /dev/null +++ b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/message/event/MenuEventMessage.java @@ -0,0 +1,46 @@ +package com.foxinmy.weixin4j.message.event; + +import javax.xml.bind.annotation.XmlElement; + +import com.foxinmy.weixin4j.type.EventType; + +/** + * 自定义菜单事件(view|click) + * + * @className MenuEventMessage + * @author jy.hu + * @date 2014年4月6日 + * @since JDK 1.7 + * @see 订阅号、服务号的菜单事件 + * @see 企业号的菜单事件 + */ +public class MenuEventMessage extends EventMessage { + + private static final long serialVersionUID = -1049672447995366063L; + + public MenuEventMessage() { + super(EventType.click.name()); + } + + public MenuEventMessage(EventType eventType) { + super(eventType.name()); + } + + /** + * 事件KEY值,与自定义菜单接口中KEY值对应 + */ + @XmlElement(name="EventKey") + private String eventKey; + + public String getEventKey() { + return eventKey; + } + + @Override + public String toString() { + return "MenuEventMessage [eventKey=" + eventKey + ", " + + super.toString() + "]"; + } +} diff --git a/weixin4j-server/src/main/java/com/foxinmy/weixin4j/message/event/MenuLocationEventMessage.java b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/message/event/MenuLocationEventMessage.java new file mode 100644 index 00000000..9065a365 --- /dev/null +++ b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/message/event/MenuLocationEventMessage.java @@ -0,0 +1,110 @@ +package com.foxinmy.weixin4j.message.event; + +import java.io.Serializable; + +import javax.xml.bind.annotation.XmlElement; + +import com.foxinmy.weixin4j.type.EventType; + +/** + * 弹出地理位置选择器的事件推送 + * + * @className MenuLocationEventMessage + * @author jy + * @date 2014年9月30日 + * @since JDK 1.7 + * @see 订阅号、服务号的弹出地理位置选择事件推送 + * @see 企业号的弹出地理位置选择事件推送 + */ +public class MenuLocationEventMessage extends MenuEventMessage { + + private static final long serialVersionUID = 145223888272819563L; + + public MenuLocationEventMessage() { + super(EventType.location_select); + } + + /** + * 发送的位置消息 + */ + @XmlElement(name = "SendLocationInfo") + private LocationInfo locationInfo; + + public LocationInfo getLocationInfo() { + return locationInfo; + } + + /** + * 地理位置信息 + * + * @className LocationInfo + * @author jy + * @date 2015年3月29日 + * @since JDK 1.7 + * @see + */ + public static class LocationInfo implements Serializable { + + private static final long serialVersionUID = 4904181780216819965L; + + /** + * 地理位置维度 + */ + @XmlElement(name = "Location_X") + private double x; + /** + * 地理位置经度 + */ + @XmlElement(name = "Location_Y") + private double y; + /** + * 地图缩放大小 + */ + @XmlElement(name = "Scale") + private double scale; + /** + * 地理位置信息 + */ + @XmlElement(name = "Label") + private String label; + /** + * 朋友圈POI的名字,可能为空 + */ + @XmlElement(name = "Poiname") + private String poiname; + + public double getX() { + return x; + } + + public double getY() { + return y; + } + + public double getScale() { + return scale; + } + + public String getLabel() { + return label; + } + + public String getPoiname() { + return poiname; + } + + @Override + public String toString() { + return "LocationInfo [x=" + x + ", y=" + y + ", scale=" + scale + + ", label=" + label + ", poiname=" + poiname + "]"; + } + } + + @Override + public String toString() { + return "MenuLocationEventMessage [locationInfo=" + locationInfo + ", " + + super.toString() + "]"; + } +} diff --git a/weixin4j-server/src/main/java/com/foxinmy/weixin4j/message/event/MenuPhotoEventMessage.java b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/message/event/MenuPhotoEventMessage.java new file mode 100644 index 00000000..791eb0aa --- /dev/null +++ b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/message/event/MenuPhotoEventMessage.java @@ -0,0 +1,104 @@ +package com.foxinmy.weixin4j.message.event; + +import java.io.Serializable; +import java.util.List; + +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; + +/** + * 弹出拍照或者相册发图的事件推送(pic_sysphoto|pic_photo_or_album|pic_weixin) + * + * @className MenuPhotoEventMessage + * @author jy + * @date 2014年9月30日 + * @since JDK 1.7 + * @see 订阅号、服务号的系统发图的事件推送 + * @see 企业号的系统发图的事件推送 + */ +public class MenuPhotoEventMessage extends MenuEventMessage { + + private static final long serialVersionUID = 3142350663022709730L; + + /** + * 发送的图片信息 + */ + @XmlElement(name = "SendPicsInfo") + private PictureInfo pictureInfo; + + public PictureInfo getPictureInfo() { + return pictureInfo; + } + + /** + * 图片信息 + * + * @className PictureInfo + * @author jy + * @date 2015年3月29日 + * @since JDK 1.7 + * @see + */ + public static class PictureInfo implements Serializable { + + private static final long serialVersionUID = -3361375879168233258L; + + /** + * 发送的图片数量 + */ + @XmlElement(name = "Count") + private int count; + /** + * 图片列表 + */ + @XmlElement(name = "PicList") + private List items; + + public int getCount() { + return count; + } + + public List getItems() { + return items; + } + + @Override + public String toString() { + return "PictureInfo [count=" + count + ", items=" + items + "]"; + } + } + + /** + * 图片 + * + * @className PictureItem + * @author jy + * @date 2015年3月29日 + * @since JDK 1.7 + * @see + */ + @XmlRootElement(name = "item") + public static class PictureItem implements Serializable { + + private static final long serialVersionUID = -7636697449096645590L; + + /** + * 图片的MD5值,开发者若需要,可用于验证接收到图片 + */ + @XmlElement(name = "PicMd5Sum") + private String md5; + + @Override + public String toString() { + return "PictureItem [md5=" + md5 + "]"; + } + } + + @Override + public String toString() { + return "MenuPhotoEventMessage [pictureInfo=" + pictureInfo + ", " + + super.toString() + "]"; + } +} diff --git a/weixin4j-server/src/main/java/com/foxinmy/weixin4j/message/event/MenuScanEventMessage.java b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/message/event/MenuScanEventMessage.java new file mode 100644 index 00000000..52334c21 --- /dev/null +++ b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/message/event/MenuScanEventMessage.java @@ -0,0 +1,75 @@ +package com.foxinmy.weixin4j.message.event; + +import java.io.Serializable; + +import javax.xml.bind.annotation.XmlElement; + +/** + * 扫码推事件(scancode_push|scancode_waitmsg) + * + * @className MenuScanEventMessage + * @author jy + * @date 2014年9月30日 + * @since JDK 1.7 + * @see 订阅号、服务号的扫码推事件 + * @see 企业号的的扫码推事件 + */ +public class MenuScanEventMessage extends MenuEventMessage { + + private static final long serialVersionUID = 3142350663022709730L; + + /** + * 扫描信息 + */ + @XmlElement(name = "ScanCodeInfo") + private ScanInfo scanInfo; + + public ScanInfo getScanInfo() { + return scanInfo; + } + + /** + * 扫描信息 + * + * @className ScanInfo + * @author jy + * @date 2015年3月29日 + * @since JDK 1.7 + * @see + */ + public static class ScanInfo implements Serializable { + + private static final long serialVersionUID = 2237570238164900421L; + /** + * 扫描类型,一般是qrcode + */ + @XmlElement(name = "ScanType") + private String type; + /** + * 扫描结果,即二维码对应的字符串信息 + */ + @XmlElement(name = "ScanResult") + private String result; + + public String getType() { + return type; + } + + public String getResult() { + return result; + } + + @Override + public String toString() { + return "ScanInfo [type=" + type + ", result=" + result + "]"; + } + } + + @Override + public String toString() { + return "MenuScanEventMessage [scanInfo=" + scanInfo + ", " + + super.toString() + "]"; + } +} diff --git a/weixin4j-server/src/main/java/com/foxinmy/weixin4j/message/event/README.md b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/message/event/README.md new file mode 100644 index 00000000..f2651b2b --- /dev/null +++ b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/message/event/README.md @@ -0,0 +1,3 @@ +菜单事件消息 + +用户点击自定义菜单后,微信会把点击事件推送给开发者,请注意,点击菜单弹出子菜单,不会产生上报。请注意,第3个到第8个的所有事件,仅支持微信iPhone5.4.1以上版本,和Android5.4以上版本的微信用户,旧版本微信用户点击后将没有回应,开发者也不能正常接收到事件推送。 \ No newline at end of file diff --git a/weixin4j-server/src/main/java/com/foxinmy/weixin4j/mp/event/KfCloseEventMessage.java b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/mp/event/KfCloseEventMessage.java new file mode 100644 index 00000000..ef0b3139 --- /dev/null +++ b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/mp/event/KfCloseEventMessage.java @@ -0,0 +1,41 @@ +package com.foxinmy.weixin4j.mp.event; + +import javax.xml.bind.annotation.XmlElement; + +import com.foxinmy.weixin4j.message.event.EventMessage; +import com.foxinmy.weixin4j.type.EventType; + +/** + * 客服关闭会话事件 + * + * @className KfCloseEventMessage + * @author jy + * @date 2015年3月22日 + * @since JDK 1.7 + * @see 会话状态通知事件 + */ +public class KfCloseEventMessage extends EventMessage { + + private static final long serialVersionUID = 3644449346935205541L; + + public KfCloseEventMessage() { + super(EventType.kf_close_session.name()); + } + + /** + * 客服账号 + */ + @XmlElement(name = "KfAccount") + private String kfAccount; + + public String getKfAccount() { + return kfAccount; + } + + @Override + public String toString() { + return "KfCloseEventMessage [kfAccount=" + kfAccount + ", =" + + super.toString() + "]"; + } +} diff --git a/weixin4j-server/src/main/java/com/foxinmy/weixin4j/mp/event/KfCreateEventMessage.java b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/mp/event/KfCreateEventMessage.java new file mode 100644 index 00000000..790d618c --- /dev/null +++ b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/mp/event/KfCreateEventMessage.java @@ -0,0 +1,41 @@ +package com.foxinmy.weixin4j.mp.event; + +import javax.xml.bind.annotation.XmlElement; + +import com.foxinmy.weixin4j.message.event.EventMessage; +import com.foxinmy.weixin4j.type.EventType; + +/** + * 客服接入会话事件 + * + * @className KfCreateEventMessage + * @author jy + * @date 2015年3月22日 + * @since JDK 1.7 + * @see 会话状态通知事件 + */ +public class KfCreateEventMessage extends EventMessage { + + private static final long serialVersionUID = -8968189700999202108L; + + public KfCreateEventMessage() { + super(EventType.kf_create_session.name()); + } + + /** + * 客服账号 + */ + @XmlElement(name = "KfAccount") + private String kfAccount; + + public String getKfAccount() { + return kfAccount; + } + + @Override + public String toString() { + return "KfCreateEventMessage [kfAccount=" + kfAccount + ", =" + + super.toString() + "]"; + } +} diff --git a/weixin4j-server/src/main/java/com/foxinmy/weixin4j/mp/event/KfSwitchEventMessage.java b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/mp/event/KfSwitchEventMessage.java new file mode 100644 index 00000000..ccf52141 --- /dev/null +++ b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/mp/event/KfSwitchEventMessage.java @@ -0,0 +1,50 @@ +package com.foxinmy.weixin4j.mp.event; + +import javax.xml.bind.annotation.XmlElement; + +import com.foxinmy.weixin4j.message.event.EventMessage; +import com.foxinmy.weixin4j.type.EventType; + +/** + * 客服转接会话事件 + * + * @className KfSwitchEventMessage + * @author jy + * @date 2015年3月22日 + * @since JDK 1.7 + * @see 会话状态通知事件 + */ +public class KfSwitchEventMessage extends EventMessage { + + private static final long serialVersionUID = 4319501074109623413L; + + public KfSwitchEventMessage() { + super(EventType.kf_switch_session.name()); + } + + /** + * 来自的客服账号 + */ + @XmlElement(name = "FromKfAccount") + private String fromKfAccount; + /** + * 转移给客服账号 + */ + @XmlElement(name = "ToKfAccount") + private String toKfAccount; + + public String getFromKfAccount() { + return fromKfAccount; + } + + public String getToKfAccount() { + return toKfAccount; + } + + @Override + public String toString() { + return "KfSwitchEventMessage [fromKfAccount=" + fromKfAccount + + ", toKfAccount=" + toKfAccount + "]"; + } +} diff --git a/weixin4j-server/src/main/java/com/foxinmy/weixin4j/mp/event/MassEventMessage.java b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/mp/event/MassEventMessage.java new file mode 100644 index 00000000..174151ad --- /dev/null +++ b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/mp/event/MassEventMessage.java @@ -0,0 +1,93 @@ +package com.foxinmy.weixin4j.mp.event; + +import javax.xml.bind.annotation.XmlElement; + +import com.foxinmy.weixin4j.message.event.EventMessage; +import com.foxinmy.weixin4j.type.EventType; +import com.foxinmy.weixin4j.util.MessageUtil; + +/** + * 群发消息事件推送 + * + * @className MassEventMessage + * @author jy + * @date 2014年4月27日 + * @since JDK 1.7 + * @see 群发回调 + */ +public class MassEventMessage extends EventMessage { + + private static final long serialVersionUID = -1660543255873723895L; + + public MassEventMessage() { + super(EventType.masssendjobfinish.name()); + } + + /** + * 群发后的状态信息 为“send success”或“send fail”或“err(num) + */ + @XmlElement(name = "Status") + private String status; + /** + * group_id下粉丝数;或者openid_list中的粉丝数 + */ + @XmlElement(name = "TotalCount") + private int totalCount; + /** + * 过滤(过滤是指特定地区、性别的过滤、用户设置拒收的过滤,用户接收已超4条的过滤)后,准备发送的粉丝数,原则上,FilterCount = + * SentCount + ErrorCount + */ + @XmlElement(name = "FilterCount") + private int filterCount; + /** + * 发送成功的粉丝数 + */ + @XmlElement(name = "SentCount") + private int sentCount; + /** + * 发送失败的粉丝数 + */ + @XmlElement(name = "ErrorCount") + private int errorCount; + + public String getStatus() { + return status; + } + + /** + * 发送状态描述
err(10001,涉嫌广告) err(20001,涉嫌政治) err(20004,涉嫌社会)
+ * err(20002,涉嫌色情) err(20006,涉嫌违法犯罪) err(20008,涉嫌欺诈)
err(20013,涉嫌版权) + * err(22000,涉嫌互推(互相宣传) err(21000,涉嫌其他) + * + * @param status + * @return 中文描述 + */ + public String getStatusDesc() { + return MessageUtil.getMassStatusDesc(status.toLowerCase()); + } + + public int getTotalCount() { + return totalCount; + } + + public int getFilterCount() { + return filterCount; + } + + public int getSentCount() { + return sentCount; + } + + public int getErrorCount() { + return errorCount; + } + + @Override + public String toString() { + return "MassEventMessage [status=" + getStatusDesc() + ", totalCount=" + + totalCount + ", filterCount=" + filterCount + ", sentCount=" + + sentCount + ", errorCount=" + errorCount + ", " + + super.toString() + "]"; + } +} diff --git a/weixin4j-server/src/main/java/com/foxinmy/weixin4j/mp/event/ScanEventMessage.java b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/mp/event/ScanEventMessage.java new file mode 100644 index 00000000..27ed5e21 --- /dev/null +++ b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/mp/event/ScanEventMessage.java @@ -0,0 +1,58 @@ +package com.foxinmy.weixin4j.mp.event; + +import javax.xml.bind.annotation.XmlElement; + +import com.foxinmy.weixin4j.message.event.EventMessage; +import com.foxinmy.weixin4j.type.EventType; + +/** + * 扫描二维码事件 + * + * @className ScanEventMessage + * @author jy.hu + * @date 2014年4月6日 + * @since JDK 1.7 + * @see 扫描二维码事件 + */ +public class ScanEventMessage extends EventMessage { + + private static final long serialVersionUID = 8078674062833071562L; + + public ScanEventMessage() { + super(EventType.scan.name()); + } + + public ScanEventMessage(String eventType) { + super(eventType); + } + + /** + * 事件KEY值,是一个32位无符号整数,即创建二维码时的二维码scene_id + */ + @XmlElement(name = "EventKey") + private String eventKey; + /** + * 二维码的ticket,可用来换取二维码图片 + */ + @XmlElement(name = "Ticket") + private String ticket; + + public String getEventKey() { + return eventKey; + } + + public String getTicket() { + return ticket; + } + + public String getParameter() { + return eventKey.replace("qrscene_", ""); + } + + @Override + public String toString() { + return "ScanEventMessage [eventKey=" + eventKey + ", ticket=" + ticket + + ", " + super.toString() + "]"; + } +} diff --git a/weixin4j-server/src/main/java/com/foxinmy/weixin4j/mp/event/ScribeEventMessage.java b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/mp/event/ScribeEventMessage.java new file mode 100644 index 00000000..0974dd8e --- /dev/null +++ b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/mp/event/ScribeEventMessage.java @@ -0,0 +1,27 @@ +package com.foxinmy.weixin4j.mp.event; + +import com.foxinmy.weixin4j.type.EventType; + +/** + * 关注/取消关注事件
包括直接关注与扫描关注 + * + * @className ScribeEventMessage + * @author jy.hu + * @date 2014年4月6日 + * @since JDK 1.7 + * @see 订阅号、服务号的关注/取消关注事件 + */ +public class ScribeEventMessage extends ScanEventMessage { + + private static final long serialVersionUID = -6846321620262204915L; + + public ScribeEventMessage() { + super(EventType.subscribe.name()); + } + + @Override + public String toString() { + return "ScribeEventMessage [" + super.toString() + "]"; + } +} diff --git a/weixin4j-server/src/main/java/com/foxinmy/weixin4j/mp/event/TemplatesendjobfinishMessage.java b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/mp/event/TemplatesendjobfinishMessage.java new file mode 100644 index 00000000..89922642 --- /dev/null +++ b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/mp/event/TemplatesendjobfinishMessage.java @@ -0,0 +1,41 @@ +package com.foxinmy.weixin4j.mp.event; + +import javax.xml.bind.annotation.XmlElement; + +import com.foxinmy.weixin4j.message.event.EventMessage; +import com.foxinmy.weixin4j.type.EventType; + +/** + * 模板消息事件推送(公众平台) + * + * @className TemplatesendjobfinishMessage + * @author jy + * @date 2014年9月19日 + * @since JDK 1.7 + * @see 模板消息事件推送 + */ +public class TemplatesendjobfinishMessage extends EventMessage { + + private static final long serialVersionUID = -2903359365988594012L; + + public TemplatesendjobfinishMessage() { + super(EventType.templatesendjobfinish.name()); + } + + /** + * 推送状态 如failed: system failed + */ + @XmlElement(name = "Status") + private String status; + + public String getStatus() { + return status; + } + + @Override + public String toString() { + return "TemplatesendjobfinishMessage [status=" + status + ", " + + super.toString() + "]"; + } +} diff --git a/weixin4j-server/src/main/java/com/foxinmy/weixin4j/qy/event/BatchjobresultMessage.java b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/qy/event/BatchjobresultMessage.java new file mode 100644 index 00000000..ec49ef87 --- /dev/null +++ b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/qy/event/BatchjobresultMessage.java @@ -0,0 +1,101 @@ +package com.foxinmy.weixin4j.qy.event; + +import java.io.Serializable; + +import javax.xml.bind.annotation.XmlElement; + +import com.foxinmy.weixin4j.message.event.EventMessage; +import com.foxinmy.weixin4j.type.EventType; + +/** + * 异步任务事件完成通知 + * + * @className BatchjobresultMessage + * @author jy + * @date 2015年3月31日 + * @since JDK 1.7 + * @see 异步任务事件完成通知 + */ +public class BatchjobresultMessage extends EventMessage { + + private static final long serialVersionUID = 8014540441322209657L; + + public BatchjobresultMessage() { + super(EventType.batch_job_result.name()); + } + + /** + * 任务信息 + */ + @XmlElement(name = "BatchJob") + private BatchJob batchJob; + + public BatchJob getBatchJob() { + return batchJob; + } + + /** + * 任务信息 + * + * @className BatchJob + * @author jy + * @date 2015年4月1日 + * @since JDK 1.7 + * @see + */ + public static class BatchJob implements Serializable { + private static final long serialVersionUID = -7520032656787156391L; + /** + * 异步任务id,最大长度为64字符 + */ + @XmlElement(name = "JobId") + private String jobId; + /** + * 操作类型,字符串,目前分别有: 1. sync_user(增量更新成员) 2. replace_user(全量覆盖成员) 3. + * invite_user(邀请成员关注) 4. replace_party(全量覆盖部门) + * + * @see com.foxinmy.weixin4j.qy.type.BatchType + */ + @XmlElement(name = "JobType") + private String jobType; + /** + * 返回码 + */ + @XmlElement(name = "ErrCode") + private String ErrCode; + /** + * 对返回码的文本描述内容 + */ + @XmlElement(name = "ErrMsg") + private String errMsg; + + public String getJobId() { + return jobId; + } + + public String getJobType() { + return jobType; + } + + public String getErrCode() { + return ErrCode; + } + + public String getErrMsg() { + return errMsg; + } + + @Override + public String toString() { + return "[jobId=" + jobId + ", jobType=" + jobType + ", ErrCode=" + + ErrCode + ", errMsg=" + errMsg + "]"; + } + } + + @Override + public String toString() { + return "BatchjobresultMessage [batchJob=" + batchJob + ", " + + super.toString() + "]"; + } +} diff --git a/weixin4j-server/src/main/java/com/foxinmy/weixin4j/qy/event/EnterAgentEventMessage.java b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/qy/event/EnterAgentEventMessage.java new file mode 100644 index 00000000..e717d483 --- /dev/null +++ b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/qy/event/EnterAgentEventMessage.java @@ -0,0 +1,42 @@ +package com.foxinmy.weixin4j.qy.event; + +import javax.xml.bind.annotation.XmlElement; + +import com.foxinmy.weixin4j.message.event.EventMessage; +import com.foxinmy.weixin4j.type.EventType; + +/** + * 用户进入应用的事件推送(企业号)本事件只有在应用的回调模式中打开上报开关时上报 + * + * @className EnterAgentEventMessage + * @author jy + * @date 2014年12月28日 + * @since JDK 1.7 + * @see 用户进入应用的事件推送 + */ +public class EnterAgentEventMessage extends EventMessage { + + private static final long serialVersionUID = 7675732524832500820L; + + public EnterAgentEventMessage() { + super(EventType.enter_agent.name()); + } + + /** + * 事件KEY值,与自定义菜单接口中KEY值对应 + */ + @XmlElement(name = "EventKey") + private String eventKey; + + public String getEventKey() { + return eventKey; + } + + @Override + public String toString() { + return "EnterAgentEventMessage [eventKey=" + eventKey + ", " + + super.toString() + "]"; + } +} diff --git a/weixin4j-server/src/main/java/com/foxinmy/weixin4j/qy/event/ScribeEventMessage.java b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/qy/event/ScribeEventMessage.java new file mode 100644 index 00000000..86414e6d --- /dev/null +++ b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/qy/event/ScribeEventMessage.java @@ -0,0 +1,28 @@ +package com.foxinmy.weixin4j.qy.event; + +import com.foxinmy.weixin4j.message.event.EventMessage; +import com.foxinmy.weixin4j.type.EventType; + +/** + * 关注/取消关注事件
包括直接关注与扫描关注 + * + * @className ScribeEventMessage + * @author jy.hu + * @date 2014年4月6日 + * @since JDK 1.7 + * @see 成员关注/取消关注事件 + */ +public class ScribeEventMessage extends EventMessage { + + private static final long serialVersionUID = -6846321620262204915L; + + public ScribeEventMessage() { + super(EventType.subscribe.name()); + } + + @Override + public String toString() { + return "ScribeEventMessage [" + super.toString() + "]"; + } +} diff --git a/weixin4j-server/src/main/java/com/foxinmy/weixin4j/request/WeixinMessage.java b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/request/WeixinMessage.java index be015608..dec597a2 100644 --- a/weixin4j-server/src/main/java/com/foxinmy/weixin4j/request/WeixinMessage.java +++ b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/request/WeixinMessage.java @@ -6,7 +6,7 @@ import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; /** - * 被动消息(待完善) + * 基本被动消息 * * @className WeixinMessage * @author jy @@ -36,6 +36,22 @@ public class WeixinMessage implements Serializable { * */ private String msgType; + /** + * 消息ID 可用于排重 + */ + private long msgId; + /** + * 企业号独有的应用ID + */ + private String agentId; + + public WeixinMessage() { + + } + + public WeixinMessage(String msgType) { + this.msgType = msgType; + } public String getToUserName() { return toUserName; @@ -73,12 +89,66 @@ public class WeixinMessage implements Serializable { this.msgType = msgType; } - //@Override - //public abstract boolean equals(Object obj) ; + public long getMsgId() { + return msgId; + } + + @XmlElement(name = "MsgId") + public void setMsgId(long msgId) { + this.msgId = msgId; + } + + public String getAgentId() { + return agentId; + } + + @XmlElement(name = "AgentID") + public void setAgentId(String agentId) { + this.agentId = agentId; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((agentId == null) ? 0 : agentId.hashCode()); + result = prime * result + (int) (createTime ^ (createTime >>> 32)); + result = prime * result + + ((fromUserName == null) ? 0 : fromUserName.hashCode()); + result = prime * result + (int) (msgId ^ (msgId >>> 32)); + result = prime * result + ((msgType == null) ? 0 : msgType.hashCode()); + result = prime * result + + ((toUserName == null) ? 0 : toUserName.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + WeixinMessage other = (WeixinMessage) obj; + if (msgId > 0l && other.getMsgId() > 0l) { + return msgId == other.getMsgId(); + } + return fromUserName.equals(other.getFromUserName()) + && createTime == other.getCreateTime(); + } @Override public String toString() { - return " toUserName=" + toUserName + ", fromUserName=" + fromUserName - + ", createTime=" + createTime + ", msgType=" + msgType; + String toString = " toUserName=" + toUserName + ", fromUserName=" + + fromUserName + ", createTime=" + createTime + ", msgType=" + + msgType; + if (msgId > 0l) { + toString += ", msgId=" + msgId; + } + if (agentId != null) { + toString += ", agentId=" + agentId; + } + return toString; } } diff --git a/weixin4j-server/src/main/java/com/foxinmy/weixin4j/socket/WeixinRequestHandler.java b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/socket/WeixinRequestHandler.java index f2f27447..64463732 100644 --- a/weixin4j-server/src/main/java/com/foxinmy/weixin4j/socket/WeixinRequestHandler.java +++ b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/socket/WeixinRequestHandler.java @@ -30,9 +30,9 @@ import com.foxinmy.weixin4j.util.MessageUtil; import com.foxinmy.weixin4j.util.StringUtil; /** - * 微信被动消息处理类 + * 微信请求处理类 * - * @className WeixinMessageHandler + * @className WeixinRequestHandler * @author jy * @date 2014年11月16日 * @since JDK 1.7 diff --git a/weixin4j-server/src/main/java/com/foxinmy/weixin4j/socket/WeixinResponseEncoder.java b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/socket/WeixinResponseEncoder.java index 0fe18d82..523bc5a1 100644 --- a/weixin4j-server/src/main/java/com/foxinmy/weixin4j/socket/WeixinResponseEncoder.java +++ b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/socket/WeixinResponseEncoder.java @@ -21,9 +21,9 @@ import com.foxinmy.weixin4j.util.RandomUtil; import com.foxinmy.weixin4j.util.StringUtil; /** - * 微信消息编码类 + * 微信回复编码类 * - * @className WeixinMessageEncoder + * @className WeixinResponseEncoder * @author jy * @date 2014年11月13日 * @since JDK 1.7 diff --git a/weixin4j-server/src/main/java/com/foxinmy/weixin4j/type/EventType.java b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/type/EventType.java new file mode 100644 index 00000000..f91233d4 --- /dev/null +++ b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/type/EventType.java @@ -0,0 +1,129 @@ +package com.foxinmy.weixin4j.type; + +/** + * 事件类型 + * + * @className EventType + * @author jy + * @date 2014年9月30日 + * @since JDK 1.7 + * @see + */ +public enum EventType { + /** + * 关注事件 + * + */ + subscribe, + /** + * 取消关注事件 + * + */ + unsubscribe, + /** + * 上报地理位置事件 + * + * @see com.foxinmy.weixin4j.message.event.LocationEventMessage + */ + location, + /** + * 菜单扫描事件 + * + * @see com.foxinmy.weixin4j.message.event.menu.MenuScanEventMessage + */ + scancode_push, + /** + * 菜单点击关键字事件 + * + * @see com.foxinmy.weixin4j.message.event.menu.MenuEventMessage + */ + view, + /** + * 菜单点击链接事件 + * + * @see com.foxinmy.weixin4j.message.event.menu.MenuEventMessage + */ + click, + /** + * 菜单扫描并调出等待界面事件 + * + * @see com.foxinmy.weixin4j.message.event.menu.MenuScanEventMessage + */ + scancode_waitmsg, + /** + * 菜单弹出拍照事件 + * + * @see com.foxinmy.weixin4j.message.event.menu.MenuPhotoEventMessage + */ + pic_sysphoto, + /** + * 菜单弹出发图事件 + * + * @see com.foxinmy.weixin4j.message.event.menu.MenuPhotoEventMessage + */ + pic_photo_or_album, + /** + * 菜单弹出发图事件 + * + * @see com.foxinmy.weixin4j.message.event.menu.MenuPhotoEventMessage + */ + pic_weixin, + /** + * 菜单发送地理位置事件 + * + * @see com.foxinmy.weixin4j.message.event.menu.MenuLocationEventMessage + */ + location_select, + + // ------------------------------公众平台特有------------------------------ + // + + /** + * 二维码扫描事件 + * + * @see com.foxinmy.weixin4j.mp.event.ScanEventMessage + */ + scan, + /** + * 群发消息事件 + * + * @see com.foxinmy.weixin4j.mp.event.MassEventMessage + */ + masssendjobfinish, + /** + * 模板消息事件 + * + * @see com.foxinmy.weixin4j.mp.event.TemplatesendjobfinishMessage + */ + templatesendjobfinish, + /** + * 客服接入会话事件 + * + * @see com.foxinmy.weixin4j.mp.event.KfCreateEventMessage + */ + kf_create_session, + /** + * 客服关闭会话事件 + * + * @see com.foxinmy.weixin4j.mp.event.KfCloseEventMessage + */ + kf_close_session, + /** + * 客服转接会话事件 + * + * @see com.foxinmy.weixin4j.mp.event.KfSwitchEventMessage + */ + kf_switch_session, + /** + * 异步任务完成事件 + * + * @see com.foxinmy.weixin4j.qy.event.BatchjobresultMessage + */ + batch_job_result, + /** + * 进入企业号应用事件 + * + * @see com.foxinmy.weixin4j.qy.event.EnterAgentEventMessage + */ + enter_agent; +} diff --git a/weixin4j-server/src/main/java/com/foxinmy/weixin4j/type/MessageType.java b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/type/MessageType.java new file mode 100644 index 00000000..c31a1dec --- /dev/null +++ b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/type/MessageType.java @@ -0,0 +1,60 @@ +package com.foxinmy.weixin4j.type; + + +/** + * + * 消息类型 + * + * @author jy.hu + * + */ +public enum MessageType { + /** + * 文字消息 + * + * @see com.foxinmy.weixin4j.message.TextMessage + */ + text, + /** + * 图片消息 + * + * @see com.foxinmy.weixin4j.message.ImageMessage + */ + image, + /** + * 语音消息 + * + * @see com.foxinmy.weixin4j.message.VoiceMessage + */ + voice, + /** + * 视频消息 + * + * @see com.foxinmy.weixin4j.message.VideoMessage + */ + video, + /** + * 小视频消息 + * + * @see com.foxinmy.weixin4j.message.VideoMessage + */ + shortvideo, + /** + * 位置消息 + * + * @see com.foxinmy.weixin4j.message.LocationMessage + */ + location, + /** + * 链接消息 + * + * @see com.foxinmy.weixin4j.message.LinkMessage + */ + link, + /** + * 事件消息 + * + * @see com.foxinmy.weixin4j.message.event.EventMessage + */ + event; +} diff --git a/weixin4j-server/src/main/java/com/foxinmy/weixin4j/util/MessageUtil.java b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/util/MessageUtil.java index 99d636c3..7a528817 100644 --- a/weixin4j-server/src/main/java/com/foxinmy/weixin4j/util/MessageUtil.java +++ b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/util/MessageUtil.java @@ -1,6 +1,8 @@ package com.foxinmy.weixin4j.util; import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; @@ -153,4 +155,36 @@ public final class MessageUtil { } return xmlContent; } + + private final static Map massStatusMap; + static { + massStatusMap = new HashMap(); + massStatusMap.put("sendsuccess", "发送成功"); + massStatusMap.put("send_success", "发送成功"); + massStatusMap.put("success", "发送成功"); + massStatusMap.put("send success", "发送成功"); + massStatusMap.put("sendfail", "发送失败"); + massStatusMap.put("send_fail", "发送失败"); + massStatusMap.put("fail", "发送失败"); + massStatusMap.put("send fail", "发送失败"); + massStatusMap.put("err(10001)", "涉嫌广告"); + massStatusMap.put("err(20001)", "涉嫌政治"); + massStatusMap.put("err(20004)", "涉嫌社会"); + massStatusMap.put("err(20006)", "涉嫌违法犯罪"); + massStatusMap.put("err(20008)", "涉嫌欺诈"); + massStatusMap.put("err(20013)", "涉嫌版权"); + massStatusMap.put("err(22000)", "涉嫌互推(互相宣传)"); + massStatusMap.put("err(21000)", "涉嫌其他"); + } + + /** + * 获取群发状态描述 + * + * @param status + * 状态 + * @return + */ + public static String getMassStatusDesc(String status) { + return massStatusMap.get(status); + } }