diff --git a/README.md b/README.md index 97c796c2..8d572a51 100644 --- a/README.md +++ b/README.md @@ -94,9 +94,23 @@ weixin4j + **weixin4j-qy**: 新增`标签管理`接口 +* 2014-11-23 + + + **weixin4j-base**: 新增企业号消息体以及用`Responseable`,`Notifyable`,`Massable`三个接口标记不同的可接受的消息类型 + + + **weixin4j-mp**: 重新定义(手贱)了「被动消息」「客服消息」「群发消息」的传输实体 + + + **weixin4j-mp**: `WeixinServerBootstrap`重命名为`WeixinMpServerBootstrap` + + + **weixin4j-qy**: 新增`多媒体管理`接口 + + + **weixin4j-qy**: 新增`发送消息`接口 + + + **weixin4j-qy**: 新增`菜单管理`接口 + 接下来 ------ -* 企业号API封装 +* 企业号消息与事件 * 微信小店 diff --git a/pom.xml b/pom.xml index e28db54f..818a57fb 100644 --- a/pom.xml +++ b/pom.xml @@ -36,6 +36,7 @@ 0.0.1-SNAPSHOT 0.0.1-SNAPSHOT + 0.0.1-SNAPSHOT 4.8.2 1.6.1 1.0.9 diff --git a/weixin4j-base/README.md b/weixin4j-base/README.md index 6eecff8d..a52b6edb 100644 --- a/weixin4j-base/README.md +++ b/weixin4j-base/README.md @@ -29,4 +29,8 @@ weixin4j-base * 2014-11-19 - + 新增`WeixinQyAccount`企业号账号信息类 \ No newline at end of file + + 新增`WeixinQyAccount`企业号账号信息类 + +* 2014-11-23 + + + 新增企业号消息体以及用`Responseable`,`Notifyable`,`Massable`三个接口标记不同的可接受的消息类型 \ No newline at end of file diff --git a/weixin4j-base/pom.xml b/weixin4j-base/pom.xml index eebbbcfb..bb41ff0b 100644 --- a/weixin4j-base/pom.xml +++ b/weixin4j-base/pom.xml @@ -11,9 +11,6 @@ weixin4j-base weixin4j-base https://github.com/foxinmy/weixin4j/tree/master/weixin4j-base - - weixin4j-base - com.thoughtworks.xstream diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/http/JsonResult.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/http/JsonResult.java index e912c4cb..50388e61 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/http/JsonResult.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/http/JsonResult.java @@ -12,7 +12,9 @@ import com.alibaba.fastjson.annotation.JSONField; * @date 2014年9月24日 * @since JDK 1.7 * @see 全局返回码 + * href="http://mp.weixin.qq.com/wiki/index.php?title=%E5%85%A8%E5%B1%80%E8%BF%94%E5%9B%9E%E7%A0%81%E8%AF%B4%E6%98%8E">公众平台全局返回码说明 + * @see 企业号全局返回码说明 */ public class JsonResult implements Serializable { diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/model/BaseMsg.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/model/BaseMsg.java index e407561e..e833a55b 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/model/BaseMsg.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/model/BaseMsg.java @@ -5,13 +5,9 @@ import java.io.Serializable; import com.thoughtworks.xstream.annotations.XStreamAlias; /** - * 普通消息基类 - *

- * 回复图片等多媒体消息时需要预先上传多媒体文件到微信服务器, - * 假如服务器无法保证在五秒内处理并回复,可以直接回复空串,微信服务器不会对此作任何处理,并且不会发起重试 - *

