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("<![CDATA[公众平台官网链接]]>"); - 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"; /** * 明文模式