From 5b8666d2f0d7b50895320a927f80bf5c8c85e546 Mon Sep 17 00:00:00 2001 From: "jy.hu" Date: Thu, 18 Dec 2014 11:32:14 +0800 Subject: [PATCH] clear code with findbugs plugin and change the version to 1.1 --- README.md | 6 ++ pom.xml | 14 +++- weixin4j-base/pom.xml | 3 +- .../weixin4j/action/AbstractAction.java | 4 +- .../com/foxinmy/weixin4j/api/BaseApi.java | 13 ++- .../com/foxinmy/weixin4j/http/Response.java | 79 +++++++++++-------- .../com/foxinmy/weixin4j/model/BaseMsg.java | 15 ++++ .../com/foxinmy/weixin4j/model/Token.java | 13 +-- .../event/menu/MenuLocationEventMessage.java | 7 +- .../msg/event/menu/MenuPhotoEventMessage.java | 11 ++- .../msg/event/menu/MenuScanEventMessage.java | 7 +- .../weixin4j/response/ResponseMessage.java | 7 +- .../weixin4j/token/FileTokenHolder.java | 6 +- .../com/foxinmy/weixin4j/util/ConfigUtil.java | 7 +- .../com/foxinmy/weixin4j/util/FileUtil.java | 19 +++-- .../foxinmy/weixin4j/util/MessageUtil.java | 4 +- .../foxinmy/weixin4j/util/PKCS7Encoder.java | 6 +- .../xml/{XStream.java => XmlStream.java} | 18 ++--- weixin4j-mp/pom.xml | 9 +-- weixin4j-mp/weixin4j-mp-api/pom.xml | 12 ++- .../com/foxinmy/weixin4j/mp/WeixinProxy.java | 16 ++-- .../foxinmy/weixin4j/mp/api/HelperApi.java | 2 +- .../com/foxinmy/weixin4j/mp/api/MediaApi.java | 30 +++++-- .../com/foxinmy/weixin4j/mp/api/MenuApi.java | 2 +- .../com/foxinmy/weixin4j/mp/api/MpApi.java | 6 ++ .../com/foxinmy/weixin4j/mp/api/PayApi.java | 65 ++++++++++----- .../com/foxinmy/weixin4j/mp/api/QrApi.java | 30 +++++-- .../weixin4j/mp/model/CustomRecord.java | 2 +- .../com/foxinmy/weixin4j/mp/model/Group.java | 10 +++ .../foxinmy/weixin4j/mp/model/SemQuery.java | 10 +-- .../com/foxinmy/weixin4j/mp/model/User.java | 25 ++++++ .../foxinmy/weixin4j/mp/payment/PayUtil.java | 12 +-- .../weixin4j/mp/payment/RefundConverter.java | 4 +- .../foxinmy/weixin4j/mp/payment/v3/Order.java | 2 + .../weixin4j/mp/spider/WeixinExecutor.java | 8 +- .../foxinmy/weixin4j/mp/util/ExcelUtil.java | 52 ++++++------ weixin4j-mp/weixin4j-mp-server/pom.xml | 2 +- .../foxinmy/weixin4j/mp/action/PayAction.java | 27 +++---- .../mp/server/WeixinMessageDecoder.java | 4 +- .../mp/server/WeixinMessageEncoder.java | 6 +- .../foxinmy/weixin4j/mp/util/HttpUtil.java | 8 +- weixin4j-qy/pom.xml | 9 +-- weixin4j-qy/weixin4j-qy-api/pom.xml | 10 ++- .../com/foxinmy/weixin4j/qy/api/MediaApi.java | 28 +++++-- .../com/foxinmy/weixin4j/qy/api/QyApi.java | 6 ++ weixin4j-qy/weixin4j-qy-server/pom.xml | 2 +- .../qy/server/WeixinMessageDecoder.java | 4 +- .../qy/server/WeixinMessageEncoder.java | 6 +- .../foxinmy/weixin4j/qy/util/HttpUtil.java | 2 +- 49 files changed, 419 insertions(+), 231 deletions(-) rename weixin4j-base/src/main/java/com/foxinmy/weixin4j/xml/{XStream.java => XmlStream.java} (81%) diff --git a/README.md b/README.md index 6d088d2b..4fefb71d 100644 --- a/README.md +++ b/README.md @@ -191,6 +191,12 @@ netty的代码没有放到maven中心仓库,也没什么意义,因为最终需 + **weixin4j-mp**: 新增群发消息预览、状态查询接口 + **weixin4j-mp**: 新增多客服添加账号、更新账号、上传头像、删除账号接口 + +* 2014-12-18 + + + clear code with findbugs plugin + + + change the version to 1.1 接下来 ------ diff --git a/pom.xml b/pom.xml index 8792588e..93a9d3df 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 com.foxinmy weixin4j - 1.0-SNAPSHOT + 1.1-SNAPSHOT pom weixin4j https://github.com/foxinmy/weixin4j @@ -71,6 +71,7 @@ 2.10.1 2.8.2 1.5 + 2.18 @@ -192,6 +193,14 @@ + + org.apache.maven.plugins + maven-surefire-plugin + ${maven.surefire.plugin.version} + + true + + @@ -241,9 +250,6 @@ - - true - diff --git a/weixin4j-base/pom.xml b/weixin4j-base/pom.xml index e136700d..624fd516 100644 --- a/weixin4j-base/pom.xml +++ b/weixin4j-base/pom.xml @@ -5,10 +5,11 @@ com.foxinmy weixin4j - 1.0-SNAPSHOT + 1.1-SNAPSHOT weixin4j-base weixin4j-base + 微信开发基础工程 https://github.com/foxinmy/weixin4j/tree/master/weixin4j-base diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/action/AbstractAction.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/action/AbstractAction.java index c3f0bec7..bd56f794 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/action/AbstractAction.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/action/AbstractAction.java @@ -8,7 +8,7 @@ import org.dom4j.DocumentException; import com.foxinmy.weixin4j.model.BaseMsg; import com.foxinmy.weixin4j.response.ResponseMessage; import com.foxinmy.weixin4j.util.MessageUtil; -import com.foxinmy.weixin4j.xml.XStream; +import com.foxinmy.weixin4j.xml.XmlStream; /** * 继承的类需实现execute(M inMessage) @@ -28,7 +28,7 @@ public abstract class AbstractAction implements WeixinAction public ResponseMessage execute(String msg) throws DocumentException { BaseMsg message = MessageUtil.xml2msg(msg); if (message == null) { - return execute(XStream.get(msg, getGenericType())); + return execute(XmlStream.get(msg, getGenericType())); } return execute((M) message); } diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/api/BaseApi.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/api/BaseApi.java index 800fee52..90a969a4 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/api/BaseApi.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/api/BaseApi.java @@ -7,7 +7,7 @@ import java.util.regex.Pattern; import com.foxinmy.weixin4j.http.HttpRequest; import com.foxinmy.weixin4j.xml.Map2ObjectConverter; -import com.foxinmy.weixin4j.xml.XStream; +import com.foxinmy.weixin4j.xml.XmlStream; import com.thoughtworks.xstream.core.ClassLoaderReference; import com.thoughtworks.xstream.mapper.DefaultMapper; @@ -20,14 +20,13 @@ import com.thoughtworks.xstream.mapper.DefaultMapper; * @see 微信公众平台API文档 * @see 微信企业号API文档 */ -public class BaseApi { +public abstract class BaseApi { protected final HttpRequest request = new HttpRequest(); - protected final static XStream mapXstream = XStream.get(); - protected static ResourceBundle weixinBundle; + protected final static XmlStream mapXstream = XmlStream.get(); static { mapXstream.alias("xml", Map.class); mapXstream.registerConverter(new Map2ObjectConverter(new DefaultMapper( - new ClassLoaderReference(XStream.class.getClassLoader())))); + new ClassLoaderReference(XmlStream.class.getClassLoader())))); } protected String map2xml(Map map) { @@ -38,9 +37,9 @@ public class BaseApi { protected Map xml2map(String xml) { return mapXstream.fromXML(xml, Map.class); } - + protected abstract ResourceBundle getWeixinBundle(); protected String getRequestUri(String key) { - String url = weixinBundle.getString(key); + String url = getWeixinBundle().getString(key); Pattern p = Pattern.compile("(\\{[^\\}]*\\})"); Matcher m = p.matcher(url); StringBuffer sb = new StringBuffer(); 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 2b50792a..84a28a94 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,5 +1,6 @@ package com.foxinmy.weixin4j.http; +import java.io.IOException; import java.io.InputStream; import org.apache.commons.lang3.StringUtils; @@ -11,7 +12,7 @@ import org.dom4j.io.SAXReader; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.TypeReference; -import com.foxinmy.weixin4j.xml.XStream; +import com.foxinmy.weixin4j.xml.XmlStream; public class Response { @@ -57,13 +58,13 @@ public class Response { if (isXmlResult) { @SuppressWarnings("unchecked") Class clazz = (Class) typeReference.getType(); - return XStream.get(text, clazz); + return XmlStream.get(text, clazz); } return null; } public XmlResult getAsXmlResult() { - return XStream.get(text, XmlResult.class); + return XmlStream.get(text, XmlResult.class); } /** @@ -79,36 +80,48 @@ public class Response { result.setCode(code); SAXReader reader = new SAXReader(); Document doc = null; + InputStream is = null; try { - doc = reader.read(Response.class.getResourceAsStream("error.xml")); + 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) { - e.printStackTrace(); - } - 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("未知错误"); + e.printStackTrace(); + } finally { + if (is != null) { + try { + is.close(); + } catch (IOException e) { + ; + } + } } return result; } @@ -134,11 +147,15 @@ public class Response { } public byte[] getBody() { - return body; + return (byte[]) body.clone(); } + /** + * May expose internal representation by incorporating reference to mutable + * object + */ public void setBody(byte[] body) { - this.body = body; + this.body = (byte[]) body.clone(); } public InputStream getStream() { diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/model/BaseMsg.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/model/BaseMsg.java index b846324d..ba508f91 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/model/BaseMsg.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/model/BaseMsg.java @@ -87,6 +87,21 @@ public class BaseMsg implements Serializable { 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 BaseMsg) { diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/model/Token.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/model/Token.java index 12456300..826cea92 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/model/Token.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/model/Token.java @@ -19,8 +19,9 @@ import com.thoughtworks.xstream.annotations.XStreamAlias; */ @XStreamAlias("app-token") public class Token implements Serializable { - - private static final long serialVersionUID = 1L; + + private static final long serialVersionUID = -7564855472419104084L; + @JSONField(name = "access_token") private String accessToken; @JSONField(name = "expires_in") @@ -51,14 +52,6 @@ public class Token implements Serializable { this.time = time; } - @Override - public boolean equals(Object obj) { - if (obj instanceof Token) { - return accessToken.equals(((Token) obj).getAccessToken()); - } - return false; - } - @Override public String toString() { return "Token [accessToken=" + accessToken + ", expiresIn=" + expiresIn diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/event/menu/MenuLocationEventMessage.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/event/menu/MenuLocationEventMessage.java index c8eda0b3..be5cdcde 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/event/menu/MenuLocationEventMessage.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/event/menu/MenuLocationEventMessage.java @@ -1,5 +1,7 @@ package com.foxinmy.weixin4j.msg.event.menu; +import java.io.Serializable; + import com.foxinmy.weixin4j.type.EventType; import com.thoughtworks.xstream.annotations.XStreamAlias; @@ -30,7 +32,10 @@ public class MenuLocationEventMessage extends MenuEventMessage { return locationInfo; } - public static class LocationInfo { + public static class LocationInfo implements Serializable { + + private static final long serialVersionUID = 4904181780216819965L; + @XStreamAlias("Location_X") private double x; // 地理位置维度 @XStreamAlias("Location_Y") diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/event/menu/MenuPhotoEventMessage.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/event/menu/MenuPhotoEventMessage.java index 7b2daa0d..10f88e18 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/event/menu/MenuPhotoEventMessage.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/event/menu/MenuPhotoEventMessage.java @@ -1,5 +1,6 @@ package com.foxinmy.weixin4j.msg.event.menu; +import java.io.Serializable; import java.util.List; import com.thoughtworks.xstream.annotations.XStreamAlias; @@ -27,7 +28,10 @@ public class MenuPhotoEventMessage extends MenuEventMessage { return pictureInfo; } - public static class PictureInfo { + public static class PictureInfo implements Serializable { + + private static final long serialVersionUID = -3361375879168233258L; + @XStreamAlias("Count") private int count; @XStreamAlias("PicList") @@ -48,7 +52,10 @@ public class MenuPhotoEventMessage extends MenuEventMessage { } @XStreamAlias("item") - public static class PictureItem { + public static class PictureItem implements Serializable { + + private static final long serialVersionUID = -7636697449096645590L; + @XStreamAlias("PicMd5Sum") private String md5; diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/event/menu/MenuScanEventMessage.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/event/menu/MenuScanEventMessage.java index 7ada3e3b..c06295d5 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/event/menu/MenuScanEventMessage.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/msg/event/menu/MenuScanEventMessage.java @@ -1,5 +1,7 @@ package com.foxinmy.weixin4j.msg.event.menu; +import java.io.Serializable; + import com.thoughtworks.xstream.annotations.XStreamAlias; /** @@ -25,7 +27,10 @@ public class MenuScanEventMessage extends MenuEventMessage { return scanInfo; } - public static class ScanInfo { + public static class ScanInfo implements Serializable { + + private static final long serialVersionUID = 2237570238164900421L; + @XStreamAlias("ScanType") private String type; @XStreamAlias("ScanResult") diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/response/ResponseMessage.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/response/ResponseMessage.java index 077a1acb..6e5dd1c4 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/response/ResponseMessage.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/response/ResponseMessage.java @@ -8,7 +8,7 @@ import com.foxinmy.weixin4j.msg.model.Base; import com.foxinmy.weixin4j.msg.model.News; import com.foxinmy.weixin4j.msg.model.Responseable; import com.foxinmy.weixin4j.util.ClassUtil; -import com.foxinmy.weixin4j.xml.XStream; +import com.foxinmy.weixin4j.xml.XmlStream; import com.thoughtworks.xstream.annotations.XStreamAlias; /** @@ -40,7 +40,7 @@ public class ResponseMessage extends BaseMsg { private static final long serialVersionUID = 7761192742840031607L; - protected final static XStream xmlStream = XStream.get(); + protected final static XmlStream xmlStream = XmlStream.get(); static { Class[] classes = ClassUtil.getClasses(Base.class.getPackage()) .toArray(new Class[0]); @@ -58,7 +58,8 @@ public class ResponseMessage extends BaseMsg { private final Base box; public ResponseMessage(Base box) { - this(box, null); + super(box.getMediaType().name()); + this.box = box; } public ResponseMessage(Base box, BaseMsg inMessage) { diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/token/FileTokenHolder.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/token/FileTokenHolder.java index d0db8c90..ae1ed794 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/token/FileTokenHolder.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/token/FileTokenHolder.java @@ -15,7 +15,7 @@ import com.foxinmy.weixin4j.model.Token; import com.foxinmy.weixin4j.model.WeixinAccount; import com.foxinmy.weixin4j.type.AccountType; import com.foxinmy.weixin4j.util.ConfigUtil; -import com.foxinmy.weixin4j.xml.XStream; +import com.foxinmy.weixin4j.xml.XmlStream; /** * 基于文件保存的Token获取类 @@ -66,7 +66,7 @@ public class FileTokenHolder extends AbstractTokenHolder { long now_time = ca.getTimeInMillis(); try { if (token_file.exists()) { - token = XStream.get(new FileInputStream(token_file), + token = XmlStream.get(new FileInputStream(token_file), Token.class); long expire_time = token.getTime() + (token.getExpiresIn() * 1000) - 2; @@ -78,7 +78,7 @@ public class FileTokenHolder extends AbstractTokenHolder { token = response.getAsObject(new TypeReference() { }); token.setTime(now_time); - XStream.to(token, new FileOutputStream(token_file)); + XmlStream.to(token, new FileOutputStream(token_file)); } catch (IOException e) { throw new WeixinException(e.getMessage()); } 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 be37e29b..7a1781bf 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 @@ -23,11 +23,16 @@ public class ConfigUtil { static { weixinBundle = ResourceBundle.getBundle("weixin"); Set keySet = weixinBundle.keySet(); + File file = null; for (String key : keySet) { if (!key.endsWith("_path")) { continue; } - new File(getValue(key)).mkdirs(); + file = new File(getValue(key)); + if (!file.exists() && !file.mkdirs()) { + System.err.append(String.format("%s create fail.%n", + file.getAbsolutePath())); + } } } diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/util/FileUtil.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/util/FileUtil.java index f3a060f8..cf3f1ac9 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/util/FileUtil.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/util/FileUtil.java @@ -92,6 +92,7 @@ public class FileUtil { /** * 获取文件类型 + * * @param file * @return */ @@ -101,14 +102,16 @@ public class FileUtil { try { fis = new FileInputStream(file); byte[] b = new byte[10]; - fis.read(b, 0, b.length); - String fileCode = bytesToHexString(b).toLowerCase(); - Iterator keyIter = FILE_TYPE_MAP.keySet().iterator(); - while (keyIter.hasNext()) { - String key = keyIter.next().toLowerCase(); - if (key.startsWith(fileCode) || fileCode.startsWith(key)) { - fileType = FILE_TYPE_MAP.get(key); - break; + int t = fis.read(b, 0, b.length); + if (t > 0) { + String fileCode = bytesToHexString(b).toLowerCase(); + Iterator keyIter = FILE_TYPE_MAP.keySet().iterator(); + while (keyIter.hasNext()) { + String key = keyIter.next().toLowerCase(); + if (key.startsWith(fileCode) || fileCode.startsWith(key)) { + fileType = FILE_TYPE_MAP.get(key); + break; + } } } } catch (IOException e) { diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/util/MessageUtil.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/util/MessageUtil.java index 794504e9..20192970 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/util/MessageUtil.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/util/MessageUtil.java @@ -20,7 +20,7 @@ import com.foxinmy.weixin4j.model.BaseMsg; import com.foxinmy.weixin4j.model.Consts; import com.foxinmy.weixin4j.type.EventType; import com.foxinmy.weixin4j.type.MessageType; -import com.foxinmy.weixin4j.xml.XStream; +import com.foxinmy.weixin4j.xml.XmlStream; /** * 消息工具类 @@ -205,7 +205,7 @@ public class MessageUtil { messageClass = EventType.valueOf(type.toLowerCase()) .getEventClass(); } - return XStream.get(xmlMsg, messageClass); + return XmlStream.get(xmlMsg, messageClass); } /** diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/util/PKCS7Encoder.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/util/PKCS7Encoder.java index 4c826e00..95dcb17a 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/util/PKCS7Encoder.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/util/PKCS7Encoder.java @@ -48,11 +48,11 @@ public class PKCS7Encoder { // 获得补位所用的字符 byte target = (byte) (amountToPad & 0xFF); char padChr = (char) target; - String tmp = new String(); + StringBuilder tmp = new StringBuilder(); for (int index = 0; index < amountToPad; index++) { - tmp += padChr; + tmp.append(padChr); } - return tmp.getBytes(Consts.UTF_8); + return tmp.toString().getBytes(Consts.UTF_8); } /** diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/xml/XStream.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/xml/XmlStream.java similarity index 81% rename from weixin4j-base/src/main/java/com/foxinmy/weixin4j/xml/XStream.java rename to weixin4j-base/src/main/java/com/foxinmy/weixin4j/xml/XmlStream.java index 9544875f..5dbea53e 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/xml/XStream.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/xml/XmlStream.java @@ -10,9 +10,9 @@ import com.thoughtworks.xstream.io.HierarchicalStreamWriter; import com.thoughtworks.xstream.io.xml.PrettyPrintWriter; import com.thoughtworks.xstream.io.xml.Xpp3Driver; -public class XStream extends com.thoughtworks.xstream.XStream { +public class XmlStream extends com.thoughtworks.xstream.XStream { - public XStream() { + public XmlStream() { super(new Xpp3Driver() { @@ -31,7 +31,7 @@ public class XStream extends com.thoughtworks.xstream.XStream { }); } - public XStream(HierarchicalStreamDriver hierarchicalStreamDriver) { + public XmlStream(HierarchicalStreamDriver hierarchicalStreamDriver) { super(hierarchicalStreamDriver); } @@ -45,29 +45,29 @@ public class XStream extends com.thoughtworks.xstream.XStream { return (T) super.fromXML(inputStream); } - public static XStream get() { - XStream xstream = new XStream(); + public static XmlStream get() { + XmlStream xstream = new XmlStream(); xstream.ignoreUnknownElements(); xstream.autodetectAnnotations(true); return xstream; } public static T get(InputStream inputStream, Class clazz) { - XStream xStream = get(); + XmlStream xStream = get(); xStream.alias("xml", clazz); xStream.processAnnotations(clazz); return xStream.fromXML(inputStream, clazz); } public static T get(String xml, Class clazz) { - XStream xStream = get(); + XmlStream xStream = get(); xStream.alias("xml", clazz); xStream.processAnnotations(clazz); return xStream.fromXML(xml, clazz); } public static String to(Object obj) { - XStream xStream = get(); + XmlStream xStream = get(); Class clazz = obj.getClass(); xStream.alias("xml", clazz); xStream.processAnnotations(clazz); @@ -75,7 +75,7 @@ public class XStream extends com.thoughtworks.xstream.XStream { } public static void to(Object obj, OutputStream out) { - XStream xStream = get(); + XmlStream xStream = get(); Class clazz = obj.getClass(); xStream.alias("xml", clazz); xStream.processAnnotations(clazz); diff --git a/weixin4j-mp/pom.xml b/weixin4j-mp/pom.xml index 500e3ff7..dacef773 100644 --- a/weixin4j-mp/pom.xml +++ b/weixin4j-mp/pom.xml @@ -4,7 +4,7 @@ com.foxinmy weixin4j - 1.0-SNAPSHOT + 1.1-SNAPSHOT weixin4j-mp weixin4j-mp @@ -15,11 +15,4 @@ weixin4j-mp-api weixin4j-mp-server - - - com.foxinmy - weixin4j-base - ${project.version} - - \ No newline at end of file diff --git a/weixin4j-mp/weixin4j-mp-api/pom.xml b/weixin4j-mp/weixin4j-mp-api/pom.xml index 5c495e49..27253a2e 100644 --- a/weixin4j-mp/weixin4j-mp-api/pom.xml +++ b/weixin4j-mp/weixin4j-mp-api/pom.xml @@ -1,15 +1,16 @@ - + 4.0.0 com.foxinmy weixin4j-mp - 1.0-SNAPSHOT + 1.1-SNAPSHOT weixin4j-mp-api weixin4j-mp-api https://github.com/foxinmy/weixin4j/tree/master/weixin4j-mp/weixin4j-mp-api - 微信公众号API + 微信公众平台API @@ -22,6 +23,11 @@ + + com.foxinmy + weixin4j-base + ${project.version} + org.apache.poi poi-ooxml diff --git a/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/WeixinProxy.java b/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/WeixinProxy.java index 80d5b886..5a624159 100644 --- a/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/WeixinProxy.java +++ b/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/WeixinProxy.java @@ -187,7 +187,6 @@ public class WeixinProxy { * 媒体类型 * @return 写入硬盘后的文件对象 * @throws WeixinException - * @throws IOException * @see 上传下载说明 * @see com.foxinmy.weixin4j.type.MediaType @@ -195,7 +194,7 @@ public class WeixinProxy { * @see {@link com.foxinmy.weixin4j.mp.WeixinProxy#downloadMedia(String)} */ public File downloadMedia(String mediaId, MediaType mediaType) - throws WeixinException, IOException { + throws WeixinException { return mediaApi.downloadMedia(mediaId, mediaType); } @@ -503,7 +502,8 @@ public class WeixinProxy { * href="http://mp.weixin.qq.com/wiki/15/5380a4e6f02f2ffdc7981a8ed7a40753.html#.E5.88.A0.E9.99.A4.E7.BE.A4.E5.8F.91.E3.80.90.E8.AE.A2.E9.98.85.E5.8F.B7.E4.B8.8E.E6.9C.8D.E5.8A.A1.E5.8F.B7.E8.AE.A4.E8.AF.81.E5.90.8E.E5.9D.87.E5.8F.AF.E7.94.A8.E3.80.91">删除群发 * @see com.foxinmy.weixin4j.mp.api.MassApi * @see {@link com.foxinmy.weixin4j.mp.WeixinProxy#massByGroupId(Base, int)} - * @see {@link com.foxinmy.weixin4j.mp.WeixinProxy#massByOpenIds(Base, String...) + * @see {@link com.foxinmy.weixin4j.mp.WeixinProxy#massByOpenIds(Base, String...) + */ public JsonResult deleteMassNews(String msgid) throws WeixinException { return massApi.deleteMassNews(msgid); @@ -756,7 +756,7 @@ public class WeixinProxy { /** * 自定义菜单 * - * @param btnList + * @param btnList 菜单列表 * @throws WeixinException * @see 创建自定义菜单 @@ -798,7 +798,7 @@ public class WeixinProxy { /** * 生成带参数的二维码 * - * @param parameter + * @param parameter 二维码参数 * @return byte数据包 * @throws WeixinException * @see com.foxinmy.weixin4j.mp.api.QrApi @@ -838,14 +838,12 @@ public class WeixinProxy { * 二维码参数 * @return 硬盘存储的文件对象 * @throws WeixinException - * @throws IOException * @see 二维码 * @see com.foxinmy.weixin4j.mp.model.QRParameter * @see com.foxinmy.weixin4j.mp.api.QrApi */ - public File getQR(QRParameter parameter) throws WeixinException, - IOException { + public File getQR(QRParameter parameter) throws WeixinException { return qrApi.getQR(parameter); } @@ -902,7 +900,7 @@ public class WeixinProxy { /** * 长链接转短链接 * - * @param url + * @param url 待转换的链接 * @return 短链接 * @throws WeixinException * @see 上传下载说明 * @see com.foxinmy.weixin4j.type.MediaType * @see {@link com.foxinmy.weixin4j.mp.api.MediaApi#downloadMedia(String)} */ public File downloadMedia(String mediaId, MediaType mediaType) - throws WeixinException, IOException { + throws WeixinException { String media_path = ConfigUtil.getValue("media_path"); File file = new File(media_path + File.separator + mediaId + "." + mediaType.getFormatName()); @@ -131,10 +130,27 @@ public class MediaApi extends MpApi { return file; } byte[] datas = downloadMedia(mediaId); - file.createNewFile(); - FileOutputStream out = new FileOutputStream(file); - out.write(datas); - out.close(); + OutputStream os = null; + try { + boolean flag = file.createNewFile(); + if (flag) { + os = new FileOutputStream(file); + os.write(datas); + } else { + throw new WeixinException("-1", String.format( + "create file fail:%s", file.getAbsolutePath())); + } + } catch (IOException e) { + throw new WeixinException("-1", e.getMessage()); + } finally { + try { + if (os != null) { + os.close(); + } + } catch (IOException ignore) { + ; + } + } return file; } diff --git a/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/api/MenuApi.java b/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/api/MenuApi.java index f6fe2c9c..842706b0 100644 --- a/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/api/MenuApi.java +++ b/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/api/MenuApi.java @@ -31,7 +31,7 @@ public class MenuApi extends MpApi { /** * 自定义菜单 * - * @param btnList + * @param btnList 菜单列表 * @throws WeixinException * @see 创建自定义菜单 diff --git a/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/api/MpApi.java b/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/api/MpApi.java index a80ff71d..efa836b3 100644 --- a/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/api/MpApi.java +++ b/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/api/MpApi.java @@ -15,8 +15,14 @@ import com.foxinmy.weixin4j.api.BaseApi; * @see api文档 */ public class MpApi extends BaseApi { + private final static ResourceBundle weixinBundle; static { weixinBundle = ResourceBundle .getBundle("com/foxinmy/weixin4j/mp/api/weixin"); } + + @Override + protected ResourceBundle getWeixinBundle() { + return weixinBundle; + } } diff --git a/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/api/PayApi.java b/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/api/PayApi.java index 0cce82be..10d29206 100644 --- a/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/api/PayApi.java +++ b/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/api/PayApi.java @@ -7,6 +7,7 @@ import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; +import java.io.OutputStream; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.nio.charset.Charset; @@ -246,8 +247,7 @@ public class PayApi extends MpApi { */ public RefundResult refund(InputStream ca, IdQuery idQuery, String outRefundNo, double totalFee, double refundFee, - String opUserId, String opUserPasswd) throws WeixinException, - IOException { + String opUserId, String opUserPasswd) throws WeixinException{ int version = weixinAccount.getVersion(); String refund_uri = getRequestUri(String.format("refund_v%d_uri", version)); @@ -355,6 +355,9 @@ public class PayApi extends MpApi { SSLHttpRequest request = new SSLHttpRequest( weixinAccount.getMchId(), ca); response = request.post(refund_uri, param); + } else { + throw new WeixinException("-1", String.format("unknown version:%d", + version)); } return response.getAsObject(new TypeReference() { }); @@ -482,7 +485,7 @@ public class PayApi extends MpApi { * @throws IOException */ public File downloadbill(Date billDate, BillType billType) - throws WeixinException, IOException { + throws WeixinException { if (billDate == null) { Calendar now = Calendar.getInstance(); now.add(Calendar.DAY_OF_MONTH, -1); @@ -526,25 +529,46 @@ public class PayApi extends MpApi { map.put("sign", sign); String param = map2xml(map); response = request.post(downloadbill_uri, param); + } else { + throw new WeixinException("-1", String.format("unknown version:%d", + version)); } + BufferedReader reader = null; + OutputStream os = null; + try { + reader = new BufferedReader(new InputStreamReader( + response.getStream(), charset)); + String line = null; + List bills = new LinkedList(); + while ((line = reader.readLine()) != null) { + bills.add(line.replaceAll("`", "").split(",")); + } - BufferedReader reader = new BufferedReader(new InputStreamReader( - response.getStream(), charset)); - String line = null; - List bills = new LinkedList(); - while ((line = reader.readLine()) != null) { - bills.add(line.replaceAll("`", "").split(",")); + List headers = Arrays.asList(bills.remove(0)); + List totalDatas = Arrays + .asList(bills.remove(bills.size() - 1)); + List totalHeaders = Arrays + .asList(bills.remove(bills.size() - 1)); + HSSFWorkbook wb = new HSSFWorkbook(); + wb.createSheet(_billDate + "对账单"); + ExcelUtil.list2excel(wb, headers, bills); + ExcelUtil.list2excel(wb, totalHeaders, totalDatas); + os = new FileOutputStream(file); + wb.write(os); + } catch (IOException e) { + throw new WeixinException("-1", e.getMessage()); + } finally { + try { + if (reader != null) { + reader.close(); + } + if (os != null) { + os.close(); + } + } catch (IOException ignore) { + ; + } } - reader.close(); - List headers = Arrays.asList(bills.remove(0)); - List totalDatas = Arrays.asList(bills.remove(bills.size() - 1)); - List totalHeaders = Arrays - .asList(bills.remove(bills.size() - 1)); - HSSFWorkbook wb = new HSSFWorkbook(); - wb.createSheet(_billDate + "对账单"); - ExcelUtil.list2excel(wb, headers, bills); - ExcelUtil.list2excel(wb, totalHeaders, totalDatas); - wb.write(new FileOutputStream(file)); return file; } @@ -581,6 +605,9 @@ public class PayApi extends MpApi { map.put("sign", sign); String param = map2xml(map); response = request.post(refundquery_uri, param); + } else { + throw new WeixinException("-1", String.format("unknown version:%d", + version)); } return RefundConverter.fromXML(response.getAsString()); } diff --git a/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/api/QrApi.java b/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/api/QrApi.java index 668ab6d0..f16d46e7 100644 --- a/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/api/QrApi.java +++ b/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/api/QrApi.java @@ -3,6 +3,7 @@ package com.foxinmy.weixin4j.mp.api; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; +import java.io.OutputStream; import com.foxinmy.weixin4j.exception.WeixinException; import com.foxinmy.weixin4j.http.Response; @@ -82,13 +83,11 @@ public class QrApi extends MpApi { * 二维码参数 * @return 硬盘存储的文件对象 * @throws WeixinException - * @throws IOException * @see 二维码 * @see com.foxinmy.weixin4j.mp.model.QRParameter */ - public File getQR(QRParameter parameter) throws WeixinException, - IOException { + public File getQR(QRParameter parameter) throws WeixinException { String qr_path = ConfigUtil.getValue("qr_path"); String filename = String.format("%s_%d_%d.jpg", parameter.getQrType() .name(), parameter.getSceneId(), parameter.getExpireSeconds()); @@ -97,10 +96,27 @@ public class QrApi extends MpApi { return file; } byte[] datas = getQRData(parameter); - file.createNewFile(); - FileOutputStream out = new FileOutputStream(file); - out.write(datas); - out.close(); + OutputStream os = null; + try { + boolean flag = file.createNewFile(); + if (flag) { + os = new FileOutputStream(file); + os.write(datas); + } else { + throw new WeixinException("-1", String.format( + "create file fail:%s", file.getAbsolutePath())); + } + } catch (IOException e) { + throw new WeixinException("-1", e.getMessage()); + } finally { + try { + if (os != null) { + os.close(); + } + } catch (IOException ignore) { + ; + } + } return file; } } diff --git a/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/model/CustomRecord.java b/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/model/CustomRecord.java index ae86a37f..e8f0d226 100644 --- a/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/model/CustomRecord.java +++ b/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/model/CustomRecord.java @@ -47,7 +47,7 @@ public class CustomRecord implements Serializable { } public Date getTime() { - return time; + return (Date) time.clone(); } public void setTime(long time) { diff --git a/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/model/Group.java b/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/model/Group.java index 9a3ae768..72f74f2b 100644 --- a/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/model/Group.java +++ b/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/model/Group.java @@ -77,6 +77,16 @@ public class Group implements Serializable { return super.equals(obj); } + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + count; + result = prime * result + id; + result = prime * result + ((name == null) ? 0 : name.hashCode()); + return result; + } + @Override public String toString() { return String.format("[Group id=%d ,name=%s ,count=%d]", id, name, diff --git a/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/model/SemQuery.java b/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/model/SemQuery.java index f02ced35..0fc17aa3 100644 --- a/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/model/SemQuery.java +++ b/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/model/SemQuery.java @@ -33,16 +33,16 @@ public class SemQuery implements Serializable { // 需要使用的服务类别,多个用,隔开,不能为空 public SemQuery category(SemCategory... categorys) { - String category = ""; + StringBuilder category = new StringBuilder(); if (categorys.length == 1) { - category = categorys[0].name(); + category.append(categorys[0].name()); } else { for (int i = 0; i < categorys.length - 1; i++) { - category += categorys[i].name() + ","; + category.append(categorys[i].name()).append(","); } - category += categorys[categorys.length - 1].name(); + category.append(categorys[categorys.length - 1].name()); } - jsonObj.put("category", category); + jsonObj.put("category", category.toString()); return this; } diff --git a/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/model/User.java b/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/model/User.java index cbdedfcf..32909be9 100644 --- a/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/model/User.java +++ b/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/model/User.java @@ -163,6 +163,31 @@ public class User implements Serializable { return false; } + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((city == null) ? 0 : city.hashCode()); + result = prime * result + ((country == null) ? 0 : country.hashCode()); + result = prime * result + + ((headimgurl == null) ? 0 : headimgurl.hashCode()); + result = prime * result + + ((language == null) ? 0 : language.hashCode()); + result = prime * result + + ((nickname == null) ? 0 : nickname.hashCode()); + result = prime * result + ((openid == null) ? 0 : openid.hashCode()); + result = prime * result + + ((privilege == null) ? 0 : privilege.hashCode()); + result = prime * result + + ((province == null) ? 0 : province.hashCode()); + result = prime * result + sex; + result = prime * result + subscribe; + result = prime * result + + (int) (subscribe_time ^ (subscribe_time >>> 32)); + result = prime * result + ((unionid == null) ? 0 : unionid.hashCode()); + return result; + } + @Override public String toString() { StringBuilder sb = new StringBuilder(); diff --git a/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/payment/PayUtil.java b/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/payment/PayUtil.java index 4a9ac383..c8adece2 100644 --- a/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/payment/PayUtil.java +++ b/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/payment/PayUtil.java @@ -26,7 +26,7 @@ import com.foxinmy.weixin4j.util.ConfigUtil; import com.foxinmy.weixin4j.util.DateUtil; import com.foxinmy.weixin4j.util.MapUtil; import com.foxinmy.weixin4j.util.RandomUtil; -import com.foxinmy.weixin4j.xml.XStream; +import com.foxinmy.weixin4j.xml.XmlStream; /** * 支付工具类(JSAPI,NATIVE,MicroPay) @@ -166,10 +166,10 @@ public class PayUtil { * 订单号 * @param orderFee * 订单总额 按实际金额传入即可(元) 构造函数会转换为分 - * @param ip - * ip地址 * @param notifyUrl * 支付通知地址 + * @param ip + * ip地址 * @param weixinAccount * 商户信息 * @return 支付json串 @@ -221,7 +221,7 @@ public class PayUtil { if (StringUtils.isBlank(payPackage.getSign())) { payPackage.setSign(paysignMd5(payPackage, paySignKey)); } - String payJsRequestXml = XStream.to(payPackage).replaceAll("__", "_"); + String payJsRequestXml = XmlStream.to(payPackage).replaceAll("__", "_"); HttpRequest request = new HttpRequest(); try { Response response = request.post(Consts.UNIFIEDORDER, @@ -351,7 +351,7 @@ public class PayUtil { map.put("retcode", payRequest.getRetCode()); map.put("reterrmsg", payRequest.getRetMsg()); payRequest.setPaySign(paysignSha(map)); - return XStream.to(payRequest); + return XmlStream.to(payRequest); } /** @@ -399,7 +399,7 @@ public class PayUtil { throws WeixinException { String sign = paysignMd5(payPackage, weixinAccount.getPaySignKey()); payPackage.setSign(sign); - String para = XStream.to(payPackage).replaceAll("__", "_"); + String para = XmlStream.to(payPackage).replaceAll("__", "_"); HttpRequest request = new HttpRequest(); Response response = request.post(Consts.MICROPAYURL, para); return response diff --git a/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/payment/RefundConverter.java b/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/payment/RefundConverter.java index ae0f8674..ea1c5faf 100644 --- a/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/payment/RefundConverter.java +++ b/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/payment/RefundConverter.java @@ -9,7 +9,7 @@ import java.util.Map.Entry; import java.util.regex.Matcher; import java.util.regex.Pattern; -import com.foxinmy.weixin4j.xml.XStream; +import com.foxinmy.weixin4j.xml.XmlStream; import com.thoughtworks.xstream.converters.Converter; import com.thoughtworks.xstream.converters.MarshallingContext; import com.thoughtworks.xstream.converters.UnmarshallingContext; @@ -30,7 +30,7 @@ import com.thoughtworks.xstream.mapper.Mapper; * @see com.foxinmy.weixin4j.mp.payment.RefundDetail */ public class RefundConverter { - private final static XStream xStream = XStream.get(); + private final static XmlStream xStream = XmlStream.get(); private final static Mapper mapper; private final static ReflectionProvider reflectionProvider; private final static Pattern pattern = Pattern.compile("(_\\d)$"); diff --git a/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/payment/v3/Order.java b/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/payment/v3/Order.java index 4b4ae7da..b20c96dc 100644 --- a/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/payment/v3/Order.java +++ b/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/payment/v3/Order.java @@ -31,6 +31,7 @@ public class Order extends ApiResult { @XStreamAlias("openid") private String openId; // 用户是否关注公众账号,Y- 关注,N-未关注,仅在公众 账号类型支付有效 + @XStreamAlias("is_subscribe") private String isSubscribe; // 交易类型 @XStreamAlias("trade_type") @@ -54,6 +55,7 @@ public class Order extends ApiResult { @XStreamAlias("out_rade_no") private String outTradeNo; // 商家数据包 + @XStreamAlias("attach") private String attach; // 支付完成时间,格式为 yyyyMMddhhmmss @XStreamAlias("time_end") diff --git a/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/spider/WeixinExecutor.java b/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/spider/WeixinExecutor.java index f6e95d9e..92a8afa0 100644 --- a/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/spider/WeixinExecutor.java +++ b/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/spider/WeixinExecutor.java @@ -1,6 +1,5 @@ package com.foxinmy.weixin4j.mp.spider; -import java.io.Serializable; import java.net.URI; import java.util.ArrayList; import java.util.HashMap; @@ -52,9 +51,8 @@ import com.foxinmy.weixin4j.util.RandomUtil; * @since JDK 1.7 * @see */ -public class WeixinExecutor implements Serializable { +public class WeixinExecutor { private final Logger logger = LoggerFactory.getLogger(getClass()); - private static final long serialVersionUID = 4253859892138066462L; private final static Map accountMap = new HashMap() { private static final long serialVersionUID = 1L; @@ -175,7 +173,7 @@ public class WeixinExecutor implements Serializable { List parameters = new ArrayList(); parameters.add(new BasicNameValuePair("username", uname)); parameters.add(new BasicNameValuePair("pwd", DigestUtils.md5Hex(pwd - .getBytes()))); + .getBytes(Consts.UTF_8)))); parameters.add(new BasicNameValuePair("f", "json")); parameters.add(new BasicNameValuePair("imgcode", imgcode)); if (!StringUtils.isBlank(imgcode)) { @@ -387,7 +385,6 @@ public class WeixinExecutor implements Serializable { .getString("bedeveloper"))); post.addHeader("Referer", url); List parameters = new ArrayList(); - parameters = new ArrayList(); parameters.add(new BasicNameValuePair("token", weixin.getString("urlToken"))); parameters.add(new BasicNameValuePair("f", "json")); @@ -527,6 +524,7 @@ public class WeixinExecutor implements Serializable { case -205: msg = "该URL可能存在安全风险,请检查"; code = 207; + break; case -301: msg = "请求URL超时"; code = 204; diff --git a/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/util/ExcelUtil.java b/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/util/ExcelUtil.java index a60ee706..9c0c1c62 100644 --- a/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/util/ExcelUtil.java +++ b/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/util/ExcelUtil.java @@ -11,6 +11,7 @@ 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; @@ -34,6 +35,7 @@ import com.alibaba.fastjson.JSONObject; /** * excel工具类 + * * @className ExcelUtil * @author jy * @date 2014年11月1日 @@ -53,18 +55,19 @@ public class ExcelUtil { */ public static String[][] read(File file) throws Exception { String fileExt = getExtension(file.getName()); - - if (null != fileExt && fileExt.toLowerCase().equals("xls")) {// 2003 - BufferedInputStream in = new BufferedInputStream( - new FileInputStream(file)); - // 打开HSSFWorkbook - POIFSFileSystem fs = new POIFSFileSystem(in); - Workbook wb = new HSSFWorkbook(fs); - in.close(); - return readExcel(wb); - } else if (null != fileExt && fileExt.toLowerCase().equals("xlsx")) {// 2007 - Workbook wb = new XSSFWorkbook(new FileInputStream(file)); - return readExcel(wb); + if (StringUtils.isNotBlank(fileExt)) { + if (fileExt.toLowerCase().equals("xls")) {// 2003 + BufferedInputStream in = new BufferedInputStream( + new FileInputStream(file)); + // 打开HSSFWorkbook + POIFSFileSystem fs = new POIFSFileSystem(in); + Workbook wb = new HSSFWorkbook(fs); + in.close(); + return readExcel(wb); + } else if (fileExt.toLowerCase().equals("xlsx")) {// 2007 + Workbook wb = new XSSFWorkbook(new FileInputStream(file)); + return readExcel(wb); + } } return null; } @@ -72,18 +75,19 @@ public class ExcelUtil { public static String[][] read4Special(File file, String fileName, int columnSize) throws Exception { String fileExt = getExtension(fileName); - - if (null != fileExt && fileExt.toLowerCase().equals("xls")) {// 2003 - BufferedInputStream in = new BufferedInputStream( - new FileInputStream(file)); - // 打开HSSFWorkbook - POIFSFileSystem fs = new POIFSFileSystem(in); - Workbook wb = new HSSFWorkbook(fs); - in.close(); - return readExcel4Special(wb, columnSize); - } else if (null != fileExt && fileExt.toLowerCase().equals("xlsx")) {// 2007 - Workbook wb = new XSSFWorkbook(new FileInputStream(file)); - return readExcel4Special(wb, columnSize); + if (StringUtils.isNotBlank(fileExt)) { + if (fileExt.toLowerCase().equals("xls")) {// 2003 + BufferedInputStream in = new BufferedInputStream( + new FileInputStream(file)); + // 打开HSSFWorkbook + POIFSFileSystem fs = new POIFSFileSystem(in); + Workbook wb = new HSSFWorkbook(fs); + in.close(); + return readExcel4Special(wb, columnSize); + } else if (fileExt.toLowerCase().equals("xlsx")) {// 2007 + Workbook wb = new XSSFWorkbook(new FileInputStream(file)); + return readExcel4Special(wb, columnSize); + } } return null; } diff --git a/weixin4j-mp/weixin4j-mp-server/pom.xml b/weixin4j-mp/weixin4j-mp-server/pom.xml index c26648ec..c33710d3 100644 --- a/weixin4j-mp/weixin4j-mp-server/pom.xml +++ b/weixin4j-mp/weixin4j-mp-server/pom.xml @@ -5,7 +5,7 @@ com.foxinmy weixin4j-mp - 1.0 + 1.1-SNAPSHOT weixin4j-mp-server weixin4j-mp-server diff --git a/weixin4j-mp/weixin4j-mp-server/src/main/java/com/foxinmy/weixin4j/mp/action/PayAction.java b/weixin4j-mp/weixin4j-mp-server/src/main/java/com/foxinmy/weixin4j/mp/action/PayAction.java index 7f63458f..888dabf1 100644 --- a/weixin4j-mp/weixin4j-mp-server/src/main/java/com/foxinmy/weixin4j/mp/action/PayAction.java +++ b/weixin4j-mp/weixin4j-mp-server/src/main/java/com/foxinmy/weixin4j/mp/action/PayAction.java @@ -26,7 +26,7 @@ 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.xml.XStream; +import com.foxinmy.weixin4j.xml.XmlStream; /** * 支付示例 @@ -48,10 +48,9 @@ public class PayAction { */ public JSONObject jsPay() { JSONObject obj = new JSONObject(); - PayPackage payPackage = null; WeixinMpAccount weixinAccount = ConfigUtil.getWeixinMpAccount(); // V3 支付 - payPackage = new PayPackageV3(weixinAccount, "用户openid", "商品描述", + PayPackage payPackage = new PayPackageV3(weixinAccount, "用户openid", "商品描述", "系统内部订单号", 1d, "IP地址", TradeType.JSAPI); // V2 支付 payPackage = new PayPackageV2("商品描述", weixinAccount.getPartnerId(), @@ -113,7 +112,7 @@ public class PayAction { * transaction_id=1221928801201410296039230054&transport_fee=0 */ log.info("jspay_notify_orderinfo,{}", objMap); - JsPayNotify payNotify = XStream.get(inputStream, JsPayNotify.class); + JsPayNotify payNotify = XmlStream.get(inputStream, JsPayNotify.class); log.info("jspay_notify_userinfo,{}", payNotify); WeixinMpAccount weixinAccount = ConfigUtil.getWeixinMpAccount(); // 验证财付通签名 @@ -152,7 +151,7 @@ public class PayAction { * </xml> */ public String jsNotifyV3(InputStream inputStream) { - com.foxinmy.weixin4j.mp.payment.v3.Order order = XStream.get( + com.foxinmy.weixin4j.mp.payment.v3.Order order = XmlStream.get( inputStream, com.foxinmy.weixin4j.mp.payment.v3.Order.class); log.info("jaapi_notify_order_info:", order); String sign = order.getSign(); @@ -162,9 +161,9 @@ public class PayAction { weixinAccount.getPaySignKey()); log.info("微信签名----->sign={},vaild_sign={}", sign, valid_sign); if (!sign.equals(valid_sign)) { - return XStream.to(new XmlResult(Consts.FAIL, "签名错误")); + return XmlStream.to(new XmlResult(Consts.FAIL, "签名错误")); } - return XStream.to(new XmlResult()); + return XmlStream.to(new XmlResult()); } /** @@ -186,7 +185,7 @@ public class PayAction { */ public String nativeNotifyV2(InputStream inputStream) { // V2.x版本 - NativePayNotifyV2 payNotify = XStream.get(inputStream, + NativePayNotifyV2 payNotify = XmlStream.get(inputStream, NativePayNotifyV2.class); log.info("native_pay_notify,{}", payNotify); WeixinMpAccount weixinAccount = ConfigUtil.getWeixinMpAccount(); @@ -205,7 +204,7 @@ public class PayAction { weixinAccount.getPartnerId(), "系统内部订单号", 1d, "回调地址", "IP地址"); NativePayResponseV2 payResponse = new NativePayResponseV2( weixinAccount, payPackage); - return XStream.to(payResponse); + return XmlStream.to(payResponse); } /** @@ -223,7 +222,7 @@ public class PayAction { * @throws PayException */ public String nativeNotifyV3(InputStream inputStream) throws PayException { - NativePayNotifyV3 payNotify = XStream.get(inputStream, + NativePayNotifyV3 payNotify = XmlStream.get(inputStream, NativePayNotifyV3.class); String sign = payNotify.getSign(); payNotify.setSign(null); @@ -241,7 +240,7 @@ public class PayAction { null); payReponse.setSign(PayUtil.paysignMd5(payReponse, weixinAccount.getPaySignKey())); - return XStream.to(payReponse); + return XmlStream.to(payReponse); } // 成功返回 @@ -249,7 +248,7 @@ public class PayAction { weixinAccount.getPaySignKey()); payReponse.setSign(PayUtil.paysignMd5(payReponse, weixinAccount.getPaySignKey())); - return XStream.to(payReponse); + return XmlStream.to(payReponse); } /** @@ -271,7 +270,7 @@ public class PayAction { * @return */ public String warning(InputStream inputStream) { - PayWarn payWarn = XStream.get(inputStream, PayWarn.class); + PayWarn payWarn = XmlStream.get(inputStream, PayWarn.class); log.info("pay_warning,{}", payWarn); WeixinMpAccount weixinAccount = ConfigUtil.getWeixinMpAccount(); String sign = payWarn.getPaySign(); @@ -292,7 +291,7 @@ public class PayAction { * @return */ public String feedback(InputStream inputStream) { - PayFeedback feedback = XStream.get(inputStream, PayFeedback.class); + PayFeedback feedback = XmlStream.get(inputStream, PayFeedback.class); log.info("pay_feedback_info:{}", feedback); WeixinMpAccount weixinAccount = ConfigUtil.getWeixinMpAccount(); // 验证微信签名 diff --git a/weixin4j-mp/weixin4j-mp-server/src/main/java/com/foxinmy/weixin4j/mp/server/WeixinMessageDecoder.java b/weixin4j-mp/weixin4j-mp-server/src/main/java/com/foxinmy/weixin4j/mp/server/WeixinMessageDecoder.java index 85a6a31d..9ba02426 100644 --- a/weixin4j-mp/weixin4j-mp-server/src/main/java/com/foxinmy/weixin4j/mp/server/WeixinMessageDecoder.java +++ b/weixin4j-mp/weixin4j-mp-server/src/main/java/com/foxinmy/weixin4j/mp/server/WeixinMessageDecoder.java @@ -18,7 +18,7 @@ import com.foxinmy.weixin4j.response.HttpWeixinMessage; import com.foxinmy.weixin4j.type.EncryptType; import com.foxinmy.weixin4j.util.ConfigUtil; import com.foxinmy.weixin4j.util.MessageUtil; -import com.foxinmy.weixin4j.xml.XStream; +import com.foxinmy.weixin4j.xml.XmlStream; /** * 微信消息解码类 @@ -41,7 +41,7 @@ public class WeixinMessageDecoder extends String xmlContent = req.content().toString(Consts.UTF_8); HttpWeixinMessage message = new HttpWeixinMessage(); if (StringUtils.isNotBlank(xmlContent)) { - message = XStream.get(xmlContent, HttpWeixinMessage.class); + message = XmlStream.get(xmlContent, HttpWeixinMessage.class); } message.setMethod(req.getMethod().name()); QueryStringDecoder queryDecoder = new QueryStringDecoder(req.getUri(), diff --git a/weixin4j-mp/weixin4j-mp-server/src/main/java/com/foxinmy/weixin4j/mp/server/WeixinMessageEncoder.java b/weixin4j-mp/weixin4j-mp-server/src/main/java/com/foxinmy/weixin4j/mp/server/WeixinMessageEncoder.java index 54d0da1d..0fbc3255 100644 --- a/weixin4j-mp/weixin4j-mp-server/src/main/java/com/foxinmy/weixin4j/mp/server/WeixinMessageEncoder.java +++ b/weixin4j-mp/weixin4j-mp-server/src/main/java/com/foxinmy/weixin4j/mp/server/WeixinMessageEncoder.java @@ -18,7 +18,7 @@ import com.foxinmy.weixin4j.util.DateUtil; import com.foxinmy.weixin4j.util.MessageUtil; import com.foxinmy.weixin4j.util.RandomUtil; import com.foxinmy.weixin4j.xml.Map2ObjectConverter; -import com.foxinmy.weixin4j.xml.XStream; +import com.foxinmy.weixin4j.xml.XmlStream; import com.thoughtworks.xstream.core.ClassLoaderReference; import com.thoughtworks.xstream.mapper.DefaultMapper; @@ -35,11 +35,11 @@ import com.thoughtworks.xstream.mapper.DefaultMapper; public class WeixinMessageEncoder extends MessageToMessageEncoder { private final Logger log = LoggerFactory.getLogger(getClass()); - private final static XStream mapXstream = XStream.get(); + private final static XmlStream mapXstream = XmlStream.get(); static { mapXstream.alias("xml", Map.class); mapXstream.registerConverter(new Map2ObjectConverter(new DefaultMapper( - new ClassLoaderReference(XStream.class.getClassLoader())))); + new ClassLoaderReference(XmlStream.class.getClassLoader())))); } @Override diff --git a/weixin4j-mp/weixin4j-mp-server/src/main/java/com/foxinmy/weixin4j/mp/util/HttpUtil.java b/weixin4j-mp/weixin4j-mp-server/src/main/java/com/foxinmy/weixin4j/mp/util/HttpUtil.java index 7a2c849e..d5b09755 100644 --- a/weixin4j-mp/weixin4j-mp-server/src/main/java/com/foxinmy/weixin4j/mp/util/HttpUtil.java +++ b/weixin4j-mp/weixin4j-mp-server/src/main/java/com/foxinmy/weixin4j/mp/util/HttpUtil.java @@ -36,9 +36,11 @@ public class HttpUtil { } FullHttpResponse httpResponse = new DefaultFullHttpResponse(HTTP_1_1, OK, Unpooled.copiedBuffer(content, Consts.UTF_8)); - httpResponse.headers().set(CONTENT_TYPE, - "application/xml;encoding=utf-8"); - httpResponse.headers().set(CONTENT_LENGTH, content.getBytes().length); + httpResponse.headers().set( + CONTENT_TYPE, + String.format("%s;encoding=%s", contentType.getMimeType(), + Consts.UTF_8.displayName())); + httpResponse.headers().set(CONTENT_LENGTH, content.getBytes(Consts.UTF_8).length); httpResponse.headers().set(CONNECTION, Values.KEEP_ALIVE); httpResponse.headers().set(DATE, new Date()); httpResponse.headers().set(SERVER, "netty4"); diff --git a/weixin4j-qy/pom.xml b/weixin4j-qy/pom.xml index 03b10e73..ecc3f8f9 100644 --- a/weixin4j-qy/pom.xml +++ b/weixin4j-qy/pom.xml @@ -4,7 +4,7 @@ com.foxinmy weixin4j - 1.0-SNAPSHOT + 1.1-SNAPSHOT weixin4j-qy weixin4j-qy @@ -15,11 +15,4 @@ weixin4j-qy-api weixin4j-qy-server - - - com.foxinmy - weixin4j-base - ${project.version} - - \ No newline at end of file diff --git a/weixin4j-qy/weixin4j-qy-api/pom.xml b/weixin4j-qy/weixin4j-qy-api/pom.xml index f90e29d7..14bd7bf8 100644 --- a/weixin4j-qy/weixin4j-qy-api/pom.xml +++ b/weixin4j-qy/weixin4j-qy-api/pom.xml @@ -1,10 +1,11 @@ - + 4.0.0 com.foxinmy weixin4j-qy - 1.0-SNAPSHOT + 1.1-SNAPSHOT weixin4j-qy-api weixin4j-qy-api @@ -22,6 +23,11 @@ + + com.foxinmy + weixin4j-base + ${project.version} + jaxen jaxen diff --git a/weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/api/MediaApi.java b/weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/api/MediaApi.java index 300ee857..91c6e6f8 100644 --- a/weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/api/MediaApi.java +++ b/weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/api/MediaApi.java @@ -4,6 +4,7 @@ import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; +import java.io.OutputStream; import org.apache.commons.lang3.StringUtils; import org.apache.http.entity.mime.content.ByteArrayBody; @@ -121,7 +122,7 @@ public class MediaApi extends QyApi { * @see {@link com.foxinmy.weixin4j.qy.api.MediaApi#downloadMedia(String)} */ public File downloadMedia(String mediaId, String extension) - throws WeixinException, IOException { + throws WeixinException { String media_path = ConfigUtil.getValue("media_path"); File file = new File(media_path + File.separator + mediaId + "." + extension); @@ -129,10 +130,27 @@ public class MediaApi extends QyApi { return file; } byte[] datas = downloadMedia(mediaId); - file.createNewFile(); - FileOutputStream out = new FileOutputStream(file); - out.write(datas); - out.close(); + OutputStream os = null; + try { + boolean flag = file.createNewFile(); + if (flag) { + os = new FileOutputStream(file); + os.write(datas); + } else { + throw new WeixinException("-1", String.format( + "create file fail:%s", file.getAbsolutePath())); + } + } catch (IOException e) { + throw new WeixinException("-1", e.getMessage()); + } finally { + try { + if (os != null) { + os.close(); + } + } catch (IOException ignore) { + ; + } + } return file; } diff --git a/weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/api/QyApi.java b/weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/api/QyApi.java index d7394cf6..84338455 100644 --- a/weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/api/QyApi.java +++ b/weixin4j-qy/weixin4j-qy-api/src/main/java/com/foxinmy/weixin4j/qy/api/QyApi.java @@ -15,8 +15,14 @@ import com.foxinmy.weixin4j.api.BaseApi; * @see api文档 */ public class QyApi extends BaseApi { + private final static ResourceBundle weixinBundle; static { weixinBundle = ResourceBundle .getBundle("com/foxinmy/weixin4j/qy/api/weixin"); } + + @Override + protected ResourceBundle getWeixinBundle() { + return weixinBundle; + } } diff --git a/weixin4j-qy/weixin4j-qy-server/pom.xml b/weixin4j-qy/weixin4j-qy-server/pom.xml index 86a2f3f6..b8888293 100644 --- a/weixin4j-qy/weixin4j-qy-server/pom.xml +++ b/weixin4j-qy/weixin4j-qy-server/pom.xml @@ -4,7 +4,7 @@ com.foxinmy weixin4j-qy - 1.0-SNAPSHOT + 1.1-SNAPSHOT weixin4j-qy-server weixin4j-qy-server diff --git a/weixin4j-qy/weixin4j-qy-server/src/main/java/com/foxinmy/weixin4j/qy/server/WeixinMessageDecoder.java b/weixin4j-qy/weixin4j-qy-server/src/main/java/com/foxinmy/weixin4j/qy/server/WeixinMessageDecoder.java index 45983406..21e00608 100644 --- a/weixin4j-qy/weixin4j-qy-server/src/main/java/com/foxinmy/weixin4j/qy/server/WeixinMessageDecoder.java +++ b/weixin4j-qy/weixin4j-qy-server/src/main/java/com/foxinmy/weixin4j/qy/server/WeixinMessageDecoder.java @@ -18,7 +18,7 @@ import com.foxinmy.weixin4j.response.HttpWeixinMessage; import com.foxinmy.weixin4j.type.EncryptType; import com.foxinmy.weixin4j.util.ConfigUtil; import com.foxinmy.weixin4j.util.MessageUtil; -import com.foxinmy.weixin4j.xml.XStream; +import com.foxinmy.weixin4j.xml.XmlStream; /** * 微信消息解码类 @@ -42,7 +42,7 @@ public class WeixinMessageDecoder extends HttpWeixinMessage message = new HttpWeixinMessage(); message.setXmlContent(xmlContent); if (StringUtils.isNotBlank(xmlContent)) { - message = XStream.get(xmlContent, HttpWeixinMessage.class); + message = XmlStream.get(xmlContent, HttpWeixinMessage.class); message.setXmlContent(MessageUtil.aesDecrypt(qyAccount.getId(), qyAccount.getEncodingAesKey(), message.getEncryptContent())); } diff --git a/weixin4j-qy/weixin4j-qy-server/src/main/java/com/foxinmy/weixin4j/qy/server/WeixinMessageEncoder.java b/weixin4j-qy/weixin4j-qy-server/src/main/java/com/foxinmy/weixin4j/qy/server/WeixinMessageEncoder.java index c1d0affc..e72218cd 100644 --- a/weixin4j-qy/weixin4j-qy-server/src/main/java/com/foxinmy/weixin4j/qy/server/WeixinMessageEncoder.java +++ b/weixin4j-qy/weixin4j-qy-server/src/main/java/com/foxinmy/weixin4j/qy/server/WeixinMessageEncoder.java @@ -18,7 +18,7 @@ import com.foxinmy.weixin4j.util.DateUtil; import com.foxinmy.weixin4j.util.MessageUtil; import com.foxinmy.weixin4j.util.RandomUtil; import com.foxinmy.weixin4j.xml.Map2ObjectConverter; -import com.foxinmy.weixin4j.xml.XStream; +import com.foxinmy.weixin4j.xml.XmlStream; import com.thoughtworks.xstream.core.ClassLoaderReference; import com.thoughtworks.xstream.mapper.DefaultMapper; @@ -35,11 +35,11 @@ import com.thoughtworks.xstream.mapper.DefaultMapper; public class WeixinMessageEncoder extends MessageToMessageEncoder { private final Logger log = LoggerFactory.getLogger(getClass()); - private final static XStream mapXstream = XStream.get(); + private final static XmlStream mapXstream = XmlStream.get(); static { mapXstream.alias("xml", Map.class); mapXstream.registerConverter(new Map2ObjectConverter(new DefaultMapper( - new ClassLoaderReference(XStream.class.getClassLoader())))); + new ClassLoaderReference(XmlStream.class.getClassLoader())))); } @Override diff --git a/weixin4j-qy/weixin4j-qy-server/src/main/java/com/foxinmy/weixin4j/qy/util/HttpUtil.java b/weixin4j-qy/weixin4j-qy-server/src/main/java/com/foxinmy/weixin4j/qy/util/HttpUtil.java index 8573c988..1de3d635 100644 --- a/weixin4j-qy/weixin4j-qy-server/src/main/java/com/foxinmy/weixin4j/qy/util/HttpUtil.java +++ b/weixin4j-qy/weixin4j-qy-server/src/main/java/com/foxinmy/weixin4j/qy/util/HttpUtil.java @@ -41,7 +41,7 @@ public class HttpUtil { String.format("%s;encoding=%s", contentType.getMimeType(), Consts.UTF_8.displayName())); - httpResponse.headers().set(CONTENT_LENGTH, content.getBytes().length); + httpResponse.headers().set(CONTENT_LENGTH, content.getBytes(Consts.UTF_8).length); httpResponse.headers().set(CONNECTION, Values.KEEP_ALIVE); httpResponse.headers().set(DATE, new Date()); httpResponse.headers().set(SERVER, "netty4");