+ * 消息基类 * - * @className BaseMessage + * @className BaseMsg * @author jy.hu * @date 2014年4月6日 * @since JDK 1.7 @@ -26,12 +22,25 @@ public class BaseMsg implements Serializable { private String fromUserName; // 发送方帐号(一个OpenID) @XStreamAlias("CreateTime") private long createTime = System.currentTimeMillis(); // 消息创建时间 (整型) + @XStreamAlias("MsgType") + private String msgType; // 消息类型 + @XStreamAlias("MsgId") + private long msgId; // 消息ID public BaseMsg() { } + public BaseMsg(String msgType) { + this(msgType, null, null); + } + public BaseMsg(String toUserName, String fromUserName) { + this(null, toUserName, fromUserName); + } + + public BaseMsg(String msgType, String toUserName, String fromUserName) { + this.msgType = msgType; this.toUserName = toUserName; this.fromUserName = fromUserName; } @@ -59,4 +68,35 @@ public class BaseMsg implements Serializable { public void setCreateTime(long createTime) { this.createTime = createTime; } + + public String getMsgType() { + return msgType; + } + + public void setMsgType(String msgType) { + this.msgType = msgType; + } + + public long getMsgId() { + return msgId; + } + + public void setMsgId(long msgId) { + this.msgId = msgId; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof BaseMsg) { + return ((BaseMsg) obj).getMsgId() == msgId; + } + return false; + } + + @Override + public String toString() { + return "BaseMsg [toUserName=" + toUserName + ", fromUserName=" + + fromUserName + ", createTime=" + createTime + ", msgType=" + + msgType + ", msgId=" + msgId + "]"; + } } diff --git a/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/model/Button.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/model/Button.java similarity index 94% rename from weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/model/Button.java rename to weixin4j-base/src/main/java/com/foxinmy/weixin4j/model/Button.java index 32fbbd98..a4406b1c 100644 --- a/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/model/Button.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/model/Button.java @@ -1,4 +1,4 @@ -package com.foxinmy.weixin4j.mp.model; +package com.foxinmy.weixin4j.model; import java.io.Serializable; import java.util.ArrayList; diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/BaseMessage.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/BaseMessage.java deleted file mode 100644 index 8dd900ff..00000000 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/BaseMessage.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.foxinmy.weixin4j.msg; - -import com.foxinmy.weixin4j.model.BaseMsg; -import com.foxinmy.weixin4j.type.MessageType; -import com.thoughtworks.xstream.annotations.XStreamAlias; - -/** - * 普通消息基类 - *

- * 回复图片等多媒体消息时需要预先上传多媒体文件到微信服务器, - * 假如服务器无法保证在五秒内处理并回复,可以直接回复空串,微信服务器不会对此作任何处理,并且不会发起重试 - *

- * - * @className BaseMessage - * @author jy.hu - * @date 2014年4月6日 - * @since JDK 1.7 - */ -public class BaseMessage extends BaseMsg { - - private static final long serialVersionUID = 7761192742840031607L; - - @XStreamAlias("MsgType") - private MessageType msgType; // 消息类型 - @XStreamAlias("MsgId") - private long msgId; // 消息ID - - public BaseMessage(MessageType msgType) { - this.msgType = msgType; - } - - public MessageType getMsgType() { - return msgType; - } - - public void setMsgType(MessageType msgType) { - this.msgType = msgType; - } - - public long getMsgId() { - return msgId; - } - - public void setMsgId(long msgId) { - this.msgId = msgId; - } - - @Override - public boolean equals(Object obj) { - if (obj instanceof BaseMessage) { - return ((BaseMessage) obj).getMsgId() == msgId; - } - return false; - } -} diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/ImageMessage.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/ImageMessage.java index bc53425a..f01939a2 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/ImageMessage.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/ImageMessage.java @@ -1,5 +1,6 @@ package com.foxinmy.weixin4j.msg; +import com.foxinmy.weixin4j.model.BaseMsg; import com.foxinmy.weixin4j.type.MessageType; import com.thoughtworks.xstream.annotations.XStreamAlias; @@ -13,12 +14,12 @@ import com.thoughtworks.xstream.annotations.XStreamAlias; * @see 图片消息 */ -public class ImageMessage extends BaseMessage { +public class ImageMessage extends BaseMsg { private static final long serialVersionUID = 8430800898756567016L; public ImageMessage() { - super(MessageType.image); + super(MessageType.image.name()); } @XStreamAlias("PicUrl") @@ -39,7 +40,7 @@ public class ImageMessage extends BaseMessage { StringBuilder sb = new StringBuilder(); sb.append("[ImageMessage ,toUserName=").append(super.getToUserName()); sb.append(" ,fromUserName=").append(super.getFromUserName()); - sb.append(" ,msgType=").append(super.getMsgType().name()); + sb.append(" ,msgType=").append(super.getMsgType()); sb.append(" ,picUrl=").append(picUrl); sb.append(" ,mediaId=").append(mediaId); sb.append(" ,createTime=").append(super.getCreateTime()); diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/LinkMessage.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/LinkMessage.java index 81c59f90..9d833664 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/LinkMessage.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/LinkMessage.java @@ -1,5 +1,6 @@ package com.foxinmy.weixin4j.msg; +import com.foxinmy.weixin4j.model.BaseMsg; import com.foxinmy.weixin4j.type.MessageType; import com.thoughtworks.xstream.annotations.XStreamAlias; @@ -13,12 +14,12 @@ import com.thoughtworks.xstream.annotations.XStreamAlias; * @see 链接消息 */ -public class LinkMessage extends BaseMessage { +public class LinkMessage extends BaseMsg { private static final long serialVersionUID = 754952745115497030L; public LinkMessage() { - super(MessageType.link); + super(MessageType.link.name()); } @XStreamAlias("Title") @@ -45,7 +46,7 @@ public class LinkMessage extends BaseMessage { StringBuilder sb = new StringBuilder(); sb.append("[LinkMessage ,toUserName=").append(super.getToUserName()); sb.append(" ,fromUserName=").append(super.getFromUserName()); - sb.append(" ,msgType=").append(super.getMsgType().name()); + sb.append(" ,msgType=").append(super.getMsgType()); sb.append(" ,title=").append(title); sb.append(" ,description=").append(description); sb.append(" ,url=").append(url); diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/LocationMessage.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/LocationMessage.java index b8786fc8..130d165b 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/LocationMessage.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/LocationMessage.java @@ -1,5 +1,6 @@ package com.foxinmy.weixin4j.msg; +import com.foxinmy.weixin4j.model.BaseMsg; import com.foxinmy.weixin4j.type.MessageType; import com.thoughtworks.xstream.annotations.XStreamAlias; @@ -13,12 +14,12 @@ import com.thoughtworks.xstream.annotations.XStreamAlias; * @see 地理位置消息 */ -public class LocationMessage extends BaseMessage { +public class LocationMessage extends BaseMsg { private static final long serialVersionUID = 2866021596599237334L; public LocationMessage() { - super(MessageType.location); + super(MessageType.location.name()); } @XStreamAlias("Location_X") @@ -56,7 +57,7 @@ public class LocationMessage extends BaseMessage { sb.append("[LocationMessage ,toUserName=") .append(super.getToUserName()); sb.append(" ,fromUserName=").append(super.getFromUserName()); - sb.append(" ,msgType=").append(super.getMsgType().name()); + sb.append(" ,msgType=").append(super.getMsgType()); sb.append(" ,location_X=").append(x); sb.append(" ,location_Y=").append(y); sb.append(" ,scale=").append(scale); diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/TextMessage.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/TextMessage.java index e2385938..d54aeac7 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/TextMessage.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/TextMessage.java @@ -1,5 +1,6 @@ package com.foxinmy.weixin4j.msg; +import com.foxinmy.weixin4j.model.BaseMsg; import com.foxinmy.weixin4j.type.MessageType; import com.thoughtworks.xstream.annotations.XStreamAlias; @@ -14,15 +15,13 @@ import com.thoughtworks.xstream.annotations.XStreamAlias; * href="http://mp.weixin.qq.com/wiki/index.php?title=%E6%8E%A5%E6%94%B6%E6%99%AE%E9%80%9A%E6%B6%88%E6%81%AF#.E6.96.87.E6.9C.AC.E6.B6.88.E6.81.AF">接收文本消息 * @see 回复文本消息 - * @see com.foxinmy.weixin4j.msg.BaseMessage - * @see com.foxinmy.weixin4j.msg.BaseMessage#toXml() */ -public class TextMessage extends BaseMessage { +public class TextMessage extends BaseMsg { private static final long serialVersionUID = -7018053906644190260L; public TextMessage() { - super(MessageType.text); + super(MessageType.text.name()); } @XStreamAlias("Content") @@ -41,7 +40,7 @@ public class TextMessage extends BaseMessage { StringBuilder sb = new StringBuilder(); sb.append("[TextMessage ,toUserName=").append(super.getToUserName()); sb.append(" ,fromUserName=").append(super.getFromUserName()); - sb.append(" ,msgType=").append(super.getMsgType().name()); + sb.append(" ,msgType=").append(super.getMsgType()); sb.append(" ,content=").append(content); sb.append(" ,createTime=").append(super.getCreateTime()); sb.append(" ,msgId=").append(super.getMsgId()).append("]"); diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/VideoMessage.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/VideoMessage.java index 1bdc5dcd..b55ecf8d 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/VideoMessage.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/VideoMessage.java @@ -1,5 +1,6 @@ package com.foxinmy.weixin4j.msg; +import com.foxinmy.weixin4j.model.BaseMsg; import com.foxinmy.weixin4j.type.MessageType; import com.thoughtworks.xstream.annotations.XStreamAlias; @@ -13,12 +14,12 @@ import com.thoughtworks.xstream.annotations.XStreamAlias; * @see 视频消息 */ -public class VideoMessage extends BaseMessage { +public class VideoMessage extends BaseMsg { private static final long serialVersionUID = -1013075358679078381L; public VideoMessage() { - super(MessageType.video); + super(MessageType.video.name()); } @XStreamAlias("MediaId") @@ -39,7 +40,7 @@ public class VideoMessage extends BaseMessage { StringBuilder sb = new StringBuilder(); sb.append("[VideoMessage ,toUserName=").append(super.getToUserName()); sb.append(" ,fromUserName=").append(super.getFromUserName()); - sb.append(" ,msgType=").append(super.getMsgType().name()); + sb.append(" ,msgType=").append(super.getMsgType()); sb.append(" ,mediaId=").append(mediaId); sb.append(" ,thumbMediaId=").append(thumbMediaId); sb.append(" ,createTime=").append(super.getCreateTime()); diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/VoiceMessage.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/VoiceMessage.java index 43d5c8bf..ec3b3f1a 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/VoiceMessage.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/VoiceMessage.java @@ -1,5 +1,6 @@ package com.foxinmy.weixin4j.msg; +import com.foxinmy.weixin4j.model.BaseMsg; import com.foxinmy.weixin4j.type.MessageType; import com.thoughtworks.xstream.annotations.XStreamAlias; @@ -16,12 +17,12 @@ import com.thoughtworks.xstream.annotations.XStreamAlias; * @see 语音消息 */ -public class VoiceMessage extends BaseMessage { +public class VoiceMessage extends BaseMsg { private static final long serialVersionUID = -7988380977182214003L; public VoiceMessage() { - super(MessageType.voice); + super(MessageType.voice.name()); } @XStreamAlias("MediaId") @@ -49,7 +50,7 @@ public class VoiceMessage extends BaseMessage { StringBuilder sb = new StringBuilder(); sb.append("[VoiceMessage ,toUserName=").append(super.getToUserName()); sb.append(" ,fromUserName=").append(super.getFromUserName()); - sb.append(" ,msgType=").append(super.getMsgType().name()); + sb.append(" ,msgType=").append(super.getMsgType()); sb.append(" ,mediaId=").append(mediaId); sb.append(" ,format=").append(format); sb.append(" ,recognition=").append(recognition); diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/event/EventMessage.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/event/EventMessage.java index 977ecb47..1ba788eb 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/event/EventMessage.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/event/EventMessage.java @@ -1,24 +1,26 @@ package com.foxinmy.weixin4j.msg.event; -import com.foxinmy.weixin4j.msg.BaseMessage; +import com.foxinmy.weixin4j.model.BaseMsg; import com.foxinmy.weixin4j.type.EventType; import com.foxinmy.weixin4j.type.MessageType; import com.thoughtworks.xstream.annotations.XStreamAlias; /** * 事件消息基类 + * * @className EventMessage * @author jy.hu * @date 2014年4月6日 * @since JDK 1.7 - * @see 事件推送 + * @see 事件推送 */ -public class EventMessage extends BaseMessage { +public class EventMessage extends BaseMsg { private static final long serialVersionUID = 7703667223814088865L; public EventMessage(EventType eventType) { - super(MessageType.event); + super(MessageType.event.name()); this.eventType = eventType; } @@ -38,7 +40,7 @@ public class EventMessage extends BaseMessage { StringBuilder sb = new StringBuilder(); sb.append("[EventMessage ,toUserName=").append(super.getToUserName()); sb.append(" ,fromUserName=").append(super.getFromUserName()); - sb.append(" ,msgType=").append(super.getMsgType().name()); + sb.append(" ,msgType=").append(super.getMsgType()); sb.append(" ,eventType=").append(eventType.name()); sb.append(" ,createTime=").append(super.getCreateTime()); sb.append(" ,msgId=").append(super.getMsgId()).append("]"); diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/event/LocationEventMessage.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/event/LocationEventMessage.java index 2e7c155c..ae434454 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/event/LocationEventMessage.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/event/LocationEventMessage.java @@ -46,7 +46,7 @@ public class LocationEventMessage extends EventMessage { sb.append("[LocationEventMessage ,toUserName=").append( super.getToUserName()); sb.append(" ,fromUserName=").append(super.getFromUserName()); - sb.append(" ,msgType=").append(super.getMsgType().name()); + sb.append(" ,msgType=").append(super.getMsgType()); sb.append(" ,eventType=").append(super.getEventType().name()); sb.append(" ,longitude=").append(longitude); sb.append(" ,latitude=").append(latitude); diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/event/MassEventMessage.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/event/MassEventMessage.java index c59d187c..ac5851d6 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/event/MassEventMessage.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/event/MassEventMessage.java @@ -58,7 +58,7 @@ public class MassEventMessage extends EventMessage { sb.append("[MassEventMessage ,toUserName=").append( super.getToUserName()); sb.append(" ,fromUserName=").append(super.getFromUserName()); - sb.append(" ,msgType=").append(super.getMsgType().name()); + sb.append(" ,msgType=").append(super.getMsgType()); sb.append(" ,eventType=").append(super.getEventType().name()); sb.append(" ,status=").append(status); sb.append(" ,totalCount=").append(totalCount); diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/event/ScanEventMessage.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/event/ScanEventMessage.java index ec697abe..df8a3f3b 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/event/ScanEventMessage.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/event/ScanEventMessage.java @@ -43,7 +43,7 @@ public class ScanEventMessage extends EventMessage { sb.append("[ScanEventMessage ,toUserName=").append( super.getToUserName()); sb.append(" ,fromUserName=").append(super.getFromUserName()); - sb.append(" ,msgType=").append(super.getMsgType().name()); + sb.append(" ,msgType=").append(super.getMsgType()); sb.append(" ,eventType=").append(super.getEventType().name()); sb.append(" ,eventKey=").append(eventKey); sb.append(" ,ticket=").append(ticket); diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/event/ScribeEventMessage.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/event/ScribeEventMessage.java index 645ab6b6..1dcf0b02 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/event/ScribeEventMessage.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/event/ScribeEventMessage.java @@ -1,14 +1,14 @@ package com.foxinmy.weixin4j.msg.event; - /** - * 关注/取消关注事件 - * 包括直接关注与扫描关注 + * 关注/取消关注事件 包括直接关注与扫描关注 + * * @className ScribeEventMessage * @author jy.hu * @date 2014年4月6日 * @since JDK 1.7 - * @see 关注/取消关注事件 + * @see 关注/取消关注事件 */ public class ScribeEventMessage extends ScanEventMessage { @@ -17,9 +17,10 @@ public class ScribeEventMessage extends ScanEventMessage { @Override public String toString() { StringBuilder sb = new StringBuilder(); - sb.append("[ScribeEventMessage ,toUserName=").append(super.getToUserName()); + sb.append("[ScribeEventMessage ,toUserName=").append( + super.getToUserName()); sb.append(" ,fromUserName=").append(super.getFromUserName()); - sb.append(" ,msgType=").append(super.getMsgType().name()); + sb.append(" ,msgType=").append(super.getMsgType()); sb.append(" ,eventType=").append(super.getEventType().name()); sb.append(" ,eventKey=").append(super.getEventKey()); sb.append(" ,ticket=").append(super.getTicket()); diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/event/menu/MenuEventMessage.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/event/menu/MenuEventMessage.java index 01b3f5d0..ad78083a 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/event/menu/MenuEventMessage.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/event/menu/MenuEventMessage.java @@ -35,7 +35,7 @@ public class MenuEventMessage extends EventMessage { sb.append("[MenuEventMessage ,toUserName=").append( super.getToUserName()); sb.append(" ,fromUserName=").append(super.getFromUserName()); - sb.append(" ,msgType=").append(super.getMsgType().name()); + sb.append(" ,msgType=").append(super.getMsgType()); sb.append(" ,eventType=").append(super.getEventType().name()); sb.append(" ,eventKey=").append(eventKey); sb.append(" ,createTime=").append(super.getCreateTime()); diff --git a/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/msg/model/Article.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/model/Article.java similarity index 73% rename from weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/msg/model/Article.java rename to weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/model/Article.java index 764a62e2..3ada2c3d 100644 --- a/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/msg/model/Article.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/model/Article.java @@ -1,10 +1,12 @@ -package com.foxinmy.weixin4j.mp.msg.model; +package com.foxinmy.weixin4j.msg.model; -import com.foxinmy.weixin4j.type.MediaType; +import java.io.Serializable; + +import com.alibaba.fastjson.annotation.JSONField; import com.thoughtworks.xstream.annotations.XStreamAlias; /** - * 图文对象 + * 客服消息图文 * * @className Article * @author jy @@ -12,15 +14,19 @@ import com.thoughtworks.xstream.annotations.XStreamAlias; * @since JDK 1.7 * @see */ -public class Article extends BaseMsg { - - private static final long serialVersionUID = 1L; +public class Article implements Serializable { + private static final long serialVersionUID = -1231352700301456395L; + + @XStreamAlias("Title") private String title; // 图文消息标题 - @XStreamAlias("description") + @JSONField(name = "description") + @XStreamAlias("Description") private String desc; // 图文消息描述 - @XStreamAlias("picurl") + @JSONField(name = "picurl") + @XStreamAlias("PicUrl") private String picUrl; // 图片链接,支持JPG、PNG格式,较好的效果为大图360*200,小图200*200 + @XStreamAlias("Url") private String url; // 点击图文消息跳转链接 public Article(String title, String desc, String picUrl, String url) { @@ -67,9 +73,4 @@ public class Article extends BaseMsg { return "Article [title=" + title + ", desc=" + desc + ", picUrl=" + picUrl + ", url=" + url + "]"; } - - @Override - public MediaType getMediaType() { - return MediaType.mpnews; - } } diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/model/Base.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/model/Base.java new file mode 100644 index 00000000..5185504d --- /dev/null +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/model/Base.java @@ -0,0 +1,29 @@ +package com.foxinmy.weixin4j.msg.model; + +import java.io.Serializable; + +import com.alibaba.fastjson.annotation.JSONField; +import com.foxinmy.weixin4j.type.MediaType; +import com.thoughtworks.xstream.annotations.XStreamOmitField; + +public class Base implements Serializable { + + private static final long serialVersionUID = 8487251213352068227L; + + @JSONField(serialize = false) + @XStreamOmitField + private MediaType mediaType; + + public Base(MediaType mediaType) { + this.mediaType = mediaType; + } + + public MediaType getMediaType() { + return mediaType; + } + + @Override + public String toString() { + return "Base [mediaType=" + mediaType + "]"; + } +} diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/model/File.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/model/File.java new file mode 100644 index 00000000..b32c8b21 --- /dev/null +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/model/File.java @@ -0,0 +1,43 @@ +package com.foxinmy.weixin4j.msg.model; + +import com.alibaba.fastjson.annotation.JSONField; +import com.foxinmy.weixin4j.type.MediaType; +import com.thoughtworks.xstream.annotations.XStreamAlias; + +/** + * 文件对象 + *

+ * 可用于「企业号的客服消息」 + *

+ * + * @className File + * @author jy + * @date 2014年11月21日 + * @since JDK 1.7 + * @see + */ +public class File extends Base implements Notifyable { + private static final long serialVersionUID = -8149837316289636110L; + + @JSONField(name = "media_id") + @XStreamAlias("MediaId") + private String mediaId; + + public File(String mediaId) { + super(MediaType.file); + this.mediaId = mediaId; + } + + public String getMediaId() { + return mediaId; + } + + public void setMediaId(String mediaId) { + this.mediaId = mediaId; + } + + @Override + public String toString() { + return "File [mediaId=" + mediaId + "]"; + } +} diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/model/Image.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/model/Image.java new file mode 100644 index 00000000..a31b8374 --- /dev/null +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/model/Image.java @@ -0,0 +1,49 @@ +package com.foxinmy.weixin4j.msg.model; + +import com.alibaba.fastjson.annotation.JSONField; +import com.foxinmy.weixin4j.type.MediaType; +import com.thoughtworks.xstream.annotations.XStreamAlias; + +/** + * 图片对象 + *

+ * 可用于「被动消息」「客服消息」「群发消息」 + *

+ * + * @className Image + * @author jy + * @date 2014年9月29日 + * @since JDK 1.7 + * @see + */ +public class Image extends Base implements Responseable, Notifyable, Massable { + + private static final long serialVersionUID = 6928681900960656161L; + + @JSONField(name = "media_id") + @XStreamAlias("MediaId") + private String mediaId; + + public Image(String mediaId) { + super(MediaType.image); + this.mediaId = mediaId; + } + + public Image(MediaType mediaType, String mediaId) { + super(mediaType); + this.mediaId = mediaId; + } + + public String getMediaId() { + return mediaId; + } + + public void setMediaId(String mediaId) { + this.mediaId = mediaId; + } + + @Override + public String toString() { + return "Image [mediaId=" + mediaId + "]"; + } +} diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/model/Massable.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/model/Massable.java new file mode 100644 index 00000000..f80ca632 --- /dev/null +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/model/Massable.java @@ -0,0 +1,18 @@ +package com.foxinmy.weixin4j.msg.model; + +/** + * 标记群发消息 + * + * @className Massable + * @author jy + * @date 2014年11月22日 + * @since JDK 1.7 + * @see com.foxinmy.weixin4j.msg.model.Text + * @see com.foxinmy.weixin4j.msg.model.Image + * @see com.foxinmy.weixin4j.msg.model.Voice + * @see com.foxinmy.weixin4j.msg.model.MpVideo + * @see com.foxinmy.weixin4j.msg.model.MpNews + */ +public interface Massable { + +} diff --git a/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/model/MpArticle.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/model/MpArticle.java similarity index 96% rename from weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/model/MpArticle.java rename to weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/model/MpArticle.java index 2d7280a9..e282952f 100644 --- a/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/model/MpArticle.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/model/MpArticle.java @@ -1,11 +1,11 @@ -package com.foxinmy.weixin4j.mp.model; +package com.foxinmy.weixin4j.msg.model; import java.io.Serializable; import com.alibaba.fastjson.annotation.JSONField; /** - * 群发图文消息 + * 群发消息图文(消息内容存储在微信后台) * * @author jy.hu * @date 2014年4月26日 @@ -28,6 +28,16 @@ public class MpArticle implements Serializable { @JSONField(name = "show_cover_pic") private String showCoverPic; // 是否显示封面,1为显示,0为不显示 可为空 + public MpArticle(String thumbMediaId, String title, String content) { + this.thumbMediaId = thumbMediaId; + this.title = title; + this.content = content; + } + + public MpArticle() { + + } + public String getThumbMediaId() { return thumbMediaId; } @@ -84,16 +94,6 @@ public class MpArticle implements Serializable { this.showCoverPic = showCoverPic ? "1" : "0"; } - public MpArticle(String thumbMediaId, String title, String content) { - this.thumbMediaId = thumbMediaId; - this.title = title; - this.content = content; - } - - public MpArticle() { - - } - @Override public String toString() { StringBuilder sb = new StringBuilder(); diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/model/MpNews.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/model/MpNews.java new file mode 100644 index 00000000..50a01517 --- /dev/null +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/model/MpNews.java @@ -0,0 +1,88 @@ +package com.foxinmy.weixin4j.msg.model; + +import java.util.ArrayList; +import java.util.List; + +import com.alibaba.fastjson.annotation.JSONField; +import com.foxinmy.weixin4j.type.MediaType; +import com.thoughtworks.xstream.annotations.XStreamAlias; +import com.thoughtworks.xstream.annotations.XStreamOmitField; + +/** + * 图文对象(消息内容存储在微信后台) + *

+ * 可用于「群发消息(其中mediaId与articles请至少保持一个有值)」「企业号的客服消息」 + *

+ * + * @className MpNews + * @author jy + * @date 2014年9月29日 + * @since JDK 1.7 + * @see + */ +public class MpNews extends Base implements Massable, Notifyable { + + private static final long serialVersionUID = 8853054484809101524L; + + @JSONField(name = "media_id") + @XStreamAlias("MediaId") + private String mediaId; + @JSONField(name = "articles") + @XStreamOmitField + private List articles; + + public MpNews() { + this(null); + } + + public MpNews(String mediaId) { + super(MediaType.mpnews); + this.mediaId = mediaId; + this.articles = new ArrayList(); + } + + public void pushArticle(String thumbMediaId, String title, String content) { + articles.add(new MpArticle(thumbMediaId, title, content)); + } + + public void pushFirstArticle(String thumbMediaId, String title, + String content) { + articles.add(0, new MpArticle(thumbMediaId, title, content)); + } + + public void pushLastArticle(String thumbMediaId, String title, + String content) { + articles.add(articles.size(), new MpArticle(thumbMediaId, title, + content)); + } + + public MpArticle removeLastArticle() { + return articles.remove(articles.size() - 1); + } + + public MpArticle removeFirstArticle() { + return articles.remove(0); + } + + public void setArticles(List articles) { + this.articles = articles; + } + + public List getArticles() { + return articles; + } + + public String getMediaId() { + return mediaId; + } + + public void setMediaId(String mediaId) { + this.mediaId = mediaId; + } + + @Override + public String toString() { + return "MpNews [articles=" + articles + ", mediaId=" + mediaId + + ", getMediaType()=" + getMediaType() + "]"; + } +} diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/model/MpVideo.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/model/MpVideo.java new file mode 100644 index 00000000..ed287655 --- /dev/null +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/model/MpVideo.java @@ -0,0 +1,44 @@ +package com.foxinmy.weixin4j.msg.model; + +import com.alibaba.fastjson.annotation.JSONField; +import com.foxinmy.weixin4j.type.MediaType; +import com.thoughtworks.xstream.annotations.XStreamAlias; + +/** + * 群发视频对象 + *

+ * 可用于「群发消息」 + *

+ * + * @className MpVideo + * @author jy + * @date 2014年9月29日 + * @since JDK 1.7 + * @see + */ +public class MpVideo extends Base implements Massable { + + private static final long serialVersionUID = 2167437425244069128L; + + @JSONField(name = "media_id") + @XStreamAlias("MediaId") + private String mediaId; + + public MpVideo(String mediaId) { + super(MediaType.mpvideo); + this.mediaId = mediaId; + } + + public String getMediaId() { + return mediaId; + } + + public void setMediaId(String mediaId) { + this.mediaId = mediaId; + } + + @Override + public String toString() { + return "MpVideo [mediaId=" + mediaId + "]"; + } +} diff --git a/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/msg/model/Music.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/model/Music.java similarity index 71% rename from weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/msg/model/Music.java rename to weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/model/Music.java index c5c91b56..958ccb6b 100644 --- a/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/msg/model/Music.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/model/Music.java @@ -1,10 +1,14 @@ -package com.foxinmy.weixin4j.mp.msg.model; +package com.foxinmy.weixin4j.msg.model; +import com.alibaba.fastjson.annotation.JSONField; import com.foxinmy.weixin4j.type.MediaType; import com.thoughtworks.xstream.annotations.XStreamAlias; /** * 音乐对象 + *

+ * 可用于「被动消息」「客服消息」 + *

* * @className Music * @author jy @@ -12,18 +16,23 @@ import com.thoughtworks.xstream.annotations.XStreamAlias; * @since JDK 1.7 * @see */ -public class Music extends BaseMsg { +public class Music extends Base implements Responseable, Notifyable { - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = -5952134916367253297L; + @XStreamAlias("Title") private String title; - @XStreamAlias("description") + @JSONField(name = "description") + @XStreamAlias("Description") private String desc; - @XStreamAlias("musicurl") + @JSONField(name = "musicurl") + @XStreamAlias("MusicUrl") private String musicUrl; - @XStreamAlias("hqmusicurl") + @JSONField(name = "hqmusicurl") + @XStreamAlias("HQMusicUrl") private String hqMusicUrl; - @XStreamAlias("thumb_media_id") + @JSONField(name = "thumb_media_id") + @XStreamAlias("ThumbMediaId") private String thumbMediaId; public Music(String thumbMediaId) { @@ -32,6 +41,7 @@ public class Music extends BaseMsg { public Music(String title, String desc, String musicUrl, String hqMusicUrl, String thumbMediaId) { + super(MediaType.music); this.title = title; this.desc = desc; this.musicUrl = musicUrl; @@ -85,9 +95,4 @@ public class Music extends BaseMsg { + musicUrl + ", hqMusicUrl=" + hqMusicUrl + ", thumbMediaId=" + thumbMediaId + "]"; } - - @Override - public MediaType getMediaType() { - return MediaType.music; - } } diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/model/News.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/model/News.java new file mode 100644 index 00000000..e0aecf44 --- /dev/null +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/model/News.java @@ -0,0 +1,88 @@ +package com.foxinmy.weixin4j.msg.model; + +import java.util.ArrayList; +import java.util.List; + +import com.alibaba.fastjson.annotation.JSONField; +import com.foxinmy.weixin4j.type.MediaType; +import com.thoughtworks.xstream.annotations.XStreamAlias; + +/** + * 图文对象 + *

+ * 可用于「被动消息」「客服消息」 + *

+ * + * @className News + * @author jy + * @date 2014年11月21日 + * @since JDK 1.7 + * @see + */ +@XStreamAlias("Articles") +public class News extends Base implements Responseable, Notifyable { + private static final int MAX_ARTICLE_COUNT = 10; + private static final long serialVersionUID = 3348756809039388415L; + + @JSONField(name = "articles") + @XStreamAlias("Articles") + private List
articles; + + public News() { + super(MediaType.news); + this.articles = new ArrayList
(); + } + + public void pushArticle(String title, String desc, String picUrl, String url) { + if ((articles.size() + 1) > MAX_ARTICLE_COUNT) { + return; + } + articles.add(new Article(title, desc, picUrl, url)); + } + + public void pushFirstArticle(String title, String desc, String picUrl, + String url) { + articles.add(0, new Article(title, desc, picUrl, url)); + } + + public void pushLastArticle(String title, String desc, String picUrl, + String url) { + articles.add(articles.size(), new Article(title, desc, picUrl, url)); + } + + public Article removeLastArticle() { + return articles.remove(articles.size() - 1); + } + + public Article removeFirstArticle() { + return articles.remove(0); + } + + @JSONField(serialize = false) + public boolean isMaxCount() { + return this.articles.size() == MAX_ARTICLE_COUNT; + } + + public void setArticles(List
articles) { + if (articles.size() > MAX_ARTICLE_COUNT) { + articles = articles.subList(0, MAX_ARTICLE_COUNT); + } + this.articles = articles; + } + + public List
getArticles() { + return articles; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + for (Article article : articles) { + sb.append("{title=").append(article.getTitle()); + sb.append(" ,description=").append(article.getDesc()); + sb.append(" ,picUrl=").append(article.getPicUrl()); + sb.append(" ,url=").append(article.getUrl()).append("}"); + } + return sb.toString(); + } +} diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/model/Notifyable.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/model/Notifyable.java new file mode 100644 index 00000000..8ad731ac --- /dev/null +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/model/Notifyable.java @@ -0,0 +1,19 @@ +package com.foxinmy.weixin4j.msg.model; + +/** + * 标记客服消息 + * + * @className Notifyable + * @author jy + * @date 2014年11月22日 + * @since JDK 1.7 + * @see com.foxinmy.weixin4j.msg.model.Text + * @see com.foxinmy.weixin4j.msg.model.Image + * @see com.foxinmy.weixin4j.msg.model.Voice + * @see com.foxinmy.weixin4j.msg.model.Video + * @see com.foxinmy.weixin4j.msg.model.Music + * @see com.foxinmy.weixin4j.msg.model.News + */ +public interface Notifyable { + +} diff --git a/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/msg/model/README.md b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/model/README.md similarity index 100% rename from weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/msg/model/README.md rename to weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/model/README.md diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/model/Responseable.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/model/Responseable.java new file mode 100644 index 00000000..b90f5b72 --- /dev/null +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/model/Responseable.java @@ -0,0 +1,20 @@ +package com.foxinmy.weixin4j.msg.model; + +/** + * 标记被动消息 + * + * @className Responseable + * @author jy + * @date 2014年11月22日 + * @since JDK 1.7 + * @see com.foxinmy.weixin4j.msg.model.Text + * @see com.foxinmy.weixin4j.msg.model.Image + * @see com.foxinmy.weixin4j.msg.model.Voice + * @see com.foxinmy.weixin4j.msg.model.Video + * @see com.foxinmy.weixin4j.msg.model.Music + * @see com.foxinmy.weixin4j.msg.model.News + * @see com.foxinmy.weixin4j.msg.model.Trans + */ +public interface Responseable { + +} diff --git a/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/msg/model/Text.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/model/Text.java similarity index 52% rename from weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/msg/model/Text.java rename to weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/model/Text.java index c6e4d4e4..7874e863 100644 --- a/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/msg/model/Text.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/model/Text.java @@ -1,21 +1,32 @@ -package com.foxinmy.weixin4j.mp.msg.model; +package com.foxinmy.weixin4j.msg.model; import com.foxinmy.weixin4j.type.MediaType; +import com.thoughtworks.xstream.annotations.XStreamAlias; /** * 文本对象 + *

+ * 可用于「被动消息」「客服消息」「群发消息」 + *

+ * * @className Text * @author jy * @date 2014年9月29日 * @since JDK 1.7 * @see */ -public class Text extends BaseMsg { +@XStreamAlias("Content") +public class Text extends Base implements Responseable, Notifyable, Massable { + + private static final long serialVersionUID = 520050144519064503L; - private static final long serialVersionUID = 1L; - private String content; + public Text(String content) { + super(MediaType.text); + this.content = content; + } + public String getContent() { return content; } @@ -24,17 +35,8 @@ public class Text extends BaseMsg { this.content = content; } - public Text(String content) { - this.content = content; - } - @Override public String toString() { return "Text [content=" + content + "]"; } - - @Override - public MediaType getMediaType() { - return MediaType.text; - } } diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/model/Trans.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/model/Trans.java new file mode 100644 index 00000000..86dbb4ff --- /dev/null +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/model/Trans.java @@ -0,0 +1,44 @@ +package com.foxinmy.weixin4j.msg.model; + +import com.foxinmy.weixin4j.type.MediaType; +import com.thoughtworks.xstream.annotations.XStreamAlias; + +/** + * 转移到客服 + *

+ * 可用于「被动消息」 + *

+ * + * @className Trans + * @author jy + * @date 2014年11月21日 + * @since JDK 1.7 + * @see + */ +@XStreamAlias("TransInfo") +public class Trans extends Base implements Responseable { + + private static final long serialVersionUID = -214711609286629729L; + + // 指定会话接入的客服账号 + @XStreamAlias("KfAccount") + private String kfAccount; + + public Trans() { + this(null); + } + + public Trans(String kfAccount) { + super(MediaType.transfer_customer_service); + this.kfAccount = kfAccount; + } + + public String getKfAccount() { + return kfAccount; + } + + @Override + public String toString() { + return "Trans [kfAccount=" + kfAccount + "]"; + } +} diff --git a/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/msg/model/Video.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/model/Video.java similarity index 63% rename from weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/msg/model/Video.java rename to weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/model/Video.java index b53b7c4b..0f6bab3c 100644 --- a/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/msg/model/Video.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/model/Video.java @@ -1,10 +1,14 @@ -package com.foxinmy.weixin4j.mp.msg.model; +package com.foxinmy.weixin4j.msg.model; +import com.alibaba.fastjson.annotation.JSONField; import com.foxinmy.weixin4j.type.MediaType; import com.thoughtworks.xstream.annotations.XStreamAlias; /** * 视频对象 + *

+ * 可用于「被动消息」「客服消息」 + *

* * @className Video * @author jy @@ -12,20 +16,24 @@ import com.thoughtworks.xstream.annotations.XStreamAlias; * @since JDK 1.7 * @see */ -public class Video extends BaseMsg { +public class Video extends Base implements Responseable, Notifyable { - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = 2167437425244069128L; - @XStreamAlias("media_id") + @JSONField(name = "media_id") + @XStreamAlias("MediaId") private String mediaId; - @XStreamAlias("thumb_media_id") + @JSONField(name = "thumb_media_id") private String thumbMediaId; + @XStreamAlias("Title") private String title; - @XStreamAlias("description") + @JSONField(name = "description") + @XStreamAlias("Description") private String desc; public Video(String mediaId) { - this(mediaId, null, null, null); + super(MediaType.video); + this.mediaId = mediaId; } public Video(String mediaId, String thumbMediaId) { @@ -37,6 +45,7 @@ public class Video extends BaseMsg { } public Video(String mediaId, String thumbMediaId, String title, String desc) { + super(MediaType.video); this.mediaId = mediaId; this.thumbMediaId = thumbMediaId; this.title = title; @@ -77,12 +86,8 @@ public class Video extends BaseMsg { @Override public String toString() { - return "Video [mediaId=" + mediaId + ", thumbMediaId=" + thumbMediaId - + ", title=" + title + ", desc=" + desc + "]"; - } - - @Override - public MediaType getMediaType() { - return MediaType.vedio; + return "Video [thumbMediaId=" + thumbMediaId + ", title=" + title + + ", desc=" + desc + ", mediaId=" + mediaId + + ", getMediaType()=" + getMediaType() + "]"; } } diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/model/Voice.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/model/Voice.java new file mode 100644 index 00000000..9b4951f4 --- /dev/null +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/model/Voice.java @@ -0,0 +1,24 @@ +package com.foxinmy.weixin4j.msg.model; + +import com.foxinmy.weixin4j.type.MediaType; + +/** + * 语音对象 + *

+ * 可用于「被动消息」「客服消息」「群发消息」 + *

+ * + * @className Voice + * @author jy + * @date 2014年9月29日 + * @since JDK 1.7 + * @see + */ +public class Voice extends Image implements Responseable, Notifyable, Massable { + + private static final long serialVersionUID = 8853054484809101524L; + + public Voice(String mediaId) { + super(MediaType.voice, mediaId); + } +} diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/type/ButtonType.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/type/ButtonType.java index cf2ab68e..f78b88d8 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/type/ButtonType.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/type/ButtonType.java @@ -1,7 +1,7 @@ package com.foxinmy.weixin4j.type; /** - * 自定义菜单类型
+ * 自定义菜单类型
* scancode_push 到 location_selec * 仅支持微信iPhone5.4.1以上版本,和Android5 .4以上版本的微信用户 旧版本微信用户点击后将没有回应 * 开发者也不能正常接收到事件推送。 diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/type/MediaType.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/type/MediaType.java index 322ba3ce..0a158da7 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/type/MediaType.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/type/MediaType.java @@ -1,40 +1,48 @@ package com.foxinmy.weixin4j.type; /** - * 上传的媒体类型
- * 图片(image): 128K,支持JPG格式
- * 语音(voice):256K,播放长度不超过60s,支持AMR\MP3格式
- * 视频(video):1MB,支持MP4格式
- * 缩略图(thumb):64KB,支持JPG格式
+ * 上传的媒体类型
+ *

+ * 公众平台上传限制:
图片(image): 128K,支持JPG格式
+ * 语音(voice):256K,播放长度不超过60s,支持AMR\MP3格式
视频(video):1MB,支持MP4格式
+ * 缩略图(thumb):64KB,支持JPG格式
+ *

+ *

+ * 企业号上传限制:
图片(image):1MB,支持JPG格式
语音(voice):2MB,播放长度不超过60s,支持AMR格式
+ * 视频(video):10MB,支持MP4格式
普通文件(file):10MB
+ *

*

* 媒体文件在后台保存时间为3天,即3天后media_id失效 - *

+ *

* * @author jy.hu * @date 2014年4月2日 * @since JDK 1.7 */ public enum MediaType { - image("image/jpeg", "jpg"), voice("binary/octet-stream", "amr"), vedio( - "binary/octet-stream", "mp4"), thumb("image/jpeg", "jpg"), text( - "application/json", ""), music("binary/octet-stream", "mp3"), news( - "application/json", ""), mpnews("application/json", ""), mpvideo( - "binary/octet-stream", ""); + image("jpg"), voice("amr/mp3"), video("mp4"), thumb("jpg"), file("unknown"), text( + ""), music(""), news(""), mpnews(""), mpvideo(""), transfer_customer_service( + ""); - MediaType(String contentType, String formatType) { - this.contentType = contentType; - this.formatType = formatType; + MediaType(String formatName) { + this.formatName = formatName; } - private String contentType; - - public String getContentType() { - return contentType; + public static MediaType getMediaType(String key) { + if (key.equals("jpg")) { + return MediaType.image; + } else if ("amr/mp3".contains(key)) { + return MediaType.voice; + } else if (key.equals("mp4")) { + return MediaType.video; + } else { + return MediaType.file; + } } - private String formatType; + private String formatName; - public String getFormatType() { - return formatType; + public String getFormatName() { + return formatName; } } diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/type/MessageType.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/type/MessageType.java index cb1315a7..fcf20891 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/type/MessageType.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/type/MessageType.java @@ -1,6 +1,6 @@ package com.foxinmy.weixin4j.type; -import com.foxinmy.weixin4j.msg.BaseMessage; +import com.foxinmy.weixin4j.model.BaseMsg; import com.foxinmy.weixin4j.msg.ImageMessage; import com.foxinmy.weixin4j.msg.LinkMessage; import com.foxinmy.weixin4j.msg.LocationMessage; @@ -21,17 +21,13 @@ public enum MessageType { VoiceMessage.class), video(VideoMessage.class), location( LocationMessage.class), link(LinkMessage.class), event( EventMessage.class); - private Class messageClass; + private Class messageClass; - MessageType(Class messageClass) { + MessageType(Class messageClass) { this.messageClass = messageClass; } - public void setMessageClass(Class messageClass) { - this.messageClass = messageClass; - } - - public Class getMessageClass() { + public Class getMessageClass() { return messageClass; } } diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/util/FileUtil.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/util/FileUtil.java new file mode 100644 index 00000000..f3a060f8 --- /dev/null +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/util/FileUtil.java @@ -0,0 +1,127 @@ +package com.foxinmy.weixin4j.util; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; + +/** + * 文件工具类 + * + * @className FileUtil + * @author jy + * @date 2014年11月21日 + * @since JDK 1.7 + * @see + */ +public class FileUtil { + + private final static Map FILE_TYPE_MAP = new HashMap(); + + static { + FILE_TYPE_MAP.put("ffd8ffe000104a464946", "jpg"); + FILE_TYPE_MAP.put("89504e470d0a1a0a0000", "png"); + FILE_TYPE_MAP.put("47494638396126026f01", "gif"); + FILE_TYPE_MAP.put("49492a00227105008037", "tif"); + FILE_TYPE_MAP.put("424d228c010000000000", "bmp"); // 16色位图(bmp) + FILE_TYPE_MAP.put("424d8240090000000000", "bmp"); // 24位位图(bmp) + FILE_TYPE_MAP.put("424d8e1b030000000000", "bmp"); // 256色位图(bmp) + FILE_TYPE_MAP.put("41433130313500000000", "dwg"); + FILE_TYPE_MAP.put("3c21444f435459504520", "html"); + FILE_TYPE_MAP.put("3c21646f637479706520", "htm"); + FILE_TYPE_MAP.put("48544d4c207b0d0a0942", "css"); + FILE_TYPE_MAP.put("696b2e71623d696b2e71", "js"); + FILE_TYPE_MAP.put("7b5c727466315c616e73", "rtf"); + FILE_TYPE_MAP.put("38425053000100000000", "psd"); + FILE_TYPE_MAP.put("46726f6d3a203d3f6762", "eml"); + FILE_TYPE_MAP.put("d0cf11e0a1b11ae10000", "doc"); // MS Excel、Word、Msi + FILE_TYPE_MAP.put("d0cf11e0a1b11ae10000", "vsd"); + FILE_TYPE_MAP.put("5374616E64617264204A", "mdb"); + FILE_TYPE_MAP.put("255044462d312e350d0a", "pdf"); + FILE_TYPE_MAP.put("2e524d46000000120001", "rmvb"); // rmvb、rm + FILE_TYPE_MAP.put("464c5601050000000900", "flv"); // flv、f4v + FILE_TYPE_MAP.put("00000020667479706d70", "mp4"); + FILE_TYPE_MAP.put("49443303000000002176", "mp3"); + FILE_TYPE_MAP.put("000001ba210001000180", "mpg"); + FILE_TYPE_MAP.put("3026b2758e66cf11a6d9", "wmv"); // wmv、asf + FILE_TYPE_MAP.put("52494646e27807005741", "wav"); + FILE_TYPE_MAP.put("52494646d07d60074156", "avi"); + FILE_TYPE_MAP.put("4d546864000000060001", "mid"); + FILE_TYPE_MAP.put("504b0304140000000800", "zip"); + FILE_TYPE_MAP.put("526172211a0700cf9073", "rar"); + FILE_TYPE_MAP.put("235468697320636f6e66", "ini"); + FILE_TYPE_MAP.put("504b03040a0000000000", "jar"); + FILE_TYPE_MAP.put("4d5a9000030000000400", "exe"); + FILE_TYPE_MAP.put("3c25402070616765206c", "jsp"); + FILE_TYPE_MAP.put("4d616e69666573742d56", "mf"); + FILE_TYPE_MAP.put("3c3f786d6c2076657273", "xml"); + FILE_TYPE_MAP.put("494e5345525420494e54", "sql"); + FILE_TYPE_MAP.put("7061636b616765207765", "java"); + FILE_TYPE_MAP.put("406563686f206f66660d", "bat"); + FILE_TYPE_MAP.put("1f8b0800000000000000", "gz"); + FILE_TYPE_MAP.put("6c6f67346a2e726f6f74", "properties"); + FILE_TYPE_MAP.put("cafebabe0000002e0041", "class"); + FILE_TYPE_MAP.put("49545346030000006000", "chm"); + FILE_TYPE_MAP.put("04000000010000001300", "mxp"); + FILE_TYPE_MAP.put("504b0304140006000800", "docx"); + FILE_TYPE_MAP.put("d0cf11e0a1b11ae10000", "wps");// WPS(wps、et、dps) + FILE_TYPE_MAP.put("6431303a637265617465", "torrent"); + FILE_TYPE_MAP.put("6D6F6F76", "mov"); + FILE_TYPE_MAP.put("FF575043", "wpd"); + FILE_TYPE_MAP.put("CFAD12FEC5FD746F", "dbx"); + FILE_TYPE_MAP.put("2142444E", "pst"); + FILE_TYPE_MAP.put("AC9EBD8F", "qdf"); + FILE_TYPE_MAP.put("E3828596", "pwl"); + FILE_TYPE_MAP.put("2E7261FD", "ram"); + } + + private static String bytesToHexString(byte[] src) { + StringBuilder stringBuilder = new StringBuilder(); + for (int i = 0; i < src.length; i++) { + int v = src[i] & 0xFF; + String hv = Integer.toHexString(v); + if (hv.length() < 2) { + stringBuilder.append(0); + } + stringBuilder.append(hv); + } + return stringBuilder.toString(); + } + + /** + * 获取文件类型 + * @param file + * @return + */ + public static String getFileType(File file) { + String fileType = "unknown"; + FileInputStream fis = null; + try { + fis = new FileInputStream(file); + byte[] b = new byte[10]; + fis.read(b, 0, b.length); + String fileCode = bytesToHexString(b).toLowerCase(); + Iterator keyIter = FILE_TYPE_MAP.keySet().iterator(); + while (keyIter.hasNext()) { + String key = keyIter.next().toLowerCase(); + if (key.startsWith(fileCode) || fileCode.startsWith(key)) { + fileType = FILE_TYPE_MAP.get(key); + break; + } + } + } catch (IOException e) { + e.printStackTrace(); + } finally { + if (fis != null) { + try { + fis.close(); + } catch (IOException ignore) { + ; + } + } + } + return fileType; + } +} \ No newline at end of file diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/util/IOUtil.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/util/IOUtil.java index 60eae107..fc3bf95f 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/util/IOUtil.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/util/IOUtil.java @@ -27,13 +27,15 @@ public class IOUtil { return toByteArray(input, Charset.defaultCharset()); } - public static byte[] toByteArray(Reader input, Charset encoding) throws IOException { + public static byte[] toByteArray(Reader input, Charset encoding) + throws IOException { ByteArrayOutputStream output = new ByteArrayOutputStream(); copy(input, output, encoding); return output.toByteArray(); } - public static void copy(Reader input, OutputStream output, Charset encoding) throws IOException { + public static void copy(Reader input, OutputStream output, Charset encoding) + throws IOException { OutputStreamWriter out = new OutputStreamWriter(output, encoding); copyLarge(input, out, new char[DEFAULT_BUFFER_SIZE]); out.flush(); @@ -45,7 +47,8 @@ public class IOUtil { return output.toByteArray(); } - private static long copyLarge(InputStream input, OutputStream output, byte[] buffer) throws IOException { + private static long copyLarge(InputStream input, OutputStream output, + byte[] buffer) throws IOException { long count = 0; int n = 0; while (EOF != (n = input.read(buffer))) { @@ -55,7 +58,8 @@ public class IOUtil { return count; } - private static long copyLarge(Reader input, Writer output, char[] buffer) throws IOException { + private static long copyLarge(Reader input, Writer output, char[] buffer) + throws IOException { long count = 0; int n = 0; while (EOF != (n = input.read(buffer))) { @@ -64,4 +68,16 @@ public class IOUtil { } return count; } + + public static String getExtension(String filename) { + int extensionPos = filename.lastIndexOf("."); + if (extensionPos < 0) { + return ""; + } + int lastUnixPos = filename.lastIndexOf("/"); + int lastWindowsPos = filename.lastIndexOf("\\"); + int lastSeparator = Math.max(lastUnixPos, lastWindowsPos); + return lastSeparator > extensionPos ? "" : filename + .substring(extensionPos + 1); + } } diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/util/MessageUtil.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/util/MessageUtil.java index b001030a..df850c57 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/util/MessageUtil.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/util/MessageUtil.java @@ -16,8 +16,8 @@ import org.dom4j.DocumentHelper; import org.dom4j.io.SAXReader; import com.foxinmy.weixin4j.exception.WeixinException; +import com.foxinmy.weixin4j.model.BaseMsg; import com.foxinmy.weixin4j.model.Consts; -import com.foxinmy.weixin4j.msg.BaseMessage; import com.foxinmy.weixin4j.type.EventType; import com.foxinmy.weixin4j.type.MessageType; import com.foxinmy.weixin4j.xml.XStream; @@ -112,14 +112,14 @@ public class MessageUtil { } /** - * 对xml消息解密 + * 对AES消息解密 * * @param appId * @param encodingAesKey * aes加密的密钥 * @param encryptContent * 加密的消息体 - * @return 解密后的xml + * @return 解密后的字符 * @throws WeixinException */ public static String aesDecrypt(String appId, String encodingAesKey, @@ -191,14 +191,14 @@ public class MessageUtil { * @see com.foxinmy.weixin4j.msg.event.LocationEventMessage * @see com.foxinmy.weixin4j.msg.event.menu.MenuEventMessage */ - public static BaseMessage xml2msg(String xmlMsg) throws DocumentException { + public static BaseMsg xml2msg(String xmlMsg) throws DocumentException { Document doc = DocumentHelper.parseText(xmlMsg); String type = doc.selectSingleNode("/xml/MsgType").getStringValue(); if (StringUtils.isBlank(type)) { return null; } MessageType messageType = MessageType.valueOf(type.toLowerCase()); - Class messageClass = messageType + Class messageClass = messageType .getMessageClass(); if (messageType == MessageType.event) { type = doc.selectSingleNode("/xml/Event").getStringValue(); @@ -217,7 +217,7 @@ public class MessageUtil { * @throws DocumentException * @see {@link com.foxinmy.weixin4j.util.MessageUtil#xml2msg(String)} */ - public static BaseMessage xml2msg(InputStream inputStream) + public static BaseMsg xml2msg(InputStream inputStream) throws DocumentException { SAXReader reader = new SAXReader(); Document doc = reader.read(inputStream); diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/util/PKCS7Encoder.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/util/PKCS7Encoder.java index a56b2b0f..4c826e00 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/util/PKCS7Encoder.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/util/PKCS7Encoder.java @@ -13,7 +13,7 @@ import java.util.Arrays; import org.apache.http.Consts; /** - * 提供基于PKCS7算法的加解密接口
+ * 提供基于PKCS7算法的加解密接口
* 提供接收和推送给公众平台消息的加解密接口(UTF8编码的字符串). *
    *
  1. 第三方回复加密消息给公众平台
  2. diff --git a/weixin4j-mp/README.md b/weixin4j-mp/README.md index 67f2f241..e5f777b7 100644 --- a/weixin4j-mp/README.md +++ b/weixin4j-mp/README.md @@ -82,4 +82,10 @@ weixin4j-mp * 2014-11-17 - + **weixin4j-mp-api**: 新增`冲正`和`被扫支付`接口 \ No newline at end of file + + **weixin4j-mp-api**: 新增`冲正`和`被扫支付`接口 + +* 2014-11-23 + + + **weixin4j-mp-api**: 重新定义(手贱)了「被动消息」「客服消息」「群发消息」的传输实体 + + + **weixin4j-mp-server**: `WeixinServerBootstrap`重命名为`WeixinMpServerBootstrap` \ No newline at end of file diff --git a/weixin4j-mp/pom.xml b/weixin4j-mp/pom.xml index b54e612f..9f9d5e69 100644 --- a/weixin4j-mp/pom.xml +++ b/weixin4j-mp/pom.xml @@ -17,9 +17,6 @@ weixin4j-mp-api weixin4j-mp-server - - weixin4j-mp - com.foxinmy.weixin4j diff --git a/weixin4j-mp/weixin4j-mp-api/README.md b/weixin4j-mp/weixin4j-mp-api/README.md index 191014a1..1a837930 100644 --- a/weixin4j-mp/weixin4j-mp-api/README.md +++ b/weixin4j-mp/weixin4j-mp-api/README.md @@ -47,17 +47,17 @@ weixin.properties说明 示例(properties中换行用右斜杆\\) > account={"id":"appId","secret":"appSecret", -> "token":"开放者的token 非必须","openId":"公众号的openid 非必须", +> "token":"开放者的token 必须","openId":"公众号的openid 非必须", > "encodingAesKey":"公众号设置了加密方式且为「安全模式」需要填入", > "mchId":"V3.x版本下的微信商户号", > "partnerId":"财付通的商户号","partnerKey":"财付通商户权限密钥Key", > "version":"针对微信支付的版本号(2,3),如果不填则按照mchId非空与否来判断", -> "paySignKey":"微信支付中调用API的密钥"}
    -> token_path=/tmp/weixin/token
    -> qr_path=/tmp/weixin/qr
    -> media_path=/tmp/weixin/media
    -> bill_path=/tmp/weixin/bill
    -> ca_file=/tmp/weixin/xxxxx.p12 | xxxx.pfx
    +> "paySignKey":"微信支付中调用API的密钥"}
    +> token_path=/tmp/weixin/token
    +> qr_path=/tmp/weixin/qr
    +> media_path=/tmp/weixin/media
    +> bill_path=/tmp/weixin/bill
    +> ca_file=/tmp/weixin/xxxxx.p12 | xxxx.pfx
    2.实例化一个`WeixinProxy`对象,调用API,需要强调的是如果只传入appid,appsecret两个参数将无法调用支付相关接口 diff --git a/weixin4j-mp/weixin4j-mp-api/pom.xml b/weixin4j-mp/weixin4j-mp-api/pom.xml index 4345ef9d..87af0a2e 100644 --- a/weixin4j-mp/weixin4j-mp-api/pom.xml +++ b/weixin4j-mp/weixin4j-mp-api/pom.xml @@ -13,11 +13,13 @@ https://github.com/foxinmy/weixin4j/tree/master/weixin4j-mp/weixin4j-mp-api 微信公众号API - weixin4j-mp-api org.apache.maven.plugins maven-assembly-plugin + + ${project.name} + diff --git a/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/WeixinProxy.java b/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/WeixinProxy.java index 3fa077a6..9785d47f 100644 --- a/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/WeixinProxy.java +++ b/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/WeixinProxy.java @@ -6,10 +6,10 @@ import java.io.InputStream; import java.util.Date; import java.util.List; -import com.alibaba.fastjson.JSONObject; import com.foxinmy.weixin4j.exception.WeixinException; import com.foxinmy.weixin4j.http.JsonResult; import com.foxinmy.weixin4j.http.XmlResult; +import com.foxinmy.weixin4j.model.Button; import com.foxinmy.weixin4j.model.WeixinMpAccount; import com.foxinmy.weixin4j.mp.api.CustomApi; import com.foxinmy.weixin4j.mp.api.GroupApi; @@ -22,27 +22,26 @@ import com.foxinmy.weixin4j.mp.api.PayApi; import com.foxinmy.weixin4j.mp.api.QrApi; import com.foxinmy.weixin4j.mp.api.TmplApi; import com.foxinmy.weixin4j.mp.api.UserApi; -import com.foxinmy.weixin4j.mp.model.Button; +import com.foxinmy.weixin4j.mp.message.NotifyMessage; +import com.foxinmy.weixin4j.mp.message.TemplateMessage; import com.foxinmy.weixin4j.mp.model.CustomRecord; import com.foxinmy.weixin4j.mp.model.Following; import com.foxinmy.weixin4j.mp.model.Group; import com.foxinmy.weixin4j.mp.model.KfAccount; -import com.foxinmy.weixin4j.mp.model.MpArticle; import com.foxinmy.weixin4j.mp.model.OauthToken; import com.foxinmy.weixin4j.mp.model.QRParameter; import com.foxinmy.weixin4j.mp.model.SemQuery; import com.foxinmy.weixin4j.mp.model.SemResult; import com.foxinmy.weixin4j.mp.model.User; -import com.foxinmy.weixin4j.mp.msg.model.Article; -import com.foxinmy.weixin4j.mp.msg.model.BaseMsg; -import com.foxinmy.weixin4j.mp.msg.notify.BaseNotify; import com.foxinmy.weixin4j.mp.payment.ApiResult; import com.foxinmy.weixin4j.mp.payment.Refund; import com.foxinmy.weixin4j.mp.payment.RefundResult; import com.foxinmy.weixin4j.mp.payment.v2.Order; -import com.foxinmy.weixin4j.mp.response.TemplateMessage; import com.foxinmy.weixin4j.mp.type.BillType; import com.foxinmy.weixin4j.mp.type.IdQuery; +import com.foxinmy.weixin4j.msg.model.Base; +import com.foxinmy.weixin4j.msg.model.MpArticle; +import com.foxinmy.weixin4j.msg.model.Video; import com.foxinmy.weixin4j.token.FileTokenHolder; import com.foxinmy.weixin4j.token.TokenHolder; import com.foxinmy.weixin4j.type.AccountType; @@ -119,10 +118,20 @@ public class WeixinProxy { /** * 上传媒体文件 - *

    - * 正常情况下返回{"type":"TYPE","media_id":"MEDIA_ID","created_at":123456789}, - * 否则抛出异常. - *

    + * + * @param file + * 媒体对象 + * @return 上传到微信服务器返回的媒体标识 + * @see {@link com.foxinmy.weixin4j.mp.WeixinProxy#uploadMedia(File, MediaType)} + * @throws WeixinException + * @throws IOException + */ + public String uploadMedia(File file) throws WeixinException, IOException { + return mediaApi.uploadMedia(file); + } + + /** + * 上传媒体文件 * * @param file * 文件对象 @@ -131,10 +140,8 @@ public class WeixinProxy { * @return 上传到微信服务器返回的媒体标识 * @throws WeixinException * @throws IOException - * @see 上传下载说明 * @see com.foxinmy.weixin4j.type.MediaType - * @see com.foxinmy.weixin4j.mp.api.MediaApi + * @see {@link com.foxinmy.weixin4j.mp.WeixinProxy#uploadMedia(String, byte[],String)} */ public String uploadMedia(File file, MediaType mediaType) throws WeixinException, IOException { @@ -143,17 +150,24 @@ public class WeixinProxy { /** * 上传媒体文件 + *

    + * 正常情况下返回{"type":"TYPE","media_id":"MEDIA_ID","created_at":123456789}, + * 否则抛出异常. + *

    * + * @param fileName + * 文件名 * @param bytes * 媒体数据包 * @param mediaType * 媒体类型 * @return 上传到微信服务器返回的媒体标识 - * @throws WeixinException + * @see 上传下载说明 * @see com.foxinmy.weixin4j.mp.api.MediaApi - * @see {@link com.foxinmy.weixin4j.mp.WeixinProxy#uploadMedia(File, MediaType)} + * @throws WeixinException */ - public String uploadMedia(String fileName, byte[] data, MediaType mediaType) + public String uploadMedia(String fileName, byte[] data, String mediaType) throws WeixinException { return mediaApi.uploadMedia(fileName, data, mediaType); } @@ -175,6 +189,7 @@ public class WeixinProxy { * href="http://mp.weixin.qq.com/wiki/index.php?title=%E4%B8%8A%E4%BC%A0%E4%B8%8B%E8%BD%BD%E5%A4%9A%E5%AA%92%E4%BD%93%E6%96%87%E4%BB%B6">上传下载说明 * @see com.foxinmy.weixin4j.type.MediaType * @see com.foxinmy.weixin4j.mp.api.MediaApi + * @see {@link com.foxinmy.weixin4j.mp.WeixinProxy#downloadMedia(String)} */ public File downloadMedia(String mediaId, MediaType mediaType) throws WeixinException, IOException { @@ -185,15 +200,13 @@ public class WeixinProxy { * 下载媒体文件 * * @param mediaId - * @param mediaType + * 媒体ID * @return 二进制数据包 * @throws WeixinException * @see com.foxinmy.weixin4j.mp.api.MediaApi - * @see {@link com.foxinmy.weixin4j.mp.WeixinProxy#downloadMedia(String, MediaType)} */ - public byte[] downloadMediaData(String mediaId, MediaType mediaType) - throws WeixinException { - return mediaApi.downloadMediaData(mediaId, mediaType); + public byte[] downloadMedia(String mediaId) throws WeixinException { + return mediaApi.downloadMedia(mediaId); } /** @@ -204,57 +217,18 @@ public class WeixinProxy { * @throws WeixinException * @see 发送客服消息 - * @see com.foxinmy.weixin4j.mp.msg.notify.TextNotify - * @see com.foxinmy.weixin4j.mp.msg.notify.ImageNotify - * @see com.foxinmy.weixin4j.mp.msg.notify.MusicNotify - * @see com.foxinmy.weixin4j.mp.msg.notify.VideoNotify - * @see com.foxinmy.weixin4j.mp.msg.notify.VoiceNotify - * @see com.foxinmy.weixin4j.mp.msg.notify.ArticleNotify + * @see com.foxinmy.weixin4j.msg.model.Text + * @see com.foxinmy.weixin4j.msg.model.Image + * @see com.foxinmy.weixin4j.msg.model.Voice + * @see com.foxinmy.weixin4j.msg.model.Video + * @see com.foxinmy.weixin4j.msg.model.Music + * @see com.foxinmy.weixin4j.msg.model.News * @see com.foxinmy.weixin4j.mp.api.NotifyApi */ - public JsonResult sendNotify(BaseNotify notify) throws WeixinException { + public JsonResult sendNotify(NotifyMessage notify) throws WeixinException { return notifyApi.sendNotify(notify); } - /** - * 发送图文消息 - * - * @param touser - * 目标ID - * @param articles - * 图文列表 - * @return 发送结果 - * @throws WeixinException - * @see com.foxinmy.weixin4j.mp.msg.model.Article - * @see com.foxinmy.weixin4j.mp.msg.notify.ArticleNotify - * @see com.foxinmy.weixin4j.mp.api.NotifyApi - */ - public JsonResult sendNotify(String touser, List
    articles) - throws WeixinException { - return notifyApi.sendNotify(touser, articles); - } - - /** - * 发送客服消息(不包含图文消息) - * - * @param touser - * 目标用户 - * @param baseMsg - * 消息类型 - * @return 发送结果 - * @see com.foxinmy.weixin4j.mp.msg.model.Text - * @see com.foxinmy.weixin4j.mp.msg.model.Image - * @see com.foxinmy.weixin4j.mp.msg.model.Music - * @see com.foxinmy.weixin4j.mp.msg.model.Video - * @see com.foxinmy.weixin4j.mp.msg.model.Voice - * @see com.foxinmy.weixin4j.mp.api.NotifyApi - * @throws WeixinException - */ - public JsonResult sendNotify(String touser, BaseMsg baseMsg) - throws WeixinException { - return notifyApi.sendNotify(touser, baseMsg); - } - /** * 客服聊天记录 * @@ -310,7 +284,7 @@ public class WeixinProxy { * href="http://mp.weixin.qq.com/wiki/index.php?title=%E9%AB%98%E7%BA%A7%E7%BE%A4%E5%8F%91%E6%8E%A5%E5%8F%A3">高级群发 * @see 上传图文消息 - * @see com.foxinmy.weixin4j.mp.model.MpArticle + * @see com.foxinmy.weixin4j.msg.model.MpArticle * @see com.foxinmy.weixin4j.mp.api.MassApi */ public String uploadArticle(List articles) @@ -321,106 +295,96 @@ public class WeixinProxy { /** * 上传分组群发的视频素材 * - * @param mediaId - * 媒体文件中上传得到的Id - * @param title - * 标题 可为空 - * @param desc - * 描述 可为空 + * @param video + * 视频对象 其中mediaId媒体文件中上传得到的Id 不能为空 * @return 上传后的ID * @throws WeixinException * * @see 高级群发 * @see com.foxinmy.weixin4j.mp.api.MassApi - * @see {@link com.foxinmy.weixin4j.mp.api.MediaApi#uploadMedia(File, MediaType)} + * @see com.foxinmy.weixin4j.msg.model.Video + * @see com.foxinmy.weixin4j.msg.model.MpVideo + * @see {@link com.foxinmy.weixin4j.mp.api.MediaApi#uploadMedia(File)} */ - public String uploadVideo(String mediaId, String title, String desc) - throws WeixinException { - return massApi.uploadVideo(mediaId, title, desc); + public String uploadVideo(Video video) throws WeixinException { + return massApi.uploadVideo(video); } /** * 分组群发 * - * @param mediaId - * 媒体ID 如果为text 则表示content - * @param mediaType - * 媒体类型 + * @param box + * 消息项 * @param groupId * 分组ID - * @return + * @return 群发后的消息ID * @throws WeixinException * @see com.foxinmy.weixin4j.mp.model.Group - * @see com.foxinmy.weixin4j.type.MediaType * @see com.foxinmy.weixin4j.mp.api.MassApi - * @see {@link com.foxinmy.weixin4j.mp.api.MediaApi#uploadMedia(File, MediaType)} + * @see com.foxinmy.weixin4j.msg.model.Text + * @see com.foxinmy.weixin4j.msg.model.Image + * @see com.foxinmy.weixin4j.msg.model.Voice + * @see com.foxinmy.weixin4j.msg.model.MpVideo + * @see com.foxinmy.weixin4j.msg.model.MpNews + * @see {@link com.foxinmy.weixin4j.mp.api.MediaApi#uploadMedia(File)} * @see {@link com.foxinmy.weixin4j.mp.api.GroupApi#getGroupByOpenId(String)} * @see {@link com.foxinmy.weixin4j.mp.api.GroupApi#getGroups()} */ - public String massByGroup(String mediaId, MediaType mediaType, - String groupId) throws WeixinException { - return massApi.massByGroup(mediaId, mediaType, groupId); + public String massByGroupId(Base box, int groupId) throws WeixinException { + return massApi.massByGroupId(box, groupId); } /** - * 分组群发图文消息 + * 分组ID群发图文消息 * * @param articles - * 图文消息列表 - * @param groupId - * 分组ID - * @return 发送出去的消息ID + * 图文列表 + * @param openIds + * openId列表 + * @return 群发后的消息ID + * @see {@link com.foxinmy.weixin4j.mp.WeixinProxy#massByGroupId(Base,int)} * @throws WeixinException - * @see com.foxinmy.weixin4j.mp.model.MpArticle - * @see com.foxinmy.weixin4j.mp.model.Group - * @see com.foxinmy.weixin4j.mp.api.MassApi - * @see {@link com.foxinmy.weixin4j.mp.api.MediaApi#uploadMedia(File, MediaType)} - * @see {@link com.foxinmy.weixin4j.mp.api.MassApi#uploadNews(List)} - * @see {@link com.foxinmy.weixin4j.mp.WeixinProxy#massByGroup(String,MediaType,String)} */ - public String massArticleByGroup(List articles, String groupId) + public String massArticleByGroupId(List articles, int groupId) throws WeixinException { - return massApi.massArticleByGroup(articles, groupId); + return massApi.massArticleByGroupId(articles, groupId); } /** * openId群发 * - * @param mediaId - * 媒体ID 如果为text 则表示content - * @param mediaType - * 媒体类型 + * @param box + * 消息项 * @param openIds * openId列表 - * @return + * @return 群发后的消息ID * @throws WeixinException * @see com.foxinmy.weixin4j.mp.model.User - * @see com.foxinmy.weixin4j.type.MediaType * @see com.foxinmy.weixin4j.mp.api.MassApi - * @see {@link com.foxinmy.weixin4j.mp.api.MediaApi#uploadMedia(File, MediaType)} - * @see {@link com.foxinmy.weixin4j.mp.WeixinProxy#massByOpenIds(JSONObject,String...)} + * @see com.foxinmy.weixin4j.msg.model.Text + * @see com.foxinmy.weixin4j.msg.model.Image + * @see com.foxinmy.weixin4j.msg.model.Voice + * @see com.foxinmy.weixin4j.msg.model.MpVideo + * @see com.foxinmy.weixin4j.msg.model.MpNews + * @see {@link com.foxinmy.weixin4j.mp.api.MediaApi#uploadMedia(File)} + * @see {@link com.foxinmy.weixin4j.mp.api.UserApi#getUser(String)} */ - public String massByOpenIds(String mediaId, MediaType mediaType, - String... openIds) throws WeixinException { - return massApi.massByOpenIds(mediaId, mediaType, openIds); + public String massByOpenIds(Base box, String... openIds) + throws WeixinException { + return massApi.massByOpenIds(box, openIds); } /** - * openId图文群发 + * 根据openid群发图文消息 * * @param articles - * 图文消息列表 + * 图文列表 * @param openIds - * 目标ID列表 - * @return 发送出去的消息ID + * openId列表 + * @return 群发后的消息ID + * @see {@link com.foxinmy.weixin4j.mp.WeixinProxy#massByOpenIds(Base,String...)} * @throws WeixinException - * @see com.foxinmy.weixin4j.mp.model.MpArticle - * @see com.foxinmy.weixin4j.mp.model.User - * @see com.foxinmy.weixin4j.mp.api.MassApi - * @see {@link com.foxinmy.weixin4j.mp.api.MediaApi#uploadMedia(File, MediaType)} - * @see {@link com.foxinmy.weixin4j.mp.api.MediaApi#uploadNews(List)} - * @see {@link com.foxinmy.weixin4j.mp.WeixinProxy#massByOpenIds(String,MediaType,String...)} */ public String massArticleByOpenIds(List articles, String... openIds) throws WeixinException { @@ -439,8 +403,8 @@ public class WeixinProxy { * @see 删除群发 * @see com.foxinmy.weixin4j.mp.api.MassApi - * @see {@link com.foxinmy.weixin4j.mp.WeixinProxy#massByGroup(JSONObject, String)} - * @see {@link com.foxinmy.weixin4j.mp.WeixinProxy#massByOpenIds(JSONObject, String...) + * @see {@link com.foxinmy.weixin4j.mp.WeixinProxy#massByGroupId(Base, int)} + * @see {@link com.foxinmy.weixin4j.mp.WeixinProxy#massByOpenIds(Base, String...) */ public JsonResult deleteMassNews(String msgid) throws WeixinException { return massApi.deleteMassNews(msgid); @@ -643,7 +607,7 @@ public class WeixinProxy { * @throws WeixinException * @see 创建自定义菜单 - * @see com.foxinmy.weixin4j.mp.model.Button + * @see com.foxinmy.weixin4j.model.Button * @see com.foxinmy.weixin4j.type.ButtonType * @see com.foxinmy.weixin4j.mp.api.MenuApi */ @@ -658,7 +622,7 @@ public class WeixinProxy { * @throws WeixinException * @see 查询菜单 - * @see com.foxinmy.weixin4j.mp.model.Button + * @see com.foxinmy.weixin4j.model.Button * @see com.foxinmy.weixin4j.mp.api.MenuApi */ public List