diff --git a/README.md b/README.md
index 8d572a51..b9e4ab20 100644
--- a/README.md
+++ b/README.md
@@ -12,11 +12,13 @@ weixin4j
`微信支付(公众号)`
- `netty构建服务器`
+ `netty服务器&消息分发`
* **weixin4j-qy**
`企业号API封装`
+
+ `netty服务器&消息分发`
更新LOG
-------
@@ -108,6 +110,12 @@ weixin4j
+ **weixin4j-qy**: 新增`菜单管理`接口
+* 2014-11-24
+
+ + **weixin4j-base**: 将Action跟Mapping基础类并入到项目
+
+ + **weixin4j-qy**: 新增netty服务与消息分发
+
接下来
------
* 企业号消息与事件
diff --git a/weixin4j-base/README.md b/weixin4j-base/README.md
index a52b6edb..2537c56a 100644
--- a/weixin4j-base/README.md
+++ b/weixin4j-base/README.md
@@ -33,4 +33,8 @@ weixin4j-base
* 2014-11-23
- + 新增企业号消息体以及用`Responseable`,`Notifyable`,`Massable`三个接口标记不同的可接受的消息类型
\ No newline at end of file
+ + 新增企业号消息体以及用`Responseable`,`Notifyable`,`Massable`三个接口标记不同的可接受的消息类型
+
+* 2014-11-24
+
+ + 将Action跟Mapping基础类并入到项目
\ No newline at end of file
diff --git a/weixin4j-base/pom.xml b/weixin4j-base/pom.xml
index bb41ff0b..57236477 100644
--- a/weixin4j-base/pom.xml
+++ b/weixin4j-base/pom.xml
@@ -100,5 +100,10 @@
commons-codec
${commons.codec.version}
+
+ jaxen
+ jaxen
+ ${jaxen.version}
+
\ No newline at end of file
diff --git a/weixin4j-mp/weixin4j-mp-server/src/main/java/com/foxinmy/weixin4j/mp/action/AbstractAction.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/action/AbstractAction.java
similarity index 89%
rename from weixin4j-mp/weixin4j-mp-server/src/main/java/com/foxinmy/weixin4j/mp/action/AbstractAction.java
rename to weixin4j-base/src/main/java/com/foxinmy/weixin4j/action/AbstractAction.java
index c6f8475e..373e76b2 100644
--- a/weixin4j-mp/weixin4j-mp-server/src/main/java/com/foxinmy/weixin4j/mp/action/AbstractAction.java
+++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/action/AbstractAction.java
@@ -1,4 +1,4 @@
-package com.foxinmy.weixin4j.mp.action;
+package com.foxinmy.weixin4j.action;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
@@ -6,7 +6,7 @@ import java.lang.reflect.Type;
import org.dom4j.DocumentException;
import com.foxinmy.weixin4j.model.BaseMsg;
-import com.foxinmy.weixin4j.mp.message.ResponseMessage;
+import com.foxinmy.weixin4j.response.ResponseMessage;
import com.foxinmy.weixin4j.util.MessageUtil;
import com.foxinmy.weixin4j.xml.XStream;
@@ -17,7 +17,7 @@ import com.foxinmy.weixin4j.xml.XStream;
* @author jy
* @date 2014年10月12日
* @since JDK 1.7
- * @see com.foxinmy.weixin4j.mp.action.WeixinAction
+ * @see com.foxinmy.weixin4j.action.WeixinAction
*/
@SuppressWarnings("unchecked")
public abstract class AbstractAction implements
diff --git a/weixin4j-mp/weixin4j-mp-server/src/main/java/com/foxinmy/weixin4j/mp/action/BlankAction.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/action/BlankAction.java
similarity index 69%
rename from weixin4j-mp/weixin4j-mp-server/src/main/java/com/foxinmy/weixin4j/mp/action/BlankAction.java
rename to weixin4j-base/src/main/java/com/foxinmy/weixin4j/action/BlankAction.java
index 64291e50..7a754876 100644
--- a/weixin4j-mp/weixin4j-mp-server/src/main/java/com/foxinmy/weixin4j/mp/action/BlankAction.java
+++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/action/BlankAction.java
@@ -1,7 +1,7 @@
-package com.foxinmy.weixin4j.mp.action;
+package com.foxinmy.weixin4j.action;
import com.foxinmy.weixin4j.model.BaseMsg;
-import com.foxinmy.weixin4j.mp.message.ResponseMessage;
+import com.foxinmy.weixin4j.response.ResponseMessage;
/**
* 回复一个空字符串 而不是一个XML结构体中content字段的内容为空
@@ -10,7 +10,7 @@ import com.foxinmy.weixin4j.mp.message.ResponseMessage;
* @author jy.hu
* @date 2014年10月2日
* @since JDK 1.7
- * @see com.foxinmy.weixin4j.mp.action.AbstractAction
+ * @see com.foxinmy.weixin4j.action.AbstractAction
*/
public class BlankAction extends AbstractAction {
diff --git a/weixin4j-mp/weixin4j-mp-server/src/main/java/com/foxinmy/weixin4j/mp/action/DebugAction.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/action/DebugAction.java
similarity index 81%
rename from weixin4j-mp/weixin4j-mp-server/src/main/java/com/foxinmy/weixin4j/mp/action/DebugAction.java
rename to weixin4j-base/src/main/java/com/foxinmy/weixin4j/action/DebugAction.java
index 9c7bedd9..673debc5 100644
--- a/weixin4j-mp/weixin4j-mp-server/src/main/java/com/foxinmy/weixin4j/mp/action/DebugAction.java
+++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/action/DebugAction.java
@@ -1,8 +1,8 @@
-package com.foxinmy.weixin4j.mp.action;
+package com.foxinmy.weixin4j.action;
import com.foxinmy.weixin4j.model.BaseMsg;
-import com.foxinmy.weixin4j.mp.message.ResponseMessage;
import com.foxinmy.weixin4j.msg.model.Text;
+import com.foxinmy.weixin4j.response.ResponseMessage;
/**
* 调试输出用户消息
diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/action/README.md b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/action/README.md
new file mode 100644
index 00000000..f560b504
--- /dev/null
+++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/action/README.md
@@ -0,0 +1,3 @@
+消息处理接口,与weixin4j-*-server配合使用
+
+如果只使用API包,则可以不关注
\ No newline at end of file
diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/action/WeixinAction.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/action/WeixinAction.java
new file mode 100644
index 00000000..cbd6bf54
--- /dev/null
+++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/action/WeixinAction.java
@@ -0,0 +1,20 @@
+package com.foxinmy.weixin4j.action;
+
+import org.dom4j.DocumentException;
+
+import com.foxinmy.weixin4j.response.ResponseMessage;
+
+/**
+ * 消息处理接口
+ *
+ * @className Action
+ * @author jy.hu
+ * @date 2014年10月2日
+ * @since JDK 1.7
+ * @see com.foxinmy.weixin4j.action.AbstractAction
+ * @see com.foxinmy.weixin4j.action.BlankAction
+ * @see com.foxinmy.weixin4j.action.DebugAction
+ */
+public interface WeixinAction {
+ public ResponseMessage execute(String inMsg) throws DocumentException;
+}
diff --git a/weixin4j-mp/weixin4j-mp-server/src/main/java/com/foxinmy/weixin4j/mp/mapping/AbstractActionMapping.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/action/mapping/AbstractActionMapping.java
similarity index 94%
rename from weixin4j-mp/weixin4j-mp-server/src/main/java/com/foxinmy/weixin4j/mp/mapping/AbstractActionMapping.java
rename to weixin4j-base/src/main/java/com/foxinmy/weixin4j/action/mapping/AbstractActionMapping.java
index 6390f42b..4dd11936 100644
--- a/weixin4j-mp/weixin4j-mp-server/src/main/java/com/foxinmy/weixin4j/mp/mapping/AbstractActionMapping.java
+++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/action/mapping/AbstractActionMapping.java
@@ -1,4 +1,4 @@
-package com.foxinmy.weixin4j.mp.mapping;
+package com.foxinmy.weixin4j.action.mapping;
import org.dom4j.Document;
import org.dom4j.DocumentException;
diff --git a/weixin4j-mp/weixin4j-mp-server/src/main/java/com/foxinmy/weixin4j/mp/mapping/Action.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/action/mapping/ActionAnnotation.java
similarity index 82%
rename from weixin4j-mp/weixin4j-mp-server/src/main/java/com/foxinmy/weixin4j/mp/mapping/Action.java
rename to weixin4j-base/src/main/java/com/foxinmy/weixin4j/action/mapping/ActionAnnotation.java
index b1de563d..7ab1e535 100644
--- a/weixin4j-mp/weixin4j-mp-server/src/main/java/com/foxinmy/weixin4j/mp/mapping/Action.java
+++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/action/mapping/ActionAnnotation.java
@@ -1,4 +1,4 @@
-package com.foxinmy.weixin4j.mp.mapping;
+package com.foxinmy.weixin4j.action.mapping;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
@@ -18,7 +18,7 @@ import com.foxinmy.weixin4j.type.MessageType;
*/
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
-public @interface Action {
+public @interface ActionAnnotation {
MessageType msgType();
diff --git a/weixin4j-mp/weixin4j-mp-server/src/main/java/com/foxinmy/weixin4j/mp/mapping/ActionMapping.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/action/mapping/ActionMapping.java
similarity index 75%
rename from weixin4j-mp/weixin4j-mp-server/src/main/java/com/foxinmy/weixin4j/mp/mapping/ActionMapping.java
rename to weixin4j-base/src/main/java/com/foxinmy/weixin4j/action/mapping/ActionMapping.java
index 8446cd26..5ea85556 100644
--- a/weixin4j-mp/weixin4j-mp-server/src/main/java/com/foxinmy/weixin4j/mp/mapping/ActionMapping.java
+++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/action/mapping/ActionMapping.java
@@ -1,8 +1,8 @@
-package com.foxinmy.weixin4j.mp.mapping;
+package com.foxinmy.weixin4j.action.mapping;
import org.dom4j.DocumentException;
-import com.foxinmy.weixin4j.mp.action.WeixinAction;
+import com.foxinmy.weixin4j.action.WeixinAction;
/**
* 可扩展的Mapping接口
diff --git a/weixin4j-mp/weixin4j-mp-server/src/main/java/com/foxinmy/weixin4j/mp/mapping/AnnotationActionMapping.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/action/mapping/AnnotationActionMapping.java
similarity index 78%
rename from weixin4j-mp/weixin4j-mp-server/src/main/java/com/foxinmy/weixin4j/mp/mapping/AnnotationActionMapping.java
rename to weixin4j-base/src/main/java/com/foxinmy/weixin4j/action/mapping/AnnotationActionMapping.java
index 0a6a1c8b..e3f36070 100644
--- a/weixin4j-mp/weixin4j-mp-server/src/main/java/com/foxinmy/weixin4j/mp/mapping/AnnotationActionMapping.java
+++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/action/mapping/AnnotationActionMapping.java
@@ -1,4 +1,4 @@
-package com.foxinmy.weixin4j.mp.mapping;
+package com.foxinmy.weixin4j.action.mapping;
import java.util.HashMap;
import java.util.Map;
@@ -6,7 +6,7 @@ import java.util.Set;
import org.dom4j.DocumentException;
-import com.foxinmy.weixin4j.mp.action.WeixinAction;
+import com.foxinmy.weixin4j.action.WeixinAction;
import com.foxinmy.weixin4j.type.EventType;
import com.foxinmy.weixin4j.type.MessageType;
import com.foxinmy.weixin4j.util.ClassUtil;
@@ -18,17 +18,16 @@ import com.foxinmy.weixin4j.util.ClassUtil;
* @author jy
* @date 2014年10月28日
* @since JDK 1.7
- * @see com.foxinmy.weixin4j.mp.mapping.Action
+ * @see com.foxinmy.weixin4j.action.mapping.ActionAnnotation
*/
public class AnnotationActionMapping extends AbstractActionMapping {
private final Map actionMap;
- public AnnotationActionMapping() {
+ public AnnotationActionMapping(Package actionPackage) {
actionMap = new HashMap();
- Set> weixinActions = ClassUtil.getClasses(WeixinAction.class
- .getPackage());
+ Set> weixinActions = ClassUtil.getClasses(actionPackage);
for (Class> clazz : weixinActions) {
- Action action = clazz.getAnnotation(Action.class);
+ ActionAnnotation action = clazz.getAnnotation(ActionAnnotation.class);
if (action == null) {
continue;
}
diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/action/mapping/README.md b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/action/mapping/README.md
new file mode 100644
index 00000000..38f6c322
--- /dev/null
+++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/action/mapping/README.md
@@ -0,0 +1,7 @@
+消息处理与Action类的mapping对应(使用注解类的方式)
+
+一般来说Action中应该有自己的实际业务处理类,那么上述方式可能不妥
+
+推荐用org.springframework.context.ApplicationContext#getBeansWithAnnotation函数
+
+当然,也可以重写AbstractActionMapping类实现自己的Mapping
\ No newline at end of file
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 e833a55b..b846324d 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
@@ -26,6 +26,8 @@ public class BaseMsg implements Serializable {
private String msgType; // 消息类型
@XStreamAlias("MsgId")
private long msgId; // 消息ID
+ @XStreamAlias("AgentID")
+ private String agentId; // 企业号独有的应用ID
public BaseMsg() {
@@ -81,8 +83,8 @@ public class BaseMsg implements Serializable {
return msgId;
}
- public void setMsgId(long msgId) {
- this.msgId = msgId;
+ public String getAgentId() {
+ return agentId;
}
@Override
@@ -95,8 +97,8 @@ public class BaseMsg implements Serializable {
@Override
public String toString() {
- return "BaseMsg [toUserName=" + toUserName + ", fromUserName="
- + fromUserName + ", createTime=" + createTime + ", msgType="
- + msgType + ", msgId=" + msgId + "]";
+ return "toUserName=" + toUserName + ", fromUserName=" + fromUserName
+ + ", createTime=" + createTime + ", msgType=" + msgType
+ + ", msgId=" + msgId + ", agentId=" + agentId;
}
}
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 f01939a2..660416d8 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
@@ -12,7 +12,9 @@ import com.thoughtworks.xstream.annotations.XStreamAlias;
* @date 2014年4月6日
* @since JDK 1.7
* @see 图片消息
+ * 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#.E5.9B.BE.E7.89.87.E6.B6.88.E6.81.AF">订阅号、服务号的图片消息
+ * @see 企业号的图片消息
*/
public class ImageMessage extends BaseMsg {
@@ -37,14 +39,7 @@ public class ImageMessage extends BaseMsg {
@Override
public String toString() {
- StringBuilder sb = new StringBuilder();
- sb.append("[ImageMessage ,toUserName=").append(super.getToUserName());
- sb.append(" ,fromUserName=").append(super.getFromUserName());
- sb.append(" ,msgType=").append(super.getMsgType());
- sb.append(" ,picUrl=").append(picUrl);
- sb.append(" ,mediaId=").append(mediaId);
- sb.append(" ,createTime=").append(super.getCreateTime());
- sb.append(" ,msgId=").append(super.getMsgId()).append("]");
- return sb.toString();
+ return "ImageMessage [picUrl=" + picUrl + ", mediaId=" + mediaId + ", "
+ + super.toString() + "]";
}
}
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 9d833664..1d6e5abb 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
@@ -12,7 +12,7 @@ import com.thoughtworks.xstream.annotations.XStreamAlias;
* @date 2014年4月6日
* @since JDK 1.7
* @see 链接消息
+ * 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#.E9.93.BE.E6.8E.A5.E6.B6.88.E6.81.AF">订阅号、服务号的链接消息
*/
public class LinkMessage extends BaseMsg {
@@ -43,15 +43,7 @@ public class LinkMessage extends BaseMsg {
@Override
public String toString() {
- StringBuilder sb = new StringBuilder();
- sb.append("[LinkMessage ,toUserName=").append(super.getToUserName());
- sb.append(" ,fromUserName=").append(super.getFromUserName());
- sb.append(" ,msgType=").append(super.getMsgType());
- sb.append(" ,title=").append(title);
- sb.append(" ,description=").append(description);
- sb.append(" ,url=").append(url);
- sb.append(" ,createTime=").append(super.getCreateTime());
- sb.append(" ,msgId=").append(super.getMsgId()).append("]");
- return sb.toString();
+ return "LinkMessage [title=" + title + ", description=" + description
+ + ", url=" + url + ", " + super.toString() + "]";
}
}
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 130d165b..8bb2e8a6 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
@@ -12,7 +12,9 @@ import com.thoughtworks.xstream.annotations.XStreamAlias;
* @date 2014年4月6日
* @since JDK 1.7
* @see 地理位置消息
+ * 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#.E5.9C.B0.E7.90.86.E4.BD.8D.E7.BD.AE.E6.B6.88.E6.81.AF">订阅号、服务号的地理位置消息
+ * @see 企业号的地理位置消息
*/
public class LocationMessage extends BaseMsg {
@@ -53,17 +55,7 @@ public class LocationMessage extends BaseMsg {
@Override
public String toString() {
- StringBuilder sb = new StringBuilder();
- sb.append("[LocationMessage ,toUserName=")
- .append(super.getToUserName());
- sb.append(" ,fromUserName=").append(super.getFromUserName());
- sb.append(" ,msgType=").append(super.getMsgType());
- sb.append(" ,location_X=").append(x);
- sb.append(" ,location_Y=").append(y);
- sb.append(" ,scale=").append(scale);
- sb.append(" ,label=").append(label);
- sb.append(" ,createTime=").append(super.getCreateTime());
- sb.append(" ,msgId=").append(super.getMsgId()).append("]");
- return sb.toString();
+ return "LocationMessage [x=" + x + ", y=" + y + ", scale=" + scale
+ + ", label=" + label + ", " + super.toString() + "]";
}
}
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 d54aeac7..b3dc6460 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
@@ -5,16 +5,16 @@ import com.foxinmy.weixin4j.type.MessageType;
import com.thoughtworks.xstream.annotations.XStreamAlias;
/**
- * 文本消息(接收|回复)
+ * 文本消息
*
* @className TextMessage
* @author jy.hu
* @date 2014年4月6日
* @since JDK 1.7
* @see 接收文本消息
+ * 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 回复文本消息
+ * href="http://qydev.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#text.E6.B6.88.E6.81.AF">企业号的文本消息
*/
public class TextMessage extends BaseMsg {
@@ -31,19 +31,9 @@ public class TextMessage extends BaseMsg {
return content;
}
- public void setContent(String content) {
- this.content = content;
- }
-
@Override
public String toString() {
- StringBuilder sb = new StringBuilder();
- sb.append("[TextMessage ,toUserName=").append(super.getToUserName());
- sb.append(" ,fromUserName=").append(super.getFromUserName());
- sb.append(" ,msgType=").append(super.getMsgType());
- sb.append(" ,content=").append(content);
- sb.append(" ,createTime=").append(super.getCreateTime());
- sb.append(" ,msgId=").append(super.getMsgId()).append("]");
- return sb.toString();
+ return "TextMessage [content=" + content + ", " + super.toString()
+ + "]";
}
}
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 b55ecf8d..f0dc27ab 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
@@ -12,7 +12,9 @@ import com.thoughtworks.xstream.annotations.XStreamAlias;
* @date 2014年4月6日
* @since JDK 1.7
* @see 视频消息
+ * 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#.E8.A7.86.E9.A2.91.E6.B6.88.E6.81.AF">订阅号、服务号的视频消息
+ * @see 企业号的视频消息
*/
public class VideoMessage extends BaseMsg {
@@ -37,14 +39,7 @@ public class VideoMessage extends BaseMsg {
@Override
public String toString() {
- StringBuilder sb = new StringBuilder();
- sb.append("[VideoMessage ,toUserName=").append(super.getToUserName());
- sb.append(" ,fromUserName=").append(super.getFromUserName());
- sb.append(" ,msgType=").append(super.getMsgType());
- sb.append(" ,mediaId=").append(mediaId);
- sb.append(" ,thumbMediaId=").append(thumbMediaId);
- sb.append(" ,createTime=").append(super.getCreateTime());
- sb.append(" ,msgId=").append(super.getMsgId()).append("]");
- return sb.toString();
+ return "VideoMessage [mediaId=" + mediaId + ", thumbMediaId="
+ + thumbMediaId + ", " + super.toString() + "]";
}
}
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 ec3b3f1a..3dd82b80 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
@@ -15,7 +15,9 @@ import com.thoughtworks.xstream.annotations.XStreamAlias;
* @date 2014年4月6日
* @since JDK 1.7
* @see 语音消息
+ * 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#.E8.AF.AD.E9.9F.B3.E6.B6.88.E6.81.AF">订阅号、服务号的语音消息
+ * @see 企业号的语音消息
*/
public class VoiceMessage extends BaseMsg {
@@ -47,15 +49,8 @@ public class VoiceMessage extends BaseMsg {
@Override
public String toString() {
- StringBuilder sb = new StringBuilder();
- sb.append("[VoiceMessage ,toUserName=").append(super.getToUserName());
- sb.append(" ,fromUserName=").append(super.getFromUserName());
- sb.append(" ,msgType=").append(super.getMsgType());
- sb.append(" ,mediaId=").append(mediaId);
- sb.append(" ,format=").append(format);
- sb.append(" ,recognition=").append(recognition);
- sb.append(" ,createTime=").append(super.getCreateTime());
- sb.append(" ,msgId=").append(super.getMsgId()).append("]");
- return sb.toString();
+ return "VoiceMessage [mediaId=" + mediaId + ", format=" + format
+ + ", recognition=" + recognition + ", " + super.toString()
+ + "]";
}
}
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 1ba788eb..8c2e980a 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
@@ -13,7 +13,9 @@ import com.thoughtworks.xstream.annotations.XStreamAlias;
* @date 2014年4月6日
* @since JDK 1.7
* @see 事件推送
+ * href="http://mp.weixin.qq.com/wiki/index.php?title=%E6%8E%A5%E6%94%B6%E4%BA%8B%E4%BB%B6%E6%8E%A8%E9%80%81">订阅号、服务号的事件推送
+ * @see 企业号的事件消息
*/
public class EventMessage extends BaseMsg {
@@ -31,19 +33,8 @@ public class EventMessage extends BaseMsg {
return eventType;
}
- public void setEventType(EventType eventType) {
- this.eventType = eventType;
- }
-
@Override
public String toString() {
- StringBuilder sb = new StringBuilder();
- sb.append("[EventMessage ,toUserName=").append(super.getToUserName());
- sb.append(" ,fromUserName=").append(super.getFromUserName());
- 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("]");
- return sb.toString();
+ return "eventType=" + eventType + ", " + super.toString();
}
}
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 ae434454..ce02a385 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
@@ -11,7 +11,9 @@ import com.thoughtworks.xstream.annotations.XStreamAlias;
* @date 2014年4月6日
* @since JDK 1.7
* @see 上报地理位置事件
+ * href="http://mp.weixin.qq.com/wiki/index.php?title=%E6%8E%A5%E6%94%B6%E4%BA%8B%E4%BB%B6%E6%8E%A8%E9%80%81#.E4.B8.8A.E6.8A.A5.E5.9C.B0.E7.90.86.E4.BD.8D.E7.BD.AE.E4.BA.8B.E4.BB.B6">订阅号、服务号的上报地理位置事件
+ * @see 企业号的上报地理位置事件
*/
public class LocationEventMessage extends EventMessage {
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 ac5851d6..7212d4f3 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
@@ -54,19 +54,9 @@ public class MassEventMessage extends EventMessage {
@Override
public String toString() {
- StringBuilder sb = new StringBuilder();
- sb.append("[MassEventMessage ,toUserName=").append(
- super.getToUserName());
- sb.append(" ,fromUserName=").append(super.getFromUserName());
- sb.append(" ,msgType=").append(super.getMsgType());
- sb.append(" ,eventType=").append(super.getEventType().name());
- sb.append(" ,status=").append(status);
- sb.append(" ,totalCount=").append(totalCount);
- sb.append(" ,filterCount=").append(filterCount);
- sb.append(" ,sentCount=").append(sentCount);
- sb.append(" ,errorCount=").append(errorCount);
- sb.append(" ,createTime=").append(super.getCreateTime());
- sb.append(" ,msgId=").append(super.getMsgId()).append("]");
- return sb.toString();
+ return "MassEventMessage [status=" + status + ", totalCount="
+ + totalCount + ", filterCount=" + filterCount + ", sentCount="
+ + sentCount + ", errorCount=" + errorCount + ", "
+ + super.toString() + "]";
}
}
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 df8a3f3b..db272e9a 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
@@ -1,5 +1,6 @@
package com.foxinmy.weixin4j.msg.event;
+import com.foxinmy.weixin4j.type.EventType;
import com.thoughtworks.xstream.annotations.XStreamAlias;
/**
@@ -15,7 +16,11 @@ import com.thoughtworks.xstream.annotations.XStreamAlias;
public class ScanEventMessage extends EventMessage {
public ScanEventMessage() {
- super(null);
+ super(EventType.scan);
+ }
+
+ public ScanEventMessage(EventType eventType) {
+ super(eventType);
}
private static final long serialVersionUID = 8078674062833071562L;
@@ -39,16 +44,7 @@ public class ScanEventMessage extends EventMessage {
@Override
public String toString() {
- StringBuilder sb = new StringBuilder();
- sb.append("[ScanEventMessage ,toUserName=").append(
- super.getToUserName());
- sb.append(" ,fromUserName=").append(super.getFromUserName());
- sb.append(" ,msgType=").append(super.getMsgType());
- sb.append(" ,eventType=").append(super.getEventType().name());
- sb.append(" ,eventKey=").append(eventKey);
- sb.append(" ,ticket=").append(ticket);
- sb.append(" ,createTime=").append(super.getCreateTime());
- sb.append(" ,msgId=").append(super.getMsgId()).append("]");
- return sb.toString();
+ return "ScanEventMessage [eventKey=" + eventKey + ", ticket=" + ticket
+ + ", " + super.toString() + "]";
}
}
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 1dcf0b02..08a9f793 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,31 +1,31 @@
package com.foxinmy.weixin4j.msg.event;
+import com.foxinmy.weixin4j.type.EventType;
+
/**
- * 关注/取消关注事件 包括直接关注与扫描关注
+ * 关注/取消关注事件 包括直接关注与扫描关注
*
* @className ScribeEventMessage
* @author jy.hu
* @date 2014年4月6日
* @since JDK 1.7
* @see 关注/取消关注事件
+ * href="http://mp.weixin.qq.com/wiki/index.php?title=%E6%8E%A5%E6%94%B6%E4%BA%8B%E4%BB%B6%E6%8E%A8%E9%80%81#.E5.85.B3.E6.B3.A8.2F.E5.8F.96.E6.B6.88.E5.85.B3.E6.B3.A8.E4.BA.8B.E4.BB.B6">订阅号、服务号的关注/取消关注事件
+ * @see 企业号的关注/取消关注
+ * 事 件
*/
public class ScribeEventMessage extends ScanEventMessage {
private static final long serialVersionUID = -6846321620262204915L;
+ public ScribeEventMessage() {
+ super(EventType.subscribe);
+ }
+
@Override
public String toString() {
- StringBuilder sb = new StringBuilder();
- sb.append("[ScribeEventMessage ,toUserName=").append(
- super.getToUserName());
- sb.append(" ,fromUserName=").append(super.getFromUserName());
- 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());
- sb.append(" ,createTime=").append(super.getCreateTime());
- sb.append(" ,msgId=").append(super.getMsgId()).append("]");
- return sb.toString();
+ return "ScribeEventMessage [" + super.toString() + "]";
}
}
diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/event/TemplatesendjobfinishMessage.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/event/TemplatesendjobfinishMessage.java
index 45a9f023..056efd34 100644
--- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/event/TemplatesendjobfinishMessage.java
+++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/event/TemplatesendjobfinishMessage.java
@@ -30,6 +30,7 @@ public class TemplatesendjobfinishMessage extends EventMessage {
@Override
public String toString() {
- return "TemplatesendjobfinishMessage [status=" + status + "]";
+ return "TemplatesendjobfinishMessage [status=" + status + ", "
+ + super.toString() + "]";
}
}
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 ad78083a..1eaffaa4 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
@@ -12,7 +12,9 @@ import com.thoughtworks.xstream.annotations.XStreamAlias;
* @date 2014年4月6日
* @since JDK 1.7
* @see 菜单事件
+ * href="http://mp.weixin.qq.com/wiki/index.php?title=%E8%87%AA%E5%AE%9A%E4%B9%89%E8%8F%9C%E5%8D%95%E4%BA%8B%E4%BB%B6%E6%8E%A8%E9%80%81#.E7.82.B9.E5.87.BB.E8.8F.9C.E5.8D.95.E6.8B.89.E5.8F.96.E6.B6.88.E6.81.AF.E6.97.B6.E7.9A.84.E4.BA.8B.E4.BB.B6.E6.8E.A8.E9.80.81">订阅号、服务号的菜单事件
+ * @see 企业号的菜单事件
*/
public class MenuEventMessage extends EventMessage {
@@ -22,6 +24,10 @@ public class MenuEventMessage extends EventMessage {
super(EventType.click);
}
+ public MenuEventMessage(EventType eventType) {
+ super(eventType);
+ }
+
@XStreamAlias("EventKey")
private String eventKey; // 事件KEY值,与自定义菜单接口中KEY值对应
@@ -31,15 +37,6 @@ public class MenuEventMessage extends EventMessage {
@Override
public String toString() {
- StringBuilder sb = new StringBuilder();
- sb.append("[MenuEventMessage ,toUserName=").append(
- super.getToUserName());
- sb.append(" ,fromUserName=").append(super.getFromUserName());
- sb.append(" ,msgType=").append(super.getMsgType());
- sb.append(" ,eventType=").append(super.getEventType().name());
- sb.append(" ,eventKey=").append(eventKey);
- sb.append(" ,createTime=").append(super.getCreateTime());
- sb.append(" ,msgId=").append(super.getMsgId()).append("]");
- return sb.toString();
+ return "eventKey=" + eventKey + ", " + super.toString();
}
}
diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/event/menu/MenuLocationEventMessage.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/event/menu/MenuLocationEventMessage.java
index 4811681f..91902349 100644
--- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/event/menu/MenuLocationEventMessage.java
+++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/event/menu/MenuLocationEventMessage.java
@@ -11,14 +11,15 @@ import com.thoughtworks.xstream.annotations.XStreamAlias;
* @date 2014年9月30日
* @since JDK 1.7
* @see 弹出地理位置选择事件推送
+ * href="http://mp.weixin.qq.com/wiki/index.php?title=%E8%87%AA%E5%AE%9A%E4%B9%89%E8%8F%9C%E5%8D%95%E4%BA%8B%E4%BB%B6%E6%8E%A8%E9%80%81#location_select.EF.BC.9A.E5.BC.B9.E5.87.BA.E5.9C.B0.E7.90.86.E4.BD.8D.E7.BD.AE.E9.80.89.E6.8B.A9.E5.99.A8.E7.9A.84.E4.BA.8B.E4.BB.B6.E6.8E.A8.E9.80.81">订阅号、服务号的弹出地理位置选择事件推送
+ * @see 企业号的弹出地理位置选择事件推送
*/
public class MenuLocationEventMessage extends MenuEventMessage {
private static final long serialVersionUID = 145223888272819563L;
public MenuLocationEventMessage() {
- super.setEventType(EventType.location_select);
+ super(EventType.location_select);
}
@XStreamAlias("SendLocationInfo")
@@ -69,6 +70,7 @@ public class MenuLocationEventMessage extends MenuEventMessage {
@Override
public String toString() {
- return "MenuLocationEventMessage [locationInfo=" + locationInfo + "]";
+ return "MenuLocationEventMessage [locationInfo=" + locationInfo + ", "
+ + super.toString() + "]";
}
}
diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/event/menu/MenuPhotoEventMessage.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/event/menu/MenuPhotoEventMessage.java
index 674303f3..112013fd 100644
--- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/event/menu/MenuPhotoEventMessage.java
+++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/event/menu/MenuPhotoEventMessage.java
@@ -12,7 +12,8 @@ import com.thoughtworks.xstream.annotations.XStreamAlias;
* @date 2014年9月30日
* @since JDK 1.7
* @see 弹出系统拍照发图的事件推送
+ * href="http://mp.weixin.qq.com/wiki/index.php?title=%E8%87%AA%E5%AE%9A%E4%B9%89%E8%8F%9C%E5%8D%95%E4%BA%8B%E4%BB%B6%E6%8E%A8%E9%80%81#pic_sysphoto.EF.BC.9A.E5.BC.B9.E5.87.BA.E7.B3.BB.E7.BB.9F.E6.8B.8D.E7.85.A7.E5.8F.91.E5.9B.BE.E7.9A.84.E4.BA.8B.E4.BB.B6.E6.8E.A8.E9.80.81">订阅号、服务号的系统发图的事件推送
+ * @see 企业号的系统发图的事件推送
*/
public class MenuPhotoEventMessage extends MenuEventMessage {
@@ -58,6 +59,7 @@ public class MenuPhotoEventMessage extends MenuEventMessage {
@Override
public String toString() {
- return "MenuPhotoEventMessage [pictureInfo=" + pictureInfo + "]";
+ return "MenuPhotoEventMessage [pictureInfo=" + pictureInfo + ", "
+ + super.toString() + "]";
}
}
diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/event/menu/MenuScanEventMessage.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/event/menu/MenuScanEventMessage.java
index cc6e4a1e..6382b29d 100644
--- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/event/menu/MenuScanEventMessage.java
+++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/event/menu/MenuScanEventMessage.java
@@ -5,12 +5,14 @@ import com.thoughtworks.xstream.annotations.XStreamAlias;
/**
* 扫码推事件(scancode_push|scancode_waitmsg)
*
- * @className MenuScanPushEventMessage
+ * @className MenuScanEventMessage
* @author jy
* @date 2014年9月30日
* @since JDK 1.7
* @see 扫码推事件的事件推送
+ * href="http://mp.weixin.qq.com/wiki/index.php?title=%E8%87%AA%E5%AE%9A%E4%B9%89%E8%8F%9C%E5%8D%95%E4%BA%8B%E4%BB%B6%E6%8E%A8%E9%80%81#scancode_push.EF.BC.9A.E6.89.AB.E7.A0.81.E6.8E.A8.E4.BA.8B.E4.BB.B6.E7.9A.84.E4.BA.8B.E4.BB.B6.E6.8E.A8.E9.80.81">订阅号、服务号的扫码推事件
+ * @see 企业号的的扫码推事件
*/
public class MenuScanEventMessage extends MenuEventMessage {
@@ -45,7 +47,7 @@ public class MenuScanEventMessage extends MenuEventMessage {
@Override
public String toString() {
- return "MenuScanPushEventMessage [scanInfo=" + scanInfo + "]";
+ return "MenuScanEventMessage [scanInfo=" + scanInfo + ", "
+ + super.toString() + "]";
}
-
}
diff --git a/weixin4j-mp/weixin4j-mp-server/src/main/java/com/foxinmy/weixin4j/mp/model/HttpWeixinMessage.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/response/HttpWeixinMessage.java
similarity index 91%
rename from weixin4j-mp/weixin4j-mp-server/src/main/java/com/foxinmy/weixin4j/mp/model/HttpWeixinMessage.java
rename to weixin4j-base/src/main/java/com/foxinmy/weixin4j/response/HttpWeixinMessage.java
index d3715426..0ab2ca80 100644
--- a/weixin4j-mp/weixin4j-mp-server/src/main/java/com/foxinmy/weixin4j/mp/model/HttpWeixinMessage.java
+++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/response/HttpWeixinMessage.java
@@ -1,10 +1,8 @@
-package com.foxinmy.weixin4j.mp.model;
-
-import io.netty.handler.codec.http.HttpMethod;
+package com.foxinmy.weixin4j.response;
import java.io.Serializable;
-import com.foxinmy.weixin4j.mp.type.EncryptType;
+import com.foxinmy.weixin4j.type.EncryptType;
import com.thoughtworks.xstream.annotations.XStreamAlias;
@XStreamAlias("xml")
@@ -31,7 +29,7 @@ public class HttpWeixinMessage implements Serializable {
private String xmlContent;
// request method
- private HttpMethod method;
+ private String method;
public String getToUserName() {
return toUserName;
@@ -113,11 +111,11 @@ public class HttpWeixinMessage implements Serializable {
this.xmlContent = xmlContent;
}
- public HttpMethod getMethod() {
+ public String getMethod() {
return method;
}
- public void setMethod(HttpMethod method) {
+ public void setMethod(String method) {
this.method = method;
}
diff --git a/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/message/ResponseMessage.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/response/ResponseMessage.java
similarity index 85%
rename from weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/message/ResponseMessage.java
rename to weixin4j-base/src/main/java/com/foxinmy/weixin4j/response/ResponseMessage.java
index e9fe4fb1..783c86ab 100644
--- a/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/message/ResponseMessage.java
+++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/response/ResponseMessage.java
@@ -1,9 +1,8 @@
-package com.foxinmy.weixin4j.mp.message;
+package com.foxinmy.weixin4j.response;
import org.apache.commons.lang3.StringUtils;
import com.foxinmy.weixin4j.model.BaseMsg;
-import com.foxinmy.weixin4j.mp.converter.TextConverter;
import com.foxinmy.weixin4j.msg.model.Article;
import com.foxinmy.weixin4j.msg.model.Base;
import com.foxinmy.weixin4j.msg.model.News;
@@ -21,7 +20,7 @@ import com.thoughtworks.xstream.annotations.XStreamAlias;
*
* @className ResponseMessage
* @author jy.hu
- * @date 2014年4月6日
+ * @date 2014年11月22日
* @since JDK 1.7
* @see com.foxinmy.weixin4j.msg.model.Text
* @see com.foxinmy.weixin4j.msg.model.Image
@@ -32,7 +31,9 @@ import com.thoughtworks.xstream.annotations.XStreamAlias;
* @see com.foxinmy.weixin4j.msg.model.Trans
* @see 回复被动消息
+ * >订阅号、服务号的被动响应消息
+ * @see 企业号的被动响应消息
*/
@XStreamAlias("xml")
public class ResponseMessage extends BaseMsg {
@@ -105,8 +106,9 @@ public class ResponseMessage extends BaseMsg {
@Override
public String toString() {
- return "ResponseMessage [box=" + box + ", getToUserName()="
- + getToUserName() + ", getFromUserName()=" + getFromUserName()
+ return "ResponseMessage [" + box.toString() + ", attach=" + attach
+ + ", getToUserName()=" + getToUserName()
+ + ", getFromUserName()=" + getFromUserName()
+ ", getCreateTime()=" + getCreateTime() + ", getMsgType()="
+ getMsgType() + "]";
}
diff --git a/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/converter/TextConverter.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/response/TextConverter.java
similarity index 93%
rename from weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/converter/TextConverter.java
rename to weixin4j-base/src/main/java/com/foxinmy/weixin4j/response/TextConverter.java
index b096c889..012a5800 100644
--- a/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/converter/TextConverter.java
+++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/response/TextConverter.java
@@ -1,4 +1,4 @@
-package com.foxinmy.weixin4j.mp.converter;
+package com.foxinmy.weixin4j.response;
import com.foxinmy.weixin4j.msg.model.Text;
import com.thoughtworks.xstream.converters.SingleValueConverter;
diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/type/EncryptType.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/type/EncryptType.java
new file mode 100644
index 00000000..5c1dacab
--- /dev/null
+++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/type/EncryptType.java
@@ -0,0 +1,13 @@
+package com.foxinmy.weixin4j.type;
+
+/**
+ * 消息加密类型
+ * @className EncryptType
+ * @author jy
+ * @date 2014年11月23日
+ * @since JDK 1.7
+ * @see
+ */
+public enum EncryptType {
+ RAW, AES
+}
diff --git a/weixin4j-mp/weixin4j-mp-api/README.md b/weixin4j-mp/weixin4j-mp-api/README.md
index 1a837930..21f80d4a 100644
--- a/weixin4j-mp/weixin4j-mp-api/README.md
+++ b/weixin4j-mp/weixin4j-mp-api/README.md
@@ -47,7 +47,7 @@ weixin.properties说明
示例(properties中换行用右斜杆\\)
> account={"id":"appId","secret":"appSecret",
-> "token":"开放者的token 必须","openId":"公众号的openid 非必须",
+> "token":"开放者的token","openId":"公众号的openid 非必须",
> "encodingAesKey":"公众号设置了加密方式且为「安全模式」需要填入",
> "mchId":"V3.x版本下的微信商户号",
> "partnerId":"财付通的商户号","partnerKey":"财付通商户权限密钥Key",
diff --git a/weixin4j-mp/weixin4j-mp-api/pom.xml b/weixin4j-mp/weixin4j-mp-api/pom.xml
index 87af0a2e..a1a9685d 100644
--- a/weixin4j-mp/weixin4j-mp-api/pom.xml
+++ b/weixin4j-mp/weixin4j-mp-api/pom.xml
@@ -24,11 +24,6 @@
-
- jaxen
- jaxen
- ${jaxen.version}
-
org.apache.poi
poi
diff --git a/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/api/PayApi.java b/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/api/PayApi.java
index be173790..a7deec63 100644
--- a/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/api/PayApi.java
+++ b/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/api/PayApi.java
@@ -42,10 +42,10 @@ import com.foxinmy.weixin4j.http.SSLHttpRequest;
import com.foxinmy.weixin4j.http.XmlResult;
import com.foxinmy.weixin4j.model.Token;
import com.foxinmy.weixin4j.model.WeixinMpAccount;
-import com.foxinmy.weixin4j.mp.converter.RefundConverter;
import com.foxinmy.weixin4j.mp.payment.ApiResult;
import com.foxinmy.weixin4j.mp.payment.PayUtil;
import com.foxinmy.weixin4j.mp.payment.Refund;
+import com.foxinmy.weixin4j.mp.payment.RefundConverter;
import com.foxinmy.weixin4j.mp.payment.RefundResult;
import com.foxinmy.weixin4j.mp.payment.v2.Order;
import com.foxinmy.weixin4j.mp.type.BillType;
diff --git a/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/converter/RefundConverter.java b/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/payment/RefundConverter.java
similarity index 96%
rename from weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/converter/RefundConverter.java
rename to weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/payment/RefundConverter.java
index c9056827..0630f117 100644
--- a/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/converter/RefundConverter.java
+++ b/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/payment/RefundConverter.java
@@ -1,4 +1,4 @@
-package com.foxinmy.weixin4j.mp.converter;
+package com.foxinmy.weixin4j.mp.payment;
import java.lang.reflect.Field;
import java.util.HashMap;
@@ -9,8 +9,6 @@ import java.util.Map.Entry;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
-import com.foxinmy.weixin4j.mp.payment.Refund;
-import com.foxinmy.weixin4j.mp.payment.RefundDetail;
import com.foxinmy.weixin4j.xml.XStream;
import com.thoughtworks.xstream.converters.Converter;
import com.thoughtworks.xstream.converters.MarshallingContext;
diff --git a/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/type/EncryptType.java b/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/type/EncryptType.java
deleted file mode 100644
index 864dff41..00000000
--- a/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/type/EncryptType.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package com.foxinmy.weixin4j.mp.type;
-
-public enum EncryptType {
- RAW, AES
-}
diff --git a/weixin4j-mp/weixin4j-mp-api/src/test/java/com/foxinmy/weixin4j/mp/test/msg/OutMsgTest.java b/weixin4j-mp/weixin4j-mp-api/src/test/java/com/foxinmy/weixin4j/mp/test/msg/OutMsgTest.java
index dff3f554..b7a42079 100644
--- a/weixin4j-mp/weixin4j-mp-api/src/test/java/com/foxinmy/weixin4j/mp/test/msg/OutMsgTest.java
+++ b/weixin4j-mp/weixin4j-mp-api/src/test/java/com/foxinmy/weixin4j/mp/test/msg/OutMsgTest.java
@@ -5,7 +5,6 @@ import org.junit.Before;
import org.junit.Test;
import com.foxinmy.weixin4j.model.BaseMsg;
-import com.foxinmy.weixin4j.mp.message.ResponseMessage;
import com.foxinmy.weixin4j.msg.TextMessage;
import com.foxinmy.weixin4j.msg.model.Image;
import com.foxinmy.weixin4j.msg.model.Music;
@@ -14,6 +13,7 @@ import com.foxinmy.weixin4j.msg.model.Text;
import com.foxinmy.weixin4j.msg.model.Trans;
import com.foxinmy.weixin4j.msg.model.Video;
import com.foxinmy.weixin4j.msg.model.Voice;
+import com.foxinmy.weixin4j.response.ResponseMessage;
/**
* 发送消息格式测试
diff --git a/weixin4j-mp/weixin4j-mp-server/README.md b/weixin4j-mp/weixin4j-mp-server/README.md
index b14b1961..78f3765c 100644
--- a/weixin4j-mp/weixin4j-mp-server/README.md
+++ b/weixin4j-mp/weixin4j-mp-server/README.md
@@ -27,7 +27,7 @@ weixin4j-mp-server
示例(properties中换行用右斜杆\\)
> account={"id":"appId","secret":"appSecret",
-> "token":"开放者的token 必须","openId":"公众号的openid 非必须",
+> "token":"开放者的token","openId":"公众号的openid 非必须",
> "encodingAesKey":"公众号设置了加密方式且为「安全模式」时需要填入",
> "mchId":"V3.x版本下的微信商户号",
> "partnerId":"财付通的商户号","partnerKey":"财付通商户权限密钥Key",
diff --git a/weixin4j-mp/weixin4j-mp-server/src/main/java/com/foxinmy/weixin4j/mp/action/ImageAction.java b/weixin4j-mp/weixin4j-mp-server/src/main/java/com/foxinmy/weixin4j/mp/action/ImageAction.java
index 050b040c..8dadd87e 100644
--- a/weixin4j-mp/weixin4j-mp-server/src/main/java/com/foxinmy/weixin4j/mp/action/ImageAction.java
+++ b/weixin4j-mp/weixin4j-mp-server/src/main/java/com/foxinmy/weixin4j/mp/action/ImageAction.java
@@ -1,6 +1,7 @@
package com.foxinmy.weixin4j.mp.action;
-import com.foxinmy.weixin4j.mp.mapping.Action;
+import com.foxinmy.weixin4j.action.DebugAction;
+import com.foxinmy.weixin4j.action.mapping.ActionAnnotation;
import com.foxinmy.weixin4j.msg.ImageMessage;
import com.foxinmy.weixin4j.type.MessageType;
@@ -13,7 +14,7 @@ import com.foxinmy.weixin4j.type.MessageType;
* @since JDK 1.7
* @see com.foxinmy.weixin4j.msg.ImageMessage
*/
-@Action(msgType = MessageType.image)
+@ActionAnnotation(msgType = MessageType.image)
public class ImageAction extends DebugAction {
}
diff --git a/weixin4j-mp/weixin4j-mp-server/src/main/java/com/foxinmy/weixin4j/mp/action/LinkAction.java b/weixin4j-mp/weixin4j-mp-server/src/main/java/com/foxinmy/weixin4j/mp/action/LinkAction.java
index c48f63f5..367bb53d 100644
--- a/weixin4j-mp/weixin4j-mp-server/src/main/java/com/foxinmy/weixin4j/mp/action/LinkAction.java
+++ b/weixin4j-mp/weixin4j-mp-server/src/main/java/com/foxinmy/weixin4j/mp/action/LinkAction.java
@@ -1,6 +1,7 @@
package com.foxinmy.weixin4j.mp.action;
-import com.foxinmy.weixin4j.mp.mapping.Action;
+import com.foxinmy.weixin4j.action.DebugAction;
+import com.foxinmy.weixin4j.action.mapping.ActionAnnotation;
import com.foxinmy.weixin4j.msg.LinkMessage;
import com.foxinmy.weixin4j.type.MessageType;
@@ -13,7 +14,7 @@ import com.foxinmy.weixin4j.type.MessageType;
* @since JDK 1.7
* @see com.foxinmy.weixin4j.msg.LinkMessage
*/
-@Action(msgType = MessageType.link)
+@ActionAnnotation(msgType = MessageType.link)
public class LinkAction extends DebugAction {
}
diff --git a/weixin4j-mp/weixin4j-mp-server/src/main/java/com/foxinmy/weixin4j/mp/action/LocationAction.java b/weixin4j-mp/weixin4j-mp-server/src/main/java/com/foxinmy/weixin4j/mp/action/LocationAction.java
index 4d580106..5dd22e5d 100644
--- a/weixin4j-mp/weixin4j-mp-server/src/main/java/com/foxinmy/weixin4j/mp/action/LocationAction.java
+++ b/weixin4j-mp/weixin4j-mp-server/src/main/java/com/foxinmy/weixin4j/mp/action/LocationAction.java
@@ -1,6 +1,7 @@
package com.foxinmy.weixin4j.mp.action;
-import com.foxinmy.weixin4j.mp.mapping.Action;
+import com.foxinmy.weixin4j.action.DebugAction;
+import com.foxinmy.weixin4j.action.mapping.ActionAnnotation;
import com.foxinmy.weixin4j.msg.LocationMessage;
import com.foxinmy.weixin4j.type.MessageType;
@@ -13,7 +14,7 @@ import com.foxinmy.weixin4j.type.MessageType;
* @since JDK 1.7
* @see com.foxinmy.weixin4j.msg.LocationMessage
*/
-@Action(msgType = MessageType.location)
+@ActionAnnotation(msgType = MessageType.location)
public class LocationAction extends DebugAction {
}
diff --git a/weixin4j-mp/weixin4j-mp-server/src/main/java/com/foxinmy/weixin4j/mp/action/TextAction.java b/weixin4j-mp/weixin4j-mp-server/src/main/java/com/foxinmy/weixin4j/mp/action/TextAction.java
index b566efef..a59119e3 100644
--- a/weixin4j-mp/weixin4j-mp-server/src/main/java/com/foxinmy/weixin4j/mp/action/TextAction.java
+++ b/weixin4j-mp/weixin4j-mp-server/src/main/java/com/foxinmy/weixin4j/mp/action/TextAction.java
@@ -1,9 +1,10 @@
package com.foxinmy.weixin4j.mp.action;
-import com.foxinmy.weixin4j.mp.mapping.Action;
-import com.foxinmy.weixin4j.mp.message.ResponseMessage;
+import com.foxinmy.weixin4j.action.AbstractAction;
+import com.foxinmy.weixin4j.action.mapping.ActionAnnotation;
import com.foxinmy.weixin4j.msg.TextMessage;
import com.foxinmy.weixin4j.msg.model.Text;
+import com.foxinmy.weixin4j.response.ResponseMessage;
import com.foxinmy.weixin4j.type.MessageType;
/**
@@ -15,7 +16,7 @@ import com.foxinmy.weixin4j.type.MessageType;
* @since JDK 1.7
* @see com.foxinmy.weixin4j.msg.TextMessage
*/
-@Action(msgType = MessageType.text)
+@ActionAnnotation(msgType = MessageType.text)
public class TextAction extends AbstractAction {
@Override
diff --git a/weixin4j-mp/weixin4j-mp-server/src/main/java/com/foxinmy/weixin4j/mp/action/VideoAction.java b/weixin4j-mp/weixin4j-mp-server/src/main/java/com/foxinmy/weixin4j/mp/action/VideoAction.java
index 8c1e2f7d..5cc01783 100644
--- a/weixin4j-mp/weixin4j-mp-server/src/main/java/com/foxinmy/weixin4j/mp/action/VideoAction.java
+++ b/weixin4j-mp/weixin4j-mp-server/src/main/java/com/foxinmy/weixin4j/mp/action/VideoAction.java
@@ -1,6 +1,7 @@
package com.foxinmy.weixin4j.mp.action;
-import com.foxinmy.weixin4j.mp.mapping.Action;
+import com.foxinmy.weixin4j.action.DebugAction;
+import com.foxinmy.weixin4j.action.mapping.ActionAnnotation;
import com.foxinmy.weixin4j.msg.VideoMessage;
import com.foxinmy.weixin4j.type.MessageType;
@@ -13,7 +14,7 @@ import com.foxinmy.weixin4j.type.MessageType;
* @since JDK 1.7
* @see com.foxinmy.weixin4j.msg.VideoMessage
*/
-@Action(msgType = MessageType.video)
+@ActionAnnotation(msgType = MessageType.video)
public class VideoAction extends DebugAction {
}
diff --git a/weixin4j-mp/weixin4j-mp-server/src/main/java/com/foxinmy/weixin4j/mp/action/VoiceAction.java b/weixin4j-mp/weixin4j-mp-server/src/main/java/com/foxinmy/weixin4j/mp/action/VoiceAction.java
index c529ea89..96478ca1 100644
--- a/weixin4j-mp/weixin4j-mp-server/src/main/java/com/foxinmy/weixin4j/mp/action/VoiceAction.java
+++ b/weixin4j-mp/weixin4j-mp-server/src/main/java/com/foxinmy/weixin4j/mp/action/VoiceAction.java
@@ -1,6 +1,7 @@
package com.foxinmy.weixin4j.mp.action;
-import com.foxinmy.weixin4j.mp.mapping.Action;
+import com.foxinmy.weixin4j.action.DebugAction;
+import com.foxinmy.weixin4j.action.mapping.ActionAnnotation;
import com.foxinmy.weixin4j.msg.VoiceMessage;
import com.foxinmy.weixin4j.type.MessageType;
@@ -13,7 +14,7 @@ import com.foxinmy.weixin4j.type.MessageType;
* @since JDK 1.7
* @see com.foxinmy.weixin4j.msg.VoiceMessage
*/
-@Action(msgType = MessageType.voice)
+@ActionAnnotation(msgType = MessageType.voice)
public class VoiceAction extends DebugAction {
}
diff --git a/weixin4j-mp/weixin4j-mp-server/src/main/java/com/foxinmy/weixin4j/mp/action/WeixinAction.java b/weixin4j-mp/weixin4j-mp-server/src/main/java/com/foxinmy/weixin4j/mp/action/WeixinAction.java
deleted file mode 100644
index 62e69369..00000000
--- a/weixin4j-mp/weixin4j-mp-server/src/main/java/com/foxinmy/weixin4j/mp/action/WeixinAction.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package com.foxinmy.weixin4j.mp.action;
-
-import org.dom4j.DocumentException;
-
-import com.foxinmy.weixin4j.mp.message.ResponseMessage;
-
-/**
- * 消息处理接口
- *
- * @className Action
- * @author jy.hu
- * @date 2014年10月2日
- * @since JDK 1.7
- * @see com.foxinmy.weixin4j.mp.action.AbstractAction
- * @see com.foxinmy.weixin4j.mp.action.BlankAction
- * @see com.foxinmy.weixin4j.mp.action.DebugAction
- */
-public interface WeixinAction {
- public ResponseMessage execute(String inMsg) throws DocumentException;
-}
diff --git a/weixin4j-mp/weixin4j-mp-server/src/main/java/com/foxinmy/weixin4j/mp/action/event/LocationAction.java b/weixin4j-mp/weixin4j-mp-server/src/main/java/com/foxinmy/weixin4j/mp/action/event/LocationAction.java
index f8b4114c..28a44f84 100644
--- a/weixin4j-mp/weixin4j-mp-server/src/main/java/com/foxinmy/weixin4j/mp/action/event/LocationAction.java
+++ b/weixin4j-mp/weixin4j-mp-server/src/main/java/com/foxinmy/weixin4j/mp/action/event/LocationAction.java
@@ -1,7 +1,7 @@
package com.foxinmy.weixin4j.mp.action.event;
-import com.foxinmy.weixin4j.mp.action.DebugAction;
-import com.foxinmy.weixin4j.mp.mapping.Action;
+import com.foxinmy.weixin4j.action.DebugAction;
+import com.foxinmy.weixin4j.action.mapping.ActionAnnotation;
import com.foxinmy.weixin4j.msg.event.LocationEventMessage;
import com.foxinmy.weixin4j.type.EventType;
import com.foxinmy.weixin4j.type.MessageType;
@@ -15,7 +15,7 @@ import com.foxinmy.weixin4j.type.MessageType;
* @since JDK 1.7
* @see com.foxinmy.weixin4j.msg.event.LocationEventMessage
*/
-@Action(msgType = MessageType.event, eventType = { EventType.location })
+@ActionAnnotation(msgType = MessageType.event, eventType = { EventType.location })
public class LocationAction extends DebugAction {
}
diff --git a/weixin4j-mp/weixin4j-mp-server/src/main/java/com/foxinmy/weixin4j/mp/action/event/MassSendAction.java b/weixin4j-mp/weixin4j-mp-server/src/main/java/com/foxinmy/weixin4j/mp/action/event/MassSendAction.java
index 13795a85..30161a3e 100644
--- a/weixin4j-mp/weixin4j-mp-server/src/main/java/com/foxinmy/weixin4j/mp/action/event/MassSendAction.java
+++ b/weixin4j-mp/weixin4j-mp-server/src/main/java/com/foxinmy/weixin4j/mp/action/event/MassSendAction.java
@@ -1,7 +1,7 @@
package com.foxinmy.weixin4j.mp.action.event;
-import com.foxinmy.weixin4j.mp.action.DebugAction;
-import com.foxinmy.weixin4j.mp.mapping.Action;
+import com.foxinmy.weixin4j.action.DebugAction;
+import com.foxinmy.weixin4j.action.mapping.ActionAnnotation;
import com.foxinmy.weixin4j.msg.event.MassEventMessage;
import com.foxinmy.weixin4j.type.EventType;
import com.foxinmy.weixin4j.type.MessageType;
@@ -15,7 +15,7 @@ import com.foxinmy.weixin4j.type.MessageType;
* @since JDK 1.7
* @see com.foxinmy.weixin4j.msg.event.MassEventMessage
*/
-@Action(msgType = MessageType.event, eventType = { EventType.massendjobfinish })
+@ActionAnnotation(msgType = MessageType.event, eventType = { EventType.massendjobfinish })
public class MassSendAction extends DebugAction {
}
diff --git a/weixin4j-mp/weixin4j-mp-server/src/main/java/com/foxinmy/weixin4j/mp/action/event/MenuClickAction.java b/weixin4j-mp/weixin4j-mp-server/src/main/java/com/foxinmy/weixin4j/mp/action/event/MenuClickAction.java
index f17d2fc2..3d0615b1 100644
--- a/weixin4j-mp/weixin4j-mp-server/src/main/java/com/foxinmy/weixin4j/mp/action/event/MenuClickAction.java
+++ b/weixin4j-mp/weixin4j-mp-server/src/main/java/com/foxinmy/weixin4j/mp/action/event/MenuClickAction.java
@@ -1,7 +1,7 @@
package com.foxinmy.weixin4j.mp.action.event;
-import com.foxinmy.weixin4j.mp.action.DebugAction;
-import com.foxinmy.weixin4j.mp.mapping.Action;
+import com.foxinmy.weixin4j.action.DebugAction;
+import com.foxinmy.weixin4j.action.mapping.ActionAnnotation;
import com.foxinmy.weixin4j.msg.event.menu.MenuEventMessage;
import com.foxinmy.weixin4j.type.EventType;
import com.foxinmy.weixin4j.type.MessageType;
@@ -15,7 +15,7 @@ import com.foxinmy.weixin4j.type.MessageType;
* @since JDK 1.7
* @see com.foxinmy.weixin4j.msg.event.menu.MenuEventMessage
*/
-@Action(msgType = MessageType.event, eventType = { EventType.click })
+@ActionAnnotation(msgType = MessageType.event, eventType = { EventType.click })
public class MenuClickAction extends DebugAction {
}
diff --git a/weixin4j-mp/weixin4j-mp-server/src/main/java/com/foxinmy/weixin4j/mp/action/event/MenuLocationAction.java b/weixin4j-mp/weixin4j-mp-server/src/main/java/com/foxinmy/weixin4j/mp/action/event/MenuLocationAction.java
index dde17816..d1ba4616 100644
--- a/weixin4j-mp/weixin4j-mp-server/src/main/java/com/foxinmy/weixin4j/mp/action/event/MenuLocationAction.java
+++ b/weixin4j-mp/weixin4j-mp-server/src/main/java/com/foxinmy/weixin4j/mp/action/event/MenuLocationAction.java
@@ -1,7 +1,7 @@
package com.foxinmy.weixin4j.mp.action.event;
-import com.foxinmy.weixin4j.mp.action.DebugAction;
-import com.foxinmy.weixin4j.mp.mapping.Action;
+import com.foxinmy.weixin4j.action.DebugAction;
+import com.foxinmy.weixin4j.action.mapping.ActionAnnotation;
import com.foxinmy.weixin4j.msg.event.menu.MenuLocationEventMessage;
import com.foxinmy.weixin4j.type.EventType;
import com.foxinmy.weixin4j.type.MessageType;
@@ -15,7 +15,7 @@ import com.foxinmy.weixin4j.type.MessageType;
* @since JDK 1.7
* @see com.foxinmy.weixin4j.msg.event.menu.MenuLocationEventMessage
*/
-@Action(msgType = MessageType.event, eventType = { EventType.location_select })
+@ActionAnnotation(msgType = MessageType.event, eventType = { EventType.location_select })
public class MenuLocationAction extends DebugAction {
}
diff --git a/weixin4j-mp/weixin4j-mp-server/src/main/java/com/foxinmy/weixin4j/mp/action/event/MenuPhotoAction.java b/weixin4j-mp/weixin4j-mp-server/src/main/java/com/foxinmy/weixin4j/mp/action/event/MenuPhotoAction.java
index ae5f7a63..7d058ed5 100644
--- a/weixin4j-mp/weixin4j-mp-server/src/main/java/com/foxinmy/weixin4j/mp/action/event/MenuPhotoAction.java
+++ b/weixin4j-mp/weixin4j-mp-server/src/main/java/com/foxinmy/weixin4j/mp/action/event/MenuPhotoAction.java
@@ -1,7 +1,7 @@
package com.foxinmy.weixin4j.mp.action.event;
-import com.foxinmy.weixin4j.mp.action.DebugAction;
-import com.foxinmy.weixin4j.mp.mapping.Action;
+import com.foxinmy.weixin4j.action.DebugAction;
+import com.foxinmy.weixin4j.action.mapping.ActionAnnotation;
import com.foxinmy.weixin4j.msg.event.menu.MenuPhotoEventMessage;
import com.foxinmy.weixin4j.type.EventType;
import com.foxinmy.weixin4j.type.MessageType;
@@ -15,7 +15,7 @@ import com.foxinmy.weixin4j.type.MessageType;
* @since JDK 1.7
* @see com.foxinmy.weixin4j.msg.event.menu.MenuPhotoEventMessage
*/
-@Action(msgType = MessageType.event, eventType = {
+@ActionAnnotation(msgType = MessageType.event, eventType = {
EventType.pic_photo_or_album, EventType.pic_sysphoto,
EventType.pic_weixin })
public class MenuPhotoAction extends DebugAction {
diff --git a/weixin4j-mp/weixin4j-mp-server/src/main/java/com/foxinmy/weixin4j/mp/action/event/MenuScanAction.java b/weixin4j-mp/weixin4j-mp-server/src/main/java/com/foxinmy/weixin4j/mp/action/event/MenuScanAction.java
index a0417574..f9dff3cd 100644
--- a/weixin4j-mp/weixin4j-mp-server/src/main/java/com/foxinmy/weixin4j/mp/action/event/MenuScanAction.java
+++ b/weixin4j-mp/weixin4j-mp-server/src/main/java/com/foxinmy/weixin4j/mp/action/event/MenuScanAction.java
@@ -1,7 +1,7 @@
package com.foxinmy.weixin4j.mp.action.event;
-import com.foxinmy.weixin4j.mp.action.DebugAction;
-import com.foxinmy.weixin4j.mp.mapping.Action;
+import com.foxinmy.weixin4j.action.DebugAction;
+import com.foxinmy.weixin4j.action.mapping.ActionAnnotation;
import com.foxinmy.weixin4j.msg.event.menu.MenuScanEventMessage;
import com.foxinmy.weixin4j.type.EventType;
import com.foxinmy.weixin4j.type.MessageType;
@@ -15,7 +15,7 @@ import com.foxinmy.weixin4j.type.MessageType;
* @since JDK 1.7
* @see com.foxinmy.weixin4j.msg.event.menu.MenuScanEventMessage
*/
-@Action(msgType = MessageType.event, eventType = { EventType.scancode_push,
+@ActionAnnotation(msgType = MessageType.event, eventType = { EventType.scancode_push,
EventType.scancode_waitmsg })
public class MenuScanAction extends DebugAction {
diff --git a/weixin4j-mp/weixin4j-mp-server/src/main/java/com/foxinmy/weixin4j/mp/action/event/MenuViewAction.java b/weixin4j-mp/weixin4j-mp-server/src/main/java/com/foxinmy/weixin4j/mp/action/event/MenuViewAction.java
index 73e536a1..9e0593b6 100644
--- a/weixin4j-mp/weixin4j-mp-server/src/main/java/com/foxinmy/weixin4j/mp/action/event/MenuViewAction.java
+++ b/weixin4j-mp/weixin4j-mp-server/src/main/java/com/foxinmy/weixin4j/mp/action/event/MenuViewAction.java
@@ -1,7 +1,7 @@
package com.foxinmy.weixin4j.mp.action.event;
-import com.foxinmy.weixin4j.mp.action.DebugAction;
-import com.foxinmy.weixin4j.mp.mapping.Action;
+import com.foxinmy.weixin4j.action.DebugAction;
+import com.foxinmy.weixin4j.action.mapping.ActionAnnotation;
import com.foxinmy.weixin4j.msg.event.menu.MenuEventMessage;
import com.foxinmy.weixin4j.type.EventType;
import com.foxinmy.weixin4j.type.MessageType;
@@ -15,7 +15,7 @@ import com.foxinmy.weixin4j.type.MessageType;
* @since JDK 1.7
* @see com.foxinmy.weixin4j.msg.event.menu.MenuEventMessage
*/
-@Action(msgType = MessageType.event, eventType = { EventType.view })
+@ActionAnnotation(msgType = MessageType.event, eventType = { EventType.view })
public class MenuViewAction extends DebugAction {
}
diff --git a/weixin4j-mp/weixin4j-mp-server/src/main/java/com/foxinmy/weixin4j/mp/action/event/ScanAction.java b/weixin4j-mp/weixin4j-mp-server/src/main/java/com/foxinmy/weixin4j/mp/action/event/ScanAction.java
index 3b070e64..cb90034d 100644
--- a/weixin4j-mp/weixin4j-mp-server/src/main/java/com/foxinmy/weixin4j/mp/action/event/ScanAction.java
+++ b/weixin4j-mp/weixin4j-mp-server/src/main/java/com/foxinmy/weixin4j/mp/action/event/ScanAction.java
@@ -1,7 +1,7 @@
package com.foxinmy.weixin4j.mp.action.event;
-import com.foxinmy.weixin4j.mp.action.DebugAction;
-import com.foxinmy.weixin4j.mp.mapping.Action;
+import com.foxinmy.weixin4j.action.DebugAction;
+import com.foxinmy.weixin4j.action.mapping.ActionAnnotation;
import com.foxinmy.weixin4j.msg.event.ScanEventMessage;
import com.foxinmy.weixin4j.type.EventType;
import com.foxinmy.weixin4j.type.MessageType;
@@ -15,7 +15,7 @@ import com.foxinmy.weixin4j.type.MessageType;
* @since JDK 1.7
* @see com.foxinmy.weixin4j.msg.event.ScanEventMessage
*/
-@Action(msgType = MessageType.event, eventType = { EventType.scan })
+@ActionAnnotation(msgType = MessageType.event, eventType = { EventType.scan })
public class ScanAction extends DebugAction {
}
diff --git a/weixin4j-mp/weixin4j-mp-server/src/main/java/com/foxinmy/weixin4j/mp/action/event/SubscribeAction.java b/weixin4j-mp/weixin4j-mp-server/src/main/java/com/foxinmy/weixin4j/mp/action/event/SubscribeAction.java
index 727889e4..7e5e6926 100644
--- a/weixin4j-mp/weixin4j-mp-server/src/main/java/com/foxinmy/weixin4j/mp/action/event/SubscribeAction.java
+++ b/weixin4j-mp/weixin4j-mp-server/src/main/java/com/foxinmy/weixin4j/mp/action/event/SubscribeAction.java
@@ -1,7 +1,7 @@
package com.foxinmy.weixin4j.mp.action.event;
-import com.foxinmy.weixin4j.mp.action.DebugAction;
-import com.foxinmy.weixin4j.mp.mapping.Action;
+import com.foxinmy.weixin4j.action.DebugAction;
+import com.foxinmy.weixin4j.action.mapping.ActionAnnotation;
import com.foxinmy.weixin4j.msg.event.ScribeEventMessage;
import com.foxinmy.weixin4j.type.EventType;
import com.foxinmy.weixin4j.type.MessageType;
@@ -15,7 +15,7 @@ import com.foxinmy.weixin4j.type.MessageType;
* @since JDK 1.7
* @see com.foxinmy.weixin4j.msg.event.ScribeEventMessage
*/
-@Action(msgType = MessageType.event, eventType = { EventType.subscribe })
+@ActionAnnotation(msgType = MessageType.event, eventType = { EventType.subscribe })
public class SubscribeAction extends DebugAction {
}
diff --git a/weixin4j-mp/weixin4j-mp-server/src/main/java/com/foxinmy/weixin4j/mp/action/event/TemplateSendAction.java b/weixin4j-mp/weixin4j-mp-server/src/main/java/com/foxinmy/weixin4j/mp/action/event/TemplateSendAction.java
index 9b35ac55..a0597554 100644
--- a/weixin4j-mp/weixin4j-mp-server/src/main/java/com/foxinmy/weixin4j/mp/action/event/TemplateSendAction.java
+++ b/weixin4j-mp/weixin4j-mp-server/src/main/java/com/foxinmy/weixin4j/mp/action/event/TemplateSendAction.java
@@ -1,7 +1,7 @@
package com.foxinmy.weixin4j.mp.action.event;
-import com.foxinmy.weixin4j.mp.action.DebugAction;
-import com.foxinmy.weixin4j.mp.mapping.Action;
+import com.foxinmy.weixin4j.action.DebugAction;
+import com.foxinmy.weixin4j.action.mapping.ActionAnnotation;
import com.foxinmy.weixin4j.msg.event.TemplatesendjobfinishMessage;
import com.foxinmy.weixin4j.type.EventType;
import com.foxinmy.weixin4j.type.MessageType;
@@ -15,7 +15,7 @@ import com.foxinmy.weixin4j.type.MessageType;
* @since JDK 1.7
* @see com.foxinmy.weixin4j.msg.event.TemplatesendjobfinishMessage
*/
-@Action(msgType = MessageType.event, eventType = { EventType.templatesendjobfinish })
+@ActionAnnotation(msgType = MessageType.event, eventType = { EventType.templatesendjobfinish })
public class TemplateSendAction extends
DebugAction {
diff --git a/weixin4j-mp/weixin4j-mp-server/src/main/java/com/foxinmy/weixin4j/mp/action/event/UnsubscribeAction.java b/weixin4j-mp/weixin4j-mp-server/src/main/java/com/foxinmy/weixin4j/mp/action/event/UnsubscribeAction.java
index c94552e1..ea9e7d43 100644
--- a/weixin4j-mp/weixin4j-mp-server/src/main/java/com/foxinmy/weixin4j/mp/action/event/UnsubscribeAction.java
+++ b/weixin4j-mp/weixin4j-mp-server/src/main/java/com/foxinmy/weixin4j/mp/action/event/UnsubscribeAction.java
@@ -1,7 +1,7 @@
package com.foxinmy.weixin4j.mp.action.event;
-import com.foxinmy.weixin4j.mp.action.DebugAction;
-import com.foxinmy.weixin4j.mp.mapping.Action;
+import com.foxinmy.weixin4j.action.DebugAction;
+import com.foxinmy.weixin4j.action.mapping.ActionAnnotation;
import com.foxinmy.weixin4j.msg.event.ScribeEventMessage;
import com.foxinmy.weixin4j.type.EventType;
import com.foxinmy.weixin4j.type.MessageType;
@@ -15,7 +15,7 @@ import com.foxinmy.weixin4j.type.MessageType;
* @since JDK 1.7
* @see com.foxinmy.weixin4j.msg.event.ScribeEventMessage
*/
-@Action(msgType = MessageType.event, eventType = { EventType.unsubscribe })
+@ActionAnnotation(msgType = MessageType.event, eventType = { EventType.unsubscribe })
public class UnsubscribeAction extends DebugAction {
}
diff --git a/weixin4j-mp/weixin4j-mp-server/src/main/java/com/foxinmy/weixin4j/mp/mapping/README.md b/weixin4j-mp/weixin4j-mp-server/src/main/java/com/foxinmy/weixin4j/mp/mapping/README.md
deleted file mode 100644
index d8eea202..00000000
--- a/weixin4j-mp/weixin4j-mp-server/src/main/java/com/foxinmy/weixin4j/mp/mapping/README.md
+++ /dev/null
@@ -1 +0,0 @@
-action与消息的mapping实现
\ No newline at end of file
diff --git a/weixin4j-mp/weixin4j-mp-server/src/main/java/com/foxinmy/weixin4j/mp/server/WeixinMessageDecoder.java b/weixin4j-mp/weixin4j-mp-server/src/main/java/com/foxinmy/weixin4j/mp/server/WeixinMessageDecoder.java
index 6d6e7d49..0677881e 100644
--- a/weixin4j-mp/weixin4j-mp-server/src/main/java/com/foxinmy/weixin4j/mp/server/WeixinMessageDecoder.java
+++ b/weixin4j-mp/weixin4j-mp-server/src/main/java/com/foxinmy/weixin4j/mp/server/WeixinMessageDecoder.java
@@ -14,8 +14,8 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.foxinmy.weixin4j.model.WeixinMpAccount;
-import com.foxinmy.weixin4j.mp.model.HttpWeixinMessage;
-import com.foxinmy.weixin4j.mp.type.EncryptType;
+import com.foxinmy.weixin4j.response.HttpWeixinMessage;
+import com.foxinmy.weixin4j.type.EncryptType;
import com.foxinmy.weixin4j.util.ConfigUtil;
import com.foxinmy.weixin4j.util.MessageUtil;
import com.foxinmy.weixin4j.xml.XStream;
@@ -43,7 +43,7 @@ public class WeixinMessageDecoder extends
if (StringUtils.isNotBlank(xmlContent)) {
message = XStream.get(xmlContent, HttpWeixinMessage.class);
}
- message.setMethod(req.getMethod());
+ message.setMethod(req.getMethod().name());
QueryStringDecoder queryDecoder = new QueryStringDecoder(req.getUri(),
true);
log.info("\n=================receive request=================");
diff --git a/weixin4j-mp/weixin4j-mp-server/src/main/java/com/foxinmy/weixin4j/mp/server/WeixinMessageEncoder.java b/weixin4j-mp/weixin4j-mp-server/src/main/java/com/foxinmy/weixin4j/mp/server/WeixinMessageEncoder.java
index 30c09f1f..75b11ff5 100644
--- a/weixin4j-mp/weixin4j-mp-server/src/main/java/com/foxinmy/weixin4j/mp/server/WeixinMessageEncoder.java
+++ b/weixin4j-mp/weixin4j-mp-server/src/main/java/com/foxinmy/weixin4j/mp/server/WeixinMessageEncoder.java
@@ -2,7 +2,6 @@ package com.foxinmy.weixin4j.mp.server;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.MessageToMessageEncoder;
-import io.netty.handler.codec.http.HttpResponse;
import java.util.HashMap;
import java.util.List;
@@ -12,8 +11,8 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.foxinmy.weixin4j.model.WeixinMpAccount;
-import com.foxinmy.weixin4j.mp.message.ResponseMessage;
import com.foxinmy.weixin4j.mp.util.HttpUtil;
+import com.foxinmy.weixin4j.response.ResponseMessage;
import com.foxinmy.weixin4j.util.ConfigUtil;
import com.foxinmy.weixin4j.util.DateUtil;
import com.foxinmy.weixin4j.util.MessageUtil;
@@ -33,7 +32,8 @@ import com.thoughtworks.xstream.mapper.DefaultMapper;
* @see 加密接入指引
*/
-public class WeixinMessageEncoder extends MessageToMessageEncoder {
+public class WeixinMessageEncoder extends
+ MessageToMessageEncoder {
private final Logger log = LoggerFactory.getLogger(getClass());
protected final static XStream mapXstream = XStream.get();
static {
@@ -51,8 +51,8 @@ public class WeixinMessageEncoder extends MessageToMessageEncoder map = new HashMap();
map.put("Encrypt", encrtypt);
map.put("MsgSignature", msgSignature);
@@ -60,12 +60,9 @@ public class WeixinMessageEncoder extends MessageToMessageEncoder {
private final ActionMapping actionMapping;
public WeixinServerInitializer() {
- this.actionMapping = new AnnotationActionMapping();
+ this.actionMapping = new AnnotationActionMapping(
+ ImageAction.class.getPackage());
}
@Override
diff --git a/weixin4j-mp/weixin4j-mp-server/src/main/java/com/foxinmy/weixin4j/mp/util/HttpUtil.java b/weixin4j-mp/weixin4j-mp-server/src/main/java/com/foxinmy/weixin4j/mp/util/HttpUtil.java
index 1534ecca..7a2c849e 100644
--- a/weixin4j-mp/weixin4j-mp-server/src/main/java/com/foxinmy/weixin4j/mp/util/HttpUtil.java
+++ b/weixin4j-mp/weixin4j-mp-server/src/main/java/com/foxinmy/weixin4j/mp/util/HttpUtil.java
@@ -16,6 +16,7 @@ import io.netty.handler.codec.http.HttpResponse;
import java.util.Date;
import org.apache.http.Consts;
+import org.apache.http.entity.ContentType;
/**
* HTTP工具类
@@ -28,7 +29,11 @@ import org.apache.http.Consts;
*/
public class HttpUtil {
- public static HttpResponse createWeixinMessageResponse(String content) {
+ public static HttpResponse createWeixinMessageResponse(String content,
+ ContentType contentType) {
+ if (contentType == null) {
+ contentType = ContentType.APPLICATION_XML;
+ }
FullHttpResponse httpResponse = new DefaultFullHttpResponse(HTTP_1_1,
OK, Unpooled.copiedBuffer(content, Consts.UTF_8));
httpResponse.headers().set(CONTENT_TYPE,
diff --git a/weixin4j-qy/README.md b/weixin4j-qy/README.md
index 17f793cc..03c32762 100644
--- a/weixin4j-qy/README.md
+++ b/weixin4j-qy/README.md
@@ -24,7 +24,7 @@ weixin4j-qy
+ `netty服务器` & `消息分发`
- + 回调链接`AES`加密、解密
+ + 回调连接`AES`加密、解密
更新LOG
-------
@@ -45,3 +45,7 @@ weixin4j-qy
+ **weixin4j-qy-api**: 新增`发送消息`接口
+ **weixin4j-qy-api**: 新增`菜单管理`接口
+
+* 2014-11-24
+
+ + **weixin4j-qy-server**: 新增netty服务与消息分发
diff --git a/weixin4j-qy/weixin4j-qy-api/README.md b/weixin4j-qy/weixin4j-qy-api/README.md
index ec281583..15b6f29c 100644
--- a/weixin4j-qy/weixin4j-qy-api/README.md
+++ b/weixin4j-qy/weixin4j-qy-api/README.md
@@ -23,13 +23,15 @@ weixin.properties说明
| :---------- | :-------------- |
| account | 微信企业号信息 `json格式` |
| token_path | 使用FileTokenHolder时token保存的物理路径 |
+| media_path | 调用媒体接口时保存媒体文件的物理路径 |
示例(properties中换行用右斜杆\\)
> account={"id":"corpid","secret":"corpsecret",
-> "token":"开放者的token 非必须",
-> "encodingAesKey":"AES加密密钥"}
+> "token":"企业号中应用在回调模式下的token",
+> "encodingAesKey":"企业号中应用在回调模式下AES加密密钥"}
> token_path=/tmp/weixin/token
+> media_path=/tmp/weixin/media
2.实例化一个`WeixinProxy`对象,调用API
diff --git a/weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/WeixinProxy.java b/weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/WeixinProxy.java
index 289c0e0e..ce2e3828 100644
--- a/weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/WeixinProxy.java
+++ b/weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/WeixinProxy.java
@@ -2,7 +2,6 @@ package com.foxinmy.weixin4j.qy;
import java.util.List;
-import com.alibaba.fastjson.JSONArray;
import com.foxinmy.weixin4j.exception.WeixinException;
import com.foxinmy.weixin4j.http.JsonResult;
import com.foxinmy.weixin4j.model.WeixinQyAccount;
@@ -10,6 +9,7 @@ import com.foxinmy.weixin4j.qy.api.DepartApi;
import com.foxinmy.weixin4j.qy.api.TagApi;
import com.foxinmy.weixin4j.qy.api.UserApi;
import com.foxinmy.weixin4j.qy.model.Department;
+import com.foxinmy.weixin4j.qy.model.Tag;
import com.foxinmy.weixin4j.qy.model.User;
import com.foxinmy.weixin4j.qy.type.UserStatus;
import com.foxinmy.weixin4j.token.FileTokenHolder;
@@ -251,13 +251,13 @@ public class WeixinProxy {
* @see 更新标签说明
+ * @see com.foxinmy.weixin4j.qy.model.Tag
* @see com.foxinmy.weixin4j.qy.api.TagApi
* @return 处理结果
* @throws WeixinException
*/
- public JsonResult updateTag(int tagId, String tagName)
- throws WeixinException {
- return tagApi.updateTag(tagId, tagName);
+ public JsonResult updateTag(Tag tag) throws WeixinException {
+ return tagApi.updateTag(tag);
}
/**
@@ -280,11 +280,12 @@ public class WeixinProxy {
*
* @see 获取标签列表说明
+ * @see com.foxinmy.weixin4j.qy.model.Tag
* @see com.foxinmy.weixin4j.qy.api.TagApi
* @return 标签列表
* @throws WeixinException
*/
- public JSONArray listTag() throws WeixinException {
+ public List listTag() throws WeixinException {
return tagApi.listTag();
}
diff --git a/weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/api/TagApi.java b/weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/api/TagApi.java
index c7d1d0f3..d8afcd1d 100644
--- a/weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/api/TagApi.java
+++ b/weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/api/TagApi.java
@@ -3,12 +3,12 @@ package com.foxinmy.weixin4j.qy.api;
import java.util.List;
import com.alibaba.fastjson.JSON;
-import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.foxinmy.weixin4j.exception.WeixinException;
import com.foxinmy.weixin4j.http.JsonResult;
import com.foxinmy.weixin4j.http.Response;
import com.foxinmy.weixin4j.model.Token;
+import com.foxinmy.weixin4j.qy.model.Tag;
import com.foxinmy.weixin4j.qy.model.User;
import com.foxinmy.weixin4j.token.TokenHolder;
@@ -59,15 +59,15 @@ public class TagApi extends BaseApi {
* "http://qydev.weixin.qq.com/wiki/index.php?title=%E7%AE%A1%E7%90%86%E6%A0%87%E7%AD%BE#.E6.9B.B4.E6.96.B0.E6.A0.87.E7.AD.BE.E5.90.8D.E5.AD.97"
* >更新标签说明
* @return 处理结果
+ * @see com.foxinmy.weixin4j.qy.model.Tag
* @throws WeixinException
*/
- public JsonResult updateTag(int tagId, String tagName)
- throws WeixinException {
+ public JsonResult updateTag(Tag tag) throws WeixinException {
String tag_update_uri = getRequestUri("tag_update_uri");
Token token = tokenHolder.getToken();
- Response response = request.post(String.format(tag_update_uri,
- token.getAccessToken()), String.format(
- "{\"tagid\":%d,\"tagname\":\"%s\"}", tagId, tagName));
+ Response response = request.post(
+ String.format(tag_update_uri, token.getAccessToken()),
+ JSON.toJSONString(tag));
return response.getAsJsonResult();
}
@@ -95,14 +95,16 @@ public class TagApi extends BaseApi {
* @see 获取标签列表说明
* @return 标签列表
+ * @see com.foxinmy.weixin4j.qy.model.Tag
* @throws WeixinException
*/
- public JSONArray listTag() throws WeixinException {
+ public List listTag() throws WeixinException {
String tag_list_uri = getRequestUri("tag_list_uri");
Token token = tokenHolder.getToken();
Response response = request.post(String.format(tag_list_uri,
token.getAccessToken()));
- return response.getAsJson().getJSONArray("taglist");
+ return JSON.parseArray(response.getAsJson().getString("taglist"),
+ Tag.class);
}
/**
diff --git a/weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/api/UserApi.java b/weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/api/UserApi.java
index b78ac07b..46c7df22 100644
--- a/weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/api/UserApi.java
+++ b/weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/api/UserApi.java
@@ -100,6 +100,29 @@ public class UserApi extends BaseApi {
return JSON.toJavaObject(obj, User.class);
}
+ /**
+ * code获取userid(管理员须拥有agent的使用权限;agentid必须和跳转链接时所在的企业应用ID相同。)
+ *
+ * @param code
+ * 通过员工授权获取到的code,每次员工授权带上的code将不一样,code只能使用一次,5分钟未被使用自动过期
+ * @param agentid
+ * 跳转链接时所在的企业应用ID
+ * @return {"UserId":"员工UserID","DeviceId":"手机设备号(由微信在安装时随机生成)"}
+ * @see 企业获取code
+ * @see 根据code获取成员信息
+ * @throws WeixinException
+ */
+ public JSONObject getUserid(String code, int agentid)
+ throws WeixinException {
+ String user_getid_uri = getRequestUri("user_getid_uri");
+ Token token = tokenHolder.getToken();
+ Response response = request.post(String.format(user_getid_uri,
+ token.getAccessToken(), code, agentid));
+ return response.getAsJson();
+ }
+
/**
* 获取部门成员
*
@@ -156,4 +179,22 @@ public class UserApi extends BaseApi {
token.getAccessToken(), userid));
return response.getAsJsonResult();
}
+
+ /**
+ * 开启二次验证成功时调用(管理员须拥有userid对应员工的管理权限)
+ *
+ * @param userid
+ * 成员ID
+ * @return 调用结果
+ * @see 二次验证说明
+ * @throws WeixinException
+ */
+ public JsonResult authsucc(String userid) throws WeixinException {
+ String user_authsucc_uri = getRequestUri("user_authsucc_uri");
+ Token token = tokenHolder.getToken();
+ Response response = request.post(String.format(user_authsucc_uri,
+ token.getAccessToken(), userid));
+ return response.getAsJsonResult();
+ }
}
diff --git a/weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/api/weixin.properties b/weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/api/weixin.properties
index de2573f7..77c63c72 100644
--- a/weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/api/weixin.properties
+++ b/weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/api/weixin.properties
@@ -15,14 +15,18 @@ department_list_uri={api_base_url}/department/list?access_token=%s
department_delete_uri={api_base_url}/department/delete?access_token=%s&id=%d
# \u521b\u5efa\u6210\u5458
user_create_uri={api_base_url}/user/create?access_token=%s
-# \u66f4\u65b0\u6210\u5458
+# \u66f4\u65b0\u6210\u5458\u4fe1\u606f
user_update_uri={api_base_url}/user/update?access_token=%s
-# \u83b7\u53d6\u6210\u5458
+# \u83b7\u53d6\u6210\u5458\u4fe1\u606f
user_get_uri={api_base_url}/user/get?access_token=%s&userid=%s
+# code\u83b7\u53d6\u6210\u5458\u4fe1\u606f
+user_getid_uri={api_base_url}/getuserinfo?access_token=%s&code=%s&agentid=%d
# \u83b7\u53d6\u90e8\u95e8\u6210\u5458
user_list_uri={api_base_url}/user/simplelist?access_token=%s&department_id=%d&fetch_child=%d&status=%d
# \u5220\u9664\u6210\u5458
user_delete_uri={api_base_url}/user/delete?access_token=%s&userid=%s
+# \u6210\u5458\u4e8c\u6b21\u9a8c\u8bc1\u6210\u529f\u65f6\u8c03\u7528
+user_authsucc_uri={api_base_url}/user/authsucc?access_token=%s&userid=%s
# \u521b\u5efa\u6807\u7b7e
tag_create_uri={api_base_url}/tag/create?access_token=%s
# \u66f4\u65b0\u6807\u7b7e
diff --git a/weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/model/Tag.java b/weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/model/Tag.java
new file mode 100644
index 00000000..51b25bcf
--- /dev/null
+++ b/weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/model/Tag.java
@@ -0,0 +1,54 @@
+package com.foxinmy.weixin4j.qy.model;
+
+import java.io.Serializable;
+
+import com.alibaba.fastjson.annotation.JSONField;
+
+/**
+ * 标签对象
+ *
+ * @className Tag
+ * @author jy
+ * @date 2014年11月24日
+ * @since JDK 1.7
+ * @see
+ */
+public class Tag implements Serializable {
+
+ private static final long serialVersionUID = 5204620476267654921L;
+
+ @JSONField(name = "tagid")
+ private int id;
+ @JSONField(name = "tagname")
+ private String name;
+
+ public Tag() {
+
+ }
+
+ public Tag(int id, String name) {
+ this.id = id;
+ this.name = name;
+ }
+
+ public int getId() {
+ return id;
+ }
+
+ public void setId(int id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ @Override
+ public String toString() {
+ return "Tag [id=" + id + ", name=" + name + "]";
+ }
+}
diff --git a/weixin4j-qy/weixin4j-qy-api/src/test/java/com/foxinmy/weixin4j/qy/test/TagTest.java b/weixin4j-qy/weixin4j-qy-api/src/test/java/com/foxinmy/weixin4j/qy/test/TagTest.java
index 3b7d4804..853d770e 100644
--- a/weixin4j-qy/weixin4j-qy-api/src/test/java/com/foxinmy/weixin4j/qy/test/TagTest.java
+++ b/weixin4j-qy/weixin4j-qy-api/src/test/java/com/foxinmy/weixin4j/qy/test/TagTest.java
@@ -7,10 +7,10 @@ import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
-import com.alibaba.fastjson.JSONArray;
import com.foxinmy.weixin4j.exception.WeixinException;
import com.foxinmy.weixin4j.http.JsonResult;
import com.foxinmy.weixin4j.qy.api.TagApi;
+import com.foxinmy.weixin4j.qy.model.Tag;
import com.foxinmy.weixin4j.qy.model.User;
/**
@@ -38,7 +38,7 @@ public class TagTest extends TokenTest {
@Test
public void update() throws WeixinException {
- JsonResult result = tagApi.updateTag(1, "coder456");
+ JsonResult result = tagApi.updateTag(new Tag(1, "coder456"));
Assert.assertEquals("updated", result.getDesc());
}
@@ -64,7 +64,7 @@ public class TagTest extends TokenTest {
@Test
public void list() throws WeixinException {
- JSONArray tags = tagApi.listTag();
+ List tags = tagApi.listTag();
Assert.assertFalse(tags.isEmpty());
System.out.println(tags);
}
diff --git a/weixin4j-qy/weixin4j-qy-server/README.md b/weixin4j-qy/weixin4j-qy-server/README.md
index 596d072a..579ef522 100644
--- a/weixin4j-qy/weixin4j-qy-server/README.md
+++ b/weixin4j-qy/weixin4j-qy-server/README.md
@@ -13,10 +13,34 @@ weixin4j-qy-server
如何使用
--------
+1.正确填写`weixin.properties`中的属性值
+| 属性名 | 说明 |
+| :---------- | :-------------- |
+| account | 微信企业号信息 `json格式` |
+| token_path | 使用FileTokenHolder时token保存的物理路径 |
+| media_path | 调用媒体接口时保存媒体文件的物理路径 |
+
+示例(properties中换行用右斜杆\\)
+
+> account={"id":"corpid","secret":"corpsecret",
+> "token":"企业号中应用在回调模式下的token",
+> "encodingAesKey":"企业号中应用在回调模式下AES加密密钥"}
+> token_path=/tmp/weixin/token
+> media_path=/tmp/weixin/media
+
+2.mvn package,得到一个zip的压缩包,解压到启动目录(见`src/main/startup.sh/APP_HOME`)
+
+3.启动netty服务(`com.foxinmy.weixin4j.mp.startup.WeixinQyServerBootstrap`)
+
+ sh startup.sh start
更新LOG
-------
* 2014-11-19
- + 得到`weixin4j-qy-server`工程
\ No newline at end of file
+ + 得到`weixin4j-qy-server`工程
+
+* 2014-11-24
+
+ + 新增netty服务与消息分发
\ No newline at end of file
diff --git a/weixin4j-qy/weixin4j-qy-server/src/main/java/com/foxinmy/weixin4j/qy/action/ImageAction.java b/weixin4j-qy/weixin4j-qy-server/src/main/java/com/foxinmy/weixin4j/qy/action/ImageAction.java
new file mode 100644
index 00000000..d614875d
--- /dev/null
+++ b/weixin4j-qy/weixin4j-qy-server/src/main/java/com/foxinmy/weixin4j/qy/action/ImageAction.java
@@ -0,0 +1,20 @@
+package com.foxinmy.weixin4j.qy.action;
+
+import com.foxinmy.weixin4j.action.DebugAction;
+import com.foxinmy.weixin4j.action.mapping.ActionAnnotation;
+import com.foxinmy.weixin4j.msg.ImageMessage;
+import com.foxinmy.weixin4j.type.MessageType;
+
+/**
+ * 图片消息处理
+ *
+ * @className ImageAction
+ * @author jy
+ * @date 2014年10月9日
+ * @since JDK 1.7
+ * @see com.foxinmy.weixin4j.msg.ImageMessage
+ */
+@ActionAnnotation(msgType = MessageType.image)
+public class ImageAction extends DebugAction {
+
+}
diff --git a/weixin4j-qy/weixin4j-qy-server/src/main/java/com/foxinmy/weixin4j/qy/action/LinkAction.java b/weixin4j-qy/weixin4j-qy-server/src/main/java/com/foxinmy/weixin4j/qy/action/LinkAction.java
new file mode 100644
index 00000000..72f1d2cf
--- /dev/null
+++ b/weixin4j-qy/weixin4j-qy-server/src/main/java/com/foxinmy/weixin4j/qy/action/LinkAction.java
@@ -0,0 +1,20 @@
+package com.foxinmy.weixin4j.qy.action;
+
+import com.foxinmy.weixin4j.action.DebugAction;
+import com.foxinmy.weixin4j.action.mapping.ActionAnnotation;
+import com.foxinmy.weixin4j.msg.LinkMessage;
+import com.foxinmy.weixin4j.type.MessageType;
+
+/**
+ * 链接消息处理
+ *
+ * @className LinkAction
+ * @author jy
+ * @date 2014年10月9日
+ * @since JDK 1.7
+ * @see com.foxinmy.weixin4j.msg.LinkMessage
+ */
+@ActionAnnotation(msgType = MessageType.link)
+public class LinkAction extends DebugAction {
+
+}
diff --git a/weixin4j-qy/weixin4j-qy-server/src/main/java/com/foxinmy/weixin4j/qy/action/LocationAction.java b/weixin4j-qy/weixin4j-qy-server/src/main/java/com/foxinmy/weixin4j/qy/action/LocationAction.java
new file mode 100644
index 00000000..e2b201a1
--- /dev/null
+++ b/weixin4j-qy/weixin4j-qy-server/src/main/java/com/foxinmy/weixin4j/qy/action/LocationAction.java
@@ -0,0 +1,20 @@
+package com.foxinmy.weixin4j.qy.action;
+
+import com.foxinmy.weixin4j.action.DebugAction;
+import com.foxinmy.weixin4j.action.mapping.ActionAnnotation;
+import com.foxinmy.weixin4j.msg.LocationMessage;
+import com.foxinmy.weixin4j.type.MessageType;
+
+/**
+ * 地理位置处理
+ *
+ * @className LocationAction
+ * @author jy
+ * @date 2014年10月9日
+ * @since JDK 1.7
+ * @see com.foxinmy.weixin4j.msg.LocationMessage
+ */
+@ActionAnnotation(msgType = MessageType.location)
+public class LocationAction extends DebugAction {
+
+}
diff --git a/weixin4j-qy/weixin4j-qy-server/src/main/java/com/foxinmy/weixin4j/qy/action/README.md b/weixin4j-qy/weixin4j-qy-server/src/main/java/com/foxinmy/weixin4j/qy/action/README.md
new file mode 100644
index 00000000..be36a4f2
--- /dev/null
+++ b/weixin4j-qy/weixin4j-qy-server/src/main/java/com/foxinmy/weixin4j/qy/action/README.md
@@ -0,0 +1 @@
+普通消息对应的Action
\ No newline at end of file
diff --git a/weixin4j-qy/weixin4j-qy-server/src/main/java/com/foxinmy/weixin4j/qy/action/TextAction.java b/weixin4j-qy/weixin4j-qy-server/src/main/java/com/foxinmy/weixin4j/qy/action/TextAction.java
new file mode 100644
index 00000000..1052cacb
--- /dev/null
+++ b/weixin4j-qy/weixin4j-qy-server/src/main/java/com/foxinmy/weixin4j/qy/action/TextAction.java
@@ -0,0 +1,26 @@
+package com.foxinmy.weixin4j.qy.action;
+
+import com.foxinmy.weixin4j.action.AbstractAction;
+import com.foxinmy.weixin4j.action.mapping.ActionAnnotation;
+import com.foxinmy.weixin4j.msg.TextMessage;
+import com.foxinmy.weixin4j.msg.model.Text;
+import com.foxinmy.weixin4j.response.ResponseMessage;
+import com.foxinmy.weixin4j.type.MessageType;
+
+/**
+ * 文字消息处理
+ *
+ * @className TextAction
+ * @author jy
+ * @date 2014年10月9日
+ * @since JDK 1.7
+ * @see com.foxinmy.weixin4j.msg.TextMessage
+ */
+@ActionAnnotation(msgType = MessageType.text)
+public class TextAction extends AbstractAction {
+
+ @Override
+ public ResponseMessage execute(TextMessage inMessage) {
+ return new ResponseMessage(new Text("Hello World!"), inMessage);
+ }
+}
diff --git a/weixin4j-qy/weixin4j-qy-server/src/main/java/com/foxinmy/weixin4j/qy/action/VideoAction.java b/weixin4j-qy/weixin4j-qy-server/src/main/java/com/foxinmy/weixin4j/qy/action/VideoAction.java
new file mode 100644
index 00000000..56f1e560
--- /dev/null
+++ b/weixin4j-qy/weixin4j-qy-server/src/main/java/com/foxinmy/weixin4j/qy/action/VideoAction.java
@@ -0,0 +1,20 @@
+package com.foxinmy.weixin4j.qy.action;
+
+import com.foxinmy.weixin4j.action.DebugAction;
+import com.foxinmy.weixin4j.action.mapping.ActionAnnotation;
+import com.foxinmy.weixin4j.msg.VideoMessage;
+import com.foxinmy.weixin4j.type.MessageType;
+
+/**
+ * 视频消息处理
+ *
+ * @className VideoAction
+ * @author jy
+ * @date 2014年10月9日
+ * @since JDK 1.7
+ * @see com.foxinmy.weixin4j.msg.VideoMessage
+ */
+@ActionAnnotation(msgType = MessageType.video)
+public class VideoAction extends DebugAction {
+
+}
diff --git a/weixin4j-qy/weixin4j-qy-server/src/main/java/com/foxinmy/weixin4j/qy/action/VoiceAction.java b/weixin4j-qy/weixin4j-qy-server/src/main/java/com/foxinmy/weixin4j/qy/action/VoiceAction.java
new file mode 100644
index 00000000..2ae170d5
--- /dev/null
+++ b/weixin4j-qy/weixin4j-qy-server/src/main/java/com/foxinmy/weixin4j/qy/action/VoiceAction.java
@@ -0,0 +1,20 @@
+package com.foxinmy.weixin4j.qy.action;
+
+import com.foxinmy.weixin4j.action.DebugAction;
+import com.foxinmy.weixin4j.action.mapping.ActionAnnotation;
+import com.foxinmy.weixin4j.msg.VoiceMessage;
+import com.foxinmy.weixin4j.type.MessageType;
+
+/**
+ * 语音消息处理
+ *
+ * @className VoiceAction
+ * @author jy
+ * @date 2014年10月9日
+ * @since JDK 1.7
+ * @see com.foxinmy.weixin4j.msg.VoiceMessage
+ */
+@ActionAnnotation(msgType = MessageType.voice)
+public class VoiceAction extends DebugAction {
+
+}
diff --git a/weixin4j-qy/weixin4j-qy-server/src/main/java/com/foxinmy/weixin4j/qy/action/event/LocationAction.java b/weixin4j-qy/weixin4j-qy-server/src/main/java/com/foxinmy/weixin4j/qy/action/event/LocationAction.java
new file mode 100644
index 00000000..181ffaf7
--- /dev/null
+++ b/weixin4j-qy/weixin4j-qy-server/src/main/java/com/foxinmy/weixin4j/qy/action/event/LocationAction.java
@@ -0,0 +1,21 @@
+package com.foxinmy.weixin4j.qy.action.event;
+
+import com.foxinmy.weixin4j.action.DebugAction;
+import com.foxinmy.weixin4j.action.mapping.ActionAnnotation;
+import com.foxinmy.weixin4j.msg.event.LocationEventMessage;
+import com.foxinmy.weixin4j.type.EventType;
+import com.foxinmy.weixin4j.type.MessageType;
+
+/**
+ * 上报地理位置后触发
+ *
+ * @className LocationAction
+ * @author jy
+ * @date 2014年10月9日
+ * @since JDK 1.7
+ * @see com.foxinmy.weixin4j.msg.event.LocationEventMessage
+ */
+@ActionAnnotation(msgType = MessageType.event, eventType = { EventType.location })
+public class LocationAction extends DebugAction {
+
+}
diff --git a/weixin4j-qy/weixin4j-qy-server/src/main/java/com/foxinmy/weixin4j/qy/action/event/MassSendAction.java b/weixin4j-qy/weixin4j-qy-server/src/main/java/com/foxinmy/weixin4j/qy/action/event/MassSendAction.java
new file mode 100644
index 00000000..cf22831b
--- /dev/null
+++ b/weixin4j-qy/weixin4j-qy-server/src/main/java/com/foxinmy/weixin4j/qy/action/event/MassSendAction.java
@@ -0,0 +1,21 @@
+package com.foxinmy.weixin4j.qy.action.event;
+
+import com.foxinmy.weixin4j.action.DebugAction;
+import com.foxinmy.weixin4j.action.mapping.ActionAnnotation;
+import com.foxinmy.weixin4j.msg.event.MassEventMessage;
+import com.foxinmy.weixin4j.type.EventType;
+import com.foxinmy.weixin4j.type.MessageType;
+
+/**
+ * 群发消息发送动作完成后触发
+ *
+ * @className MassSendAction
+ * @author jy
+ * @date 2014年10月9日
+ * @since JDK 1.7
+ * @see com.foxinmy.weixin4j.msg.event.MassEventMessage
+ */
+@ActionAnnotation(msgType = MessageType.event, eventType = { EventType.massendjobfinish })
+public class MassSendAction extends DebugAction {
+
+}
diff --git a/weixin4j-qy/weixin4j-qy-server/src/main/java/com/foxinmy/weixin4j/qy/action/event/MenuClickAction.java b/weixin4j-qy/weixin4j-qy-server/src/main/java/com/foxinmy/weixin4j/qy/action/event/MenuClickAction.java
new file mode 100644
index 00000000..16ceee3a
--- /dev/null
+++ b/weixin4j-qy/weixin4j-qy-server/src/main/java/com/foxinmy/weixin4j/qy/action/event/MenuClickAction.java
@@ -0,0 +1,21 @@
+package com.foxinmy.weixin4j.qy.action.event;
+
+import com.foxinmy.weixin4j.action.DebugAction;
+import com.foxinmy.weixin4j.action.mapping.ActionAnnotation;
+import com.foxinmy.weixin4j.msg.event.menu.MenuEventMessage;
+import com.foxinmy.weixin4j.type.EventType;
+import com.foxinmy.weixin4j.type.MessageType;
+
+/**
+ * click类型菜单点击时触发
+ *
+ * @className MenuClickAction
+ * @author jy
+ * @date 2014年10月9日
+ * @since JDK 1.7
+ * @see com.foxinmy.weixin4j.msg.event.menu.MenuEventMessage
+ */
+@ActionAnnotation(msgType = MessageType.event, eventType = { EventType.click })
+public class MenuClickAction extends DebugAction {
+
+}
diff --git a/weixin4j-qy/weixin4j-qy-server/src/main/java/com/foxinmy/weixin4j/qy/action/event/MenuLocationAction.java b/weixin4j-qy/weixin4j-qy-server/src/main/java/com/foxinmy/weixin4j/qy/action/event/MenuLocationAction.java
new file mode 100644
index 00000000..8a4ba8fe
--- /dev/null
+++ b/weixin4j-qy/weixin4j-qy-server/src/main/java/com/foxinmy/weixin4j/qy/action/event/MenuLocationAction.java
@@ -0,0 +1,21 @@
+package com.foxinmy.weixin4j.qy.action.event;
+
+import com.foxinmy.weixin4j.action.DebugAction;
+import com.foxinmy.weixin4j.action.mapping.ActionAnnotation;
+import com.foxinmy.weixin4j.msg.event.menu.MenuLocationEventMessage;
+import com.foxinmy.weixin4j.type.EventType;
+import com.foxinmy.weixin4j.type.MessageType;
+
+/**
+ * 点击菜单发送地理位置时触发
+ *
+ * @className MenuLocationAction
+ * @author jy
+ * @date 2014年10月9日
+ * @since JDK 1.7
+ * @see com.foxinmy.weixin4j.msg.event.menu.MenuLocationEventMessage
+ */
+@ActionAnnotation(msgType = MessageType.event, eventType = { EventType.location_select })
+public class MenuLocationAction extends DebugAction {
+
+}
diff --git a/weixin4j-qy/weixin4j-qy-server/src/main/java/com/foxinmy/weixin4j/qy/action/event/MenuPhotoAction.java b/weixin4j-qy/weixin4j-qy-server/src/main/java/com/foxinmy/weixin4j/qy/action/event/MenuPhotoAction.java
new file mode 100644
index 00000000..f2303505
--- /dev/null
+++ b/weixin4j-qy/weixin4j-qy-server/src/main/java/com/foxinmy/weixin4j/qy/action/event/MenuPhotoAction.java
@@ -0,0 +1,23 @@
+package com.foxinmy.weixin4j.qy.action.event;
+
+import com.foxinmy.weixin4j.action.DebugAction;
+import com.foxinmy.weixin4j.action.mapping.ActionAnnotation;
+import com.foxinmy.weixin4j.msg.event.menu.MenuPhotoEventMessage;
+import com.foxinmy.weixin4j.type.EventType;
+import com.foxinmy.weixin4j.type.MessageType;
+
+/**
+ * 点击菜单发送图片时触发
+ *
+ * @className MenuPhotoAction
+ * @author jy
+ * @date 2014年10月9日
+ * @since JDK 1.7
+ * @see com.foxinmy.weixin4j.msg.event.menu.MenuPhotoEventMessage
+ */
+@ActionAnnotation(msgType = MessageType.event, eventType = {
+ EventType.pic_photo_or_album, EventType.pic_sysphoto,
+ EventType.pic_weixin })
+public class MenuPhotoAction extends DebugAction {
+
+}
diff --git a/weixin4j-qy/weixin4j-qy-server/src/main/java/com/foxinmy/weixin4j/qy/action/event/MenuScanAction.java b/weixin4j-qy/weixin4j-qy-server/src/main/java/com/foxinmy/weixin4j/qy/action/event/MenuScanAction.java
new file mode 100644
index 00000000..da4c2fcb
--- /dev/null
+++ b/weixin4j-qy/weixin4j-qy-server/src/main/java/com/foxinmy/weixin4j/qy/action/event/MenuScanAction.java
@@ -0,0 +1,22 @@
+package com.foxinmy.weixin4j.qy.action.event;
+
+import com.foxinmy.weixin4j.action.DebugAction;
+import com.foxinmy.weixin4j.action.mapping.ActionAnnotation;
+import com.foxinmy.weixin4j.msg.event.menu.MenuScanEventMessage;
+import com.foxinmy.weixin4j.type.EventType;
+import com.foxinmy.weixin4j.type.MessageType;
+
+/**
+ * 点击菜单扫描时触发
+ *
+ * @className MenuScanAction
+ * @author jy
+ * @date 2014年10月9日
+ * @since JDK 1.7
+ * @see com.foxinmy.weixin4j.msg.event.menu.MenuScanEventMessage
+ */
+@ActionAnnotation(msgType = MessageType.event, eventType = { EventType.scancode_push,
+ EventType.scancode_waitmsg })
+public class MenuScanAction extends DebugAction {
+
+}
diff --git a/weixin4j-qy/weixin4j-qy-server/src/main/java/com/foxinmy/weixin4j/qy/action/event/MenuViewAction.java b/weixin4j-qy/weixin4j-qy-server/src/main/java/com/foxinmy/weixin4j/qy/action/event/MenuViewAction.java
new file mode 100644
index 00000000..537759b5
--- /dev/null
+++ b/weixin4j-qy/weixin4j-qy-server/src/main/java/com/foxinmy/weixin4j/qy/action/event/MenuViewAction.java
@@ -0,0 +1,21 @@
+package com.foxinmy.weixin4j.qy.action.event;
+
+import com.foxinmy.weixin4j.action.DebugAction;
+import com.foxinmy.weixin4j.action.mapping.ActionAnnotation;
+import com.foxinmy.weixin4j.msg.event.menu.MenuEventMessage;
+import com.foxinmy.weixin4j.type.EventType;
+import com.foxinmy.weixin4j.type.MessageType;
+
+/**
+ * view类型菜单点击时触发
+ *
+ * @className MenuViewAction
+ * @author jy
+ * @date 2014年10月9日
+ * @since JDK 1.7
+ * @see com.foxinmy.weixin4j.msg.event.menu.MenuEventMessage
+ */
+@ActionAnnotation(msgType = MessageType.event, eventType = { EventType.view })
+public class MenuViewAction extends DebugAction {
+
+}
diff --git a/weixin4j-qy/weixin4j-qy-server/src/main/java/com/foxinmy/weixin4j/qy/action/event/README.md b/weixin4j-qy/weixin4j-qy-server/src/main/java/com/foxinmy/weixin4j/qy/action/event/README.md
new file mode 100644
index 00000000..a9452c58
--- /dev/null
+++ b/weixin4j-qy/weixin4j-qy-server/src/main/java/com/foxinmy/weixin4j/qy/action/event/README.md
@@ -0,0 +1 @@
+事件消息对应的Action
\ No newline at end of file
diff --git a/weixin4j-qy/weixin4j-qy-server/src/main/java/com/foxinmy/weixin4j/qy/action/event/ScanAction.java b/weixin4j-qy/weixin4j-qy-server/src/main/java/com/foxinmy/weixin4j/qy/action/event/ScanAction.java
new file mode 100644
index 00000000..8c450fd9
--- /dev/null
+++ b/weixin4j-qy/weixin4j-qy-server/src/main/java/com/foxinmy/weixin4j/qy/action/event/ScanAction.java
@@ -0,0 +1,21 @@
+package com.foxinmy.weixin4j.qy.action.event;
+
+import com.foxinmy.weixin4j.action.DebugAction;
+import com.foxinmy.weixin4j.action.mapping.ActionAnnotation;
+import com.foxinmy.weixin4j.msg.event.ScanEventMessage;
+import com.foxinmy.weixin4j.type.EventType;
+import com.foxinmy.weixin4j.type.MessageType;
+
+/**
+ * 扫描事件时触发
+ *
+ * @className ScanAction
+ * @author jy
+ * @date 2014年10月9日
+ * @since JDK 1.7
+ * @see com.foxinmy.weixin4j.msg.event.ScanEventMessage
+ */
+@ActionAnnotation(msgType = MessageType.event, eventType = { EventType.scan })
+public class ScanAction extends DebugAction {
+
+}
diff --git a/weixin4j-qy/weixin4j-qy-server/src/main/java/com/foxinmy/weixin4j/qy/action/event/SubscribeAction.java b/weixin4j-qy/weixin4j-qy-server/src/main/java/com/foxinmy/weixin4j/qy/action/event/SubscribeAction.java
new file mode 100644
index 00000000..bdb30710
--- /dev/null
+++ b/weixin4j-qy/weixin4j-qy-server/src/main/java/com/foxinmy/weixin4j/qy/action/event/SubscribeAction.java
@@ -0,0 +1,21 @@
+package com.foxinmy.weixin4j.qy.action.event;
+
+import com.foxinmy.weixin4j.action.DebugAction;
+import com.foxinmy.weixin4j.action.mapping.ActionAnnotation;
+import com.foxinmy.weixin4j.msg.event.ScribeEventMessage;
+import com.foxinmy.weixin4j.type.EventType;
+import com.foxinmy.weixin4j.type.MessageType;
+
+/**
+ * 关注时触发
+ *
+ * @className SubscribeAction
+ * @author jy
+ * @date 2014年10月9日
+ * @since JDK 1.7
+ * @see com.foxinmy.weixin4j.msg.event.ScribeEventMessage
+ */
+@ActionAnnotation(msgType = MessageType.event, eventType = { EventType.subscribe })
+public class SubscribeAction extends DebugAction {
+
+}
diff --git a/weixin4j-qy/weixin4j-qy-server/src/main/java/com/foxinmy/weixin4j/qy/action/event/TemplateSendAction.java b/weixin4j-qy/weixin4j-qy-server/src/main/java/com/foxinmy/weixin4j/qy/action/event/TemplateSendAction.java
new file mode 100644
index 00000000..6fee3417
--- /dev/null
+++ b/weixin4j-qy/weixin4j-qy-server/src/main/java/com/foxinmy/weixin4j/qy/action/event/TemplateSendAction.java
@@ -0,0 +1,22 @@
+package com.foxinmy.weixin4j.qy.action.event;
+
+import com.foxinmy.weixin4j.action.DebugAction;
+import com.foxinmy.weixin4j.action.mapping.ActionAnnotation;
+import com.foxinmy.weixin4j.msg.event.TemplatesendjobfinishMessage;
+import com.foxinmy.weixin4j.type.EventType;
+import com.foxinmy.weixin4j.type.MessageType;
+
+/**
+ * 模板消息发送动作完成时触发
+ *
+ * @className TemplateSendAction
+ * @author jy
+ * @date 2014年10月10日
+ * @since JDK 1.7
+ * @see com.foxinmy.weixin4j.msg.event.TemplatesendjobfinishMessage
+ */
+@ActionAnnotation(msgType = MessageType.event, eventType = { EventType.templatesendjobfinish })
+public class TemplateSendAction extends
+ DebugAction {
+
+}
diff --git a/weixin4j-qy/weixin4j-qy-server/src/main/java/com/foxinmy/weixin4j/qy/action/event/UnsubscribeAction.java b/weixin4j-qy/weixin4j-qy-server/src/main/java/com/foxinmy/weixin4j/qy/action/event/UnsubscribeAction.java
new file mode 100644
index 00000000..a3eabaf2
--- /dev/null
+++ b/weixin4j-qy/weixin4j-qy-server/src/main/java/com/foxinmy/weixin4j/qy/action/event/UnsubscribeAction.java
@@ -0,0 +1,21 @@
+package com.foxinmy.weixin4j.qy.action.event;
+
+import com.foxinmy.weixin4j.action.DebugAction;
+import com.foxinmy.weixin4j.action.mapping.ActionAnnotation;
+import com.foxinmy.weixin4j.msg.event.ScribeEventMessage;
+import com.foxinmy.weixin4j.type.EventType;
+import com.foxinmy.weixin4j.type.MessageType;
+
+/**
+ * 取消关注时触发
+ *
+ * @className UnsubscribeAction
+ * @author jy
+ * @date 2014年10月10日
+ * @since JDK 1.7
+ * @see com.foxinmy.weixin4j.msg.event.ScribeEventMessage
+ */
+@ActionAnnotation(msgType = MessageType.event, eventType = { EventType.unsubscribe })
+public class UnsubscribeAction extends DebugAction {
+
+}
diff --git a/weixin4j-qy/weixin4j-qy-server/src/main/java/com/foxinmy/weixin4j/qy/server/README.md b/weixin4j-qy/weixin4j-qy-server/src/main/java/com/foxinmy/weixin4j/qy/server/README.md
new file mode 100644
index 00000000..03efe206
--- /dev/null
+++ b/weixin4j-qy/weixin4j-qy-server/src/main/java/com/foxinmy/weixin4j/qy/server/README.md
@@ -0,0 +1,5 @@
+WeixinMessageDecoder:对微信消息进行解码
+
+WeixinMessageEncoder:对微信消息进行编码
+
+WeixinServerHandler:微信请求处理类
\ No newline at end of file
diff --git a/weixin4j-qy/weixin4j-qy-server/src/main/java/com/foxinmy/weixin4j/qy/server/WeixinMessageDecoder.java b/weixin4j-qy/weixin4j-qy-server/src/main/java/com/foxinmy/weixin4j/qy/server/WeixinMessageDecoder.java
new file mode 100644
index 00000000..45983406
--- /dev/null
+++ b/weixin4j-qy/weixin4j-qy-server/src/main/java/com/foxinmy/weixin4j/qy/server/WeixinMessageDecoder.java
@@ -0,0 +1,77 @@
+package com.foxinmy.weixin4j.qy.server;
+
+import io.netty.channel.ChannelHandlerContext;
+import io.netty.handler.codec.MessageToMessageDecoder;
+import io.netty.handler.codec.http.FullHttpRequest;
+import io.netty.handler.codec.http.QueryStringDecoder;
+
+import java.util.List;
+import java.util.Map;
+
+import org.apache.commons.lang3.StringUtils;
+import org.apache.http.Consts;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.foxinmy.weixin4j.model.WeixinQyAccount;
+import com.foxinmy.weixin4j.response.HttpWeixinMessage;
+import com.foxinmy.weixin4j.type.EncryptType;
+import com.foxinmy.weixin4j.util.ConfigUtil;
+import com.foxinmy.weixin4j.util.MessageUtil;
+import com.foxinmy.weixin4j.xml.XStream;
+
+/**
+ * 微信消息解码类
+ *
+ * @className WeixinMessageDecoder
+ * @author jy
+ * @date 2014年11月13日
+ * @since JDK 1.7
+ * @see 回调模式
+ */
+public class WeixinMessageDecoder extends
+ MessageToMessageDecoder {
+ private final Logger log = LoggerFactory.getLogger(getClass());
+
+ @Override
+ protected void decode(ChannelHandlerContext ctx, FullHttpRequest req,
+ List