diff --git a/CHANGE.md b/CHANGE.md
index c4d6149f..2478e875 100644
--- a/CHANGE.md
+++ b/CHANGE.md
@@ -271,8 +271,8 @@
* 2015-05-07
- +**weixin4j-server**: 完成基本骨架
+ + **weixin4j-server**: 完成基本骨架
* 2015-05-08
- +**weixin4j-server**: 完成消息分发器、消息处理器、消息拦截器的骨架
\ No newline at end of file
+ + **weixin4j-server**: 完成消息分发器、消息处理器、消息拦截器的骨架
\ No newline at end of file
diff --git a/weixin4j-base/pom.xml b/weixin4j-base/pom.xml
index a48fd843..c00c1be0 100644
--- a/weixin4j-base/pom.xml
+++ b/weixin4j-base/pom.xml
@@ -47,30 +47,15 @@
-
- org.apache.commons
- commons-lang3
- ${commons.lang.version}
-
com.alibaba
fastjson
${fastjson.version}
-
- dom4j
- dom4j
- ${dom4j.version}
-
redis.clients
jedis
${jedis.version}
-
- commons-codec
- commons-codec
- ${commons.codec.version}
-
\ No newline at end of file
diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/http/HttpRequest.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/http/HttpRequest.java
index ec60be66..d3ed3cdd 100644
--- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/http/HttpRequest.java
+++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/http/HttpRequest.java
@@ -7,7 +7,6 @@ import java.util.ArrayList;
import java.util.List;
import java.util.Map;
-import org.apache.commons.lang3.StringUtils;
import org.apache.http.Consts;
import org.apache.http.Header;
import org.apache.http.HttpEntity;
@@ -36,7 +35,9 @@ import org.apache.http.util.EntityUtils;
import com.alibaba.fastjson.JSONException;
import com.foxinmy.weixin4j.exception.WeixinException;
+import com.foxinmy.weixin4j.util.ErrorUtil;
import com.foxinmy.weixin4j.util.MapUtil;
+import com.foxinmy.weixin4j.util.StringUtil;
import com.thoughtworks.xstream.mapper.CannotResolveClassException;
/**
@@ -237,8 +238,9 @@ public class HttpRequest {
JsonResult jsonResult = response.getAsJsonResult();
response.setJsonResult(true);
if (jsonResult.getCode() != 0) {
- if (StringUtils.isBlank(jsonResult.getDesc())) {
- jsonResult = response.getTextError(jsonResult.getCode());
+ if (StringUtil.isBlank(jsonResult.getDesc())) {
+ jsonResult.setDesc(ErrorUtil.getText(Integer
+ .toString(jsonResult.getCode())));
}
throw new WeixinException(Integer.toString(jsonResult.getCode()),
jsonResult.getDesc());
diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/http/Response.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/http/Response.java
index cd3ae6d5..9ea367c4 100644
--- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/http/Response.java
+++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/http/Response.java
@@ -1,14 +1,7 @@
package com.foxinmy.weixin4j.http;
-import java.io.IOException;
import java.io.InputStream;
-import org.apache.commons.lang3.StringUtils;
-import org.dom4j.Document;
-import org.dom4j.DocumentException;
-import org.dom4j.Node;
-import org.dom4j.io.SAXReader;
-
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.TypeReference;
@@ -67,65 +60,6 @@ public class Response {
return XmlStream.get(text, XmlResult.class);
}
- /**
- * 全局返回码 {"errcode":45009,"errmsg":"api freq out of limit"}
- *
- * @return
- * @throws DocumentException
- */
- public JsonResult getTextError(int code) {
- JsonResult result = new JsonResult();
- result.setCode(code);
- SAXReader reader = new SAXReader();
- Document doc = null;
- InputStream is = null;
- try {
- is = Response.class.getResourceAsStream("error.xml");
- doc = reader.read(is);
- Node node = doc.getRootElement().selectSingleNode(
- String.format("error/code[text()=%d]", code));
- if (node != null) {
- node = node.getParent();
- String desc = null;
- Node _node = node.selectSingleNode("desc");
- if (_node != null) {
- desc = _node.getStringValue();
- }
- String text = null;
- _node = node.selectSingleNode("text");
- if (_node != null) {
- text = _node.getStringValue();
- }
- if (StringUtils.isBlank(desc) && StringUtils.isNotBlank(text)) {
- desc = text;
- }
- if (StringUtils.isBlank(text) && StringUtils.isNotBlank(desc)) {
- text = desc;
- }
- result.setDesc(desc);
- result.setText(text);
- } else {
- result.setDesc("unknown error");
- result.setText("未知错误");
- }
- } catch (DocumentException e) {
- result.setDesc("unknown error");
- result.setText("未知错误");
- e.printStackTrace();
- } finally {
- if (is != null) {
- try {
- is.close();
- } catch (IOException e) {
- ;
- }
- }
- }
- return result;
- }
-
public void setText(String text) {
this.text = text;
}
diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/http/XmlResult.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/http/XmlResult.java
index 60d09ee5..94cd31a0 100644
--- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/http/XmlResult.java
+++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/http/XmlResult.java
@@ -2,9 +2,8 @@ package com.foxinmy.weixin4j.http;
import java.io.Serializable;
-import org.apache.commons.lang3.StringUtils;
-
import com.alibaba.fastjson.annotation.JSONField;
+import com.foxinmy.weixin4j.util.StringUtil;
import com.thoughtworks.xstream.annotations.XStreamAlias;
/**
@@ -53,7 +52,7 @@ public class XmlResult implements Serializable {
}
public String getReturnMsg() {
- return StringUtils.isNotBlank(returnMsg) ? returnMsg : null;
+ return StringUtil.isNotBlank(returnMsg) ? returnMsg : null;
}
public void setReturnMsg(String returnMsg) {
@@ -77,7 +76,7 @@ public class XmlResult implements Serializable {
}
public String getErrCodeDes() {
- return StringUtils.isNotBlank(errCodeDes) ? errCodeDes : null;
+ return StringUtil.isNotBlank(errCodeDes) ? errCodeDes : null;
}
public void setErrCodeDes(String errCodeDes) {
diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/message/BaseMessage.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/message/BaseMessage.java
deleted file mode 100644
index 567326fa..00000000
--- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/message/BaseMessage.java
+++ /dev/null
@@ -1,140 +0,0 @@
-package com.foxinmy.weixin4j.message;
-
-import java.io.Serializable;
-
-import com.thoughtworks.xstream.annotations.XStreamAlias;
-
-/**
- * 消息基类
- *
- * @className BaseMessage
- * @author jy.hu
- * @date 2014年4月6日
- * @since JDK 1.7
- */
-public class BaseMessage implements Serializable {
-
- private static final long serialVersionUID = 7761192742840031607L;
-
- /**
- * 开发者微信号
- */
- @XStreamAlias("ToUserName")
- private String toUserName;
- /**
- * 发送方账号 即用户的openid
- */
- @XStreamAlias("FromUserName")
- private String fromUserName;
- /**
- * 消息创建时间 系统毫秒数
- */
- @XStreamAlias("CreateTime")
- private long createTime = System.currentTimeMillis();
- /**
- * 消息类型
- *
- * @see com.foxinmy.weixin4j.type.MessageType
- */
- @XStreamAlias("MsgType")
- private String msgType;
- /**
- * 消息ID 可用于排重
- */
- @XStreamAlias("MsgId")
- private long msgId;
- /**
- * 企业号独有的应用ID
- */
- @XStreamAlias("AgentID")
- private String agentId;
-
- public BaseMessage() {
-
- }
-
- public BaseMessage(String msgType) {
- this.msgType = msgType;
- }
-
- public BaseMessage(String toUserName, String fromUserName) {
- this(null, toUserName, fromUserName);
- }
-
- public BaseMessage(String msgType, String toUserName, String fromUserName) {
- this.msgType = msgType;
- this.toUserName = toUserName;
- this.fromUserName = fromUserName;
- }
-
- public String getToUserName() {
- return toUserName;
- }
-
- public void setToUserName(String toUserName) {
- this.toUserName = toUserName;
- }
-
- public String getFromUserName() {
- return fromUserName;
- }
-
- public void setFromUserName(String fromUserName) {
- this.fromUserName = fromUserName;
- }
-
- public long getCreateTime() {
- return createTime;
- }
-
- public void setCreateTime(long createTime) {
- this.createTime = createTime;
- }
-
- public String getMsgType() {
- return msgType;
- }
-
- public void setMsgType(String msgType) {
- this.msgType = msgType;
- }
-
- public long getMsgId() {
- return msgId;
- }
-
- public String getAgentId() {
- return agentId;
- }
-
- @Override
- public int hashCode() {
- final int prime = 31;
- int result = 1;
- result = prime * result + ((agentId == null) ? 0 : agentId.hashCode());
- result = prime * result + (int) (createTime ^ (createTime >>> 32));
- result = prime * result
- + ((fromUserName == null) ? 0 : fromUserName.hashCode());
- result = prime * result + (int) (msgId ^ (msgId >>> 32));
- result = prime * result + ((msgType == null) ? 0 : msgType.hashCode());
- result = prime * result
- + ((toUserName == null) ? 0 : toUserName.hashCode());
- return result;
- }
-
- @Override
- public boolean equals(Object obj) {
- if (obj instanceof BaseMessage) {
- return ((BaseMessage) obj).getMsgId() == msgId
- && ((BaseMessage) obj).getCreateTime() == createTime;
- }
- return false;
- }
-
- @Override
- public String toString() {
- return "toUserName=" + toUserName + ", fromUserName=" + fromUserName
- + ", createTime=" + createTime + ", msgType=" + msgType
- + ", msgId=" + msgId + ", agentId=" + agentId;
- }
-}
diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/message/ImageMessage.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/message/ImageMessage.java
deleted file mode 100644
index 45e0fe3d..00000000
--- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/message/ImageMessage.java
+++ /dev/null
@@ -1,50 +0,0 @@
-package com.foxinmy.weixin4j.message;
-
-import com.foxinmy.weixin4j.type.MessageType;
-import com.thoughtworks.xstream.annotations.XStreamAlias;
-
-/**
- * 图片消息
- *
- * @className ImageMessage
- * @author jy.hu
- * @date 2014年4月6日
- * @since JDK 1.7
- * @see 订阅号、服务号的图片消息
- * @see 企业号的图片消息
- */
-public class ImageMessage extends BaseMessage {
-
- private static final long serialVersionUID = 8430800898756567016L;
-
- public ImageMessage() {
- super(MessageType.image.name());
- }
-
- /**
- * 图片链接
- */
- @XStreamAlias("PicUrl")
- private String picUrl;
- /**
- * 图片消息媒体id,可以调用多媒体文件下载接口拉取数据。
- */
- @XStreamAlias("MediaId")
- private String mediaId;
-
- public String getPicUrl() {
- return picUrl;
- }
-
- public String getMediaId() {
- return mediaId;
- }
-
- @Override
- public String toString() {
- return "ImageMessage [picUrl=" + picUrl + ", mediaId=" + mediaId + ", "
- + super.toString() + "]";
- }
-}
diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/message/LinkMessage.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/message/LinkMessage.java
deleted file mode 100644
index 98ff2ea0..00000000
--- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/message/LinkMessage.java
+++ /dev/null
@@ -1,57 +0,0 @@
-package com.foxinmy.weixin4j.message;
-
-import com.foxinmy.weixin4j.type.MessageType;
-import com.thoughtworks.xstream.annotations.XStreamAlias;
-
-/**
- * 链接消息
- *
- * @className LinkMessage
- * @author jy.hu
- * @date 2014年4月6日
- * @since JDK 1.7
- * @see 订阅号、服务号的链接消息
- */
-public class LinkMessage extends BaseMessage {
-
- private static final long serialVersionUID = 754952745115497030L;
-
- public LinkMessage() {
- super(MessageType.link.name());
- }
-
- /**
- * 消息标题
- */
- @XStreamAlias("Title")
- private String title;
- /**
- * 消息描述
- */
- @XStreamAlias("Description")
- private String description;
- /**
- * 消息链接
- */
- @XStreamAlias("Url")
- private String url;
-
- public String getTitle() {
- return title;
- }
-
- public String getDescription() {
- return description;
- }
-
- public String getUrl() {
- return url;
- }
-
- @Override
- public String toString() {
- return "LinkMessage [title=" + title + ", description=" + description
- + ", url=" + url + ", " + super.toString() + "]";
- }
-}
diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/message/LocationMessage.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/message/LocationMessage.java
deleted file mode 100644
index bfabc618..00000000
--- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/message/LocationMessage.java
+++ /dev/null
@@ -1,68 +0,0 @@
-package com.foxinmy.weixin4j.message;
-
-import com.foxinmy.weixin4j.type.MessageType;
-import com.thoughtworks.xstream.annotations.XStreamAlias;
-
-/**
- * 地理位置消息
- *
- * @className LocationMessage
- * @author jy.hu
- * @date 2014年4月6日
- * @since JDK 1.7
- * @see 订阅号、服务号的地理位置消息
- * @see 企业号的地理位置消息
- */
-public class LocationMessage extends BaseMessage {
-
- private static final long serialVersionUID = 2866021596599237334L;
-
- public LocationMessage() {
- super(MessageType.location.name());
- }
-
- /**
- * 地理位置维度
- */
- @XStreamAlias("Location_X")
- private double x;
- /**
- * 地理位置经度
- */
- @XStreamAlias("Location_Y")
- private double y;
- /**
- * 地图缩放大小
- */
- @XStreamAlias("Scale")
- private double scale;
- /**
- * 地理位置信息
- */
- @XStreamAlias("Label")
- private String label;
-
- public double getX() {
- return x;
- }
-
- public double getY() {
- return y;
- }
-
- public double getScale() {
- return scale;
- }
-
- public String getLabel() {
- return label;
- }
-
- @Override
- public String toString() {
- return "LocationMessage [x=" + x + ", y=" + y + ", scale=" + scale
- + ", label=" + label + ", " + super.toString() + "]";
- }
-}
diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/message/README.md b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/message/README.md
deleted file mode 100644
index d273f850..00000000
--- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/message/README.md
+++ /dev/null
@@ -1,10 +0,0 @@
-普通消息
--------
-
-当普通微信用户向公众账号发消息时,微信服务器将POST消息的XML数据包到开发者填写的URL上。
-
-微信服务器在五秒内收不到响应会断掉连接,并且重新发起请求,总共重试三次
-
-关于重试的消息排重,推荐使用msgid排重。
-
-假如服务器无法保证在五秒内处理并回复,可以直接回复空串,微信服务器不会对此作任何处理,并且不会发起重试。
\ No newline at end of file
diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/message/TextMessage.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/message/TextMessage.java
deleted file mode 100644
index 36d73cbc..00000000
--- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/message/TextMessage.java
+++ /dev/null
@@ -1,41 +0,0 @@
-package com.foxinmy.weixin4j.message;
-
-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 订阅号、服务号的文本消息
- * @see 企业号的文本消息
- */
-public class TextMessage extends BaseMessage {
-
- private static final long serialVersionUID = -7018053906644190260L;
-
- public TextMessage() {
- super(MessageType.text.name());
- }
-
- /**
- * 消息内容
- */
- @XStreamAlias("Content")
- private String content;
-
- public String getContent() {
- return content;
- }
-
- @Override
- public String toString() {
- return "TextMessage [content=" + content + ", " + super.toString()
- + "]";
- }
-}
\ No newline at end of file
diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/message/VideoMessage.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/message/VideoMessage.java
deleted file mode 100644
index cd83bb42..00000000
--- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/message/VideoMessage.java
+++ /dev/null
@@ -1,50 +0,0 @@
-package com.foxinmy.weixin4j.message;
-
-import com.foxinmy.weixin4j.type.MessageType;
-import com.thoughtworks.xstream.annotations.XStreamAlias;
-
-/**
- * 视频消息
- *
- * @className VideoMessage
- * @author jy.hu
- * @date 2014年4月6日
- * @since JDK 1.7
- * @see 订阅号、服务号的视频消息
- * @see 企业号的视频消息
- */
-public class VideoMessage extends BaseMessage {
-
- private static final long serialVersionUID = -1013075358679078381L;
-
- public VideoMessage() {
- super(MessageType.video.name());
- }
-
- /**
- * 视频消息媒体id,可以调用多媒体文件下载接口拉取数据。
- */
- @XStreamAlias("MediaId")
- private String mediaId;
- /**
- * 视频消息缩略图的媒体id,可以调用多媒体文件下载接口拉取数据。
- */
- @XStreamAlias("ThumbMediaId")
- private String thumbMediaId;
-
- public String getMediaId() {
- return mediaId;
- }
-
- public String getThumbMediaId() {
- return thumbMediaId;
- }
-
- @Override
- public String toString() {
- return "VideoMessage [mediaId=" + mediaId + ", thumbMediaId="
- + thumbMediaId + ", " + super.toString() + "]";
- }
-}
diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/message/VoiceMessage.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/message/VoiceMessage.java
deleted file mode 100644
index fb68ae26..00000000
--- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/message/VoiceMessage.java
+++ /dev/null
@@ -1,63 +0,0 @@
-package com.foxinmy.weixin4j.message;
-
-import com.foxinmy.weixin4j.type.MessageType;
-import com.thoughtworks.xstream.annotations.XStreamAlias;
-
-/**
- * 语音消息
- *
- * 开通语音识别功能,用户每次发送语音给公众号时,微信会在推送的语音消息XML数据包中,赋值到Recongnition字段.
- *
- *
- * @className VoiceMessage
- * @author jy.hu
- * @date 2014年4月6日
- * @since JDK 1.7
- * @see 订阅号、服务号的语音消息
- * @see 企业号的语音消息
- */
-public class VoiceMessage extends BaseMessage {
-
- private static final long serialVersionUID = -7988380977182214003L;
-
- public VoiceMessage() {
- super(MessageType.voice.name());
- }
-
- /**
- * 语音消息媒体id,可以调用多媒体文件下载接口拉取数据。
- */
- @XStreamAlias("MediaId")
- private String mediaId;
- /**
- * 语音格式,如amr,speex等
- */
- @XStreamAlias("Format")
- private String format;
- /**
- * 语音识别结果,UTF8编码
- */
- @XStreamAlias("Recognition")
- private String recognition;
-
- public String getRecognition() {
- return recognition;
- }
-
- public String getMediaId() {
- return mediaId;
- }
-
- public String getFormat() {
- return format;
- }
-
- @Override
- public String toString() {
- return "VoiceMessage [mediaId=" + mediaId + ", format=" + format
- + ", recognition=" + recognition + ", " + super.toString()
- + "]";
- }
-}
diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/message/event/EventMessage.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/message/event/EventMessage.java
deleted file mode 100644
index 613a98f9..00000000
--- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/message/event/EventMessage.java
+++ /dev/null
@@ -1,44 +0,0 @@
-package com.foxinmy.weixin4j.message.event;
-
-import com.foxinmy.weixin4j.message.BaseMessage;
-import com.foxinmy.weixin4j.type.MessageType;
-import com.thoughtworks.xstream.annotations.XStreamAlias;
-
-/**
- * 事件消息基类
- *
- * @className EventMessage
- * @author jy.hu
- * @date 2014年4月6日
- * @since JDK 1.7
- * @see 订阅号、服务号的事件推送
- * @see 企业号的事件消息
- */
-public class EventMessage extends BaseMessage {
-
- private static final long serialVersionUID = 7703667223814088865L;
-
- public EventMessage(String eventType) {
- super(MessageType.event.name());
- this.eventType = eventType;
- }
-
- /**
- * 事件类型
- *
- * @see com.foxinmy.weixin4j.type.EventType
- */
- @XStreamAlias("Event")
- private String eventType;
-
- public String getEventType() {
- return eventType;
- }
-
- @Override
- public String toString() {
- return "eventType=" + eventType + ", " + super.toString();
- }
-}
diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/message/event/LocationEventMessage.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/message/event/LocationEventMessage.java
deleted file mode 100644
index 400e36d5..00000000
--- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/message/event/LocationEventMessage.java
+++ /dev/null
@@ -1,59 +0,0 @@
-package com.foxinmy.weixin4j.message.event;
-
-import com.foxinmy.weixin4j.type.EventType;
-import com.thoughtworks.xstream.annotations.XStreamAlias;
-
-/**
- * 上报地理位置事件
- *
- * @className LocationEventMessage
- * @author jy.hu
- * @date 2014年4月6日
- * @since JDK 1.7
- * @see 订阅号、服务号的上报地理位置事件
- * @see 企业号的上报地理位置事件
- */
-public class LocationEventMessage extends EventMessage {
-
- private static final long serialVersionUID = -2030716800669824861L;
-
- public LocationEventMessage() {
- super(EventType.location.name());
- }
- /**
- * 地理位置纬度
- */
- @XStreamAlias("Latitude")
- private String latitude;
- /**
- * 地理位置经度
- */
- @XStreamAlias("Longitude")
- private String longitude;
- /**
- * 地理位置精度
- */
- @XStreamAlias("Precision")
- private String precision;
-
- public String getLatitude() {
- return latitude;
- }
-
- public String getLongitude() {
- return longitude;
- }
-
- public String getPrecision() {
- return precision;
- }
-
- @Override
- public String toString() {
- return "LocationEventMessage [latitude=" + latitude + ", longitude="
- + longitude + ", precision=" + precision + ", "
- + super.toString() + "]";
- }
-}
diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/message/event/MenuEventMessage.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/message/event/MenuEventMessage.java
deleted file mode 100644
index b21bad55..00000000
--- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/message/event/MenuEventMessage.java
+++ /dev/null
@@ -1,45 +0,0 @@
-package com.foxinmy.weixin4j.message.event;
-
-import com.foxinmy.weixin4j.type.EventType;
-import com.thoughtworks.xstream.annotations.XStreamAlias;
-
-/**
- * 自定义菜单事件(view|click)
- *
- * @className MenuEventMessage
- * @author jy.hu
- * @date 2014年4月6日
- * @since JDK 1.7
- * @see 订阅号、服务号的菜单事件
- * @see 企业号的菜单事件
- */
-public class MenuEventMessage extends EventMessage {
-
- private static final long serialVersionUID = -1049672447995366063L;
-
- public MenuEventMessage() {
- super(EventType.click.name());
- }
-
- public MenuEventMessage(EventType eventType) {
- super(eventType.name());
- }
-
- /**
- * 事件KEY值,与自定义菜单接口中KEY值对应
- */
- @XStreamAlias("EventKey")
- private String eventKey;
-
- public String getEventKey() {
- return eventKey;
- }
-
- @Override
- public String toString() {
- return "MenuEventMessage [eventKey=" + eventKey + ", "
- + super.toString() + "]";
- }
-}
diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/message/event/MenuLocationEventMessage.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/message/event/MenuLocationEventMessage.java
deleted file mode 100644
index 574f3e15..00000000
--- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/message/event/MenuLocationEventMessage.java
+++ /dev/null
@@ -1,108 +0,0 @@
-package com.foxinmy.weixin4j.message.event;
-
-import java.io.Serializable;
-
-import com.foxinmy.weixin4j.type.EventType;
-import com.thoughtworks.xstream.annotations.XStreamAlias;
-
-/**
- * 弹出地理位置选择器的事件推送
- *
- * @className MenuLocationEventMessage
- * @author jy
- * @date 2014年9月30日
- * @since JDK 1.7
- * @see 订阅号、服务号的弹出地理位置选择事件推送
- * @see 企业号的弹出地理位置选择事件推送
- */
-public class MenuLocationEventMessage extends MenuEventMessage {
-
- private static final long serialVersionUID = 145223888272819563L;
-
- public MenuLocationEventMessage() {
- super(EventType.location_select);
- }
-
- /**
- * 发送的位置消息
- */
- @XStreamAlias("SendLocationInfo")
- private LocationInfo locationInfo;
-
- public LocationInfo getLocationInfo() {
- return locationInfo;
- }
-
- /**
- * 地理位置信息
- * @className LocationInfo
- * @author jy
- * @date 2015年3月29日
- * @since JDK 1.7
- * @see
- */
- public static class LocationInfo implements Serializable {
-
- private static final long serialVersionUID = 4904181780216819965L;
-
- /**
- * 地理位置维度
- */
- @XStreamAlias("Location_X")
- private double x;
- /**
- * 地理位置经度
- */
- @XStreamAlias("Location_Y")
- private double y;
- /**
- * 地图缩放大小
- */
- @XStreamAlias("Scale")
- private double scale;
- /**
- * 地理位置信息
- */
- @XStreamAlias("Label")
- private String label;
- /**
- * 朋友圈POI的名字,可能为空
- */
- @XStreamAlias("Poiname")
- private String poiname;
-
- public double getX() {
- return x;
- }
-
- public double getY() {
- return y;
- }
-
- public double getScale() {
- return scale;
- }
-
- public String getLabel() {
- return label;
- }
-
- public String getPoiname() {
- return poiname;
- }
-
- @Override
- public String toString() {
- return "LocationInfo [x=" + x + ", y=" + y + ", scale=" + scale
- + ", label=" + label + ", poiname=" + poiname + "]";
- }
- }
-
- @Override
- public String toString() {
- return "MenuLocationEventMessage [locationInfo=" + locationInfo + ", "
- + super.toString() + "]";
- }
-}
diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/message/event/MenuPhotoEventMessage.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/message/event/MenuPhotoEventMessage.java
deleted file mode 100644
index a6a9a51d..00000000
--- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/message/event/MenuPhotoEventMessage.java
+++ /dev/null
@@ -1,103 +0,0 @@
-package com.foxinmy.weixin4j.message.event;
-
-import java.io.Serializable;
-import java.util.List;
-
-import com.thoughtworks.xstream.annotations.XStreamAlias;
-
-/**
- * 弹出拍照或者相册发图的事件推送(pic_sysphoto|pic_photo_or_album|pic_weixin)
- *
- * @className MenuPhotoEventMessage
- * @author jy
- * @date 2014年9月30日
- * @since JDK 1.7
- * @see 订阅号、服务号的系统发图的事件推送
- * @see 企业号的系统发图的事件推送
- */
-public class MenuPhotoEventMessage extends MenuEventMessage {
-
- private static final long serialVersionUID = 3142350663022709730L;
-
- /**
- * 发送的图片信息
- */
- @XStreamAlias("SendPicsInfo")
- private PictureInfo pictureInfo;
-
- public PictureInfo getPictureInfo() {
- return pictureInfo;
- }
-
- /**
- * 图片信息
- *
- * @className PictureInfo
- * @author jy
- * @date 2015年3月29日
- * @since JDK 1.7
- * @see
- */
- public static class PictureInfo implements Serializable {
-
- private static final long serialVersionUID = -3361375879168233258L;
-
- /**
- * 发送的图片数量
- */
- @XStreamAlias("Count")
- private int count;
- /**
- * 图片列表
- */
- @XStreamAlias("PicList")
- private List items;
-
- public int getCount() {
- return count;
- }
-
- public List getItems() {
- return items;
- }
-
- @Override
- public String toString() {
- return "PictureInfo [count=" + count + ", items=" + items + "]";
- }
- }
-
- /**
- * 图片
- *
- * @className PictureItem
- * @author jy
- * @date 2015年3月29日
- * @since JDK 1.7
- * @see
- */
- @XStreamAlias("item")
- public static class PictureItem implements Serializable {
-
- private static final long serialVersionUID = -7636697449096645590L;
-
- /**
- * 图片的MD5值,开发者若需要,可用于验证接收到图片
- */
- @XStreamAlias("PicMd5Sum")
- private String md5;
-
- @Override
- public String toString() {
- return "PictureItem [md5=" + md5 + "]";
- }
- }
-
- @Override
- public String toString() {
- return "MenuPhotoEventMessage [pictureInfo=" + pictureInfo + ", "
- + super.toString() + "]";
- }
-}
diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/message/event/MenuScanEventMessage.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/message/event/MenuScanEventMessage.java
deleted file mode 100644
index c83c6165..00000000
--- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/message/event/MenuScanEventMessage.java
+++ /dev/null
@@ -1,75 +0,0 @@
-package com.foxinmy.weixin4j.message.event;
-
-import java.io.Serializable;
-
-import com.thoughtworks.xstream.annotations.XStreamAlias;
-
-/**
- * 扫码推事件(scancode_push|scancode_waitmsg)
- *
- * @className MenuScanEventMessage
- * @author jy
- * @date 2014年9月30日
- * @since JDK 1.7
- * @see 订阅号、服务号的扫码推事件
- * @see 企业号的的扫码推事件
- */
-public class MenuScanEventMessage extends MenuEventMessage {
-
- private static final long serialVersionUID = 3142350663022709730L;
-
- /**
- * 扫描信息
- */
- @XStreamAlias("ScanCodeInfo")
- private ScanInfo scanInfo;
-
- public ScanInfo getScanInfo() {
- return scanInfo;
- }
-
- /**
- * 扫描信息
- *
- * @className ScanInfo
- * @author jy
- * @date 2015年3月29日
- * @since JDK 1.7
- * @see
- */
- public static class ScanInfo implements Serializable {
-
- private static final long serialVersionUID = 2237570238164900421L;
- /**
- * 扫描类型,一般是qrcode
- */
- @XStreamAlias("ScanType")
- private String type;
- /**
- * 扫描结果,即二维码对应的字符串信息
- */
- @XStreamAlias("ScanResult")
- private String result;
-
- public String getType() {
- return type;
- }
-
- public String getResult() {
- return result;
- }
-
- @Override
- public String toString() {
- return "ScanInfo [type=" + type + ", result=" + result + "]";
- }
- }
-
- @Override
- public String toString() {
- return "MenuScanEventMessage [scanInfo=" + scanInfo + ", "
- + super.toString() + "]";
- }
-}
diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/message/event/README.md b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/message/event/README.md
deleted file mode 100644
index f2651b2b..00000000
--- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/message/event/README.md
+++ /dev/null
@@ -1,3 +0,0 @@
-菜单事件消息
-
-用户点击自定义菜单后,微信会把点击事件推送给开发者,请注意,点击菜单弹出子菜单,不会产生上报。请注意,第3个到第8个的所有事件,仅支持微信iPhone5.4.1以上版本,和Android5.4以上版本的微信用户,旧版本微信用户点击后将没有回应,开发者也不能正常接收到事件推送。
\ No newline at end of file
diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/model/Consts.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/model/Consts.java
index 67ce4624..02647d2d 100644
--- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/model/Consts.java
+++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/model/Consts.java
@@ -22,6 +22,9 @@ public final class Consts {
public static final String TLS = "TLS";
public static final String X509 = "X.509";
public static final String AES = "AES";
+ public static final String MD5 = "MD5";
+ public static final String SHA = "SHA";
+ public static final String SHA1 = "SHA-1";
public static final String PROTOCOL_FILE = "file";
public static final String PROTOCOL_JAR = "jar";
diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/token/RedisTokenHolder.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/token/RedisTokenHolder.java
index 7d79cea1..4b8560fa 100644
--- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/token/RedisTokenHolder.java
+++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/token/RedisTokenHolder.java
@@ -1,7 +1,5 @@
package com.foxinmy.weixin4j.token;
-import org.apache.commons.lang3.StringUtils;
-
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
@@ -9,6 +7,7 @@ import redis.clients.jedis.exceptions.JedisException;
import com.foxinmy.weixin4j.exception.WeixinException;
import com.foxinmy.weixin4j.model.Token;
+import com.foxinmy.weixin4j.util.StringUtil;
/**
* 用REDIS保存TOKEN
@@ -64,7 +63,7 @@ public class RedisTokenHolder implements TokenHolder {
jedis = jedisPool.getResource();
String cacheKey = tokenCreator.getCacheKey();
String accessToken = jedis.get(cacheKey);
- if (StringUtils.isBlank(accessToken)) {
+ if (StringUtil.isBlank(accessToken)) {
token = tokenCreator.createToken();
jedis.setex(cacheKey, (int) token.getExpiresIn(),
token.getAccessToken());
diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/type/EventType.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/type/EventType.java
deleted file mode 100644
index 860adab2..00000000
--- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/type/EventType.java
+++ /dev/null
@@ -1,77 +0,0 @@
-package com.foxinmy.weixin4j.type;
-
-/**
- * 事件类型
- *
- * @className EventType
- * @author jy
- * @date 2014年9月30日
- * @since JDK 1.7
- * @see
- */
-public enum EventType {
- /**
- * 关注事件
- *
- */
- subscribe,
- /**
- * 取消关注事件
- *
- */
- unsubscribe,
- /**
- * 上报地理位置事件
- *
- * @see com.foxinmy.weixin4j.msg.event.LocationEventMessage
- */
- location,
- /**
- * 菜单扫描事件
- *
- * @see com.foxinmy.weixin4j.msg.event.menu.MenuScanEventMessage
- */
- scancode_push,
- /**
- * 菜单点击关键字事件
- *
- * @see com.foxinmy.weixin4j.msg.event.menu.MenuEventMessage
- */
- view,
- /**
- * 菜单点击链接事件
- *
- * @see com.foxinmy.weixin4j.msg.event.menu.MenuEventMessage
- */
- click,
- /**
- * 菜单扫描并调出等待界面事件
- *
- * @see com.foxinmy.weixin4j.msg.event.menu.MenuScanEventMessage
- */
- scancode_waitmsg,
- /**
- * 菜单弹出拍照事件
- *
- * @see com.foxinmy.weixin4j.msg.event.menu.MenuPhotoEventMessage
- */
- pic_sysphoto,
- /**
- * 菜单弹出发图事件
- *
- * @see com.foxinmy.weixin4j.msg.event.menu.MenuPhotoEventMessage
- */
- pic_photo_or_album,
- /**
- * 菜单弹出发图事件
- *
- * @see com.foxinmy.weixin4j.msg.event.menu.MenuPhotoEventMessage
- */
- pic_weixin,
- /**
- * 菜单发送地理位置事件
- *
- * @see com.foxinmy.weixin4j.msg.event.menu.MenuLocationEventMessage
- */
- location_select;
-}
diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/util/ConfigUtil.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/util/ConfigUtil.java
index da4de144..d57139f3 100644
--- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/util/ConfigUtil.java
+++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/util/ConfigUtil.java
@@ -8,7 +8,7 @@ import com.alibaba.fastjson.JSON;
import com.foxinmy.weixin4j.model.WeixinAccount;
/**
- * 商户配置工具类
+ * 公众号配置
*
* @className ConfigUtil
* @author jy
diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/util/DigestUtil.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/util/DigestUtil.java
new file mode 100644
index 00000000..c7a7207b
--- /dev/null
+++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/util/DigestUtil.java
@@ -0,0 +1,62 @@
+package com.foxinmy.weixin4j.util;
+
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+
+import com.foxinmy.weixin4j.model.Consts;
+
+/**
+ * 签名工具类
+ *
+ * @className DigestUtil
+ * @author jy
+ * @date 2015年5月6日
+ * @since JDK 1.7
+ * @see
+ */
+public final class DigestUtil {
+
+ private static MessageDigest getDigest(final String algorithm) {
+ try {
+ return MessageDigest.getInstance(algorithm);
+ } catch (final NoSuchAlgorithmException e) {
+ throw new IllegalArgumentException(e);
+ }
+ }
+
+ /**
+ * SHA1签名
+ *
+ * @param content
+ * 待签名字符串
+ * @return 签名后的字符串
+ */
+ public static String SHA1(String content) {
+ byte[] data = StringUtil.getBytesUtf8(content);
+ return HexUtil.encodeHexString(getDigest(Consts.SHA1).digest(data));
+ }
+
+ /**
+ * SHA签名
+ *
+ * @param content
+ * 待签名字符串
+ * @return 签名后的字符串
+ */
+ public static String SHA(String content) {
+ byte[] data = StringUtil.getBytesUtf8(content);
+ return HexUtil.encodeHexString(getDigest(Consts.SHA).digest(data));
+ }
+
+ /**
+ * MD5签名
+ *
+ * @param content
+ * 待签名字符串
+ * @return 签名后的字符串
+ */
+ public static String MD5(String content) {
+ byte[] data = StringUtil.getBytesUtf8(content);
+ return HexUtil.encodeHexString(getDigest(Consts.MD5).digest(data));
+ }
+}
diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/util/ErrorUtil.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/util/ErrorUtil.java
new file mode 100644
index 00000000..ed038dd7
--- /dev/null
+++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/util/ErrorUtil.java
@@ -0,0 +1,107 @@
+package com.foxinmy.weixin4j.util;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.xml.sax.Attributes;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+import org.xml.sax.XMLReader;
+import org.xml.sax.helpers.DefaultHandler;
+import org.xml.sax.helpers.XMLReaderFactory;
+
+import com.foxinmy.weixin4j.http.Response;
+
+/**
+ * 接口调用错误获取
+ *
+ * @className ErrorUtil
+ * @author jy
+ * @date 2015年5月12日
+ * @since JDK 1.7
+ * @see
+ */
+public final class ErrorUtil {
+ private static byte[] errorXmlByteArray;
+ private final static Map errorCacheMap;
+ static {
+ errorCacheMap = new HashMap();
+ try {
+ errorXmlByteArray = IOUtil.toByteArray(Response.class
+ .getResourceAsStream("error.xml"));
+ } catch (IOException e) {
+ ;
+ }
+ }
+
+ private static class ErrorTextHandler extends DefaultHandler {
+
+ private final String code;
+
+ public ErrorTextHandler(String code) {
+ this.code = code;
+ }
+
+ private String text;
+ private boolean codeElement;
+ private boolean textElement;
+ private boolean findElement;
+
+ @Override
+ public void startElement(String uri, String localName, String qName,
+ Attributes attributes) throws SAXException {
+ codeElement = qName.equalsIgnoreCase("code");
+ textElement = qName.equalsIgnoreCase("text");
+ }
+
+ @Override
+ public void endElement(String uri, String localName, String qName)
+ throws SAXException {
+ }
+
+ @Override
+ public void characters(char[] ch, int start, int length)
+ throws SAXException {
+ String _text = new String(ch, start, length);
+ if (codeElement && _text.equalsIgnoreCase(code)) {
+ findElement = true;
+ } else if (textElement && findElement) {
+ text = _text;
+ throw new SAXException("ENOUGH");
+ }
+ }
+
+ public String getText() {
+ return StringUtil.isBlank(text) ? "未知错误" : text;
+ }
+ }
+
+ public static String getText(String code) throws RuntimeException {
+ String text = errorCacheMap.get(code);
+ if (StringUtil.isBlank(text)) {
+ ErrorTextHandler textHandler = new ErrorTextHandler(code);
+ try {
+ XMLReader xmlReader = XMLReaderFactory.createXMLReader();
+ xmlReader.setContentHandler(textHandler);
+ xmlReader.parse(new InputSource(new ByteArrayInputStream(
+ errorXmlByteArray)));
+ text = textHandler.getText();
+ errorCacheMap.put(code, text);
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ } catch (SAXException e) {
+ text = textHandler.getText();
+ errorCacheMap.put(code, text);
+ }
+ }
+ return text;
+ }
+
+ public static void main(String[] args) {
+ System.out.println(getText("40001"));
+ System.out.println(getText("40001"));
+ System.out.println(getText("1234"));
+ }
+}
diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/util/HexUtil.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/util/HexUtil.java
new file mode 100644
index 00000000..dff126f5
--- /dev/null
+++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/util/HexUtil.java
@@ -0,0 +1,34 @@
+package com.foxinmy.weixin4j.util;
+
+public final class HexUtil {
+ /**
+ * Used to build output as Hex
+ */
+ private static final char[] DIGITS_LOWER = { '0', '1', '2', '3', '4', '5',
+ '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
+
+ /**
+ * Used to build output as Hex
+ */
+ private static final char[] DIGITS_UPPER = { '0', '1', '2', '3', '4', '5',
+ '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
+
+ private static char[] encodeHex(final byte[] data, final char[] toDigits) {
+ final int l = data.length;
+ final char[] out = new char[l << 1];
+ // two characters form the hex value.
+ for (int i = 0, j = 0; i < l; i++) {
+ out[j++] = toDigits[(0xF0 & data[i]) >>> 4];
+ out[j++] = toDigits[0x0F & data[i]];
+ }
+ return out;
+ }
+
+ public static String encodeHexString(final byte[] data) {
+ return new String(encodeHex(data, true));
+ }
+
+ public static char[] encodeHex(final byte[] data, final boolean toLowerCase) {
+ return encodeHex(data, toLowerCase ? DIGITS_LOWER : DIGITS_UPPER);
+ }
+}
diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/util/MapUtil.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/util/MapUtil.java
index ac3b238c..59ca71c3 100644
--- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/util/MapUtil.java
+++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/util/MapUtil.java
@@ -7,7 +7,6 @@ import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
-import org.apache.commons.lang3.StringUtils;
import org.apache.http.Consts;
import com.alibaba.fastjson.JSON;
@@ -65,7 +64,7 @@ public class MapUtil {
try {
if (encoder && lowerCase) {
for (Map.Entry entry : set) {
- if (StringUtils.isBlank(entry.getValue())) {
+ if (StringUtil.isBlank(entry.getValue())) {
continue;
}
sb.append(entry.getKey().toLowerCase())
@@ -75,7 +74,7 @@ public class MapUtil {
}
} else if (encoder) {
for (Map.Entry entry : set) {
- if (StringUtils.isBlank(entry.getValue())) {
+ if (StringUtil.isBlank(entry.getValue())) {
continue;
}
sb.append(entry.getKey())
@@ -85,7 +84,7 @@ public class MapUtil {
}
} else if (lowerCase) {
for (Map.Entry entry : set) {
- if (StringUtils.isBlank(entry.getValue())) {
+ if (StringUtil.isBlank(entry.getValue())) {
continue;
}
sb.append(entry.getKey().toLowerCase()).append("=")
@@ -93,7 +92,7 @@ public class MapUtil {
}
} else {
for (Map.Entry entry : set) {
- if (StringUtils.isBlank(entry.getValue())) {
+ if (StringUtil.isBlank(entry.getValue())) {
continue;
}
sb.append(entry.getKey()).append("=")
diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/util/MessageUtil.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/util/MessageUtil.java
deleted file mode 100644
index 8399a993..00000000
--- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/util/MessageUtil.java
+++ /dev/null
@@ -1,158 +0,0 @@
-package com.foxinmy.weixin4j.util;
-
-import java.util.Arrays;
-
-import javax.crypto.Cipher;
-import javax.crypto.spec.IvParameterSpec;
-import javax.crypto.spec.SecretKeySpec;
-
-import org.apache.commons.codec.binary.Base64;
-import org.apache.commons.codec.digest.DigestUtils;
-
-import com.foxinmy.weixin4j.exception.WeixinException;
-import com.foxinmy.weixin4j.model.Consts;
-
-/**
- * 消息工具类
- *
- * @className MessageUtil
- * @author jy
- * @date 2014年10月31日
- * @since JDK 1.7
- * @see
- */
-public class MessageUtil {
-
- /**
- * 验证微信签名
- *
- * @param signature
- * 微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数
- * @return 开发者通过检验signature对请求进行相关校验。若确认此次GET请求来自微信服务器
- * 请原样返回echostr参数内容,则接入生效 成为开发者成功,否则接入失败
- * @see 接入指南
- */
- public static String signature(String... para) {
- Arrays.sort(para);
- StringBuilder sb = new StringBuilder();
- for (String str : para) {
- sb.append(str);
- }
- return DigestUtils.sha1Hex(sb.toString());
- }
-
- /**
- * 对xml消息加密
- *
- * @param appId 应用ID
- * @param encodingAesKey
- * 加密密钥
- * @param xmlContent
- * 原始消息体
- * @return aes加密后的消息体
- * @throws WeixinException
- */
- public static String aesEncrypt(String appId, String encodingAesKey,
- String xmlContent) throws WeixinException {
- byte[] randomBytes = RandomUtil.generateString(16).getBytes(
- org.apache.http.Consts.UTF_8);
- byte[] xmlBytes = xmlContent.getBytes(org.apache.http.Consts.UTF_8);
- int xmlLength = xmlBytes.length;
- byte[] orderBytes = new byte[4];
- orderBytes[3] = (byte) (xmlLength & 0xFF);
- orderBytes[2] = (byte) (xmlLength >> 8 & 0xFF);
- orderBytes[1] = (byte) (xmlLength >> 16 & 0xFF);
- orderBytes[0] = (byte) (xmlLength >> 24 & 0xFF);
- byte[] appidBytes = appId.getBytes(org.apache.http.Consts.UTF_8);
- int byteLength = randomBytes.length + xmlLength + orderBytes.length
- + appidBytes.length;
- // ... + pad: 使用自定义的填充方式对明文进行补位填充
- byte[] padBytes = PKCS7Encoder.encode(byteLength);
- // random + endian + xml + appid + pad 获得最终的字节流
- byte[] unencrypted = new byte[byteLength + padBytes.length];
- byteLength = 0;
- // src:源数组;srcPos:源数组要复制的起始位置;dest:目的数组;destPos:目的数组放置的起始位置;length:复制的长度
- System.arraycopy(randomBytes, 0, unencrypted, byteLength,
- randomBytes.length);
- byteLength += randomBytes.length;
- System.arraycopy(orderBytes, 0, unencrypted, byteLength,
- orderBytes.length);
- byteLength += orderBytes.length;
- System.arraycopy(xmlBytes, 0, unencrypted, byteLength, xmlBytes.length);
- byteLength += xmlBytes.length;
- System.arraycopy(appidBytes, 0, unencrypted, byteLength,
- appidBytes.length);
- byteLength += appidBytes.length;
- System.arraycopy(padBytes, 0, unencrypted, byteLength, padBytes.length);
- try {
- byte[] aesKey = Base64.decodeBase64(encodingAesKey + "=");
- // 设置加密模式为AES的CBC模式
- Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
- SecretKeySpec keySpec = new SecretKeySpec(aesKey, Consts.AES);
- IvParameterSpec iv = new IvParameterSpec(aesKey, 0, 16);
- cipher.init(Cipher.ENCRYPT_MODE, keySpec, iv);
- // 加密
- byte[] encrypted = cipher.doFinal(unencrypted);
- // 使用BASE64对加密后的字符串进行编码
- return Base64.encodeBase64String(encrypted);
- } catch (Exception e) {
- throw new WeixinException("-40006", "AES加密失败:" + e.getMessage());
- }
- }
-
- /**
- * 对AES消息解密
- *
- * @param appId
- * @param encodingAesKey
- * aes加密的密钥
- * @param encryptContent
- * 加密的消息体
- * @return 解密后的字符
- * @throws WeixinException
- */
- public static String aesDecrypt(String appId, String encodingAesKey,
- String encryptContent) throws WeixinException {
- byte[] aesKey = Base64.decodeBase64(encodingAesKey + "=");
- byte[] original;
- try {
- // 设置解密模式为AES的CBC模式
- Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
- SecretKeySpec key_spec = new SecretKeySpec(aesKey, Consts.AES);
- IvParameterSpec iv = new IvParameterSpec(Arrays.copyOfRange(aesKey,
- 0, 16));
- cipher.init(Cipher.DECRYPT_MODE, key_spec, iv);
- // 使用BASE64对密文进行解码
- byte[] encrypted = Base64.decodeBase64(encryptContent);
- // 解密
- original = cipher.doFinal(encrypted);
- } catch (Exception e) {
- throw new WeixinException("-40007", "AES解密失败:" + e.getMessage());
- }
- String xmlContent, fromAppId;
- try {
- // 去除补位字符
- byte[] bytes = PKCS7Encoder.decode(original);
- // 获取表示xml长度的字节数组
- byte[] lengthByte = Arrays.copyOfRange(bytes, 16, 20);
- // 获取xml消息主体的长度(byte[]2int)
- // http://my.oschina.net/u/169390/blog/97495
- int xmlLength = lengthByte[3] & 0xff | (lengthByte[2] & 0xff) << 8
- | (lengthByte[1] & 0xff) << 16
- | (lengthByte[0] & 0xff) << 24;
- xmlContent = new String(Arrays.copyOfRange(bytes, 20,
- 20 + xmlLength), org.apache.http.Consts.UTF_8);
- fromAppId = new String(Arrays.copyOfRange(bytes, 20 + xmlLength,
- bytes.length), org.apache.http.Consts.UTF_8);
- } catch (Exception e) {
- throw new WeixinException("-40008", "公众平台发送的xml不合法:"
- + e.getMessage());
- }
- // 校验appId是否一致
- if (!fromAppId.trim().equals(appId)) {
- throw new WeixinException("-40005", "校验AppID失败");
- }
- return xmlContent;
- }
-}
diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/util/ReflectionUtil.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/util/ReflectionUtil.java
index d4d49093..8d18bd71 100644
--- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/util/ReflectionUtil.java
+++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/util/ReflectionUtil.java
@@ -6,8 +6,6 @@ import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
-import org.apache.commons.lang3.StringUtils;
-
/**
* @title 反射工具类
* @description 提供对类,字段的反射调用
@@ -92,13 +90,13 @@ public class ReflectionUtil {
Method getterMethod = null;
String propertyNa = null;
if (propertyName.contains(".")) {
- propertyNa = StringUtils.substringBefore(propertyName, ".");
- getterMethodName = "get" + StringUtils.capitalize(propertyNa);
+ propertyNa = StringUtil.substringBefore(propertyName, ".");
+ getterMethodName = "get" + StringUtil.capitalize(propertyNa);
getterMethod = object.getClass().getMethod(getterMethodName);
return invokeGetterMethod(getterMethod.invoke(object),
- StringUtils.substringAfter(propertyName, "."));
+ StringUtil.substringAfter(propertyName, "."));
} else {
- getterMethodName = "get" + StringUtils.capitalize(propertyName);
+ getterMethodName = "get" + StringUtil.capitalize(propertyName);
getterMethod = object.getClass().getMethod(getterMethodName);
return getterMethod.invoke(object);
}
@@ -140,7 +138,7 @@ public class ReflectionUtil {
*/
public static void invokeSetterMethod(Object object, String propertyName,
Object propertyValue, Class> setterMethodClass) {
- String setterMethodName = "set" + StringUtils.capitalize(propertyName);
+ String setterMethodName = "set" + StringUtil.capitalize(propertyName);
try {
Method setterMethod = object.getClass().getMethod(setterMethodName,
setterMethodClass);
diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/util/StringUtil.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/util/StringUtil.java
new file mode 100644
index 00000000..1ed1c910
--- /dev/null
+++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/util/StringUtil.java
@@ -0,0 +1,193 @@
+package com.foxinmy.weixin4j.util;
+
+import java.nio.charset.Charset;
+import java.util.Iterator;
+import java.util.Objects;
+
+import com.foxinmy.weixin4j.model.Consts;
+
+public final class StringUtil {
+
+ public static final String EMPTY = "";
+ public static final int INDEX_NOT_FOUND = -1;
+
+ private static byte[] getBytes(final String content, final Charset charset) {
+ if (content == null) {
+ return null;
+ }
+ return content.getBytes(charset);
+ }
+
+ private static String newString(final byte[] bytes, final Charset charset) {
+ return bytes == null ? null : new String(bytes, charset);
+ }
+
+ public static byte[] getBytesUtf8(final String content) {
+ return getBytes(content, Consts.UTF_8);
+ }
+
+ public static String newStringUtf8(final byte[] bytes) {
+ return newString(bytes, Consts.UTF_8);
+ }
+
+ public static boolean isEmpty(final CharSequence cs) {
+ return cs == null || cs.length() == 0;
+ }
+
+ public static boolean isBlank(final CharSequence cs) {
+ int strLen;
+ if (cs == null || (strLen = cs.length()) == 0) {
+ return true;
+ }
+ for (int i = 0; i < strLen; i++) {
+ if (Character.isWhitespace(cs.charAt(i)) == false) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ public static boolean isNotBlank(final CharSequence cs) {
+ return !isBlank(cs);
+ }
+
+ public static String capitalize(final String str) {
+ int strLen;
+ if (str == null || (strLen = str.length()) == 0) {
+ return str;
+ }
+
+ char firstChar = str.charAt(0);
+ if (Character.isTitleCase(firstChar)) {
+ // already capitalized
+ return str;
+ }
+ return new StringBuilder(strLen)
+ .append(Character.toTitleCase(firstChar))
+ .append(str.substring(1)).toString();
+ }
+
+ public static String substringBefore(final String str,
+ final String separator) {
+ if (isEmpty(str) || separator == null) {
+ return str;
+ }
+ if (separator.isEmpty()) {
+ return EMPTY;
+ }
+ final int pos = str.indexOf(separator);
+ if (pos == INDEX_NOT_FOUND) {
+ return str;
+ }
+ return str.substring(0, pos);
+ }
+
+ public static String substringAfter(final String str, final String separator) {
+ if (isEmpty(str)) {
+ return str;
+ }
+ if (separator == null) {
+ return EMPTY;
+ }
+ final int pos = str.indexOf(separator);
+ if (pos == INDEX_NOT_FOUND) {
+ return EMPTY;
+ }
+ return str.substring(pos + separator.length());
+ }
+
+ public static String join(final Object[] array, final char separator) {
+ if (array == null) {
+ return null;
+ }
+ return join(array, separator, 0, array.length);
+ }
+
+ public static String join(final Object[] array, final char separator,
+ final int startIndex, final int endIndex) {
+ if (array == null) {
+ return null;
+ }
+ final int noOfItems = endIndex - startIndex;
+ if (noOfItems <= 0) {
+ return EMPTY;
+ }
+ final StringBuilder buf = new StringBuilder(noOfItems * 16);
+ for (int i = startIndex; i < endIndex; i++) {
+ if (i > startIndex) {
+ buf.append(separator);
+ }
+ if (array[i] != null) {
+ buf.append(array[i]);
+ }
+ }
+ return buf.toString();
+ }
+
+ public static String join(final Iterable> iterable, final char separator) {
+ if (iterable == null) {
+ return null;
+ }
+ return join(iterable.iterator(), separator);
+ }
+
+ public static String join(final Iterator> iterator, final char separator) {
+
+ // handle null, zero and one elements before building a buffer
+ if (iterator == null) {
+ return null;
+ }
+ if (!iterator.hasNext()) {
+ return EMPTY;
+ }
+ final Object first = iterator.next();
+ if (!iterator.hasNext()) {
+ String result = Objects.toString(first);
+ return result;
+ }
+
+ // two or more elements
+ final StringBuilder buf = new StringBuilder(256); // Java default is 16,
+ // probably too
+ // small
+ if (first != null) {
+ buf.append(first);
+ }
+
+ while (iterator.hasNext()) {
+ buf.append(separator);
+ final Object obj = iterator.next();
+ if (obj != null) {
+ buf.append(obj);
+ }
+ }
+
+ return buf.toString();
+ }
+
+ public static String join(final int[] array, final char separator) {
+ if (array == null) {
+ return null;
+ }
+ return join(array, separator, 0, array.length);
+ }
+
+ public static String join(final int[] array, final char separator,
+ final int startIndex, final int endIndex) {
+ if (array == null) {
+ return null;
+ }
+ final int noOfItems = endIndex - startIndex;
+ if (noOfItems <= 0) {
+ return EMPTY;
+ }
+ final StringBuilder buf = new StringBuilder(noOfItems * 16);
+ for (int i = startIndex; i < endIndex; i++) {
+ if (i > startIndex) {
+ buf.append(separator);
+ }
+ buf.append(array[i]);
+ }
+ return buf.toString();
+ }
+}
diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/xml/Map2ObjectConverter.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/xml/Map2ObjectConverter.java
index 7128ccdb..6462f9db 100644
--- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/xml/Map2ObjectConverter.java
+++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/xml/Map2ObjectConverter.java
@@ -4,8 +4,7 @@ import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
-import org.apache.commons.lang3.StringUtils;
-
+import com.foxinmy.weixin4j.util.StringUtil;
import com.thoughtworks.xstream.converters.MarshallingContext;
import com.thoughtworks.xstream.converters.UnmarshallingContext;
import com.thoughtworks.xstream.converters.collections.MapConverter;
@@ -50,7 +49,7 @@ public class Map2ObjectConverter extends MapConverter {
continue;
}
String value = entry.getValue().toString();
- if (StringUtils.isBlank(value)) {
+ if (StringUtil.isBlank(value)) {
continue;
}
ExtendedHierarchicalStreamWriterHelper.startNode(writer, entry
diff --git a/weixin4j-mp/pom.xml b/weixin4j-mp/pom.xml
index 838670c6..ea851cb6 100644
--- a/weixin4j-mp/pom.xml
+++ b/weixin4j-mp/pom.xml
@@ -16,7 +16,7 @@
org.apache.maven.plugins
maven-assembly-plugin
- weixin4j-mp-${project.version}
+ ${project.name}-${project.version}
@@ -42,11 +42,6 @@
-
- org.jsoup
- jsoup
- ${jsoup.version}
-
org.slf4j
slf4j-api
diff --git a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/api/CouponApi.java b/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/api/CouponApi.java
index 7d43442c..3441aff7 100644
--- a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/api/CouponApi.java
+++ b/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/api/CouponApi.java
@@ -7,8 +7,6 @@ import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
-import org.apache.commons.lang3.StringUtils;
-
import com.alibaba.fastjson.TypeReference;
import com.foxinmy.weixin4j.exception.WeixinException;
import com.foxinmy.weixin4j.http.Response;
@@ -19,6 +17,7 @@ import com.foxinmy.weixin4j.mp.payment.coupon.CouponDetail;
import com.foxinmy.weixin4j.mp.payment.coupon.CouponResult;
import com.foxinmy.weixin4j.mp.payment.coupon.CouponStock;
import com.foxinmy.weixin4j.util.RandomUtil;
+import com.foxinmy.weixin4j.util.StringUtil;
/**
* 代金券API
@@ -66,7 +65,7 @@ public class CouponApi extends MpApi {
// openid记录数(目前支持num=1)
map.put("openid_count", "1");
// 操作员帐号, 默认为商户号 可在商户平台配置操作员对应的api权限
- if (StringUtils.isBlank(opUserId)) {
+ if (StringUtil.isBlank(opUserId)) {
opUserId = weixinAccount.getMchId();
}
map.put("op_user_id", opUserId);
@@ -158,10 +157,10 @@ public class CouponApi extends MpApi {
map.put("appid", weixinAccount.getId());
map.put("mch_id", weixinAccount.getMchId());
map.put("nonce_str", RandomUtil.generateString(16));
- if (StringUtils.isNotBlank(weixinAccount.getDeviceInfo())) {
+ if (StringUtil.isNotBlank(weixinAccount.getDeviceInfo())) {
map.put("device_info", weixinAccount.getDeviceInfo());
}
- if (StringUtils.isNotBlank(weixinAccount.getSubMchId())) {
+ if (StringUtil.isNotBlank(weixinAccount.getSubMchId())) {
map.put("sub_mch_id", weixinAccount.getSubMchId());
}
return map;
diff --git a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/api/CustomApi.java b/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/api/CustomApi.java
index 719ec4df..33c5a42b 100644
--- a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/api/CustomApi.java
+++ b/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/api/CustomApi.java
@@ -6,7 +6,6 @@ import java.io.IOException;
import java.util.Date;
import java.util.List;
-import org.apache.commons.codec.digest.DigestUtils;
import org.apache.http.entity.mime.content.ByteArrayBody;
import com.alibaba.fastjson.JSON;
@@ -21,6 +20,7 @@ import com.foxinmy.weixin4j.mp.model.CustomRecord;
import com.foxinmy.weixin4j.mp.model.KfAccount;
import com.foxinmy.weixin4j.mp.model.KfSession;
import com.foxinmy.weixin4j.token.TokenHolder;
+import com.foxinmy.weixin4j.util.DigestUtil;
import com.foxinmy.weixin4j.util.IOUtil;
/**
@@ -136,7 +136,7 @@ public class CustomApi extends MpApi {
JSONObject obj = new JSONObject();
obj.put("kf_account", id);
obj.put("nickname", name);
- obj.put("password", DigestUtils.md5Hex(pwd));
+ obj.put("password", DigestUtil.MD5(pwd));
String custom_add_uri = getRequestUri("custom_add_uri");
Token token = tokenHolder.getToken();
Response response = request.post(
@@ -167,7 +167,7 @@ public class CustomApi extends MpApi {
JSONObject obj = new JSONObject();
obj.put("kf_account", id);
obj.put("nickname", name);
- obj.put("password", DigestUtils.md5Hex(pwd));
+ obj.put("password", DigestUtil.MD5(pwd));
String custom_update_uri = getRequestUri("custom_update_uri");
Token token = tokenHolder.getToken();
Response response = request.post(
diff --git a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/api/MassApi.java b/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/api/MassApi.java
index cee62ab0..d660bf0b 100644
--- a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/api/MassApi.java
+++ b/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/api/MassApi.java
@@ -3,8 +3,6 @@ package com.foxinmy.weixin4j.mp.api;
import java.io.File;
import java.util.List;
-import org.apache.commons.lang3.StringUtils;
-
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.foxinmy.weixin4j.exception.WeixinException;
@@ -17,6 +15,7 @@ import com.foxinmy.weixin4j.tuple.MpArticle;
import com.foxinmy.weixin4j.tuple.MpNews;
import com.foxinmy.weixin4j.tuple.Tuple;
import com.foxinmy.weixin4j.tuple.Video;
+import com.foxinmy.weixin4j.util.StringUtil;
/**
* 群发相关API
@@ -132,7 +131,7 @@ public class MassApi extends MpApi {
if (tuple instanceof MpNews) {
MpNews _news = (MpNews) tuple;
List _articles = _news.getArticles();
- if (StringUtils.isBlank(_news.getMediaId())
+ if (StringUtil.isBlank(_news.getMediaId())
&& (_articles == null || _articles.isEmpty())) {
throw new WeixinException(
"mass fail:mediaId or articles is required");
@@ -203,7 +202,7 @@ public class MassApi extends MpApi {
if (tuple instanceof MpNews) {
MpNews _news = (MpNews) tuple;
List _articles = _news.getArticles();
- if (StringUtils.isBlank(_news.getMediaId())
+ if (StringUtil.isBlank(_news.getMediaId())
&& (_articles == null || _articles.isEmpty())) {
throw new WeixinException(
"mass fail:mediaId or articles is required");
diff --git a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/api/MediaApi.java b/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/api/MediaApi.java
index 21e0819e..7d21623e 100644
--- a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/api/MediaApi.java
+++ b/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/api/MediaApi.java
@@ -9,7 +9,6 @@ import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;
-import org.apache.commons.lang3.StringUtils;
import org.apache.http.entity.mime.content.ByteArrayBody;
import org.apache.http.entity.mime.content.StringBody;
@@ -32,6 +31,7 @@ import com.foxinmy.weixin4j.type.MediaType;
import com.foxinmy.weixin4j.util.ConfigUtil;
import com.foxinmy.weixin4j.util.FileUtil;
import com.foxinmy.weixin4j.util.IOUtil;
+import com.foxinmy.weixin4j.util.StringUtil;
/**
* 素材相关API
@@ -65,7 +65,7 @@ public class MediaApi extends MpApi {
public String uploadMedia(File file, boolean isMaterial)
throws WeixinException, IOException {
String mediaTypeKey = IOUtil.getExtension(file.getName());
- if (StringUtils.isBlank(mediaTypeKey)) {
+ if (StringUtil.isBlank(mediaTypeKey)) {
mediaTypeKey = FileUtil.getFileType(file);
}
MediaType mediaType = MediaType.getMediaType(mediaTypeKey);
diff --git a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/api/NotifyApi.java b/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/api/NotifyApi.java
index 4e0d3811..1f8c697b 100644
--- a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/api/NotifyApi.java
+++ b/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/api/NotifyApi.java
@@ -1,7 +1,5 @@
package com.foxinmy.weixin4j.mp.api;
-import org.apache.commons.lang3.StringUtils;
-
import com.alibaba.fastjson.JSONObject;
import com.foxinmy.weixin4j.exception.WeixinException;
import com.foxinmy.weixin4j.http.JsonResult;
@@ -10,6 +8,7 @@ import com.foxinmy.weixin4j.model.Token;
import com.foxinmy.weixin4j.mp.message.NotifyMessage;
import com.foxinmy.weixin4j.token.TokenHolder;
import com.foxinmy.weixin4j.tuple.NotifyTuple;
+import com.foxinmy.weixin4j.util.StringUtil;
/**
* 客服消息API
@@ -70,7 +69,7 @@ public class NotifyApi extends MpApi {
obj.put("touser", notify.getTouser());
obj.put("msgtype", msgtype);
obj.put(msgtype, tuple);
- if (StringUtils.isNotBlank(kfAccount)) {
+ if (StringUtil.isNotBlank(kfAccount)) {
JSONObject kf = new JSONObject();
kf.put("kf_account", kfAccount);
obj.put("customservice", kf);
diff --git a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/api/Pay2Api.java b/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/api/Pay2Api.java
index 77969812..9e3bbfeb 100644
--- a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/api/Pay2Api.java
+++ b/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/api/Pay2Api.java
@@ -24,8 +24,6 @@ import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManagerFactory;
-import org.apache.commons.codec.digest.DigestUtils;
-import org.apache.commons.lang3.StringUtils;
import org.apache.http.Consts;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
@@ -52,7 +50,9 @@ import com.foxinmy.weixin4j.mp.util.ExcelUtil;
import com.foxinmy.weixin4j.token.TokenHolder;
import com.foxinmy.weixin4j.util.ConfigUtil;
import com.foxinmy.weixin4j.util.DateUtil;
+import com.foxinmy.weixin4j.util.DigestUtil;
import com.foxinmy.weixin4j.util.MapUtil;
+import com.foxinmy.weixin4j.util.StringUtil;
/**
* V2支付API
@@ -91,7 +91,7 @@ public class Pay2Api extends PayApi {
sb.append("&partner=").append(weixinAccount.getPartnerId());
String part = sb.toString();
sb.append("&key=").append(weixinAccount.getPartnerKey());
- String sign = DigestUtils.md5Hex(sb.toString()).toUpperCase();
+ String sign = DigestUtil.MD5(sb.toString()).toUpperCase();
sb.delete(0, sb.length());
sb.append(part).append("&sign=").append(sign);
@@ -172,7 +172,7 @@ public class Pay2Api extends PayApi {
map.put("total_fee", DateUtil.formaFee2Fen(totalFee));
map.put("refund_fee", DateUtil.formaFee2Fen(refundFee));
map.put(idQuery.getType().getName(), idQuery.getId());
- if (StringUtils.isBlank(opUserId)) {
+ if (StringUtil.isBlank(opUserId)) {
opUserId = weixinAccount.getPartnerId();
}
map.put("op_user_id", opUserId);
@@ -261,7 +261,7 @@ public class Pay2Api extends PayApi {
String outRefundNo, double totalFee, double refundFee,
String opUserId, String opUserPasswd) throws WeixinException {
Map mopara = new HashMap();
- mopara.put("op_user_passwd", DigestUtils.md5Hex(opUserPasswd));
+ mopara.put("op_user_passwd", DigestUtil.MD5(opUserPasswd));
return refund(caFile, idQuery, outRefundNo, totalFee, refundFee,
opUserId, mopara);
}
@@ -301,11 +301,11 @@ public class Pay2Api extends PayApi {
String opUserId, String opUserPasswd, String recvUserId,
String reccvUserName, RefundType refundType) throws WeixinException {
Map mopara = new HashMap();
- mopara.put("op_user_passwd", DigestUtils.md5Hex(opUserPasswd));
- if (StringUtils.isNotBlank(recvUserId)) {
+ mopara.put("op_user_passwd", DigestUtil.MD5(opUserPasswd));
+ if (StringUtil.isNotBlank(recvUserId)) {
mopara.put("recv_user_id", recvUserId);
}
- if (StringUtils.isNotBlank(reccvUserName)) {
+ if (StringUtil.isNotBlank(reccvUserName)) {
mopara.put("reccv_user_name", reccvUserName);
}
if (refundType != null) {
@@ -389,7 +389,7 @@ public class Pay2Api extends PayApi {
map.put("cft_signtype", "0");
map.put("mchtype", Integer.toString(billType.getVal()));
map.put("key", weixinAccount.getPartnerKey());
- String sign = DigestUtils.md5Hex(MapUtil
+ String sign = DigestUtil.MD5(MapUtil
.toJoinString(map, false, false));
map.put("sign", sign.toLowerCase());
Response response = request.get(downloadbill_uri, map);
diff --git a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/api/Pay3Api.java b/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/api/Pay3Api.java
index 6c852f45..e3527218 100644
--- a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/api/Pay3Api.java
+++ b/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/api/Pay3Api.java
@@ -18,7 +18,6 @@ import java.util.LinkedList;
import java.util.List;
import java.util.Map;
-import org.apache.commons.lang3.StringUtils;
import org.apache.http.Consts;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
@@ -45,6 +44,7 @@ import com.foxinmy.weixin4j.token.TokenHolder;
import com.foxinmy.weixin4j.util.ConfigUtil;
import com.foxinmy.weixin4j.util.DateUtil;
import com.foxinmy.weixin4j.util.RandomUtil;
+import com.foxinmy.weixin4j.util.StringUtil;
/**
* V3(商户平台版)支付API
@@ -134,7 +134,7 @@ public class Pay3Api extends PayApi {
map.put("out_refund_no", outRefundNo);
map.put("total_fee", DateUtil.formaFee2Fen(totalFee));
map.put("refund_fee", DateUtil.formaFee2Fen(refundFee));
- if (StringUtils.isBlank(opUserId)) {
+ if (StringUtil.isBlank(opUserId)) {
opUserId = weixinAccount.getMchId();
}
map.put("op_user_id", opUserId);
@@ -459,7 +459,7 @@ public class Pay3Api extends PayApi {
map.put("appid", weixinAccount.getId());
map.put("mch_id", weixinAccount.getMchId());
map.put("nonce_str", RandomUtil.generateString(16));
- if (StringUtils.isNotBlank(weixinAccount.getDeviceInfo())) {
+ if (StringUtil.isNotBlank(weixinAccount.getDeviceInfo())) {
map.put("device_info", weixinAccount.getDeviceInfo());
}
if (idQuery != null) {
diff --git a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/event/KfCloseEventMessage.java b/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/event/KfCloseEventMessage.java
deleted file mode 100644
index 3566db4d..00000000
--- a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/event/KfCloseEventMessage.java
+++ /dev/null
@@ -1,40 +0,0 @@
-package com.foxinmy.weixin4j.mp.event;
-
-import com.foxinmy.weixin4j.message.event.EventMessage;
-import com.foxinmy.weixin4j.mp.type.EventType;
-import com.thoughtworks.xstream.annotations.XStreamAlias;
-
-/**
- * 客服关闭会话事件
- *
- * @className KfCloseEventMessage
- * @author jy
- * @date 2015年3月22日
- * @since JDK 1.7
- * @see 会话状态通知事件
- */
-public class KfCloseEventMessage extends EventMessage {
-
- private static final long serialVersionUID = 3644449346935205541L;
-
- public KfCloseEventMessage() {
- super(EventType.kf_close_session.name());
- }
-
- /**
- * 客服账号
- */
- @XStreamAlias("KfAccount")
- private String kfAccount;
-
- public String getKfAccount() {
- return kfAccount;
- }
-
- @Override
- public String toString() {
- return "KfCloseEventMessage [kfAccount=" + kfAccount + ", ="
- + super.toString() + "]";
- }
-}
diff --git a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/event/KfCreateEventMessage.java b/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/event/KfCreateEventMessage.java
deleted file mode 100644
index aca1de86..00000000
--- a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/event/KfCreateEventMessage.java
+++ /dev/null
@@ -1,40 +0,0 @@
-package com.foxinmy.weixin4j.mp.event;
-
-import com.foxinmy.weixin4j.message.event.EventMessage;
-import com.foxinmy.weixin4j.mp.type.EventType;
-import com.thoughtworks.xstream.annotations.XStreamAlias;
-
-/**
- * 客服接入会话事件
- *
- * @className KfCreateEventMessage
- * @author jy
- * @date 2015年3月22日
- * @since JDK 1.7
- * @see 会话状态通知事件
- */
-public class KfCreateEventMessage extends EventMessage {
-
- private static final long serialVersionUID = -8968189700999202108L;
-
- public KfCreateEventMessage() {
- super(EventType.kf_create_session.name());
- }
-
- /**
- * 客服账号
- */
- @XStreamAlias("KfAccount")
- private String kfAccount;
-
- public String getKfAccount() {
- return kfAccount;
- }
-
- @Override
- public String toString() {
- return "KfCreateEventMessage [kfAccount=" + kfAccount + ", ="
- + super.toString() + "]";
- }
-}
diff --git a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/event/KfSwitchEventMessage.java b/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/event/KfSwitchEventMessage.java
deleted file mode 100644
index d004275d..00000000
--- a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/event/KfSwitchEventMessage.java
+++ /dev/null
@@ -1,48 +0,0 @@
-package com.foxinmy.weixin4j.mp.event;
-
-import com.foxinmy.weixin4j.message.event.EventMessage;
-import com.foxinmy.weixin4j.mp.type.EventType;
-import com.thoughtworks.xstream.annotations.XStreamAlias;
-
-/**
- * 客服转接会话事件
- *
- * @className KfSwitchEventMessage
- * @author jy
- * @date 2015年3月22日
- * @since JDK 1.7
- * @see 会话状态通知事件
- */
-public class KfSwitchEventMessage extends EventMessage {
-
- private static final long serialVersionUID = 4319501074109623413L;
-
- public KfSwitchEventMessage() {
- super(EventType.kf_switch_session.name());
- }
- /**
- * 来自的客服账号
- */
- @XStreamAlias("FromKfAccount")
- private String fromKfAccount;
- /**
- * 转移给客服账号
- */
- @XStreamAlias("ToKfAccount")
- private String toKfAccount;
-
- public String getFromKfAccount() {
- return fromKfAccount;
- }
-
- public String getToKfAccount() {
- return toKfAccount;
- }
-
- @Override
- public String toString() {
- return "KfSwitchEventMessage [fromKfAccount=" + fromKfAccount
- + ", toKfAccount=" + toKfAccount + "]";
- }
-}
diff --git a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/event/MassEventMessage.java b/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/event/MassEventMessage.java
deleted file mode 100644
index 8f915add..00000000
--- a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/event/MassEventMessage.java
+++ /dev/null
@@ -1,129 +0,0 @@
-package com.foxinmy.weixin4j.mp.event;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import com.foxinmy.weixin4j.message.event.EventMessage;
-import com.foxinmy.weixin4j.mp.type.EventType;
-import com.thoughtworks.xstream.annotations.XStreamAlias;
-import com.thoughtworks.xstream.annotations.XStreamOmitField;
-
-/**
- * 群发消息事件推送
- *
- * @className MassEventMessage
- * @author jy
- * @date 2014年4月27日
- * @since JDK 1.7
- * @see 群发回调
- */
-public class MassEventMessage extends EventMessage {
-
- private static final long serialVersionUID = -1660543255873723895L;
-
- public MassEventMessage() {
- super(EventType.masssendjobfinish.name());
- }
-
- /**
- * 群发后的状态信息 为“send success”或“send fail”或“err(num)
- */
- @XStreamAlias("Status")
- private String status;
- /**
- * group_id下粉丝数;或者openid_list中的粉丝数
- */
- @XStreamAlias("TotalCount")
- private int totalCount;
- /**
- * 过滤(过滤是指特定地区、性别的过滤、用户设置拒收的过滤,用户接收已超4条的过滤)后,准备发送的粉丝数,原则上,FilterCount =
- * SentCount + ErrorCount
- */
- @XStreamAlias("FilterCount")
- private int filterCount;
- /**
- * 发送成功的粉丝数
- */
- @XStreamAlias("SentCount")
- private int sentCount;
- /**
- * 发送失败的粉丝数
- */
- @XStreamAlias("ErrorCount")
- private int errorCount;
-
- @XStreamOmitField
- private final static Map statusMap;
- static {
- statusMap = new HashMap();
- statusMap.put("sendsuccess", "发送成功");
- statusMap.put("send_success", "发送成功");
- statusMap.put("success", "发送成功");
- statusMap.put("send success", "发送成功");
- statusMap.put("sendfail", "发送失败");
- statusMap.put("send_fail", "发送失败");
- statusMap.put("fail", "发送失败");
- statusMap.put("send fail", "发送失败");
- statusMap.put("err(10001)", "涉嫌广告");
- statusMap.put("err(20001)", "涉嫌政治");
- statusMap.put("err(20004)", "涉嫌社会");
- statusMap.put("err(20006)", "涉嫌违法犯罪");
- statusMap.put("err(20008)", "涉嫌欺诈");
- statusMap.put("err(20013)", "涉嫌版权");
- statusMap.put("err(22000)", "涉嫌互推(互相宣传)");
- statusMap.put("err(21000)", "涉嫌其他");
- }
-
- public String getStatus() {
- return status;
- }
-
- /**
- * 发送状态描述 err(10001,涉嫌广告) err(20001,涉嫌政治) err(20004,涉嫌社会)
- * err(20002,涉嫌色情) err(20006,涉嫌违法犯罪) err(20008,涉嫌欺诈) err(20013,涉嫌版权)
- * err(22000,涉嫌互推(互相宣传) err(21000,涉嫌其他)
- *
- * @param status
- * @return 中文描述
- */
- public String getStatusDesc() {
- return statusMap.get(status.toLowerCase());
- }
-
- /**
- * 发送状态描述 err(10001,涉嫌广告) err(20001,涉嫌政治) err(20004,涉嫌社会)
- * err(20002,涉嫌色情) err(20006,涉嫌违法犯罪) err(20008,涉嫌欺诈) err(20013,涉嫌版权)
- * err(22000,涉嫌互推(互相宣传) err(21000,涉嫌其他)
- *
- * @param status
- * @return 中文描述
- */
- public static String getStatusDesc(String status) {
- return statusMap.get(status.toLowerCase());
- }
-
- public int getTotalCount() {
- return totalCount;
- }
-
- public int getFilterCount() {
- return filterCount;
- }
-
- public int getSentCount() {
- return sentCount;
- }
-
- public int getErrorCount() {
- return errorCount;
- }
-
- @Override
- public String toString() {
- return "MassEventMessage [status=" + getStatusDesc() + ", totalCount="
- + totalCount + ", filterCount=" + filterCount + ", sentCount="
- + sentCount + ", errorCount=" + errorCount + ", "
- + super.toString() + "]";
- }
-}
diff --git a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/event/ScanEventMessage.java b/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/event/ScanEventMessage.java
deleted file mode 100644
index 497a55bd..00000000
--- a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/event/ScanEventMessage.java
+++ /dev/null
@@ -1,57 +0,0 @@
-package com.foxinmy.weixin4j.mp.event;
-
-import com.foxinmy.weixin4j.message.event.EventMessage;
-import com.foxinmy.weixin4j.mp.type.EventType;
-import com.thoughtworks.xstream.annotations.XStreamAlias;
-
-/**
- * 扫描二维码事件
- *
- * @className ScanEventMessage
- * @author jy.hu
- * @date 2014年4月6日
- * @since JDK 1.7
- * @see 扫描二维码事件
- */
-public class ScanEventMessage extends EventMessage {
-
- private static final long serialVersionUID = 8078674062833071562L;
-
- public ScanEventMessage() {
- super(EventType.scan.name());
- }
-
- public ScanEventMessage(String eventType) {
- super(eventType);
- }
-
- /**
- * 事件KEY值,是一个32位无符号整数,即创建二维码时的二维码scene_id
- */
- @XStreamAlias("EventKey")
- private String eventKey;
- /**
- * 二维码的ticket,可用来换取二维码图片
- */
- @XStreamAlias("Ticket")
- private String ticket;
-
- public String getEventKey() {
- return eventKey;
- }
-
- public String getTicket() {
- return ticket;
- }
-
- public String getParameter() {
- return eventKey.replace("qrscene_", "");
- }
-
- @Override
- public String toString() {
- return "ScanEventMessage [eventKey=" + eventKey + ", ticket=" + ticket
- + ", " + super.toString() + "]";
- }
-}
diff --git a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/event/ScribeEventMessage.java b/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/event/ScribeEventMessage.java
deleted file mode 100644
index 0974dd8e..00000000
--- a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/event/ScribeEventMessage.java
+++ /dev/null
@@ -1,27 +0,0 @@
-package com.foxinmy.weixin4j.mp.event;
-
-import com.foxinmy.weixin4j.type.EventType;
-
-/**
- * 关注/取消关注事件 包括直接关注与扫描关注
- *
- * @className ScribeEventMessage
- * @author jy.hu
- * @date 2014年4月6日
- * @since JDK 1.7
- * @see 订阅号、服务号的关注/取消关注事件
- */
-public class ScribeEventMessage extends ScanEventMessage {
-
- private static final long serialVersionUID = -6846321620262204915L;
-
- public ScribeEventMessage() {
- super(EventType.subscribe.name());
- }
-
- @Override
- public String toString() {
- return "ScribeEventMessage [" + super.toString() + "]";
- }
-}
diff --git a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/event/TemplatesendjobfinishMessage.java b/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/event/TemplatesendjobfinishMessage.java
deleted file mode 100644
index 7d5b98a8..00000000
--- a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/event/TemplatesendjobfinishMessage.java
+++ /dev/null
@@ -1,40 +0,0 @@
-package com.foxinmy.weixin4j.mp.event;
-
-import com.foxinmy.weixin4j.message.event.EventMessage;
-import com.foxinmy.weixin4j.mp.type.EventType;
-import com.thoughtworks.xstream.annotations.XStreamAlias;
-
-/**
- * 模板消息事件推送(公众平台)
- *
- * @className TemplatesendjobfinishMessage
- * @author jy
- * @date 2014年9月19日
- * @since JDK 1.7
- * @see 模板消息事件推送
- */
-public class TemplatesendjobfinishMessage extends EventMessage {
-
- private static final long serialVersionUID = -2903359365988594012L;
-
- public TemplatesendjobfinishMessage() {
- super(EventType.templatesendjobfinish.name());
- }
-
- /**
- * 推送状态 如failed: system failed
- */
- @XStreamAlias("Status")
- private String status;
-
- public String getStatus() {
- return status;
- }
-
- @Override
- public String toString() {
- return "TemplatesendjobfinishMessage [status=" + status + ", "
- + super.toString() + "]";
- }
-}
diff --git a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/model/User.java b/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/model/User.java
index db650d0f..78aafad6 100644
--- a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/model/User.java
+++ b/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/model/User.java
@@ -3,12 +3,11 @@ package com.foxinmy.weixin4j.mp.model;
import java.io.Serializable;
import java.util.Date;
-import org.apache.commons.lang3.StringUtils;
-
import com.alibaba.fastjson.annotation.JSONField;
import com.foxinmy.weixin4j.model.Gender;
import com.foxinmy.weixin4j.mp.type.FaceSize;
import com.foxinmy.weixin4j.mp.type.Lang;
+import com.foxinmy.weixin4j.util.StringUtil;
/**
* 用户对象
@@ -135,7 +134,7 @@ public class User implements Serializable {
}
public String getHeadimgurl(FaceSize size) {
- if (StringUtils.isNotBlank(headimgurl)) {
+ if (StringUtil.isNotBlank(headimgurl)) {
StringBuilder sb = new StringBuilder(headimgurl);
return sb.replace(0, (headimgurl.length() - 1), size.getInt() + "")
.toString();
diff --git a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/model/WeixinMpAccount.java b/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/model/WeixinMpAccount.java
index 4822d510..f02ca416 100644
--- a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/model/WeixinMpAccount.java
+++ b/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/model/WeixinMpAccount.java
@@ -1,8 +1,7 @@
package com.foxinmy.weixin4j.mp.model;
-import org.apache.commons.lang3.StringUtils;
-
import com.foxinmy.weixin4j.model.WeixinAccount;
+import com.foxinmy.weixin4j.util.StringUtil;
/**
* 微信公众平台信息
@@ -101,7 +100,7 @@ public class WeixinMpAccount extends WeixinAccount {
public int getVersion() {
if (version == 0) {
- return StringUtils.isNotBlank(mchId) ? 3 : 2;
+ return StringUtil.isNotBlank(mchId) ? 3 : 2;
}
return version;
}
diff --git a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/payment/PayUtil.java b/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/payment/PayUtil.java
index 794e86dc..22545c9b 100644
--- a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/payment/PayUtil.java
+++ b/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/payment/PayUtil.java
@@ -3,9 +3,6 @@ package com.foxinmy.weixin4j.mp.payment;
import java.util.HashMap;
import java.util.Map;
-import org.apache.commons.codec.digest.DigestUtils;
-import org.apache.commons.lang3.StringUtils;
-
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.foxinmy.weixin4j.exception.PayException;
@@ -24,8 +21,10 @@ import com.foxinmy.weixin4j.mp.type.SignType;
import com.foxinmy.weixin4j.mp.type.TradeType;
import com.foxinmy.weixin4j.util.ConfigUtil;
import com.foxinmy.weixin4j.util.DateUtil;
+import com.foxinmy.weixin4j.util.DigestUtil;
import com.foxinmy.weixin4j.util.MapUtil;
import com.foxinmy.weixin4j.util.RandomUtil;
+import com.foxinmy.weixin4j.util.StringUtil;
import com.foxinmy.weixin4j.xml.XmlStream;
/**
@@ -73,7 +72,7 @@ public class PayUtil {
*/
public static String createPayJsRequestJsonV2(PayPackageV2 payPackage,
WeixinMpAccount weixinAccount) {
- if (StringUtils.isBlank(payPackage.getPartner())) {
+ if (StringUtil.isBlank(payPackage.getPartner())) {
payPackage.setPartner(weixinAccount.getPartnerId());
}
JsPayRequestV2 jsPayRequest = new JsPayRequestV2(weixinAccount,
@@ -115,8 +114,7 @@ public class PayUtil {
* @return
*/
public static String paysignSha(Object obj) {
- return DigestUtils
- .sha1Hex(MapUtil.toJoinString(obj, false, true, null));
+ return DigestUtil.SHA1(MapUtil.toJoinString(obj, false, true, null));
}
/**
@@ -132,8 +130,7 @@ public class PayUtil {
public static String paysignSha(Object obj, String paySignKey) {
Map extra = new HashMap();
extra.put("appKey", paySignKey);
- return DigestUtils.sha1Hex(MapUtil
- .toJoinString(obj, false, true, extra));
+ return DigestUtil.SHA1(MapUtil.toJoinString(obj, false, true, extra));
}
/**
@@ -154,7 +151,7 @@ public class PayUtil {
// stringSignTemp 进行 md5 运算
// 再将得到的 字符串所有字符转换为大写 ,得到 sign 值 signValue。
sb.append("&key=").append(paySignKey);
- return DigestUtils.md5Hex(sb.toString()).toUpperCase();
+ return DigestUtil.SHA1(sb.toString()).toUpperCase();
}
/**
@@ -224,7 +221,7 @@ public class PayUtil {
*/
public static PrePay createPrePay(PayPackageV3 payPackage, String paySignKey)
throws PayException {
- if (StringUtils.isBlank(payPackage.getSign())) {
+ if (StringUtil.isBlank(payPackage.getSign())) {
payPackage.setSign(paysignMd5(payPackage, paySignKey));
}
String payJsRequestXml = XmlStream.to(payPackage).replaceAll("__", "_");
diff --git a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/payment/coupon/CouponDetail.java b/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/payment/coupon/CouponDetail.java
index d2f53b8e..dcf61352 100644
--- a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/payment/coupon/CouponDetail.java
+++ b/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/payment/coupon/CouponDetail.java
@@ -2,14 +2,13 @@ package com.foxinmy.weixin4j.mp.payment.coupon;
import java.util.Date;
-import org.apache.commons.lang3.StringUtils;
-
import com.alibaba.fastjson.annotation.JSONField;
import com.foxinmy.weixin4j.mp.payment.v3.ApiResult;
import com.foxinmy.weixin4j.mp.type.CouponStatus;
import com.foxinmy.weixin4j.mp.type.CouponStockType;
import com.foxinmy.weixin4j.mp.type.CouponType;
import com.foxinmy.weixin4j.util.DateUtil;
+import com.foxinmy.weixin4j.util.StringUtil;
import com.thoughtworks.xstream.annotations.XStreamAlias;
/**
@@ -315,7 +314,7 @@ public class CouponDetail extends ApiResult {
@JSONField(deserialize = false, serialize = false)
public Date getFormatUseTime() {
- return StringUtils.isNotBlank(useTime) ? DateUtil
+ return StringUtil.isNotBlank(useTime) ? DateUtil
.parse2yyyyMMddHHmmss(useTime) : null;
}
diff --git a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/payment/v2/ApiResult.java b/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/payment/v2/ApiResult.java
index 7b3beae6..b58e1a5d 100644
--- a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/payment/v2/ApiResult.java
+++ b/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/payment/v2/ApiResult.java
@@ -2,10 +2,9 @@ package com.foxinmy.weixin4j.mp.payment.v2;
import java.io.Serializable;
-import org.apache.commons.lang3.StringUtils;
-
import com.alibaba.fastjson.annotation.JSONField;
import com.foxinmy.weixin4j.mp.type.SignType;
+import com.foxinmy.weixin4j.util.StringUtil;
import com.thoughtworks.xstream.annotations.XStreamAlias;
/**
@@ -68,7 +67,7 @@ public class ApiResult implements Serializable {
}
public String getRetMsg() {
- return StringUtils.isNotBlank(retMsg) ? retMsg : null;
+ return StringUtil.isNotBlank(retMsg) ? retMsg : null;
}
public void setRetMsg(String retMsg) {
diff --git a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/payment/v2/JsPayRequestV2.java b/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/payment/v2/JsPayRequestV2.java
index c352fadf..ca7ca5d4 100644
--- a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/payment/v2/JsPayRequestV2.java
+++ b/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/payment/v2/JsPayRequestV2.java
@@ -2,11 +2,10 @@ package com.foxinmy.weixin4j.mp.payment.v2;
import java.beans.Transient;
-import org.apache.commons.codec.digest.DigestUtils;
-
import com.alibaba.fastjson.annotation.JSONField;
import com.foxinmy.weixin4j.mp.model.WeixinMpAccount;
import com.foxinmy.weixin4j.mp.payment.PayRequest;
+import com.foxinmy.weixin4j.util.DigestUtil;
import com.foxinmy.weixin4j.util.MapUtil;
/**
@@ -48,7 +47,7 @@ public class JsPayRequestV2 extends PayRequest {
// 再将得到的 字符串所有字符转换为大写 ,得到 sign 值 signValue。
sb.append("&key=").append(partnerKey);
// c---> & d---->
- String sign = DigestUtils.md5Hex(sb.toString()).toUpperCase();
+ String sign = DigestUtil.MD5(sb.toString()).toUpperCase();
sb.delete(0, sb.length());
// c.对传入参数中所有键值对的 value 进行 urlencode 转码后重新拼接成字符串 string2
sb.append(MapUtil.toJoinString(payPackage, true, false, null))
diff --git a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/payment/v2/RefundDetail.java b/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/payment/v2/RefundDetail.java
index 163d0fca..bd289041 100644
--- a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/payment/v2/RefundDetail.java
+++ b/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/payment/v2/RefundDetail.java
@@ -1,10 +1,9 @@
package com.foxinmy.weixin4j.mp.payment.v2;
-import org.apache.commons.lang3.StringUtils;
-
import com.alibaba.fastjson.annotation.JSONField;
import com.foxinmy.weixin4j.mp.type.RefundChannel;
import com.foxinmy.weixin4j.mp.type.RefundStatus;
+import com.foxinmy.weixin4j.util.StringUtil;
import com.thoughtworks.xstream.annotations.XStreamAlias;
/**
@@ -123,11 +122,11 @@ public class RefundDetail extends ApiResult {
}
public String getRecvUserId() {
- return StringUtils.isNotBlank(recvUserId) ? recvUserId : null;
+ return StringUtil.isNotBlank(recvUserId) ? recvUserId : null;
}
public String getReccvUserName() {
- return StringUtils.isNotBlank(reccvUserName) ? reccvUserName : null;
+ return StringUtil.isNotBlank(reccvUserName) ? reccvUserName : null;
}
@Override
diff --git a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/payment/v2/RefundRecord.java b/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/payment/v2/RefundRecord.java
index 147a3644..69e97a7d 100644
--- a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/payment/v2/RefundRecord.java
+++ b/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/payment/v2/RefundRecord.java
@@ -2,9 +2,8 @@ package com.foxinmy.weixin4j.mp.payment.v2;
import java.util.List;
-import org.apache.commons.lang3.StringUtils;
-
import com.alibaba.fastjson.annotation.JSONField;
+import com.foxinmy.weixin4j.util.StringUtil;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.annotations.XStreamOmitField;
@@ -52,7 +51,7 @@ public class RefundRecord extends ApiResult {
}
public String getOutTradeNo() {
- return StringUtils.isNotBlank(outTradeNo) ? outTradeNo : null;
+ return StringUtil.isNotBlank(outTradeNo) ? outTradeNo : null;
}
public int getCount() {
diff --git a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/payment/v3/ApiResult.java b/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/payment/v3/ApiResult.java
index 1e61248e..b13f8456 100644
--- a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/payment/v3/ApiResult.java
+++ b/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/payment/v3/ApiResult.java
@@ -1,9 +1,8 @@
package com.foxinmy.weixin4j.mp.payment.v3;
-import org.apache.commons.lang3.StringUtils;
-
import com.alibaba.fastjson.annotation.JSONField;
import com.foxinmy.weixin4j.http.XmlResult;
+import com.foxinmy.weixin4j.util.StringUtil;
import com.thoughtworks.xstream.annotations.XStreamAlias;
/**
@@ -83,7 +82,7 @@ public class ApiResult extends XmlResult {
}
public String getSubMchId() {
- return StringUtils.isNotBlank(subMchId) ? subMchId : null;
+ return StringUtil.isNotBlank(subMchId) ? subMchId : null;
}
public void setSubMchId(String subMchId) {
diff --git a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/payment/v3/RefundDetail.java b/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/payment/v3/RefundDetail.java
index c8467dd4..392527d6 100644
--- a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/payment/v3/RefundDetail.java
+++ b/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/payment/v3/RefundDetail.java
@@ -2,13 +2,12 @@ package com.foxinmy.weixin4j.mp.payment.v3;
import java.util.List;
-import org.apache.commons.lang3.StringUtils;
-
import com.alibaba.fastjson.annotation.JSONField;
import com.foxinmy.weixin4j.mp.payment.coupon.CouponInfo;
import com.foxinmy.weixin4j.mp.type.CurrencyType;
import com.foxinmy.weixin4j.mp.type.RefundChannel;
import com.foxinmy.weixin4j.mp.type.RefundStatus;
+import com.foxinmy.weixin4j.util.StringUtil;
import com.thoughtworks.xstream.annotations.XStreamAlias;
/**
@@ -140,7 +139,7 @@ public class RefundDetail extends ApiResult {
@JSONField(deserialize = false, serialize = false)
public RefundChannel getFormatRefundChannel() {
- if (StringUtils.isNotBlank(refundChannel)) {
+ if (StringUtil.isNotBlank(refundChannel)) {
return RefundChannel.valueOf(refundChannel.toUpperCase());
}
return null;
@@ -170,7 +169,7 @@ public class RefundDetail extends ApiResult {
@JSONField(deserialize = false, serialize = false)
public RefundStatus getFormatRefundStatus() {
- if (StringUtils.isNotBlank(refundStatus)) {
+ if (StringUtil.isNotBlank(refundStatus)) {
return RefundStatus.valueOf(refundStatus);
}
return null;
diff --git a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/spider/README.md b/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/spider/README.md
deleted file mode 100644
index fd9763a5..00000000
--- a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/spider/README.md
+++ /dev/null
@@ -1,3 +0,0 @@
-模拟微信公众平台登陆
-
-(模拟登录|启用开发者模式|修改服务器配置|修改回调地址|启用服务器配置....more)
\ No newline at end of file
diff --git a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/spider/WeixinExecutor.java b/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/spider/WeixinExecutor.java
deleted file mode 100644
index 92a8afa0..00000000
--- a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/spider/WeixinExecutor.java
+++ /dev/null
@@ -1,666 +0,0 @@
-package com.foxinmy.weixin4j.mp.spider;
-
-import java.net.URI;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.apache.commons.codec.binary.Base64;
-import org.apache.commons.codec.digest.DigestUtils;
-import org.apache.commons.lang3.StringUtils;
-import org.apache.http.Consts;
-import org.apache.http.HttpEntity;
-import org.apache.http.HttpHost;
-import org.apache.http.HttpResponse;
-import org.apache.http.HttpStatus;
-import org.apache.http.NameValuePair;
-import org.apache.http.StatusLine;
-import org.apache.http.client.entity.UrlEncodedFormEntity;
-import org.apache.http.client.methods.HttpGet;
-import org.apache.http.client.methods.HttpPost;
-import org.apache.http.client.params.ClientPNames;
-import org.apache.http.client.params.CookiePolicy;
-import org.apache.http.cookie.Cookie;
-import org.apache.http.impl.client.AbstractHttpClient;
-import org.apache.http.impl.client.DefaultHttpClient;
-import org.apache.http.message.BasicHeader;
-import org.apache.http.message.BasicNameValuePair;
-import org.jsoup.Jsoup;
-import org.jsoup.nodes.Document;
-import org.jsoup.nodes.Element;
-import org.jsoup.select.Elements;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.alibaba.fastjson.JSON;
-import com.alibaba.fastjson.JSONObject;
-import com.foxinmy.weixin4j.util.IOUtil;
-import com.foxinmy.weixin4j.util.RandomUtil;
-
-/**
- * 模拟微信公众平台登陆
- *
- *
- * (模拟登录|启用开发者模式|修改服务器配置|修改回调地址|启用服务器配置....more)
- *
- *
- * @className WeixinExecutor
- * @author jy
- * @date 2014年8月15日
- * @since JDK 1.7
- * @see
- */
-public class WeixinExecutor {
- private final Logger logger = LoggerFactory.getLogger(getClass());
-
- private final static Map accountMap = new HashMap() {
- private static final long serialVersionUID = 1L;
-
- {
- put("名称", "name");
- put("头像", "avatar");
- put("登录邮箱", "loginEmail");
- put("原始ID", "originalId");
- put("微信号", "weixinNo");
- put("类型", "accountType");
- put("认证情况", "weixinVerify");
- put("主体信息", "bodyInfo");
- put("介绍", "introduce");
- put("所在地址", "address");
- put("二维码", "qrcodeUrl");
- }
- };
-
- private AbstractHttpClient client;
- private HttpHost host;
- private JSONObject weixin;
-
- // 服务器响应地址
- private String pushurl;
- // oauth授权回调地址
- private String backurl;
- // 服务器校验token
- private String token;
-
- // 公众号用户名
- private String uname;
- // 公众号密码
- private String pwd;
- // 登录时验证码(如果有)
- private String imgcode;
- // 当要求输入验证码时,cookie需带上
- private String sig;
-
- public WeixinExecutor(String backurl, String pushurl, String token,
- String uname, String pwd, String imgcode, String sig) {
- this.backurl = backurl;
- this.pushurl = pushurl;
- this.token = token;
-
- this.uname = uname;
- this.pwd = pwd;
- this.imgcode = StringUtils.isBlank(imgcode) ? "" : imgcode;
- this.sig = sig;
-
- weixin = new JSONObject();
- weixin.put("host", "mp.weixin.qq.com");
- weixin.put("base", "https://mp.weixin.qq.com");
- weixin.put("auth", "https://mp.weixin.qq.com/cgi-bin/login?lang=zh_CN");
- weixin.put(
- "call",
- "https://mp.weixin.qq.com/advanced/callbackprofile?t=ajax-response&token=%s&lang=zh_CN");
- weixin.put("start",
- "https://mp.weixin.qq.com/misc/skeyform?form=advancedswitchform");
- weixin.put("back",
- "https://mp.weixin.qq.com/merchant/myservice?action=set_oauth_domain&f=json");
- weixin.put("verifycode",
- "https://mp.weixin.qq.com/cgi-bin/verifycode?username=" + uname
- + "&r=%s");
- weixin.put("bedeveloper",
- "https://mp.weixin.qq.com/advanced/advanced?action=agreement");
-
- List headers = new ArrayList();
- headers.add(new BasicHeader("Origin", weixin.getString("base")));
- headers.add(new BasicHeader("Connection", "keep-alive"));
- headers.add(new BasicHeader(
- "User-Agent",
- "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.143 Safari/537.36"));
-
- client = new DefaultHttpClient();
- client.getParams().setParameter(ClientPNames.COOKIE_POLICY,
- CookiePolicy.BROWSER_COMPATIBILITY);
- client.getParams().setBooleanParameter(
- "http.protocol.single-cookie-header", true);
- client.getParams().setParameter(ClientPNames.DEFAULT_HEADERS, headers);
-
- host = new HttpHost(weixin.getString("host"), -1, "https");
- }
-
- public JSONObject process() {
- // 1.登陆微信公众号
- step1_login();
- int code = weixin.getIntValue("code");
- if (code == 0) {
- // 2.收集相关信息
- step2_collect();
- code = weixin.getIntValue("code");
- // 3.填写服务器配置
- // 3-1.未初始化账号
- // 3-2.已配置账号
- if (code == 0) {
- step3_setting();
- }
- code = weixin.getIntValue("code");
- // 4.修改网页授权地址
- if (code == 0) {
- step4_back();
- }
- // 5.创建底部菜单 (调用封装好的API)
- // 5-1.订阅号
- // 5-2.服务号
- // 6.完成
- }
- return weixin;
- }
-
- /**
- * step1:登录操作
- */
- private void step1_login() {
- HttpPost method = new HttpPost(weixin.getString("auth"));
- try {
- List parameters = new ArrayList();
- parameters.add(new BasicNameValuePair("username", uname));
- parameters.add(new BasicNameValuePair("pwd", DigestUtils.md5Hex(pwd
- .getBytes(Consts.UTF_8))));
- parameters.add(new BasicNameValuePair("f", "json"));
- parameters.add(new BasicNameValuePair("imgcode", imgcode));
- if (!StringUtils.isBlank(imgcode)) {
- method.addHeader("Cookie", "sig=" + sig);
- }
- method.setEntity(new UrlEncodedFormEntity(parameters, Consts.UTF_8));
- method.addHeader("Referer", weixin.getString("base"));
-
- HttpResponse response = client.execute(host, method);
- HttpEntity entity = response.getEntity();
- Document root = Jsoup.parse(entity.getContent(),
- Consts.UTF_8.name(), weixin.getString("base"));
- StatusLine line = response.getStatusLine();
- logger.info("step1_login--->status={},body=\n{}", line,
- root.toString());
- if (line.getStatusCode() == HttpStatus.SC_OK) {
- JSONObject body = JSON.parseObject(root.body().text());
-
- String msg = "";
- int code = 0;
- switch (body.getIntValue("ret")
- + body.getJSONObject("base_resp").getIntValue("ret")) {
- case -1:
- msg = "系统错误,请稍候再试。";
- code = -1;
- break;
- case -2:
- msg = "帐号或密码错误。";
- code = 100;
- break;
- case -23:
- msg = "您输入的帐号或者密码不正确,请重新输入。";
- code = 101;
- break;
- case -21:
- msg = "不存在该帐户。";
- code = 102;
- break;
- case -7:
- msg = "您目前处于访问受限状态。";
- code = 103;
- break;
- case -8:
- msg = "请输入图中的验证码";
- code = 104;
- break;
- case -27:
- msg = "您输入的验证码不正确,请重新输入";
- code = 105;
- break;
- case -26:
- msg = "该公众会议号已经过期,无法再登录使用。";
- code = 106;
- break;
- case 0:
- msg = "成功登录,正在跳转...";
- break;
- case -25:
- msg = "海外帐号请在公众平台海外版登录,点击登录";
- code = 107;
- break;
- default:
- msg = "未知错误";
- code = 108;
- break;
- }
- if (code == 0) {
- weixin.put(
- "urlToken",
- getQueryMap(body.getString("redirect_url")).get(
- "token"));
- weixin.put("indexUrl", String.format("%s%s",
- weixin.getString("base"),
- body.getString("redirect_url")));
- weixin.put("step", "1");
- } else {
- if (code == 104 || code == 105) {
- // 下载验证码
- HttpGet get = new HttpGet(String.format(
- weixin.getString("verifycode"),
- System.currentTimeMillis()));
- get.setHeaders(method.getAllHeaders());
- response = client.execute(host, get);
- StringBuffer base64 = new StringBuffer();
- base64.append("data:")
- .append(response.getFirstHeader("Content-Type")
- .getValue()).append(";base64,");
- base64.append(new String(
- Base64.encodeBase64(IOUtil.toByteArray(response
- .getEntity().getContent())),
- Consts.UTF_8));
- weixin.put("verifydata", base64.toString());
- List cookieList = client.getCookieStore()
- .getCookies();
- for (Cookie cookie : cookieList) {
- if (cookie.getName().equals("sig")) {
- weixin.put("sig", cookie.getValue());
- break;
- }
- }
- }
- weixin.put("code", code);
- weixin.put("msg", msg);
- }
- } else {
- weixin.put("code", "-3");
- weixin.put("msg", "网络异常,请稍后重试!");
- }
- } catch (Exception e) {
- weixin.put("code", "-2");
- weixin.put("msg", "服务器繁忙,请稍后重试!");
- weixin.put("exception", e.getMessage());
- logger.error("step1_login catch error", e);
- } finally {
- if (weixin.getIntValue("code") != 0) {
- client.getConnectionManager().shutdown();
- }
- }
- }
-
- /**
- * step2:收集信息
- */
- private void step2_collect() {
- String url = weixin.getString("indexUrl");
- HttpGet method = new HttpGet(url);
- try {
- method.addHeader("Referer", weixin.getString("base"));
-
- HttpResponse response = client.execute(host, method);
- HttpEntity entity = response.getEntity();
- Document root = Jsoup.parse(entity.getContent(),
- Consts.UTF_8.name(), weixin.getString("base"));
- StatusLine line = response.getStatusLine();
- logger.info("step2_setting--->status={},body=\n{}", line,
- root.toString());
- if (line.getStatusCode() == HttpStatus.SC_OK) {
- Element ele = root.getElementById("menuBar")
- .getElementsByTag("dl").last();
- url = ele.getElementsByTag("a").last().absUrl("href");
-
- weixin.put("developerUrl", url);
-
- method.addHeader("Referer", url);
- url = ele.previousElementSibling().getElementsByTag("a")
- .first().absUrl("href");
- weixin.put("settingUrl", url);
- method.setURI(URI.create(url));
-
- response = client.execute(host, method);
- entity = response.getEntity();
- root = Jsoup.parse(entity.getContent(), Consts.UTF_8.name(),
- weixin.getString("base"));
- line = response.getStatusLine();
- weixin.put("step", "2-1");
- // 公众号配置页面
- if (line.getStatusCode() == HttpStatus.SC_OK) {
- Elements eles = root.getElementById("settingArea")
- .getElementsByTag("li");
- String key, value;
- for (Element element : eles) {
- key = element.getElementsByTag("h4").first().text();
- ele = element.getElementsByClass("meta_content")
- .first();
- if (ele.children().isEmpty()) {
- value = ele.text();
- } else {
- if (ele.child(0).tagName().equalsIgnoreCase("a")) {
- value = ele.child(0).absUrl("href");
- } else if (ele.child(0).tagName()
- .equalsIgnoreCase("img")) {
- value = ele.child(0).absUrl("src");
- } else {
- value = ele.text();
- }
- }
- weixin.put(accountMap.get(key), value);
- }
- weixin.put("isVerify", weixin.getString("weixinVerify")
- .contains("微信认证"));
- weixin.put("isService", weixin.getString("accountType")
- .contains("服务号"));
- weixin.put("isSubscribe", weixin.getString("accountType")
- .contains("订阅号"));
- value = weixin.getString("qrcodeUrl");
-
- method.setURI(URI.create(value));
- response = client.execute(host, method);
- weixin.put("qrcodeData", IOUtil.toByteArray(response
- .getEntity().getContent()));
-
- weixin.put("step", "2-2");
- // 开发者页面
- method.addHeader("Referer", url);
- method.setURI(URI.create(weixin.getString("developerUrl")));
-
- response = client.execute(host, method);
- entity = response.getEntity();
- root = Jsoup.parse(entity.getContent(),
- Consts.UTF_8.name(), weixin.getString("base"));
- line = response.getStatusLine();
-
- if (line.getStatusCode() == HttpStatus.SC_OK) {
- // 还没有成为开发者 2014.10-06 jy.hu
- // 触发成为开发者动作
- ele = root.getElementById("js_toBeDeveloper");
- if (ele != null && ele.hasText()) {
- HttpPost post = new HttpPost(URI.create(weixin
- .getString("bedeveloper")));
- post.addHeader("Referer", url);
- List parameters = new ArrayList();
- parameters.add(new BasicNameValuePair("token",
- weixin.getString("urlToken")));
- parameters.add(new BasicNameValuePair("f", "json"));
- parameters.add(new BasicNameValuePair("ajax", "1"));
- parameters.add(new BasicNameValuePair("lang",
- "zh_CN"));
- parameters.add(new BasicNameValuePair("random",
- System.currentTimeMillis() + ""));
-
- post.setEntity(new UrlEncodedFormEntity(parameters,
- Consts.UTF_8));
- response = client.execute(host, post);
- entity = response.getEntity();
- root = Jsoup.parse(entity.getContent(),
- Consts.UTF_8.name(),
- weixin.getString("base"));
- line = response.getStatusLine();
- logger.info(
- "step2_bedeveloper--->status={},body=\n{}",
- line, root.toString());
- if (line.getStatusCode() == HttpStatus.SC_OK) {
- JSONObject body = JSON.parseObject(root.body()
- .text());
- if (body.getIntValue("ret") == 0) {
- method.addHeader("Referer", url);
- method.setURI(URI.create(weixin
- .getString("developerUrl")));
-
- response = client.execute(host, method);
- entity = response.getEntity();
- root = Jsoup.parse(entity.getContent(),
- Consts.UTF_8.name(),
- weixin.getString("base"));
- } else {
- weixin.put("code", "-100");
- weixin.put("msg", "成为开发者失败!");
- return;
- }
- }
- }
- // 初始化状态
- // 配置未启用状态
- // 配置已启用状态
- eles = root.getElementsByClass("developer_info_opr");
- if (eles != null && eles.hasText()) {
- weixin.put("developerModifyUrl", eles.first()
- .children().first().absUrl("href"));
- weixin.put("status",
- eles.text().contains("启用") ? "READY"
- : "RUNNING");
- } else {
- weixin.put("status", "INIT");
- }
- // appid&appsecret
- if (weixin.getBooleanValue("isService")
- || (weixin.getBooleanValue("isSubscribe") && weixin
- .getBooleanValue("isVerify"))) {
- eles = root
- .getElementsByClass("developer_info_item")
- .first().children().last()
- .getElementsByClass("frm_controls");
- weixin.put("appId", eles.first().text());
- weixin.put("appSecret",
- eles.last().text().replace("重置", "").trim());
- }
- weixin.put("step", "2-3");
- }
- } else {
- weixin.put("code", "-3");
- weixin.put("msg", "网络异常,请稍后重试!");
- }
- } else {
- weixin.put("code", "-3");
- weixin.put("msg", "网络异常,请稍后重试!");
- }
- } catch (Exception e) {
- weixin.put("code", "-2");
- weixin.put("msg", "服务器繁忙,请稍后重试!");
- weixin.put("exception", e.getMessage());
- logger.error("step2_collect catch error", e);
- } finally {
- if (weixin.getIntValue("code") != 0) {
- client.getConnectionManager().shutdown();
- }
- }
- }
-
- /**
- * step3:填写配置
- */
- private void step3_setting() {
- HttpPost method = new HttpPost(String.format(weixin.getString("call"),
- weixin.getString("urlToken")));
- try {
- List parameters = new ArrayList();
- parameters.add(new BasicNameValuePair("url", pushurl));
- parameters.add(new BasicNameValuePair("callback_token", token));
- // EncodingAESKey | 消息加解密方式(明文0,兼容1,安全2)
- parameters.add(new BasicNameValuePair("encoding_aeskey", RandomUtil
- .generateString(43)));
- parameters
- .add(new BasicNameValuePair("callback_encrypt_mode", "0"));
- parameters.add(new BasicNameValuePair("operation_seq", RandomUtil
- .generateStringByNumberChar(9)));
- method.setEntity(new UrlEncodedFormEntity(parameters, Consts.UTF_8));
- method.addHeader("Referer", weixin.getString("developerModifyUrl"));
-
- HttpResponse response = client.execute(host, method);
- HttpEntity entity = response.getEntity();
- Document root = Jsoup.parse(entity.getContent(),
- Consts.UTF_8.name(), weixin.getString("base"));
- StatusLine line = response.getStatusLine();
- logger.info("step3_setting--->status={},body=\n{}", line,
- root.toString());
- if (line.getStatusCode() == HttpStatus.SC_OK) {
- JSONObject body = JSON.parseObject(root.body().text());
- String msg = "";
- int code = 0;
- switch (body.getIntValue("ret")
- + body.getJSONObject("base_resp").getIntValue("ret")) {
- case -201:
- msg = "无效的URL";
- code = 200;
- break;
- case -202:
- msg = "无效的Token";
- code = 201;
- break;
- case -203:
- msg = "操作频率太快,请休息一下。";
- code = 202;
- break;
- case -204:
- msg = "请先在设置页面完善当前帐号信息";
- code = 203;
- break;
- case -205:
- msg = "该URL可能存在安全风险,请检查";
- code = 207;
- break;
- case -301:
- msg = "请求URL超时";
- code = 204;
- break;
- case -302:
- msg = "服务器没有正确响应Token验证,请稍后重试";
- code = 205;
- break;
- case -104:
- msg = "参数错误,请重新填写。";
- code = 206;
- break;
- case 0:
- msg = "配置成功..";
- break;
- default:
- msg = "未知错误";
- code = 108;
- break;
- }
- if (code == 0) {
- // 触发启用按钮
- if (!weixin.getString("status").equals("RUNNING")) {
- parameters = new ArrayList();
- parameters.add(new BasicNameValuePair("token", weixin
- .getString("urlToken")));
- parameters.add(new BasicNameValuePair("f", "json"));
- parameters.add(new BasicNameValuePair("ajax", "1"));
- parameters.add(new BasicNameValuePair("flag", "1"));
- parameters.add(new BasicNameValuePair("type", "2"));
- parameters.add(new BasicNameValuePair("lang", "zh_CN"));
- parameters.add(new BasicNameValuePair("random", System
- .currentTimeMillis() + ""));
-
- method.setEntity(new UrlEncodedFormEntity(parameters,
- Consts.UTF_8));
- method.setURI(URI.create(weixin.getString("start")));
-
- response = client.execute(host, method);
- entity = response.getEntity();
- root = Jsoup.parse(entity.getContent(),
- Consts.UTF_8.name(), weixin.getString("base"));
- line = response.getStatusLine();
- logger.info("step3_setting--->status={},body=\n{}",
- line, root.toString());
- if (line.getStatusCode() == HttpStatus.SC_OK) {
- body = JSON.parseObject(root.body().text());
- if (body.getIntValue("ret")
- + body.getJSONObject("base_resp")
- .getIntValue("ret") != 0) {
- weixin.put("code", 300);
- weixin.put("msg", "启用开发者模式失败,请稍后再试!");
- }
- }
- }
- weixin.put("step", "3");
- } else {
- weixin.put("code", code);
- weixin.put("msg", msg);
- }
- } else {
- weixin.put("code", "-3");
- weixin.put("msg", "网络异常,请稍后重试!");
- }
- } catch (Exception e) {
- weixin.put("code", "-2");
- weixin.put("msg", "服务器繁忙,请稍后重试!");
- weixin.put("exception", e.getMessage());
- logger.error("step3_setting catch error", e);
- } finally {
- if (weixin.getIntValue("code") != 0) {
- client.getConnectionManager().shutdown();
- }
- }
- }
-
- /**
- * step4:修改回调
- */
- private void step4_back() {
- try {
- if (weixin.getBooleanValue("isVerify")) {
- HttpPost method = new HttpPost(weixin.getString("back"));
-
- List parameters = new ArrayList();
- parameters.add(new BasicNameValuePair("domain", backurl));
- parameters.add(new BasicNameValuePair("token", weixin
- .getString("urlToken")));
- parameters.add(new BasicNameValuePair("f", "json"));
- parameters.add(new BasicNameValuePair("ajax", "1"));
- parameters.add(new BasicNameValuePair("flag", "1"));
- parameters.add(new BasicNameValuePair("lang", "zh_CN"));
- parameters.add(new BasicNameValuePair("random", System
- .currentTimeMillis() + ""));
- method.setEntity(new UrlEncodedFormEntity(parameters,
- Consts.UTF_8));
- method.addHeader("Referer", weixin.getString("developerUrl"));
-
- HttpResponse response = client.execute(host, method);
- HttpEntity entity = response.getEntity();
- Document root = Jsoup.parse(entity.getContent(),
- Consts.UTF_8.name(), weixin.getString("base"));
- StatusLine line = response.getStatusLine();
- logger.info("step4_back--->status={},body=\n{}", line,
- root.toString());
- if (line.getStatusCode() == HttpStatus.SC_OK) {
- JSONObject body = JSON.parseObject(root.body().text());
- if (body.getIntValue("ret")
- + body.getJSONObject("base_resp")
- .getIntValue("ret") != 0) {
- weixin.put("code", "400");
- weixin.put("msg", "修改授权回调地址失败!");
- }
- weixin.put("step", "4");
- }
- } else {
- logger.info("公众号尚未认证,放弃本次修改授权回调地址操作。{}", weixin);
- }
- } catch (Exception e) {
- weixin.put("code", "-2");
- weixin.put("msg", "服务器繁忙,请稍后重试!");
- weixin.put("exception", e.getMessage());
- logger.error("step4_back catch error", e);
- } finally {
- client.getConnectionManager().shutdown();
- }
- }
-
- private Map getQueryMap(String query) {
- String[] params = query.split("&");
- Map map = new HashMap();
- for (String param : params) {
- String name = param.split("=")[0];
- String value = param.split("=")[1];
- map.put(name, value);
- }
- return map;
- }
-}
diff --git a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/type/EventType.java b/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/type/EventType.java
deleted file mode 100644
index f9231155..00000000
--- a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/type/EventType.java
+++ /dev/null
@@ -1,55 +0,0 @@
-package com.foxinmy.weixin4j.mp.type;
-
-/**
- * 公众号事件类型
- *
- * @className EventType
- * @author jy
- * @date 2014年9月30日
- * @since JDK 1.7
- * @see
- */
-public enum EventType {
- /**
- * 二维码扫描事件
- *
- * @see com.foxinmy.weixin4j.mp.event.ScanEventMessage
- */
- scan,
- /**
- * 群发消息事件
- *
- * @see com.foxinmy.weixin4j.mp.event.MassEventMessage
- */
- masssendjobfinish,
- /**
- * 模板消息事件
- *
- * @see com.foxinmy.weixin4j.mp.event.TemplatesendjobfinishMessage
- */
- templatesendjobfinish,
- /**
- * 客服接入会话事件
- *
- * @see com.foxinmy.weixin4j.mp.event.KfCreateEventMessage
- */
- kf_create_session,
- /**
- * 客服关闭会话事件
- *
- * @see com.foxinmy.weixin4j.mp.event.KfCloseEventMessage
- */
- kf_close_session,
- /**
- * 客服转接会话事件
- *
- * @see com.foxinmy.weixin4j.mp.event.KfSwitchEventMessage
- */
- kf_switch_session,
- /**
- * 异步任务完成事件
- *
- * @see com.foxinmy.weixin4j.mp.event.BatchjobresultMessage
- */
- batch_job_result;
-}
diff --git a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/util/ExcelUtil.java b/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/util/ExcelUtil.java
index 9c0c1c62..c00ab363 100644
--- a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/util/ExcelUtil.java
+++ b/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/util/ExcelUtil.java
@@ -11,7 +11,6 @@ import java.util.Collection;
import java.util.Date;
import java.util.List;
-import org.apache.commons.lang3.StringUtils;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFFont;
@@ -32,6 +31,7 @@ import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
+import com.foxinmy.weixin4j.util.StringUtil;
/**
* excel工具类
@@ -55,7 +55,7 @@ public class ExcelUtil {
*/
public static String[][] read(File file) throws Exception {
String fileExt = getExtension(file.getName());
- if (StringUtils.isNotBlank(fileExt)) {
+ if (StringUtil.isNotBlank(fileExt)) {
if (fileExt.toLowerCase().equals("xls")) {// 2003
BufferedInputStream in = new BufferedInputStream(
new FileInputStream(file));
@@ -75,7 +75,7 @@ public class ExcelUtil {
public static String[][] read4Special(File file, String fileName,
int columnSize) throws Exception {
String fileExt = getExtension(fileName);
- if (StringUtils.isNotBlank(fileExt)) {
+ if (StringUtil.isNotBlank(fileExt)) {
if (fileExt.toLowerCase().equals("xls")) {// 2003
BufferedInputStream in = new BufferedInputStream(
new FileInputStream(file));
diff --git a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/util/PayDemo.java b/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/util/PayDemo.java
new file mode 100644
index 00000000..f49fc821
--- /dev/null
+++ b/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/util/PayDemo.java
@@ -0,0 +1,323 @@
+package com.foxinmy.weixin4j.mp.util;
+
+import java.io.InputStream;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.foxinmy.weixin4j.exception.PayException;
+import com.foxinmy.weixin4j.http.XmlResult;
+import com.foxinmy.weixin4j.model.Consts;
+import com.foxinmy.weixin4j.mp.model.WeixinMpAccount;
+import com.foxinmy.weixin4j.mp.payment.JsPayNotify;
+import com.foxinmy.weixin4j.mp.payment.PayPackage;
+import com.foxinmy.weixin4j.mp.payment.PayUtil;
+import com.foxinmy.weixin4j.mp.payment.conver.CouponConverter;
+import com.foxinmy.weixin4j.mp.payment.v2.NativePayNotifyV2;
+import com.foxinmy.weixin4j.mp.payment.v2.NativePayResponseV2;
+import com.foxinmy.weixin4j.mp.payment.v2.PayFeedback;
+import com.foxinmy.weixin4j.mp.payment.v2.PayPackageV2;
+import com.foxinmy.weixin4j.mp.payment.v2.PayWarn;
+import com.foxinmy.weixin4j.mp.payment.v3.NativePayNotifyV3;
+import com.foxinmy.weixin4j.mp.payment.v3.NativePayResponseV3;
+import com.foxinmy.weixin4j.mp.payment.v3.PayPackageV3;
+import com.foxinmy.weixin4j.mp.type.TradeType;
+import com.foxinmy.weixin4j.util.ConfigUtil;
+import com.foxinmy.weixin4j.util.StringUtil;
+import com.foxinmy.weixin4j.xml.XmlStream;
+
+/**
+ * 支付示例
+ *
+ * @className PayDemo
+ * @author jy
+ * @date 2014年10月28日
+ * @since JDK 1.7
+ * @see
+ */
+public final class PayDemo {
+
+ private final Logger log = LoggerFactory.getLogger(getClass());
+
+ /**
+ * JSAPI支付
+ *
+ * @return
+ */
+ public JSONObject jsPay() {
+ JSONObject obj = new JSONObject();
+ WeixinMpAccount weixinAccount = JSON.parseObject(
+ ConfigUtil.getValue("account"), WeixinMpAccount.class);
+ // V3 支付
+ PayPackage payPackage = new PayPackageV3(weixinAccount, "用户openid",
+ "商品描述", "系统内部订单号", 1d, "IP地址", TradeType.JSAPI);
+ // V2 支付
+ payPackage = new PayPackageV2("商品描述", weixinAccount.getPartnerId(),
+ "系统内部订单号", 1d, "回调地址", "IP地址");
+ payPackage.setAttach("ID");
+ String jspay = null;
+ try {
+ jspay = PayUtil.createPayJsRequestJson(payPackage, weixinAccount);
+ } catch (PayException e) {
+ log.error("create jspay error,{}", weixinAccount, e);
+ }
+ if (StringUtil.isBlank(jspay)) {
+ obj.put("code", "-2");
+ obj.put("msg", "创建支付链接失败!");
+ return obj;
+ }
+ obj.put("code", "0");
+ obj.put("jspay", jspay);
+
+ /*
+ * 编辑收货地址 SnsToken token = (SnsToken) getSession("AccessToken");
+ * obj.put("editaddress", PayUtil.createAddressRequestJson(
+ * wx.getAppId(), getFullLoction(), token.getAccess_token()));
+ */
+ log.info("js pay....{}", obj);
+ return obj;
+ }
+
+ /**
+ * JSAPI(V2)支付成功(前端)时的回调通知
+ * <xml> <OpenId><![CDATA[111222]]></OpenId>
+ * <AppId><![CDATA[wwwwb4f85f3a797777]]></AppId>
+ * <IsSubscribe>1</IsSubscribe>
+ * <TimeStamp>1369743511</TimeStamp>
+ * <NonceStr><![CDATA[jALldRTHAFd5Tgs5]]></NonceStr>
+ * <AppSignature><![CDATA[bafe07f060f22dcda0bfdb4b5ff756f973aecffa]]>
+ * </AppSignature>
+ * <SignMethod><![CDATA[sha1]]></SignMethod> </xml>
+ * 参与签名的字段为: appid、appkey、timestamp、noncestr、openid、issubscribe
+ *
+ * @param 订单信息
+ * @param inputStream
+ * 用户信息
+ *
+ * @see com.foxinmy.weixin4j.mp.payment.JsPayNotify
+ * @return success或其他
+ */
+ public String jsNotifyV2(InputStream inputStream) {
+ Map objMap = new HashMap();
+ /*
+ * 收集url中携带的参数 /pay/notify/back?attach=8&bank_billno=201410293351060&
+ * bank_type=2032&discount=0&fee_type=1&input_charset=UTF-8&
+ * notify_id=9fKbVf_qg6y-
+ * wSjtSMV0PLXeEn2oGfTM1s9dWSvR2B9U6iFQRTzmjrMWKUxvh9mpBLvnh8aqFbC_OFk1pTvFnFUO00Lln4fh
+ * & out_trade_no=D14102900031&partner=1221928801&product_fee=1&
+ * sign=B9D6E772C271C9B86B8436FC9F5DFC1A&
+ * sign_type=MD5&time_end=20141029183707&
+ * total_fee=1&trade_mode=1&trade_state=0&
+ * transaction_id=1221928801201410296039230054&transport_fee=0
+ */
+ log.info("jspay_notify_orderinfo,{}", objMap);
+ JsPayNotify payNotify = XmlStream.get(inputStream, JsPayNotify.class);
+ log.info("jspay_notify_userinfo,{}", payNotify);
+ WeixinMpAccount weixinAccount = JSON.parseObject(
+ ConfigUtil.getValue("account"), WeixinMpAccount.class);
+ // 验证财付通签名
+ String sign = objMap.get("sign");
+ objMap.remove("sign");
+ String _sign = PayUtil
+ .paysignMd5(objMap, weixinAccount.getPartnerKey());
+ log.info("财付通签名----->sign={},vaild_sign={}", sign, _sign);
+ if (!sign.equals(_sign)) {
+ return "fail";
+ }
+ objMap.clear();
+ // 验证微信签名
+ sign = payNotify.getPaySign();
+ payNotify.setPaySign(null);
+ payNotify.setSignType(null);
+ String vaild_sign = PayUtil.paysignSha(payNotify,
+ weixinAccount.getPaySignKey());
+ log.info("微信签名----->sign={},vaild_sign={}", sign, vaild_sign);
+ if (!sign.equals(vaild_sign)) {
+ return "fail";
+ }
+ // 处理业务逻辑
+ return "success";
+ }
+
+ /**
+ * JSAPI(V3)支付成功(前端)时的回调通知
+ *
+ *
+ * @param inputStream
+ * 订单回调
+ * @return <xml>
+ * <return_code>SUCCESS/FAIL</return_code>
+ * <return_msg>如非空,为错误 原因签名失败参数格式校验错误</return_msg>
+ * </xml>
+ * @throws DocumentException
+ * @see 支付结果通知
+ */
+ public String jsNotifyV3(InputStream inputStream) {
+ String orderXml = "从inputStream中读取订单信息";
+ com.foxinmy.weixin4j.mp.payment.v3.Order order = CouponConverter
+ .fromXML(orderXml,
+ com.foxinmy.weixin4j.mp.payment.v3.Order.class);
+ log.info("jsapi_notify_order_info:", order);
+ String sign = order.getSign();
+ order.setSign(null);
+ WeixinMpAccount weixinAccount = JSON.parseObject(
+ ConfigUtil.getValue("account"), WeixinMpAccount.class);
+ String valid_sign = PayUtil.paysignMd5(order,
+ weixinAccount.getPaySignKey());
+ // 如果订单中存在代金券的情况并不适用
+ log.info("微信签名----->sign={},vaild_sign={}", sign, valid_sign);
+ if (!sign.equals(valid_sign)) {
+ return XmlStream.to(new XmlResult(Consts.FAIL, "签名错误"));
+ }
+ // 处理业务逻辑
+ return XmlStream.to(new XmlResult(Consts.SUCCESS, ""));
+ }
+
+ /**
+ * V2.x版本Native支付时POST数据
+ * <xml> <OpenId><![CDATA[111222]]></OpenId>
+ * <AppId><![CDATA[wwwwb4f85f3a797777]]></AppId>
+ * <IsSubscribe>1</IsSubscribe>
+ * <ProductId>[CDATA[000000]]</ProductId>
+ * <TimeStamp>1369743511</TimeStamp>
+ * <NonceStr><![CDATA[jALldRTHAFd5Tgs5]]></NonceStr>
+ * <AppSignature><![CDATA[bafe07f060f22dcda0bfdb4b5ff756f973aecffa]]>
+ * </AppSignature>
+ * <SignMethod><![CDATA[sha1]]></SignMethod> </xml>
+ * 参与签名的字段为: appid、appkey、timestamp、noncestr、openid、issubscribe、productId
+ *
+ * @param inputStream
+ *
+ * @return 必须返回一个带有Package信息的xml字符串
+ */
+ public String nativeNotifyV2(InputStream inputStream) {
+ // V2.x版本
+ NativePayNotifyV2 payNotify = XmlStream.get(inputStream,
+ NativePayNotifyV2.class);
+ log.info("native_pay_notify,{}", payNotify);
+ WeixinMpAccount weixinAccount = JSON.parseObject(
+ ConfigUtil.getValue("account"), WeixinMpAccount.class);
+ String sign = payNotify.getPaySign();
+ payNotify.setPaySign(null);
+ payNotify.setSignType(null);
+ // 验证微信签名
+ String vaild_sign = PayUtil.paysignSha(payNotify,
+ weixinAccount.getPaySignKey());
+ log.info("微信签名----->sign={},vaild_sign={}", sign, vaild_sign);
+ if (!sign.equals(vaild_sign)) {
+ return "fail";
+ }
+ // 构造订单信息
+ PayPackageV2 payPackage = new PayPackageV2("商品描述",
+ weixinAccount.getPartnerId(), "系统内部订单号", 1d, "回调地址", "IP地址");
+ NativePayResponseV2 payResponse = new NativePayResponseV2(
+ weixinAccount, payPackage);
+ return XmlStream.to(payResponse);
+ }
+
+ /**
+ * V3.x版本native回调
+ * <xml> <openid><![CDATA[111222]]></openid>
+ * <appid><![CDATA[wwwwb4f85f3a797777]]></appid>
+ * <mch_id><![CDATA[1100022]]></mch_id>
+ * <is_subscribe>1</is_subscribe>
+ * <product_id>[CDATA[000000]]</product_id>
+ * <nonce_str><![CDATA[jALldRTHAFd5Tgs5]]></nonce_str>
+ * <sign><![CDATA[bafe07f060f22dcda0bfdb4b5ff756f973aecffa]]>
+ * </sign> </xml>
+ *
+ * @return
+ * @throws PayException
+ */
+ public String nativeNotifyV3(InputStream inputStream) throws PayException {
+ NativePayNotifyV3 payNotify = XmlStream.get(inputStream,
+ NativePayNotifyV3.class);
+ String sign = payNotify.getSign();
+ payNotify.setSign(null);
+ WeixinMpAccount weixinAccount = JSON.parseObject(
+ ConfigUtil.getValue("account"), WeixinMpAccount.class);
+ String valid_sign = PayUtil.paysignMd5(payNotify,
+ weixinAccount.getPaySignKey());
+ log.info("微信签名----->sign={},vaild_sign={}", sign, valid_sign);
+ // 生成Package
+ PayPackageV3 payPackage = new PayPackageV3(weixinAccount, "用户openid",
+ "商品描述", "系统内部订单号", 1d, "IP地址", TradeType.NATIVE);
+ payPackage.setProductId(payNotify.getProductId());
+ if (!sign.equals(valid_sign)) {
+ // 校验失败
+ NativePayResponseV3 payReponse = new NativePayResponseV3("签名失败",
+ null);
+ payReponse.setSign(PayUtil.paysignMd5(payReponse,
+ weixinAccount.getPaySignKey()));
+ return XmlStream.to(payReponse);
+
+ }
+ // 成功返回
+ NativePayResponseV3 payReponse = new NativePayResponseV3(payPackage,
+ weixinAccount.getPaySignKey());
+ payReponse.setSign(PayUtil.paysignMd5(payReponse,
+ weixinAccount.getPaySignKey()));
+ return XmlStream.to(payReponse);
+ }
+
+ /**
+ * 告警通知 需要成功返回 success <xml>
+ * <AppId><![CDATA[wxf8b4f85f3a794e77]]></AppId>
+ * <ErrorType>1001</ErrorType>
+ * <Description><![CDATA[错误描述]]></Description>
+ * <AlarmContent><![CDATA[错误详情]]></AlarmContent>
+ * <TimeStamp>1393860740</TimeStamp>
+ * <AppSignature><![CDATA[签名方式跟JsPayRequest中的paySign一样]]></
+ * AppSignature>
+ * <SignMethod><![CDATA[sha1]]></SignMethod>
+ * </xml>
+ * 参与签名字段:alarmcontent、appid、appkey、description、errortype、timestamp
+ *
+ * @param inputStream
+ * xml数据
+ * @see com.foxinmy.weixin4j.mp.payment.v2.PayWarn
+ * @return
+ */
+ public String warning(InputStream inputStream) {
+ PayWarn payWarn = XmlStream.get(inputStream, PayWarn.class);
+ log.info("pay_warning,{}", payWarn);
+ WeixinMpAccount weixinAccount = JSON.parseObject(
+ ConfigUtil.getValue("account"), WeixinMpAccount.class);
+ String sign = payWarn.getPaySign();
+ payWarn.setPaySign(null);
+ payWarn.setSignType(null);
+ // 验证微信签名
+ String vaild_sign = PayUtil.paysignSha(payWarn,
+ weixinAccount.getPaySignKey());
+ log.info("微信签名----->sign={},vaild_sign={}", sign, vaild_sign);
+ return "success";
+ }
+
+ /**
+ * 用户维权
+ *
+ * @param inputStream
+ * @see com.foxinmy.weixin4j.mp.payment.v2.PayFeedback
+ * @return
+ */
+ public String feedback(InputStream inputStream) {
+ PayFeedback feedback = XmlStream.get(inputStream, PayFeedback.class);
+ log.info("pay_feedback_info:{}", feedback);
+ WeixinMpAccount weixinAccount = JSON.parseObject(
+ ConfigUtil.getValue("account"), WeixinMpAccount.class);
+ // 验证微信签名
+ Map obj = new HashMap();
+ obj.put("openid", feedback.getOpenId());
+ obj.put("appid", feedback.getAppId());
+ obj.put("timestamp", feedback.getTimeStamp());
+ obj.put("appkey", weixinAccount.getPaySignKey());
+ String sign = PayUtil.paysignSha(obj);
+ log.info("微信签名----->sign={},vaild_sign={}", sign, feedback.getPaySign());
+ return "success";
+ }
+}
\ No newline at end of file
diff --git a/weixin4j-mp/src/test/java/com/foxinmy/weixin4j/mp/test/msg/CustomTest.java b/weixin4j-mp/src/test/java/com/foxinmy/weixin4j/mp/test/CustomTest.java
similarity index 94%
rename from weixin4j-mp/src/test/java/com/foxinmy/weixin4j/mp/test/msg/CustomTest.java
rename to weixin4j-mp/src/test/java/com/foxinmy/weixin4j/mp/test/CustomTest.java
index ddd8598b..4d24867b 100644
--- a/weixin4j-mp/src/test/java/com/foxinmy/weixin4j/mp/test/msg/CustomTest.java
+++ b/weixin4j-mp/src/test/java/com/foxinmy/weixin4j/mp/test/CustomTest.java
@@ -1,4 +1,4 @@
-package com.foxinmy.weixin4j.mp.test.msg;
+package com.foxinmy.weixin4j.mp.test;
import java.io.File;
import java.io.IOException;
@@ -16,7 +16,6 @@ import com.foxinmy.weixin4j.mp.api.CustomApi;
import com.foxinmy.weixin4j.mp.model.CustomRecord;
import com.foxinmy.weixin4j.mp.model.KfAccount;
import com.foxinmy.weixin4j.mp.model.KfSession;
-import com.foxinmy.weixin4j.mp.test.TokenTest;
/**
* 客服消息测试
diff --git a/weixin4j-mp/src/test/java/com/foxinmy/weixin4j/mp/test/msg/MassMsgTest.java b/weixin4j-mp/src/test/java/com/foxinmy/weixin4j/mp/test/MassTest.java
similarity index 92%
rename from weixin4j-mp/src/test/java/com/foxinmy/weixin4j/mp/test/msg/MassMsgTest.java
rename to weixin4j-mp/src/test/java/com/foxinmy/weixin4j/mp/test/MassTest.java
index 533851fa..67a10321 100644
--- a/weixin4j-mp/src/test/java/com/foxinmy/weixin4j/mp/test/msg/MassMsgTest.java
+++ b/weixin4j-mp/src/test/java/com/foxinmy/weixin4j/mp/test/MassTest.java
@@ -1,4 +1,4 @@
-package com.foxinmy.weixin4j.mp.test.msg;
+package com.foxinmy.weixin4j.mp.test;
import java.io.File;
import java.io.IOException;
@@ -13,8 +13,6 @@ import com.foxinmy.weixin4j.exception.WeixinException;
import com.foxinmy.weixin4j.http.JsonResult;
import com.foxinmy.weixin4j.mp.api.MassApi;
import com.foxinmy.weixin4j.mp.api.MediaApi;
-import com.foxinmy.weixin4j.mp.event.MassEventMessage;
-import com.foxinmy.weixin4j.mp.test.TokenTest;
import com.foxinmy.weixin4j.tuple.Image;
import com.foxinmy.weixin4j.tuple.MpArticle;
import com.foxinmy.weixin4j.tuple.Text;
@@ -30,7 +28,7 @@ import com.foxinmy.weixin4j.type.MediaType;
* @since JDK 1.7
* @see
*/
-public class MassMsgTest extends TokenTest {
+public class MassTest extends TokenTest {
private MassApi massApi;
private MediaApi mediaApi;
@@ -107,7 +105,6 @@ public class MassMsgTest extends TokenTest {
public void getMassNews() throws WeixinException {
String status = massApi.getMassNews("82358");
System.out.println(status);
- System.out.println(MassEventMessage.getStatusDesc(status));
Assert.assertNotNull(status);
}
}
diff --git a/weixin4j-mp/src/test/java/com/foxinmy/weixin4j/mp/test/msg/NotifyMsgTest.java b/weixin4j-mp/src/test/java/com/foxinmy/weixin4j/mp/test/NotifyTest.java
similarity index 92%
rename from weixin4j-mp/src/test/java/com/foxinmy/weixin4j/mp/test/msg/NotifyMsgTest.java
rename to weixin4j-mp/src/test/java/com/foxinmy/weixin4j/mp/test/NotifyTest.java
index fd3323da..4052d141 100644
--- a/weixin4j-mp/src/test/java/com/foxinmy/weixin4j/mp/test/msg/NotifyMsgTest.java
+++ b/weixin4j-mp/src/test/java/com/foxinmy/weixin4j/mp/test/NotifyTest.java
@@ -1,4 +1,4 @@
-package com.foxinmy.weixin4j.mp.test.msg;
+package com.foxinmy.weixin4j.mp.test;
import java.io.File;
import java.io.IOException;
@@ -12,7 +12,6 @@ import com.foxinmy.weixin4j.http.JsonResult;
import com.foxinmy.weixin4j.mp.api.MediaApi;
import com.foxinmy.weixin4j.mp.api.NotifyApi;
import com.foxinmy.weixin4j.mp.message.NotifyMessage;
-import com.foxinmy.weixin4j.mp.test.TokenTest;
import com.foxinmy.weixin4j.tuple.Image;
import com.foxinmy.weixin4j.tuple.Music;
import com.foxinmy.weixin4j.tuple.News;
@@ -30,7 +29,7 @@ import com.foxinmy.weixin4j.type.MediaType;
* @since JDK 1.7
* @see
*/
-public class NotifyMsgTest extends TokenTest {
+public class NotifyTest extends TokenTest {
private NotifyApi notifyApi;
private MediaApi mediaApi;
diff --git a/weixin4j-mp/src/test/java/com/foxinmy/weixin4j/mp/test/msg/TemplateMsgTest.java b/weixin4j-mp/src/test/java/com/foxinmy/weixin4j/mp/test/TemplateTest.java
similarity index 87%
rename from weixin4j-mp/src/test/java/com/foxinmy/weixin4j/mp/test/msg/TemplateMsgTest.java
rename to weixin4j-mp/src/test/java/com/foxinmy/weixin4j/mp/test/TemplateTest.java
index 6614e3c3..a4f7db39 100644
--- a/weixin4j-mp/src/test/java/com/foxinmy/weixin4j/mp/test/msg/TemplateMsgTest.java
+++ b/weixin4j-mp/src/test/java/com/foxinmy/weixin4j/mp/test/TemplateTest.java
@@ -1,4 +1,4 @@
-package com.foxinmy.weixin4j.mp.test.msg;
+package com.foxinmy.weixin4j.mp.test;
import org.junit.Assert;
import org.junit.Before;
@@ -8,10 +8,9 @@ import com.foxinmy.weixin4j.exception.WeixinException;
import com.foxinmy.weixin4j.http.JsonResult;
import com.foxinmy.weixin4j.mp.api.TmplApi;
import com.foxinmy.weixin4j.mp.message.TemplateMessage;
-import com.foxinmy.weixin4j.mp.test.TokenTest;
import com.foxinmy.weixin4j.mp.type.IndustryType;
-public class TemplateMsgTest extends TokenTest {
+public class TemplateTest extends TokenTest {
private TmplApi tmplApi;
@Before
diff --git a/weixin4j-mp/src/test/java/com/foxinmy/weixin4j/mp/test/TokenTest.java b/weixin4j-mp/src/test/java/com/foxinmy/weixin4j/mp/test/TokenTest.java
index 20f48255..ebe58b79 100644
--- a/weixin4j-mp/src/test/java/com/foxinmy/weixin4j/mp/test/TokenTest.java
+++ b/weixin4j-mp/src/test/java/com/foxinmy/weixin4j/mp/test/TokenTest.java
@@ -1,11 +1,5 @@
package com.foxinmy.weixin4j.mp.test;
-import java.net.URL;
-
-import org.jsoup.Jsoup;
-import org.jsoup.nodes.Document;
-import org.jsoup.nodes.Element;
-import org.jsoup.select.Elements;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
@@ -36,19 +30,4 @@ public class TokenTest {
public void test() throws WeixinException {
Assert.assertNotNull(tokenHolder.getToken());
}
-
- public static void main(String[] args) throws Exception {
- String wikiUrl = "http://qydev.weixin.qq.com/wiki/index.php?title=%E5%85%A8%E5%B1%80%E8%BF%94%E5%9B%9E%E7%A0%81%E8%AF%B4%E6%98%8E";
- // wikiUrl =
- // "http://mp.weixin.qq.com/wiki/17/fa4e1434e57290788bde25603fa2fcbd.html";
- Document doc = Jsoup.parse(new URL(wikiUrl), 5000);
- Elements errors = doc.getElementsByTag("tr");
- String node = "%s%s";
- StringBuilder xml = new StringBuilder();
- for (Element error : errors) {
- xml.append(String.format(node, error.child(0).text(), error
- .child(1).text()));
- }
- System.err.println(xml);
- }
}
diff --git a/weixin4j-mp/src/test/java/com/foxinmy/weixin4j/mp/test/msg/AesMsgTest.java b/weixin4j-mp/src/test/java/com/foxinmy/weixin4j/mp/test/msg/AesMsgTest.java
deleted file mode 100644
index c391ec4b..00000000
--- a/weixin4j-mp/src/test/java/com/foxinmy/weixin4j/mp/test/msg/AesMsgTest.java
+++ /dev/null
@@ -1,64 +0,0 @@
-package com.foxinmy.weixin4j.mp.test.msg;
-
-import java.io.IOException;
-
-import org.junit.Assert;
-import org.junit.Test;
-
-import com.foxinmy.weixin4j.exception.WeixinException;
-
-public class AesMsgTest extends MessagePush {
- StringBuilder xmlSb = new StringBuilder();
-
- @Test
- public void testValidate() throws WeixinException, IOException {
- String para = "?signature=0d2366aedb4f3531cfa4297c1e4ea7eece2311d9&echostr=2143641595566077626×tamp=1415951914&nonce=165976363";
- xmlSb.delete(0, xmlSb.length());
- String response = get(para);
- Assert.assertEquals("2143641595566077626", response);
- }
-
- @Test
- public void testType1() throws WeixinException, IOException {
- String para = "?signature=6dd806a20a314723e78bc58742a1b98a7adfd151×tamp=1415979366&nonce=1865915590";
- xmlSb.delete(0, xmlSb.length());
- xmlSb.append("");
- xmlSb.append("");
- xmlSb.append("");
- xmlSb.append("1415979365");
- xmlSb.append("");
- xmlSb.append("");
- xmlSb.append("");
- xmlSb.append("");
- String response = push(para, xmlSb.toString());
- Assert.assertNotNull(response);
- }
-
- @Test
- public void testType2() throws WeixinException, IOException {
- String para = "?signature=ad05f836772d1cbba1ff2edb7be4b9c9fb3a43d5×tamp=1415980001&nonce=1803216865&encrypt_type=raw&msg_signature=c0d38e9ca00548f7142627ec2908a4fe8481025e";
- xmlSb.delete(0, xmlSb.length());
- xmlSb.append("");
- xmlSb.append("");
- xmlSb.append("");
- xmlSb.append("1415980001");
- xmlSb.append("");
- xmlSb.append("");
- xmlSb.append("");
- xmlSb.append("");
- String response = push(para, xmlSb.toString());
- Assert.assertNotNull(response);
- }
-
- @Test
- public void testType3() throws WeixinException, IOException {
- String para = "?signature=ad05f836772d1cbba1ff2edb7be4b9c9fb3a43d5×tamp=1415980001&nonce=1803216865&encrypt_type=aes&msg_signature=c0d38e9ca00548f7142627ec2908a4fe8481025e";
- xmlSb.delete(0, xmlSb.length());
- xmlSb.append("");
- xmlSb.append("");
- xmlSb.append("");
- xmlSb.append("");
- String response = push(para, xmlSb.toString());
- Assert.assertNotNull(response);
- }
-}
diff --git a/weixin4j-mp/src/test/java/com/foxinmy/weixin4j/mp/test/msg/EventMsgTest.java b/weixin4j-mp/src/test/java/com/foxinmy/weixin4j/mp/test/msg/EventMsgTest.java
deleted file mode 100644
index 11783dba..00000000
--- a/weixin4j-mp/src/test/java/com/foxinmy/weixin4j/mp/test/msg/EventMsgTest.java
+++ /dev/null
@@ -1,179 +0,0 @@
-package com.foxinmy.weixin4j.mp.test.msg;
-
-import java.io.IOException;
-
-import org.junit.Assert;
-import org.junit.Test;
-
-import com.foxinmy.weixin4j.exception.WeixinException;
-
-/**
- * 接收事件消息格式测试
- *
- * @author jy.hu
- * @date 2014年3月24日
- * @since JDK 1.7
- */
-public class EventMsgTest extends MessagePush {
-
- private StringBuilder xmlSb = new StringBuilder();
-
- /***************** event message *********************/
- @Test
- public void scribe() throws WeixinException, IOException {
- xmlSb.delete(0, xmlSb.length());
- xmlSb.append("");
- xmlSb.append("");
- xmlSb.append("");
- xmlSb.append("123456789");
- xmlSb.append("");
- xmlSb.append("");
- xmlSb.append("");
- String response = push(xmlSb.toString());
- Assert.assertNotNull(response);
- System.out.println(response);
- }
-
- @Test
- public void scan() throws WeixinException, IOException {
- xmlSb.delete(0, xmlSb.length());
- xmlSb.append("");
- xmlSb.append("");
- xmlSb.append("");
- xmlSb.append("123456789");
- xmlSb.append("");
- xmlSb.append("");
- xmlSb.append("");
- xmlSb.append("");
- xmlSb.append("");
- String response = push(xmlSb.toString());
- Assert.assertNotNull(response);
- System.out.println(response);
- }
-
- @Test
- public void scan_scribe() throws WeixinException, IOException {
- xmlSb.delete(0, xmlSb.length());
- xmlSb.append("");
- xmlSb.append("");
- xmlSb.append("123456789");
- xmlSb.append("");
- xmlSb.append("");
- xmlSb.append("");
- xmlSb.append("");
- xmlSb.append("");
- String response = push(xmlSb.toString());
- Assert.assertNotNull(response);
- System.out.println(response);
- }
-
- @Test
- public void location() throws WeixinException, IOException {
- xmlSb.delete(0, xmlSb.length());
- xmlSb.append("");
- xmlSb.append("");
- xmlSb.append("");
- xmlSb.append("123456789");
- xmlSb.append("");
- xmlSb.append("");
- xmlSb.append("23.137466");
- xmlSb.append("113.352425");
- xmlSb.append("119.385040");
- xmlSb.append("");
- String response = push(xmlSb.toString());
- Assert.assertNotNull(response);
- System.out.println(response);
- }
-
- @Test
- public void menu_click() throws WeixinException, IOException {
- xmlSb.delete(0, xmlSb.length());
- xmlSb.append("");
- xmlSb.append("");
- xmlSb.append("");
- xmlSb.append("123456789");
- xmlSb.append("");
- xmlSb.append("");
- xmlSb.append("");
- xmlSb.append("");
- String response = push(xmlSb.toString());
- Assert.assertNotNull(response);
- System.out.println(response);
- }
-
- @Test
- public void menu_link() throws WeixinException, IOException {
- xmlSb.delete(0, xmlSb.length());
- xmlSb.append("");
- xmlSb.append("");
- xmlSb.append("");
- xmlSb.append("123456789");
- xmlSb.append("");
- xmlSb.append("");
- xmlSb.append("");
- xmlSb.append("");
- String response = push(xmlSb.toString());
- Assert.assertNotNull(response);
- System.out.println(response);
- }
-
- @Test
- public void menu_scan() throws WeixinException, IOException {
- xmlSb.delete(0, xmlSb.length());
- xmlSb.append("");
- xmlSb.append("");
- xmlSb.append("");
- xmlSb.append("123456789");
- xmlSb.append("");
- xmlSb.append("");
- xmlSb.append("");
- xmlSb.append("");
- xmlSb.append("");
- xmlSb.append("");
-
- xmlSb.append("");
- String response = push(xmlSb.toString());
- Assert.assertNotNull(response);
- System.out.println(response);
- }
-
- @Test
- public void menu_photo() throws WeixinException, IOException {
- xmlSb.delete(0, xmlSb.length());
- xmlSb.append("");
- xmlSb.append("");
- xmlSb.append("");
- xmlSb.append("123456789");
- xmlSb.append("");
- xmlSb.append("");
- xmlSb.append("");
- xmlSb.append("1");
- xmlSb.append("- ");
- xmlSb.append("
");
- xmlSb.append("");
- String response = push(xmlSb.toString());
- Assert.assertNotNull(response);
- System.out.println(response);
- }
-
- @Test
- public void menu_location() throws WeixinException, IOException {
- xmlSb.delete(0, xmlSb.length());
- xmlSb.append("");
- xmlSb.append("");
- xmlSb.append("");
- xmlSb.append("123456789");
- xmlSb.append("");
- xmlSb.append("");
- xmlSb.append("");
- xmlSb.append("");
- xmlSb.append("");
- xmlSb.append("");
- xmlSb.append("");
- xmlSb.append("");
- xmlSb.append("");
- String response = push(xmlSb.toString());
- Assert.assertNotNull(response);
- System.out.println(response);
- }
-}
diff --git a/weixin4j-mp/src/test/java/com/foxinmy/weixin4j/mp/test/msg/InMsgTest.java b/weixin4j-mp/src/test/java/com/foxinmy/weixin4j/mp/test/msg/InMsgTest.java
deleted file mode 100644
index a2eb4910..00000000
--- a/weixin4j-mp/src/test/java/com/foxinmy/weixin4j/mp/test/msg/InMsgTest.java
+++ /dev/null
@@ -1,144 +0,0 @@
-package com.foxinmy.weixin4j.mp.test.msg;
-
-import java.io.IOException;
-
-import org.junit.Assert;
-import org.junit.Test;
-
-import com.foxinmy.weixin4j.exception.WeixinException;
-
-/**
- * 接受一般消息格式测试
- *
- * @author jy.hu
- * @date 2014年3月24日
- * @since JDK 1.7
- */
-public class InMsgTest extends MessagePush {
-
- private StringBuilder xmlSb = new StringBuilder();
-
- /***************** common message *********************/
-
- @Test
- public void text() throws WeixinException, IOException {
- xmlSb.delete(0, xmlSb.length());
- xmlSb.append("");
- xmlSb.append("");
- xmlSb.append("");
- xmlSb.append("1348831860");
- xmlSb.append("");
- xmlSb.append("");
- xmlSb.append("1234567890123456");
- xmlSb.append("");
- String response = push(xmlSb.toString());
- Assert.assertNotNull(response);
- System.out.println(response);
- }
-
- @Test
- public void image() throws WeixinException, IOException {
- xmlSb.delete(0, xmlSb.length());
- xmlSb.append("");
- xmlSb.append("");
- xmlSb.append("");
- xmlSb.append("123456789");
- xmlSb.append("");
- xmlSb.append("");
- xmlSb.append("");
- xmlSb.append("1234567890123456");
- xmlSb.append("");
- String response = push(xmlSb.toString());
- Assert.assertNotNull(response);
- System.out.println(response);
- }
-
- @Test
- public void voice() throws WeixinException, IOException {
- xmlSb.delete(0, xmlSb.length());
- xmlSb.append("");
- xmlSb.append("");
- xmlSb.append("");
- xmlSb.append("123456789");
- xmlSb.append("");
- xmlSb.append("");
- xmlSb.append("");
- xmlSb.append("1234567890123456");
- xmlSb.append("");
- String response = push(xmlSb.toString());
- Assert.assertNotNull(response);
- System.out.println(response);
- }
-
- @Test
- public void re_voice() throws WeixinException, IOException {
- xmlSb.delete(0, xmlSb.length());
- xmlSb.append("");
- xmlSb.append("");
- xmlSb.append("");
- xmlSb.append("123456789");
- xmlSb.append("");
- xmlSb.append("");
- xmlSb.append("");
- xmlSb.append("");
- xmlSb.append("1234567890123456");
- xmlSb.append("");
- String response = push(xmlSb.toString());
- Assert.assertNotNull(response);
- System.out.println(response);
- }
-
- @Test
- public void video() throws WeixinException, IOException {
- xmlSb.delete(0, xmlSb.length());
- xmlSb.append("");
- xmlSb.append("");
- xmlSb.append("");
- xmlSb.append("123456789");
- xmlSb.append("");
- xmlSb.append("");
- xmlSb.append("");
- xmlSb.append("1234567890123456");
- xmlSb.append("");
- String response = push(xmlSb.toString());
- Assert.assertNotNull(response);
- System.out.println(response);
- }
-
- @Test
- public void location() throws WeixinException, IOException {
- xmlSb.delete(0, xmlSb.length());
- xmlSb.append("");
- xmlSb.append("");
- xmlSb.append("");
- xmlSb.append("123456789");
- xmlSb.append("");
- xmlSb.append("23.134521");
- xmlSb.append("113.358803");
- xmlSb.append("20");
- xmlSb.append("");
- xmlSb.append("1234567890123456");
- xmlSb.append("");
- String response = push(xmlSb.toString());
- Assert.assertNotNull(response);
- System.out.println(response);
- }
-
- @Test
- public void link() throws WeixinException, IOException {
- xmlSb.delete(0, xmlSb.length());
- xmlSb.append("");
- xmlSb.append("");
- xmlSb.append("");
- xmlSb.append("123456789");
- xmlSb.append("");
- xmlSb.append("");
- xmlSb.append("");
- xmlSb.append("");
- xmlSb.append("1234567890123456");
- xmlSb.append("");
- String response = push(xmlSb.toString());
- Assert.assertNotNull(response);
- System.out.println(response);
- }
-}
diff --git a/weixin4j-mp/src/test/java/com/foxinmy/weixin4j/mp/test/msg/MessagePush.java b/weixin4j-mp/src/test/java/com/foxinmy/weixin4j/mp/test/msg/MessagePush.java
deleted file mode 100644
index 220bfd8d..00000000
--- a/weixin4j-mp/src/test/java/com/foxinmy/weixin4j/mp/test/msg/MessagePush.java
+++ /dev/null
@@ -1,68 +0,0 @@
-package com.foxinmy.weixin4j.mp.test.msg;
-
-import java.io.IOException;
-import java.net.URI;
-import java.nio.charset.StandardCharsets;
-
-import org.apache.http.HttpResponse;
-import org.apache.http.HttpStatus;
-import org.apache.http.StatusLine;
-import org.apache.http.client.HttpClient;
-import org.apache.http.client.methods.HttpGet;
-import org.apache.http.client.methods.HttpPost;
-import org.apache.http.entity.StringEntity;
-import org.apache.http.impl.client.DefaultHttpClient;
-import org.apache.http.util.EntityUtils;
-
-import com.foxinmy.weixin4j.exception.WeixinException;
-
-public class MessagePush {
-
- private final String server = "http://localhost:8080";
- private final HttpClient httpClient;
- private final HttpPost httpPost;
- private final HttpGet httpGet;
-
- public MessagePush() {
- httpClient = new DefaultHttpClient();
- httpPost = new HttpPost();
- httpPost.setURI(URI.create(server));
-
- httpGet = new HttpGet();
- httpGet.setURI(URI.create(server));
- }
-
- public String get(String para) throws WeixinException, IOException {
- httpGet.setURI(URI.create(server + para));
- HttpResponse httpResponse = httpClient.execute(httpGet);
- return entity(httpResponse);
- }
-
- public String push(String xml) throws WeixinException, IOException {
- return push("", xml);
- }
-
- public String push(String para, String xml) throws WeixinException,
- IOException {
- httpPost.setURI(URI.create(server + para));
- httpPost.setEntity(new StringEntity(xml, StandardCharsets.UTF_8));
- HttpResponse httpResponse = httpClient.execute(httpPost);
- return entity(httpResponse);
- }
-
- private String entity(HttpResponse httpResponse) throws WeixinException,
- IOException {
- StatusLine statusLine = httpResponse.getStatusLine();
-
- int status = statusLine.getStatusCode();
- if (status != HttpStatus.SC_OK) {
- throw new WeixinException(Integer.toString(status), "request fail");
- }
- if (status == HttpStatus.SC_MOVED_PERMANENTLY
- || status == HttpStatus.SC_MOVED_TEMPORARILY) {
- throw new WeixinException(Integer.toString(status), "uri moved");
- }
- return EntityUtils.toString(httpResponse.getEntity(),
- StandardCharsets.UTF_8);
- }
-}
\ No newline at end of file
diff --git a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/api/MediaApi.java b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/api/MediaApi.java
index 21e992bf..441824d6 100644
--- a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/api/MediaApi.java
+++ b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/api/MediaApi.java
@@ -10,7 +10,6 @@ import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
-import org.apache.commons.lang3.StringUtils;
import org.apache.http.entity.mime.content.ByteArrayBody;
import com.alibaba.fastjson.JSON;
@@ -30,6 +29,7 @@ import com.foxinmy.weixin4j.type.MediaType;
import com.foxinmy.weixin4j.util.ConfigUtil;
import com.foxinmy.weixin4j.util.FileUtil;
import com.foxinmy.weixin4j.util.IOUtil;
+import com.foxinmy.weixin4j.util.StringUtil;
/**
* 媒体相关API
@@ -62,7 +62,7 @@ public class MediaApi extends QyApi {
*/
public String uploadMedia(File file) throws WeixinException, IOException {
String mediaTypeKey = IOUtil.getExtension(file.getName());
- if (StringUtils.isBlank(mediaTypeKey)) {
+ if (StringUtil.isBlank(mediaTypeKey)) {
mediaTypeKey = FileUtil.getFileType(file);
}
MediaType mediaType = MediaType.getMediaType(mediaTypeKey);
@@ -237,7 +237,7 @@ public class MediaApi extends QyApi {
return true;
}
});
- writer.write(StringUtils.join(column.values(), ","));
+ writer.write(StringUtil.join(column.values(), ','));
writer.write("\r\n");
}
String mediaId = uploadMedia(batchName,
diff --git a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/api/UserApi.java b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/api/UserApi.java
index 995c3f72..eb9b14ea 100644
--- a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/api/UserApi.java
+++ b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/api/UserApi.java
@@ -3,8 +3,6 @@ package com.foxinmy.weixin4j.qy.api;
import java.util.ArrayList;
import java.util.List;
-import org.apache.commons.lang3.StringUtils;
-
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
@@ -16,6 +14,7 @@ import com.foxinmy.weixin4j.qy.model.User;
import com.foxinmy.weixin4j.qy.type.InviteType;
import com.foxinmy.weixin4j.qy.type.UserStatus;
import com.foxinmy.weixin4j.token.TokenHolder;
+import com.foxinmy.weixin4j.util.StringUtil;
/**
* 成员API
@@ -282,7 +281,7 @@ public class UserApi extends QyApi {
throws WeixinException {
JSONObject obj = new JSONObject();
obj.put("userid", userId);
- if (StringUtils.isBlank(tips)) {
+ if (StringUtil.isBlank(tips)) {
obj.put("invite_tips", tips);
}
String invite_user_uri = getRequestUri("invite_user_uri");
diff --git a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/event/BatchjobresultMessage.java b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/event/BatchjobresultMessage.java
deleted file mode 100644
index 69bbabe6..00000000
--- a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/event/BatchjobresultMessage.java
+++ /dev/null
@@ -1,100 +0,0 @@
-package com.foxinmy.weixin4j.qy.event;
-
-import java.io.Serializable;
-
-import com.foxinmy.weixin4j.message.event.EventMessage;
-import com.foxinmy.weixin4j.qy.type.EventType;
-import com.thoughtworks.xstream.annotations.XStreamAlias;
-
-/**
- * 异步任务事件完成通知
- *
- * @className BatchjobresultMessage
- * @author jy
- * @date 2015年3月31日
- * @since JDK 1.7
- * @see 异步任务事件完成通知
- */
-public class BatchjobresultMessage extends EventMessage {
-
- private static final long serialVersionUID = 8014540441322209657L;
-
- public BatchjobresultMessage() {
- super(EventType.batch_job_result.name());
- }
-
- /**
- * 任务信息
- */
- @XStreamAlias("BatchJob")
- private BatchJob batchJob;
-
- public BatchJob getBatchJob() {
- return batchJob;
- }
-
- /**
- * 任务信息
- *
- * @className BatchJob
- * @author jy
- * @date 2015年4月1日
- * @since JDK 1.7
- * @see
- */
- public static class BatchJob implements Serializable {
- private static final long serialVersionUID = -7520032656787156391L;
- /**
- * 异步任务id,最大长度为64字符
- */
- @XStreamAlias("JobId")
- private String jobId;
- /**
- * 操作类型,字符串,目前分别有: 1. sync_user(增量更新成员) 2. replace_user(全量覆盖成员) 3.
- * invite_user(邀请成员关注) 4. replace_party(全量覆盖部门)
- *
- * @see com.foxinmy.weixin4j.qy.type.BatchType
- */
- @XStreamAlias("JobType")
- private String jobType;
- /**
- * 返回码
- */
- @XStreamAlias("ErrCode")
- private String ErrCode;
- /**
- * 对返回码的文本描述内容
- */
- @XStreamAlias("ErrMsg")
- private String errMsg;
-
- public String getJobId() {
- return jobId;
- }
-
- public String getJobType() {
- return jobType;
- }
-
- public String getErrCode() {
- return ErrCode;
- }
-
- public String getErrMsg() {
- return errMsg;
- }
-
- @Override
- public String toString() {
- return "[jobId=" + jobId + ", jobType=" + jobType + ", ErrCode="
- + ErrCode + ", errMsg=" + errMsg + "]";
- }
- }
-
- @Override
- public String toString() {
- return "BatchjobresultMessage [batchJob=" + batchJob + ", "
- + super.toString() + "]";
- }
-}
diff --git a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/event/EnterAgentEventMessage.java b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/event/EnterAgentEventMessage.java
deleted file mode 100644
index 3108a833..00000000
--- a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/event/EnterAgentEventMessage.java
+++ /dev/null
@@ -1,41 +0,0 @@
-package com.foxinmy.weixin4j.qy.event;
-
-import com.foxinmy.weixin4j.message.event.EventMessage;
-import com.foxinmy.weixin4j.qy.type.EventType;
-import com.thoughtworks.xstream.annotations.XStreamAlias;
-
-/**
- * 用户进入应用的事件推送(企业号)本事件只有在应用的回调模式中打开上报开关时上报
- *
- * @className EnterAgentEventMessage
- * @author jy
- * @date 2014年12月28日
- * @since JDK 1.7
- * @see 用户进入应用的事件推送
- */
-public class EnterAgentEventMessage extends EventMessage {
-
- private static final long serialVersionUID = 7675732524832500820L;
-
- public EnterAgentEventMessage() {
- super(EventType.enter_agent.name());
- }
-
- /**
- * 事件KEY值,与自定义菜单接口中KEY值对应
- */
- @XStreamAlias("EventKey")
- private String eventKey;
-
- public String getEventKey() {
- return eventKey;
- }
-
- @Override
- public String toString() {
- return "EnterAgentEventMessage [eventKey=" + eventKey + ", "
- + super.toString() + "]";
- }
-}
diff --git a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/event/ScribeEventMessage.java b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/event/ScribeEventMessage.java
deleted file mode 100644
index 86414e6d..00000000
--- a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/event/ScribeEventMessage.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package com.foxinmy.weixin4j.qy.event;
-
-import com.foxinmy.weixin4j.message.event.EventMessage;
-import com.foxinmy.weixin4j.type.EventType;
-
-/**
- * 关注/取消关注事件 包括直接关注与扫描关注
- *
- * @className ScribeEventMessage
- * @author jy.hu
- * @date 2014年4月6日
- * @since JDK 1.7
- * @see 成员关注/取消关注事件
- */
-public class ScribeEventMessage extends EventMessage {
-
- private static final long serialVersionUID = -6846321620262204915L;
-
- public ScribeEventMessage() {
- super(EventType.subscribe.name());
- }
-
- @Override
- public String toString() {
- return "ScribeEventMessage [" + super.toString() + "]";
- }
-}
diff --git a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/message/NotifyMessage.java b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/message/NotifyMessage.java
index c4651b2f..1b761714 100644
--- a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/message/NotifyMessage.java
+++ b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/message/NotifyMessage.java
@@ -3,10 +3,9 @@ package com.foxinmy.weixin4j.qy.message;
import java.io.Serializable;
import java.util.List;
-import org.apache.commons.lang3.StringUtils;
-
import com.alibaba.fastjson.annotation.JSONField;
import com.foxinmy.weixin4j.tuple.NotifyTuple;
+import com.foxinmy.weixin4j.util.StringUtil;
/**
* 发送消息对象
@@ -29,7 +28,7 @@ public class NotifyMessage implements Serializable {
private static final long serialVersionUID = 1219589414293000383L;
- private static final String SEPARATOR = "|";
+ private static final char SEPARATOR = '|';
/**
* UserID列表(消息接收者,多个接收者用‘|’分隔)。特殊情况:指定为@all,则向关注该企业应用的全部成员发送
@@ -65,13 +64,13 @@ public class NotifyMessage implements Serializable {
public NotifyMessage(List tousers, List topartys,
List totags, NotifyTuple tuple, int agentid, boolean isSafe) {
if (tousers != null && !tousers.isEmpty()) {
- this.touser = StringUtils.join(tousers, SEPARATOR);
+ this.touser = StringUtil.join(tousers, SEPARATOR);
}
if (topartys != null && !topartys.isEmpty()) {
- this.toparty = StringUtils.join(topartys, SEPARATOR);
+ this.toparty = StringUtil.join(topartys, SEPARATOR);
}
if (totags != null && !totags.isEmpty()) {
- this.totag = StringUtils.join(totags, SEPARATOR);
+ this.totag = StringUtil.join(totags, SEPARATOR);
}
this.agentid = agentid;
this.safe = isSafe ? 1 : 0;
@@ -88,7 +87,7 @@ public class NotifyMessage implements Serializable {
public void setTouser(List tousers) {
if (tousers != null && !tousers.isEmpty()) {
- this.touser = StringUtils.join(tousers, SEPARATOR);
+ this.touser = StringUtil.join(tousers, SEPARATOR);
}
}
@@ -102,7 +101,7 @@ public class NotifyMessage implements Serializable {
public void setToparty(List topartys) {
if (topartys != null && !topartys.isEmpty()) {
- this.toparty = StringUtils.join(topartys, SEPARATOR);
+ this.toparty = StringUtil.join(topartys, SEPARATOR);
}
}
@@ -116,7 +115,7 @@ public class NotifyMessage implements Serializable {
public void setTotag(List totags) {
if (totags != null && !totags.isEmpty()) {
- this.totag = StringUtils.join(totags, SEPARATOR);
+ this.totag = StringUtil.join(totags, SEPARATOR);
}
}
diff --git a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/model/IdParameter.java b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/model/IdParameter.java
index 8306b7de..e4dc62af 100644
--- a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/model/IdParameter.java
+++ b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/model/IdParameter.java
@@ -4,7 +4,7 @@ import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
-import org.apache.commons.lang3.StringUtils;
+import com.foxinmy.weixin4j.util.StringUtil;
/**
* id参数集
@@ -19,6 +19,8 @@ public class IdParameter implements Serializable {
private static final long serialVersionUID = -2689758682205591133L;
+ private static final char SEPARATOR = '|';
+
private Map parameterMap;
public IdParameter() {
@@ -32,7 +34,7 @@ public class IdParameter implements Serializable {
* @return
*/
public IdParameter putUseIds(String... userIds) {
- parameterMap.put("touser", StringUtils.join(userIds, '|'));
+ parameterMap.put("touser", StringUtil.join(userIds, SEPARATOR));
return this;
}
@@ -43,7 +45,7 @@ public class IdParameter implements Serializable {
* @return
*/
public IdParameter putUseIds(int... partyIds) {
- parameterMap.put("toparty", StringUtils.join(partyIds, '|'));
+ parameterMap.put("toparty", StringUtil.join(partyIds, SEPARATOR));
return this;
}
@@ -54,7 +56,7 @@ public class IdParameter implements Serializable {
* @return
*/
public IdParameter putTagIds(int... tagIds) {
- parameterMap.put("totag", StringUtils.join(tagIds, '|'));
+ parameterMap.put("totag", StringUtil.join(tagIds, SEPARATOR));
return this;
}
diff --git a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/type/EventType.java b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/type/EventType.java
deleted file mode 100644
index f9814152..00000000
--- a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/type/EventType.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package com.foxinmy.weixin4j.qy.type;
-
-/**
- * 企业号事件类型
- *
- * @className EventType
- * @author jy
- * @date 2014年9月30日
- * @since JDK 1.7
- * @see
- */
-public enum EventType {
- /**
- * 进入企业号应用事件
- *
- * @see com.foxinmy.weixin4j.qy.event.EnterAgentEventMessage
- */
- enter_agent,
- /**
- * 异步任务完成事件
- *
- * @see com.foxinmy.weixin4j.msg.event.BatchjobresultMessage
- */
- batch_job_result;
-}
diff --git a/weixin4j-qy/src/test/java/com/foxinmy/weixin4j/qy/test/AesMsgTest.java b/weixin4j-qy/src/test/java/com/foxinmy/weixin4j/qy/test/AesMsgTest.java
deleted file mode 100644
index a6d0c52b..00000000
--- a/weixin4j-qy/src/test/java/com/foxinmy/weixin4j/qy/test/AesMsgTest.java
+++ /dev/null
@@ -1,64 +0,0 @@
-package com.foxinmy.weixin4j.qy.test;
-
-import java.io.IOException;
-
-import org.junit.Assert;
-import org.junit.Test;
-
-import com.foxinmy.weixin4j.exception.WeixinException;
-
-public class AesMsgTest extends MessagePush {
- StringBuilder xmlSb = new StringBuilder();
-
- @Test
- public void testValidate() throws WeixinException, IOException {
- String para = "?msg_signature=33f680b72cfd87a6f8f4d751575bcc31266853a9×tamp=1416488666&nonce=1358224345&echostr=WZu9tT6KDuyhgOZ1aT%2FIoPNaUkA%2FsfVR%2F%2BDua5q84Kvhs6Fc1%2F6f2510%2BUuMByessdQWsoeak0lSIpaYOIlHrw%3D%3D";
- xmlSb.delete(0, xmlSb.length());
- String response = get(para);
- Assert.assertEquals("2143641595566077626", response);
- }
-
- @Test
- public void testType1() throws WeixinException, IOException {
- String para = "?signature=6dd806a20a314723e78bc58742a1b98a7adfd151×tamp=1415979366&nonce=1865915590";
- xmlSb.delete(0, xmlSb.length());
- xmlSb.append("");
- xmlSb.append("");
- xmlSb.append("");
- xmlSb.append("1415979365");
- xmlSb.append("");
- xmlSb.append("");
- xmlSb.append("");
- xmlSb.append("");
- String response = push(para, xmlSb.toString());
- Assert.assertNotNull(response);
- }
-
- @Test
- public void testType2() throws WeixinException, IOException {
- String para = "?signature=ad05f836772d1cbba1ff2edb7be4b9c9fb3a43d5×tamp=1415980001&nonce=1803216865&encrypt_type=raw&msg_signature=c0d38e9ca00548f7142627ec2908a4fe8481025e";
- xmlSb.delete(0, xmlSb.length());
- xmlSb.append("");
- xmlSb.append("");
- xmlSb.append("");
- xmlSb.append("1415980001");
- xmlSb.append("");
- xmlSb.append("");
- xmlSb.append("");
- xmlSb.append("");
- String response = push(para, xmlSb.toString());
- Assert.assertNotNull(response);
- }
-
- @Test
- public void testType3() throws WeixinException, IOException {
- String para = "?signature=ad05f836772d1cbba1ff2edb7be4b9c9fb3a43d5×tamp=1415980001&nonce=1803216865&encrypt_type=aes&msg_signature=c0d38e9ca00548f7142627ec2908a4fe8481025e";
- xmlSb.delete(0, xmlSb.length());
- xmlSb.append("");
- xmlSb.append("");
- xmlSb.append("");
- xmlSb.append("");
- String response = push(para, xmlSb.toString());
- Assert.assertNotNull(response);
- }
-}
diff --git a/weixin4j-qy/src/test/java/com/foxinmy/weixin4j/qy/test/MessagePush.java b/weixin4j-qy/src/test/java/com/foxinmy/weixin4j/qy/test/MessagePush.java
deleted file mode 100644
index 39487bc3..00000000
--- a/weixin4j-qy/src/test/java/com/foxinmy/weixin4j/qy/test/MessagePush.java
+++ /dev/null
@@ -1,68 +0,0 @@
-package com.foxinmy.weixin4j.qy.test;
-
-import java.io.IOException;
-import java.net.URI;
-import java.nio.charset.StandardCharsets;
-
-import org.apache.http.HttpResponse;
-import org.apache.http.HttpStatus;
-import org.apache.http.StatusLine;
-import org.apache.http.client.HttpClient;
-import org.apache.http.client.methods.HttpGet;
-import org.apache.http.client.methods.HttpPost;
-import org.apache.http.entity.StringEntity;
-import org.apache.http.impl.client.DefaultHttpClient;
-import org.apache.http.util.EntityUtils;
-
-import com.foxinmy.weixin4j.exception.WeixinException;
-
-public class MessagePush {
-
- private final String server = "http://localhost:8090";
- private final HttpClient httpClient;
- private final HttpPost httpPost;
- private final HttpGet httpGet;
-
- public MessagePush() {
- httpClient = new DefaultHttpClient();
- httpPost = new HttpPost();
- httpPost.setURI(URI.create(server));
-
- httpGet = new HttpGet();
- httpGet.setURI(URI.create(server));
- }
-
- public String get(String para) throws WeixinException, IOException {
- httpGet.setURI(URI.create(server + para));
- HttpResponse httpResponse = httpClient.execute(httpGet);
- return entity(httpResponse);
- }
-
- public String push(String xml) throws WeixinException, IOException {
- return push("", xml);
- }
-
- public String push(String para, String xml) throws WeixinException,
- IOException {
- httpPost.setURI(URI.create(server + para));
- httpPost.setEntity(new StringEntity(xml, StandardCharsets.UTF_8));
- HttpResponse httpResponse = httpClient.execute(httpPost);
- return entity(httpResponse);
- }
-
- private String entity(HttpResponse httpResponse) throws WeixinException,
- IOException {
- StatusLine statusLine = httpResponse.getStatusLine();
-
- int status = statusLine.getStatusCode();
- if (status != HttpStatus.SC_OK) {
- throw new WeixinException(Integer.toString(status), "request fail");
- }
- if (status == HttpStatus.SC_MOVED_PERMANENTLY
- || status == HttpStatus.SC_MOVED_TEMPORARILY) {
- throw new WeixinException(Integer.toString(status), "uri moved");
- }
- return EntityUtils.toString(httpResponse.getEntity(),
- StandardCharsets.UTF_8);
- }
-}
\ No newline at end of file
diff --git a/weixin4j-server/src/main/java/com/foxinmy/weixin4j/startup/WeixinServerBootstrap.java b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/startup/WeixinServerBootstrap.java
index 77419e93..3bfe102f 100644
--- a/weixin4j-server/src/main/java/com/foxinmy/weixin4j/startup/WeixinServerBootstrap.java
+++ b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/startup/WeixinServerBootstrap.java
@@ -130,7 +130,7 @@ public final class WeixinServerBootstrap {
new WeixinServerInitializer(aesToken,
messageDispatcher));
Channel ch = b.bind(serverPort).sync().channel();
- System.err.println("weixin server startup OK:" + serverPort);
+ System.err.println("weixin4j server startup OK:" + serverPort);
ch.closeFuture().sync();
} catch (WeixinException e) {
throw e;
diff --git a/weixin4j-server/src/main/java/com/foxinmy/weixin4j/xml/EncryptMessageHandler.java b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/xml/EncryptMessageHandler.java
index 98d79af9..8da8f74a 100644
--- a/weixin4j-server/src/main/java/com/foxinmy/weixin4j/xml/EncryptMessageHandler.java
+++ b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/xml/EncryptMessageHandler.java
@@ -16,32 +16,28 @@ public class EncryptMessageHandler extends DefaultHandler {
private String encryptContent;
- private String currentQName;
-
@Override
public void startDocument() throws SAXException {
encryptContent = null;
- currentQName = null;
}
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
- this.currentQName = qName;
+ if (qName.equalsIgnoreCase("encrypt")) {
+ return;
+ }
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
- this.currentQName = null;
}
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
- if (currentQName.equalsIgnoreCase("encrypt")) {
this.encryptContent = new String(ch, start, length);
- }
}
public String getEncryptContent() {
diff --git a/weixin4j-server/src/test/java/com/foxinmy/weixin4j/server/test/MessageServerStarup.java b/weixin4j-server/src/test/java/com/foxinmy/weixin4j/server/test/MessageServerStarup.java
index cc49bcc8..3a287945 100644
--- a/weixin4j-server/src/test/java/com/foxinmy/weixin4j/server/test/MessageServerStarup.java
+++ b/weixin4j-server/src/test/java/com/foxinmy/weixin4j/server/test/MessageServerStarup.java
@@ -25,9 +25,9 @@ import com.foxinmy.weixin4j.startup.WeixinServerBootstrap;
*/
public class MessageServerStarup {
- final String appid = "公众号appid";
- final String token = "开发者token";
- final String aesKey = "aes加密密钥";
+ final String appid = "wx0d1d598c0c03c999";
+ final String token = "carsonliu13450438112";
+ final String aesKey = "vlrw8zK2UDSV7Hbmkl8ThzSBmdC11Lw95Um9b2dg3w1";
/**
* 明文模式