From 8281b636882b08a40a2e33c0a2e3f8f660bc407d Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Fri, 30 Sep 2016 17:35:24 +0800 Subject: [PATCH 01/83] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index aba634dd..b4165f69 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ ### 注意: 1. ***本项目Fork自chanjarster/weixin-java-tools,但由于原项目已停止维护,故单独维护和发布,且发布到maven上的groupId也会不同,详细信息见下文。*** -1. ***自2.0.0版本以来,主要是公众号的接口调整比较大,主要是为了解决主接口类过于庞大不方便管理的问题,将接口实现代码按模块进行拆分。*** +1. ***自2.0.0版本以来,公众号的接口调整比较大,主要是为了解决主接口类过于庞大不方便管理的问题,将接口实现代码按模块进行拆分。*** 1. 最新更新:2016-09-30 发布2.2.0正式版! =========== From 2ae95e48efe99f98690e3e0fcd3d7a10f05b2092 Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Sat, 1 Oct 2016 14:55:47 +0800 Subject: [PATCH 02/83] clean code --- .../chanjar/weixin/mp/api/WxMpPayService.java | 1 - .../mp/api/impl/WxMpKefuServiceImpl.java | 35 +++++++++++-------- .../mp/api/impl/WxMpPayServiceImpl.java | 5 +-- .../weixin/mp/bean/store/WxMpStoreInfo.java | 1 - 4 files changed, 22 insertions(+), 20 deletions(-) diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpPayService.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpPayService.java index 72eabd08..c6480e6c 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpPayService.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpPayService.java @@ -6,7 +6,6 @@ import me.chanjar.weixin.common.exception.WxErrorException; import me.chanjar.weixin.mp.bean.pay.WxMpPayCallback; import me.chanjar.weixin.mp.bean.pay.WxMpPayRefundResult; import me.chanjar.weixin.mp.bean.pay.WxMpPayResult; -import me.chanjar.weixin.mp.bean.pay.WxMpPrepayIdResult; import me.chanjar.weixin.mp.bean.pay.WxRedpackResult; import me.chanjar.weixin.mp.bean.pay.WxSendRedpackRequest; import me.chanjar.weixin.mp.bean.pay.WxUnifiedOrderRequest; diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpKefuServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpKefuServiceImpl.java index 99428348..e83c17ac 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpKefuServiceImpl.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpKefuServiceImpl.java @@ -1,6 +1,13 @@ package me.chanjar.weixin.mp.api.impl; +import java.io.File; +import java.util.Date; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import com.google.gson.JsonObject; + import me.chanjar.weixin.common.bean.result.WxError; import me.chanjar.weixin.common.bean.result.WxMediaUploadResult; import me.chanjar.weixin.common.exception.WxErrorException; @@ -10,12 +17,12 @@ import me.chanjar.weixin.mp.api.WxMpService; import me.chanjar.weixin.mp.bean.WxMpCustomMessage; import me.chanjar.weixin.mp.bean.kefu.request.WxMpKfAccountRequest; import me.chanjar.weixin.mp.bean.kefu.request.WxMpKfSessionRequest; -import me.chanjar.weixin.mp.bean.kefu.result.*; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.io.File; -import java.util.Date; +import me.chanjar.weixin.mp.bean.kefu.result.WxMpKfList; +import me.chanjar.weixin.mp.bean.kefu.result.WxMpKfMsgList; +import me.chanjar.weixin.mp.bean.kefu.result.WxMpKfOnlineList; +import me.chanjar.weixin.mp.bean.kefu.result.WxMpKfSessionGetResult; +import me.chanjar.weixin.mp.bean.kefu.result.WxMpKfSessionList; +import me.chanjar.weixin.mp.bean.kefu.result.WxMpKfSessionWaitCaseList; /** * @@ -38,7 +45,7 @@ public class WxMpKefuServiceImpl implements WxMpKefuService { throws WxErrorException { String url = "https://api.weixin.qq.com/cgi-bin/message/custom/send"; String responseContent = this.wxMpService.post(url, message.toJson()); - return true; + return responseContent != null; } @Override @@ -60,7 +67,7 @@ public class WxMpKefuServiceImpl implements WxMpKefuService { throws WxErrorException { String url = API_URL_PREFIX + "/kfaccount/add"; String responseContent = this.wxMpService.post(url, request.toJson()); - return true; + return responseContent != null; } @Override @@ -68,14 +75,14 @@ public class WxMpKefuServiceImpl implements WxMpKefuService { throws WxErrorException { String url = API_URL_PREFIX + "/kfaccount/update"; String responseContent = this.wxMpService.post(url, request.toJson()); - return true; + return responseContent != null; } @Override public boolean kfAccountInviteWorker(WxMpKfAccountRequest request) throws WxErrorException { String url = API_URL_PREFIX + "/kfaccount/inviteworker"; String responseContent = this.wxMpService.post(url, request.toJson()); - return true; + return responseContent != null; } @Override @@ -84,14 +91,14 @@ public class WxMpKefuServiceImpl implements WxMpKefuService { String url = API_URL_PREFIX + "/kfaccount/uploadheadimg?kf_account=" + kfAccount; WxMediaUploadResult responseContent = this.wxMpService .execute(new MediaUploadRequestExecutor(), url, imgFile); - return true; + return responseContent != null; } @Override public boolean kfAccountDel(String kfAccount) throws WxErrorException { String url = API_URL_PREFIX + "/kfaccount/del?kf_account=" + kfAccount; String responseContent = this.wxMpService.get(url, null); - return true; + return responseContent != null; } @Override @@ -100,7 +107,7 @@ public class WxMpKefuServiceImpl implements WxMpKefuService { WxMpKfSessionRequest request = new WxMpKfSessionRequest(kfAccount, openid); String url = API_URL_PREFIX + "/kfsession/create"; String responseContent = this.wxMpService.post(url, request.toJson()); - return true; + return responseContent != null; } @Override @@ -109,7 +116,7 @@ public class WxMpKefuServiceImpl implements WxMpKefuService { WxMpKfSessionRequest request = new WxMpKfSessionRequest(kfAccount, openid); String url = API_URL_PREFIX + "/kfsession/close"; String responseContent = this.wxMpService.post(url, request.toJson()); - return true; + return responseContent != null; } @Override diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImpl.java index dcb1e89f..bc48e0db 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImpl.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImpl.java @@ -11,8 +11,6 @@ import java.util.TreeMap; import org.apache.commons.codec.digest.DigestUtils; import org.apache.commons.lang3.StringUtils; import org.joor.Reflect; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import com.google.common.collect.Lists; import com.google.common.collect.Maps; @@ -42,7 +40,6 @@ public class WxMpPayServiceImpl implements WxMpPayService { private static final List TRADE_TYPES = Lists.newArrayList("JSAPI", "NATIVE", "APP"); - private final Logger log = LoggerFactory.getLogger(WxMpPayServiceImpl.class); private WxMpService wxMpService; public WxMpPayServiceImpl(WxMpService wxMpService) { @@ -286,7 +283,7 @@ public class WxMpPayServiceImpl implements WxMpPayService { if (!TRADE_TYPES.contains(request.getTradeType())) { throw new IllegalArgumentException( - "trade_type目前必须为" + TRADE_TYPES + "其中之一"); +"trade_type目前必须为" + TRADE_TYPES + "其中之一"); } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/store/WxMpStoreInfo.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/store/WxMpStoreInfo.java index 5b44b860..864d9d2c 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/store/WxMpStoreInfo.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/store/WxMpStoreInfo.java @@ -1,6 +1,5 @@ package me.chanjar.weixin.mp.bean.store; -import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; import org.apache.commons.lang3.builder.ToStringBuilder; import org.apache.commons.lang3.builder.ToStringStyle; From 118e4c7a28be47c2488c77af43dab77edb7a27be Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Mon, 3 Oct 2016 23:13:59 +0800 Subject: [PATCH 03/83] =?UTF-8?q?=E6=8F=90=E5=8F=96=E6=94=AF=E4=BB=98?= =?UTF-8?q?=E5=85=AC=E7=94=A8=E6=8E=A5=E5=8F=A3=E5=9C=B0=E5=9D=80=E5=B8=B8?= =?UTF-8?q?=E9=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../weixin/mp/api/impl/WxMpPayServiceImpl.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImpl.java index bc48e0db..965e5df1 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImpl.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImpl.java @@ -38,6 +38,7 @@ import me.chanjar.weixin.mp.bean.pay.WxUnifiedOrderResult; */ public class WxMpPayServiceImpl implements WxMpPayService { + private static final String PAY_BASE_URL = "https://api.mch.weixin.qq.com"; private static final List TRADE_TYPES = Lists.newArrayList("JSAPI", "NATIVE", "APP"); private WxMpService wxMpService; @@ -77,7 +78,7 @@ public class WxMpPayServiceImpl implements WxMpPayService { } request.append(""); - String url = "https://api.mch.weixin.qq.com/pay/orderquery"; + String url = PAY_BASE_URL + "/pay/orderquery"; String responseContent = this.wxMpService.post(url, request.toString()); XStream xstream = XStreamInitializer.getInstance(); xstream.alias("xml", WxMpPayResult.class); @@ -119,7 +120,7 @@ public class WxMpPayServiceImpl implements WxMpPayService { } request.append(""); - String url = "https://api.mch.weixin.qq.com/secapi/pay/refund"; + String url = PAY_BASE_URL + "/secapi/pay/refund"; String responseContent = this.wxMpService.post(url, request.toString()); XStream xstream = XStreamInitializer.getInstance(); xstream.processAnnotations(WxMpPayRefundResult.class); @@ -163,10 +164,10 @@ public class WxMpPayServiceImpl implements WxMpPayService { this.wxMpService.getWxMpConfigStorage().getPartnerKey()); request.setSign(sign); - String url = "https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack"; + String url = PAY_BASE_URL + "/mmpaymkttransfers/sendredpack"; if (request.getAmtType() != null) { //裂变红包 - url = "https://api.mch.weixin.qq.com/mmpaymkttransfers/sendgroupredpack"; + url = PAY_BASE_URL + "/mmpaymkttransfers/sendgroupredpack"; } String responseContent = this.wxMpService.post(url, xstream.toXML(request)); @@ -245,7 +246,7 @@ public class WxMpPayServiceImpl implements WxMpPayService { this.wxMpService.getWxMpConfigStorage().getPartnerKey()); request.setSign(sign); - String url = "https://api.mch.weixin.qq.com/pay/unifiedorder"; + String url = PAY_BASE_URL + "/pay/unifiedorder"; String responseContent = this.wxMpService.post(url, xstream.toXML(request)); WxUnifiedOrderResult result = (WxUnifiedOrderResult) xstream @@ -282,8 +283,7 @@ public class WxMpPayServiceImpl implements WxMpPayService { } if (!TRADE_TYPES.contains(request.getTradeType())) { - throw new IllegalArgumentException( -"trade_type目前必须为" + TRADE_TYPES + "其中之一"); + throw new IllegalArgumentException("trade_type目前必须为" + TRADE_TYPES + "其中之一"); } From f2655e5eed9085d83a3ce77538f42d23fbc721b1 Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Tue, 4 Oct 2016 23:38:17 +0800 Subject: [PATCH 04/83] =?UTF-8?q?=E7=A7=BB=E9=99=A4=E6=97=A0=E7=94=A8?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mp/bean/pay/WxMpPrepayIdResult.java | 124 ------------------ 1 file changed, 124 deletions(-) delete mode 100644 weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxMpPrepayIdResult.java diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxMpPrepayIdResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxMpPrepayIdResult.java deleted file mode 100644 index cff9d787..00000000 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxMpPrepayIdResult.java +++ /dev/null @@ -1,124 +0,0 @@ -package me.chanjar.weixin.mp.bean.pay; - -import java.io.Serializable; - -/** - *
- * 在发起微信支付前,需要调用统一下单接口,获取"预支付交易会话标识"返回的结果
- * 统一下单(详见http://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1)
- * 
- * - * @author chanjarster - */ -@Deprecated -public class WxMpPrepayIdResult implements Serializable { - private static final long serialVersionUID = -8970574397788396143L; - private String return_code; - private String return_msg; - private String appid; - private String mch_id; - private String nonce_str; - private String sign; - private String result_code; - private String prepay_id; - private String trade_type; - private String err_code; - private String err_code_des; - private String code_url; - - public String getReturn_code() { - return this.return_code; - } - - public void setReturn_code(String return_code) { - this.return_code = return_code; - } - - public String getReturn_msg() { - return this.return_msg; - } - - public void setReturn_msg(String return_msg) { - this.return_msg = return_msg; - } - - public String getAppid() { - return this.appid; - } - - public void setAppid(String appid) { - this.appid = appid; - } - - public String getMch_id() { - return this.mch_id; - } - - public void setMch_id(String mch_id) { - this.mch_id = mch_id; - } - - public String getNonce_str() { - return this.nonce_str; - } - - public void setNonce_str(String nonce_str) { - this.nonce_str = nonce_str; - } - - public String getSign() { - return this.sign; - } - - public void setSign(String sign) { - this.sign = sign; - } - - public String getResult_code() { - return this.result_code; - } - - public void setResult_code(String result_code) { - this.result_code = result_code; - } - - public String getPrepay_id() { - return this.prepay_id; - } - - public void setPrepay_id(String prepay_id) { - this.prepay_id = prepay_id; - } - - public String getTrade_type() { - return this.trade_type; - } - - public void setTrade_type(String trade_type) { - this.trade_type = trade_type; - } - - public String getErr_code() { - return this.err_code; - } - - public void setErr_code(String err_code) { - this.err_code = err_code; - } - - public String getErr_code_des() { - return this.err_code_des; - } - - public void setErr_code_des(String err_code_des) { - this.err_code_des = err_code_des; - } - - public String getCode_url() { - return this.code_url; - } - - public void setCode_url(String code_url) { - this.code_url = code_url; - } -} From 392429a476cfe1b96f5d06abe03a54a4e5a2fca7 Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Tue, 4 Oct 2016 23:43:54 +0800 Subject: [PATCH 05/83] =?UTF-8?q?=E4=B8=BAWxErrorException=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E4=B8=80=E4=B8=AA=E6=9E=84=E9=80=A0=E6=96=B9=E6=B3=95?= =?UTF-8?q?=EF=BC=8C=E7=94=A8=E4=BA=8E=E5=BF=85=E8=A6=81=E6=97=B6=E6=89=93?= =?UTF-8?q?=E5=8D=B0=E5=87=BA=E9=94=99=E8=AF=AF=E6=A0=B9=E6=BA=90=E4=BF=A1?= =?UTF-8?q?=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../me/chanjar/weixin/common/exception/WxErrorException.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/exception/WxErrorException.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/exception/WxErrorException.java index 51219a41..4038e601 100644 --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/exception/WxErrorException.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/exception/WxErrorException.java @@ -13,6 +13,11 @@ public class WxErrorException extends Exception { this.error = error; } + public WxErrorException(WxError error, Throwable cause) { + super(error.toString(), cause); + this.error = error; + } + public WxError getError() { return this.error; } From a4b0fdce937759fb309d610432eeb329fe75decc Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Wed, 5 Oct 2016 21:35:31 +0800 Subject: [PATCH 06/83] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=95=86=E6=88=B7?= =?UTF-8?q?=E5=B9=B3=E5=8F=B0=E7=9A=84=E6=B5=8B=E8=AF=95=E7=9B=B8=E5=85=B3?= =?UTF-8?q?=E7=9A=84=E9=85=8D=E7=BD=AE=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- weixin-java-mp/src/test/resources/test-config.sample.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/weixin-java-mp/src/test/resources/test-config.sample.xml b/weixin-java-mp/src/test/resources/test-config.sample.xml index ad46a19e..2bbc8d8e 100644 --- a/weixin-java-mp/src/test/resources/test-config.sample.xml +++ b/weixin-java-mp/src/test/resources/test-config.sample.xml @@ -6,6 +6,8 @@ 可以不填写 可以不填写 某个加你公众号的用户的openId + 微信商户平台ID + 商户平台设置的API密钥 模版消息的模版ID 网页授权获取用户信息回调地址 网页应用授权登陆回调地址 From dabafc2a9e52db51f62662c024ded60a472fd300 Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Thu, 6 Oct 2016 20:53:39 +0800 Subject: [PATCH 07/83] =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E4=BC=81=E4=B8=9A?= =?UTF-8?q?=E4=BB=98=E6=AC=BE=E7=9A=84=E6=8E=A5=E5=8F=A3=EF=BC=8C=E6=9A=82?= =?UTF-8?q?=E6=97=B6=E6=9C=AA=E8=B0=83=E9=80=9A=EF=BC=8C=E5=9B=A0=E7=BC=BA?= =?UTF-8?q?=E5=B0=91=E8=AF=81=E4=B9=A6=20for=20issue=20#50?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../chanjar/weixin/mp/api/WxMpPayService.java | 16 ++ .../mp/api/impl/WxMpPayServiceImpl.java | 93 ++++++- .../weixin/mp/bean/pay/WxEntPayRequest.java | 253 ++++++++++++++++++ .../weixin/mp/bean/pay/WxEntPayResult.java | 190 +++++++++++++ .../mp/api/impl/WxMpPayServiceImplTest.java | 15 ++ 5 files changed, 553 insertions(+), 14 deletions(-) create mode 100644 weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxEntPayRequest.java create mode 100644 weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxEntPayResult.java diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpPayService.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpPayService.java index c6480e6c..cf5bb8c3 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpPayService.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpPayService.java @@ -1,8 +1,11 @@ package me.chanjar.weixin.mp.api; +import java.io.File; import java.util.Map; import me.chanjar.weixin.common.exception.WxErrorException; +import me.chanjar.weixin.mp.bean.pay.WxEntPayRequest; +import me.chanjar.weixin.mp.bean.pay.WxEntPayResult; import me.chanjar.weixin.mp.bean.pay.WxMpPayCallback; import me.chanjar.weixin.mp.bean.pay.WxMpPayRefundResult; import me.chanjar.weixin.mp.bean.pay.WxMpPayResult; @@ -85,4 +88,17 @@ public interface WxMpPayService { */ WxRedpackResult sendRedpack(WxSendRedpackRequest request) throws WxErrorException; + /** + *
 
+   * 企业付款业务是基于微信支付商户平台的资金管理能力,为了协助商户方便地实现企业向个人付款,针对部分有开发能力的商户,提供通过API完成企业付款的功能。
+   * 比如目前的保险行业向客户退保、给付、理赔。
+   * 企业付款将使用商户的可用余额,需确保可用余额充足。查看可用余额、充值、提现请登录商户平台“资金管理”https://pay.weixin.qq.com/进行操作。
+   * 注意:与商户微信支付收款资金并非同一账户,需要单独充值。
+   * 文档详见:https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=14_2
+   * 接口链接:https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers
+   * @param keyFile  证书文件对象
+   * 
+ */ + WxEntPayResult entPay(WxEntPayRequest request, File keyFile) throws WxErrorException; + } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImpl.java index 965e5df1..79e2c312 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImpl.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImpl.java @@ -1,6 +1,9 @@ package me.chanjar.weixin.mp.api.impl; +import java.io.File; +import java.io.FileInputStream; import java.lang.reflect.Field; +import java.security.KeyStore; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -8,8 +11,19 @@ import java.util.Map.Entry; import java.util.SortedMap; import java.util.TreeMap; +import javax.net.ssl.SSLContext; + import org.apache.commons.codec.digest.DigestUtils; import org.apache.commons.lang3.StringUtils; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.conn.ssl.DefaultHostnameVerifier; +import org.apache.http.conn.ssl.SSLConnectionSocketFactory; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.ssl.SSLContexts; +import org.apache.http.util.EntityUtils; import org.joor.Reflect; import com.google.common.collect.Lists; @@ -23,6 +37,8 @@ import me.chanjar.weixin.common.exception.WxErrorException; import me.chanjar.weixin.common.util.xml.XStreamInitializer; import me.chanjar.weixin.mp.api.WxMpPayService; import me.chanjar.weixin.mp.api.WxMpService; +import me.chanjar.weixin.mp.bean.pay.WxEntPayRequest; +import me.chanjar.weixin.mp.bean.pay.WxEntPayResult; import me.chanjar.weixin.mp.bean.pay.WxMpPayCallback; import me.chanjar.weixin.mp.bean.pay.WxMpPayRefundResult; import me.chanjar.weixin.mp.bean.pay.WxMpPayResult; @@ -263,6 +279,23 @@ public class WxMpPayServiceImpl implements WxMpPayService { private void checkParameters(WxUnifiedOrderRequest request) { + checkNotNullParams(request); + + if (!TRADE_TYPES.contains(request.getTradeType())) { + throw new IllegalArgumentException("trade_type目前必须为" + TRADE_TYPES + "其中之一"); + + } + + if ("JSAPI".equals(request.getTradeType()) && request.getOpenid() == null) { + throw new IllegalArgumentException("当 trade_type是'JSAPI'时未指定openid"); + } + + if ("NATIVE".equals(request.getTradeType()) && request.getProductId() == null) { + throw new IllegalArgumentException("当 trade_type是'NATIVE'时未指定product_id"); + } + } + + private void checkNotNullParams(Object request) { List nullFields = Lists.newArrayList(); for (Entry entry : Reflect.on(request).fields() .entrySet()) { @@ -281,20 +314,6 @@ public class WxMpPayServiceImpl implements WxMpPayService { if (!nullFields.isEmpty()) { throw new IllegalArgumentException("必填字段[" + nullFields + "]必须提供值"); } - - if (!TRADE_TYPES.contains(request.getTradeType())) { - throw new IllegalArgumentException("trade_type目前必须为" + TRADE_TYPES + "其中之一"); - - } - - if ("JSAPI".equals(request.getTradeType()) && request.getOpenid() == null) { - throw new IllegalArgumentException("当 trade_type是'JSAPI'时未指定openid"); - } - - if ("NATIVE".equals(request.getTradeType()) - && request.getProductId() == null) { - throw new IllegalArgumentException("当 trade_type是'NATIVE'时未指定product_id"); - } } @Override @@ -332,4 +351,50 @@ public class WxMpPayServiceImpl implements WxMpPayService { return payInfo; } + @Override + public WxEntPayResult entPay(WxEntPayRequest request, File keyFile) throws WxErrorException { + checkNotNullParams(request); + + XStream xstream = XStreamInitializer.getInstance(); + xstream.processAnnotations(WxEntPayRequest.class); + xstream.processAnnotations(WxEntPayResult.class); + + request.setMchAppid(this.wxMpService.getWxMpConfigStorage().getAppId()); + request.setMchId(this.wxMpService.getWxMpConfigStorage().getPartnerId()); + request.setNonceStr(System.currentTimeMillis() + ""); + + String sign = this.createSign(xmlBean2Map(request), this.wxMpService.getWxMpConfigStorage().getPartnerKey()); + request.setSign(sign); + + String url = PAY_BASE_URL + "/mmpaymkttransfers/promotion/transfers"; + + try (FileInputStream instream = new FileInputStream(keyFile)) { + String mchId = request.getMchId(); + KeyStore keyStore = KeyStore.getInstance("PKCS12"); + keyStore.load(instream, mchId.toCharArray()); + + SSLContext sslcontext = SSLContexts.custom().loadKeyMaterial(keyStore, mchId.toCharArray()).build(); + SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslcontext, new String[] { "TLSv1" }, null, + new DefaultHostnameVerifier()); + + try (CloseableHttpClient httpclient = HttpClients.custom().setSSLSocketFactory(sslsf).build()) { + HttpPost httpPost = new HttpPost(url); + httpPost.setEntity(new StringEntity(new String(xstream.toXML(request).getBytes("UTF-8"), "ISO-8859-1"))); + + try (CloseableHttpResponse response = httpclient.execute(httpPost)) { + String responseContent = EntityUtils.toString(response.getEntity()); + WxEntPayResult result = (WxEntPayResult) xstream.fromXML(responseContent); + if ("FAIL".equals(result.getResultCode())) { + throw new WxErrorException( + WxError.newBuilder().setErrorMsg(result.getErrCode() + ":" + result.getErrCodeDes()).build()); + } + + return result; + } + } + } catch (Exception e) { + throw new WxErrorException(WxError.newBuilder().setErrorMsg(e.getMessage()).build(), e); + } + } + } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxEntPayRequest.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxEntPayRequest.java new file mode 100644 index 00000000..9c7253d2 --- /dev/null +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxEntPayRequest.java @@ -0,0 +1,253 @@ +package me.chanjar.weixin.mp.bean.pay; + +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; + +import com.thoughtworks.xstream.annotations.XStreamAlias; + +/** + * 企业付款请求对象 + * 注释中各行含义如下: + * 字段名、 变量名、 是否必填、 示例值、 类型、 描述 + * Created by Binary Wang on 2016/10/02. + * @author binarywang (https://github.com/binarywang) + */ +@XStreamAlias("xml") +public class WxEntPayRequest { + /** + * 公众账号appid + * mch_appid + * 是 + * wx8888888888888888 + * String + * 微信分配的公众账号ID(企业号corpid即为此appId) + */ + @XStreamAlias("mch_appid") + private String mchAppid; + + /** + * 商户号 + * mchid + * 是 + * 1900000109 + * String(32) + * 微信支付分配的商户号 + */ + @XStreamAlias("mchid") + private String mchId; + + /** + * 设备号 + * device_info + * 否 + * 13467007045764 + * String(32) + *微信支付分配的终端设备号 + */ + @XStreamAlias("device_info") + private String deviceInfo; + + /** + * 随机字符串 + * nonce_str + *是 + *5K8264ILTKCH16CQ2502SI8ZNMTM67VS + *String(32) + *随机字符串,不长于32位 + */ + @XStreamAlias("nonce_str") + private String nonceStr; + + /** + * 签名 + * sign + * 是 + * C380BEC2BFD727A4B6845133519F3AD6 + * String(32) + *签名,详见签名算法 + */ + @XStreamAlias("sign") + private String sign; + + /** + * 商户订单号 + * partner_trade_no + * 是 + * 10000098201411111234567890 + * String + * 商户订单号, + */ + @XStreamAlias("partner_trade_no") + private String partnerTradeNo; + + /** + * 需保持唯一性 用户openid + * openid + * 是 + * oxTWIuGaIt6gTKsQRLau2M0yL16E + * String + * 商户appid下,某用户的openid + */ + @XStreamAlias("openid") + private String openid; + + /** + * 校验用户姓名选项 + * check_name + * 是 + * OPTION_CHECK + * String + * NO_CHECK:不校验真实姓名  + * FORCE_CHECK:强校验真实姓名(未实名认证的用户会校验失败,无法转账)  + * OPTION_CHECK:针对已实名认证的用户才校验真实姓名(未实名认证用户不校验,可以转账成功) + */ + @XStreamAlias("check_name") + private String checkName; + + /** + * 收款用户姓名 + * re_user_name + * 可选 + * 马花花 + * String + * 收款用户真实姓名。 + * 如果check_name设置为FORCE_CHECK或OPTION_CHECK, 则必填用户真实姓名 + */ + @XStreamAlias("re_user_name") + private String reUserName; + + /** + * 金额 + * amount + * 是 + * 10099 + * int + * 企业付款金额, 单位为分 + */ + @XStreamAlias("amount") + private Integer amount; + + /** + * 企业付款描述信息 + * desc + * 是 + * 理赔 + * String + * 企业付款操作说明信息。必填。 + */ + @XStreamAlias("desc") + private String description; + + /** + * Ip地址 + * spbill_create_ip + * 是 + * 192.168.0.1 + * String(32) + * 调用接口的机器Ip地址 + */ + @XStreamAlias("spbill_create_ip") + private String spbillCreateIp; + + public String getMchAppid() { + return mchAppid; + } + + public void setMchAppid(String mchAppid) { + this.mchAppid = mchAppid; + } + + public String getMchId() { + return mchId; + } + + public void setMchId(String mchId) { + this.mchId = mchId; + } + + public String getDeviceInfo() { + return deviceInfo; + } + + public void setDeviceInfo(String deviceInfo) { + this.deviceInfo = deviceInfo; + } + + public String getNonceStr() { + return nonceStr; + } + + public void setNonceStr(String nonceStr) { + this.nonceStr = nonceStr; + } + + public String getSign() { + return sign; + } + + public void setSign(String sign) { + this.sign = sign; + } + + public String getPartnerTradeNo() { + return partnerTradeNo; + } + + public void setPartnerTradeNo(String partnerTradeNo) { + this.partnerTradeNo = partnerTradeNo; + } + + public String getOpenid() { + return openid; + } + + public void setOpenid(String openid) { + this.openid = openid; + } + + public String getCheckName() { + return checkName; + } + + public void setCheckName(String checkName) { + this.checkName = checkName; + } + + public String getReUserName() { + return reUserName; + } + + public void setReUserName(String reUserName) { + this.reUserName = reUserName; + } + + public Integer getAmount() { + return amount; + } + + public void setAmount(Integer amount) { + this.amount = amount; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getSpbillCreateIp() { + return spbillCreateIp; + } + + public void setSpbillCreateIp(String spbillCreateIp) { + this.spbillCreateIp = spbillCreateIp; + } + + @Override + public String toString() { + return ToStringBuilder.reflectionToString(this, ToStringStyle.JSON_STYLE); + } + +} diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxEntPayResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxEntPayResult.java new file mode 100644 index 00000000..b2dbb8f1 --- /dev/null +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxEntPayResult.java @@ -0,0 +1,190 @@ +package me.chanjar.weixin.mp.bean.pay; + +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; + +import com.thoughtworks.xstream.annotations.XStreamAlias; + +/** + * 企业付款返回结果 + * Created by Binary Wang on 2016/10/02. + * @author binarywang (https://github.com/binarywang) + */ +@XStreamAlias("xml") +public class WxEntPayResult { + + /** + * 返回状态码 + */ + @XStreamAlias("return_code") + private String returnCode; + + /** + * 返回信息 + */ + @XStreamAlias("return_msg") + private String returnMsg; + + //############以下字段在return_code为SUCCESS的时候有返回 + + /** + * 商户appid + */ + @XStreamAlias("mch_appid") + private String mchAppid; + + /** + * 商户号 + */ + @XStreamAlias("mchid") + private String mchId; + + /** + * 设备号 + */ + @XStreamAlias("device_info") + private String deviceInfo; + + /** + * 随机字符串 + */ + @XStreamAlias("nonce_str") + private String nonceStr; + + /** + * 业务结果 + */ + @XStreamAlias("result_code") + private String resultCode; + /** + * 错误代码 + */ + @XStreamAlias("err_code") + private String errCode; + + /** + * 错误代码描述 + */ + @XStreamAlias("err_code_des") + private String errCodeDes; + + //############以下字段在return_code 和result_code都为SUCCESS的时候有返回############## + /** + * 商户订单号 + */ + @XStreamAlias("partner_trade_no") + private String partnerTradeNo; + + /** + * 微信订单号 + */ + @XStreamAlias("payment_no") + private String paymentNo; + + /** + * 微信支付成功时间 + */ + @XStreamAlias("payment_time") + private String paymentTime; + + @Override + public String toString() { + return ToStringBuilder.reflectionToString(this, ToStringStyle.JSON_STYLE); + } + + public String getReturnCode() { + return returnCode; + } + + public void setReturnCode(String returnCode) { + this.returnCode = returnCode; + } + + public String getReturnMsg() { + return returnMsg; + } + + public void setReturnMsg(String returnMsg) { + this.returnMsg = returnMsg; + } + + public String getMchAppid() { + return mchAppid; + } + + public void setMchAppid(String mchAppid) { + this.mchAppid = mchAppid; + } + + public String getMchId() { + return mchId; + } + + public void setMchId(String mchId) { + this.mchId = mchId; + } + + public String getDeviceInfo() { + return deviceInfo; + } + + public void setDeviceInfo(String deviceInfo) { + this.deviceInfo = deviceInfo; + } + + public String getNonceStr() { + return nonceStr; + } + + public void setNonceStr(String nonceStr) { + this.nonceStr = nonceStr; + } + + public String getResultCode() { + return resultCode; + } + + public void setResultCode(String resultCode) { + this.resultCode = resultCode; + } + + public String getErrCode() { + return errCode; + } + + public void setErrCode(String errCode) { + this.errCode = errCode; + } + + public String getErrCodeDes() { + return errCodeDes; + } + + public void setErrCodeDes(String errCodeDes) { + this.errCodeDes = errCodeDes; + } + + public String getPartnerTradeNo() { + return partnerTradeNo; + } + + public void setPartnerTradeNo(String partnerTradeNo) { + this.partnerTradeNo = partnerTradeNo; + } + + public String getPaymentNo() { + return paymentNo; + } + + public void setPaymentNo(String paymentNo) { + this.paymentNo = paymentNo; + } + + public String getPaymentTime() { + return paymentTime; + } + + public void setPaymentTime(String paymentTime) { + this.paymentTime = paymentTime; + } +} diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImplTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImplTest.java index 092be38a..6199efeb 100644 --- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImplTest.java +++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImplTest.java @@ -1,5 +1,7 @@ package me.chanjar.weixin.mp.api.impl; +import java.io.File; + import org.testng.annotations.Guice; import org.testng.annotations.Test; @@ -8,6 +10,7 @@ import com.google.inject.Inject; import me.chanjar.weixin.common.exception.WxErrorException; import me.chanjar.weixin.mp.api.ApiTestModule; import me.chanjar.weixin.mp.api.WxXmlMpInMemoryConfigStorage; +import me.chanjar.weixin.mp.bean.pay.WxEntPayRequest; import me.chanjar.weixin.mp.bean.pay.WxRedpackResult; import me.chanjar.weixin.mp.bean.pay.WxSendRedpackRequest; import me.chanjar.weixin.mp.bean.pay.WxUnifiedOrderRequest; @@ -74,4 +77,16 @@ public class WxMpPayServiceImplTest { .tradeType("JSAPI").openid("122").outTradeNo("111111").build()); System.err.println(result); } + + /** + * Test method for {@link me.chanjar.weixin.mp.api.impl.WxMpPayServiceImpl#entPay(WxEntPayRequest, File)}. + * @throws WxErrorException + */ + @Test + public final void testEntPay() throws WxErrorException { + File keyFile = new File("E:\\dlt.p12"); + WxEntPayRequest request = new WxEntPayRequest(); + System.err.println(this.wxService.getPayService().entPay(request, keyFile)); + } + } From 782bc6a772bdd27e4160383ef9efd3ef3f808aff Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Fri, 7 Oct 2016 14:07:22 +0800 Subject: [PATCH 08/83] Update README.md --- README.md | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 0d02922a..d4440332 100644 --- a/README.md +++ b/README.md @@ -5,6 +5,7 @@ ### 注意: 1. ***本项目Fork自chanjarster/weixin-java-tools,但由于原项目已停止维护,故单独维护和发布,且发布到maven上的groupId也会不同,详细信息见下文。*** 1. ***自2.0.0版本以来,公众号的接口调整比较大,主要是为了解决主接口类过于庞大不方便管理的问题,将接口实现代码按模块进行拆分。*** +1. 本SDK要求的最低JDK版本是7,为解决少量还在使用JDK6的用户,特意抽出独立的代码分支项目,请参考 https://github.com/binarywang/weixin-java-tools-for-jdk ,其他更早的JDK版本则需要自己改造实现; 1. 最新更新:2016-09-30 发布2.2.0正式版! =========== @@ -19,9 +20,9 @@ =========== ## 版本说明 -1. 本项目定为每月发布一次正式版,版本号格式为X.X.0(如2.0.0,2.1.0等),月初或月底发布新版本,遇到重大问题需修复会及时提交新版本,欢迎大家随时提交Pull Request; +1. 本项目定为每月发布一次正式版,版本号格式为X.X.0(如2.1.0,2.2.0等),月初或月底发布新版本,遇到重大问题需修复会及时提交新版本,欢迎大家随时提交Pull Request; 1. BUG修复和新特性一般会先发布成小版本作为临时版本(如2.0.1,2.0.2等,即尾号不为0,以区别于正式版); -1. 目前最新版本号为 ![Maven Central](https://img.shields.io/maven-central/v/com.github.binarywang/weixin-java-parent.svg) ,也可以通过访问链接[【公众号】](http://search.maven.org/#search%7Cgav%7C1%7Cg%3A%22com.github.binarywang%22%20AND%20a%3A%22weixin-java-mp%22) 、[【企业号】](http://search.maven.org/#search%7Cgav%7C1%7Cg%3A%22com.github.binarywang%22%20AND%20a%3A%22weixin-java-cp%22) +1. 目前最新版本号为 ![Maven Central](https://img.shields.io/maven-central/v/com.github.binarywang/weixin-java-parent.svg) ,也可以通过访问链接 [【公众号】](http://search.maven.org/#search%7Cgav%7C1%7Cg%3A%22com.github.binarywang%22%20AND%20a%3A%22weixin-java-mp%22) 、[【企业号】](http://search.maven.org/#search%7Cgav%7C1%7Cg%3A%22com.github.binarywang%22%20AND%20a%3A%22weixin-java-cp%22) 分别查看所有最新的版本。 ## Maven & Gradle @@ -56,6 +57,8 @@ gradle: compile 'com.github.binarywang:weixin-java-cp:2.2.0' ``` +=========== + #### 本项目主要存放在github上,地址为 : * https://github.com/wechat-group/weixin-java-tools * ===========但同时会在其他几个网站同步更新,地址分别是: @@ -63,11 +66,12 @@ compile 'com.github.binarywang:weixin-java-cp:2.2.0' * http://git.oschina.net/binary/weixin-java-tools * https://git.coding.net/binarywang/weixin-java-tools.git - +=========== ## 目前可参考的Demo项目有两个: 1. https://github.com/wechat-group/weixin-mp-demo 1. https://github.com/wechat-group/weixin-java-tools-springmvc +=========== ## 关于代码贡献 1. 非常欢迎和感谢对本项目发起Pull Request的同学,本项目代码风格为使用2个空格代表一个Tab,因此在提交代码时请注意一下,否则很容易在IDE格式化代码后与原代码产生大量diff,这样会给其他人阅读代码带来极大的困扰。 1. 为了便于设置,本项目引入editorconfig插件,请使用eclipse的同学在贡献代码前安装相关插件,IntelliJ IDEA则自带支持,无需额外安装插件。 From 03f029c68c428a216c46e745c0e60b87b0f408b6 Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Fri, 7 Oct 2016 14:12:27 +0800 Subject: [PATCH 09/83] =?UTF-8?q?=E5=8A=A0=E5=85=A5=E5=8E=9F=E4=BD=9C?= =?UTF-8?q?=E8=80=85=E4=BF=A1=E6=81=AF=20https://github.com/chanjarster/we?= =?UTF-8?q?ixin-java-tools/pull/277?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../weixin/common/util/http/ApacheHttpClientBuilder.java | 1 + .../common/util/http/DefaultApacheHttpClientBuilder.java | 8 +++++--- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/ApacheHttpClientBuilder.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/ApacheHttpClientBuilder.java index 8bd900ca..c932445d 100644 --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/ApacheHttpClientBuilder.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/ApacheHttpClientBuilder.java @@ -5,6 +5,7 @@ import org.apache.http.impl.client.CloseableHttpClient; /** * httpclient build interface + * @author kakotor */ public interface ApacheHttpClientBuilder { diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/DefaultApacheHttpClientBuilder.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/DefaultApacheHttpClientBuilder.java index f69dcc6c..0e6f9000 100644 --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/DefaultApacheHttpClientBuilder.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/DefaultApacheHttpClientBuilder.java @@ -1,6 +1,8 @@ package me.chanjar.weixin.common.util.http; -import me.chanjar.weixin.common.util.StringUtils; +import java.io.IOException; +import java.util.concurrent.TimeUnit; + import org.apache.http.annotation.NotThreadSafe; import org.apache.http.auth.AuthScope; import org.apache.http.auth.UsernamePasswordCredentials; @@ -21,11 +23,11 @@ import org.apache.http.impl.client.HttpClients; import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; import org.apache.http.protocol.HttpContext; -import java.io.IOException; -import java.util.concurrent.TimeUnit; +import me.chanjar.weixin.common.util.StringUtils; /** * httpclient 连接管理器 + * @author kakotor */ @NotThreadSafe public class DefaultApacheHttpClientBuilder implements ApacheHttpClientBuilder { From d9a32d87b90d18052c1755f9e866a6b8d6ec463c Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Fri, 7 Oct 2016 14:17:20 +0800 Subject: [PATCH 10/83] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d4440332..c473c9cd 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ ### 注意: 1. ***本项目Fork自chanjarster/weixin-java-tools,但由于原项目已停止维护,故单独维护和发布,且发布到maven上的groupId也会不同,详细信息见下文。*** 1. ***自2.0.0版本以来,公众号的接口调整比较大,主要是为了解决主接口类过于庞大不方便管理的问题,将接口实现代码按模块进行拆分。*** -1. 本SDK要求的最低JDK版本是7,为解决少量还在使用JDK6的用户,特意抽出独立的代码分支项目,请参考 https://github.com/binarywang/weixin-java-tools-for-jdk ,其他更早的JDK版本则需要自己改造实现; +1. 本SDK要求的最低JDK版本是7,为解决少量还在使用JDK6的用户,特意抽出独立的代码分支项目,请参考 https://github.com/binarywang/weixin-java-tools-for-jdk6 ,其他更早的JDK版本则需要自己改造实现; 1. 最新更新:2016-09-30 发布2.2.0正式版! =========== From 5aba474ffe9331e2ddd79c02244968b4ed9f852f Mon Sep 17 00:00:00 2001 From: BinaryWang Date: Sat, 8 Oct 2016 12:07:47 +0800 Subject: [PATCH 11/83] =?UTF-8?q?=E6=A0=BC=E5=BC=8F=E5=8C=96javadoc?= =?UTF-8?q?=EF=BC=8C=E6=B7=BB=E5=8A=A0pre=E6=A0=87=E7=AD=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../weixin/mp/bean/pay/WxEntPayRequest.java | 26 ++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxEntPayRequest.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxEntPayRequest.java index 9c7253d2..ea900b50 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxEntPayRequest.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxEntPayRequest.java @@ -15,83 +15,98 @@ import com.thoughtworks.xstream.annotations.XStreamAlias; @XStreamAlias("xml") public class WxEntPayRequest { /** + *
   * 公众账号appid
   * mch_appid
   * 是
   * wx8888888888888888
   * String
   * 微信分配的公众账号ID(企业号corpid即为此appId)
+   * 
*/ @XStreamAlias("mch_appid") private String mchAppid; /** + *
   *  商户号
   *  mchid
   *  是
   *  1900000109
   *  String(32)
   *  微信支付分配的商户号
+   * 
*/ @XStreamAlias("mchid") private String mchId; /** + *
   * 设备号
   * device_info
   * 否
   * 13467007045764
   * String(32)
   *微信支付分配的终端设备号
+   * 
*/ @XStreamAlias("device_info") private String deviceInfo; /** + *
   * 随机字符串
   * nonce_str
   *是
   *5K8264ILTKCH16CQ2502SI8ZNMTM67VS
   *String(32)
   *随机字符串,不长于32位
+   * 
*/ @XStreamAlias("nonce_str") private String nonceStr; /** + *
   * 签名
   * sign
   * 是
   * C380BEC2BFD727A4B6845133519F3AD6
   * String(32)
   *签名,详见签名算法
+   * 
*/ @XStreamAlias("sign") private String sign; /** + *
   * 商户订单号
   * partner_trade_no
   * 是
   * 10000098201411111234567890
   * String
-  * 商户订单号,
+  * 商户订单号
+   * 
*/ @XStreamAlias("partner_trade_no") private String partnerTradeNo; /** + *
   * 需保持唯一性 用户openid
   * openid
   * 是
   * oxTWIuGaIt6gTKsQRLau2M0yL16E
   * String
   * 商户appid下,某用户的openid
+   * 
*/ @XStreamAlias("openid") private String openid; /** + *
   * 校验用户姓名选项
   * check_name
   * 是
@@ -100,11 +115,13 @@ public class WxEntPayRequest {
   * NO_CHECK:不校验真实姓名 
   * FORCE_CHECK:强校验真实姓名(未实名认证的用户会校验失败,无法转账) 
   * OPTION_CHECK:针对已实名认证的用户才校验真实姓名(未实名认证用户不校验,可以转账成功)
+   * 
*/ @XStreamAlias("check_name") private String checkName; /** + *
   * 收款用户姓名
   * re_user_name
   * 可选
@@ -112,39 +129,46 @@ public class WxEntPayRequest {
   * String
   * 收款用户真实姓名。
   * 如果check_name设置为FORCE_CHECK或OPTION_CHECK,  则必填用户真实姓名
+   * 
*/ @XStreamAlias("re_user_name") private String reUserName; /** + *
   * 金额
   * amount
   * 是
   * 10099
   * int
   * 企业付款金额, 单位为分
+   * 
*/ @XStreamAlias("amount") private Integer amount; /** + *
   * 企业付款描述信息
   * desc
   * 是
   * 理赔
   * String
   * 企业付款操作说明信息。必填。
+   * 
*/ @XStreamAlias("desc") private String description; /** + *
   * Ip地址
   * spbill_create_ip
   * 是
   * 192.168.0.1
   * String(32)
   * 调用接口的机器Ip地址
+   * 
*/ @XStreamAlias("spbill_create_ip") private String spbillCreateIp; From ff20ecb56c52663e4b979241cc9ba36e3274ef1a Mon Sep 17 00:00:00 2001 From: BinaryWang Date: Sat, 8 Oct 2016 14:38:26 +0800 Subject: [PATCH 12/83] =?UTF-8?q?=E6=9B=BF=E6=8D=A2=E7=BD=91=E5=9D=80?= =?UTF-8?q?=E5=85=B1=E5=90=8C=E9=83=A8=E5=88=86=E4=B8=BA=E5=B7=B2=E5=AE=9A?= =?UTF-8?q?=E4=B9=89=E7=9A=84=E5=B8=B8=E9=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../chanjar/weixin/mp/api/impl/WxMpUserTagServiceImpl.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpUserTagServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpUserTagServiceImpl.java index 4d3639c8..94749c12 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpUserTagServiceImpl.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpUserTagServiceImpl.java @@ -102,7 +102,7 @@ public class WxMpUserTagServiceImpl implements WxMpUserTagService { @Override public boolean batchTagging(Long tagId, String[] openids) throws WxErrorException { - String url = "https://api.weixin.qq.com/cgi-bin/tags/members/batchtagging"; + String url = API_URL_PREFIX + "/members/batchtagging"; JsonObject json = new JsonObject(); json.addProperty("tagid", tagId); @@ -124,7 +124,7 @@ public class WxMpUserTagServiceImpl implements WxMpUserTagService { @Override public boolean batchUntagging(Long tagId, String[] openids) throws WxErrorException { - String url = "https://api.weixin.qq.com/cgi-bin/tags/members/batchuntagging"; + String url = API_URL_PREFIX + "/members/batchuntagging"; JsonObject json = new JsonObject(); json.addProperty("tagid", tagId); @@ -145,7 +145,7 @@ public class WxMpUserTagServiceImpl implements WxMpUserTagService { @Override public List userTagList(String openid) throws WxErrorException { - String url = "https://api.weixin.qq.com/cgi-bin/tags/getidlist"; + String url = API_URL_PREFIX + "/getidlist"; JsonObject json = new JsonObject(); json.addProperty("openid", openid); From d9d0f5403ec7ce97179fdfffc7a45f426f24562c Mon Sep 17 00:00:00 2001 From: BinaryWang Date: Sat, 8 Oct 2016 14:38:44 +0800 Subject: [PATCH 13/83] =?UTF-8?q?=E6=A0=BC=E5=BC=8F=E5=8C=96javadoc?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../chanjar/weixin/mp/bean/pay/WxEntPayRequest.java | 11 +++++++++-- .../weixin/mp/bean/pay/WxUnifiedOrderRequest.java | 2 +- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxEntPayRequest.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxEntPayRequest.java index ea900b50..38ed704a 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxEntPayRequest.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxEntPayRequest.java @@ -6,9 +6,16 @@ import org.apache.commons.lang3.builder.ToStringStyle; import com.thoughtworks.xstream.annotations.XStreamAlias; /** + *
  * 企业付款请求对象
- * 注释中各行含义如下:
- * 字段名、 变量名、 是否必填、 示例值、 类型、 描述
+ * 注释中各行每个字段描述对应如下:
+ * 
  • 字段名 + *
  • 变量名 + *
  • 是否必填 + *
  • 类型 + *
  • 示例值 + *
  • 描述 + *
  • * Created by Binary Wang on 2016/10/02. * @author binarywang (https://github.com/binarywang) */ diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxUnifiedOrderRequest.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxUnifiedOrderRequest.java index ccdfff90..4173c373 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxUnifiedOrderRequest.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxUnifiedOrderRequest.java @@ -11,7 +11,7 @@ import me.chanjar.weixin.common.annotation.Required; *
      * 统一下单请求参数对象
      * 参考文档:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1
    - * 每个字段描述对应如下:
    + * 注释中各行每个字段描述对应如下:
      * 
  • 字段名 *
  • 变量名 *
  • 是否必填 From 10ce6a8920cf66680db771391a7534cf8250e07d Mon Sep 17 00:00:00 2001 From: BinaryWang Date: Sat, 8 Oct 2016 15:02:45 +0800 Subject: [PATCH 14/83] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E7=BC=BA=E5=A4=B1?= =?UTF-8?q?=E7=9A=84=E5=8D=95=E5=85=83=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/impl/WxMpUserTagServiceImplTest.java | 20 ++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpUserTagServiceImplTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpUserTagServiceImplTest.java index 9fc579c9..569b696d 100644 --- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpUserTagServiceImplTest.java +++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpUserTagServiceImplTest.java @@ -1,17 +1,15 @@ package me.chanjar.weixin.mp.api.impl; -import java.util.List; - -import org.testng.Assert; -import org.testng.annotations.Guice; -import org.testng.annotations.Test; - import com.google.inject.Inject; - import me.chanjar.weixin.mp.api.ApiTestModule; import me.chanjar.weixin.mp.api.WxXmlMpInMemoryConfigStorage; import me.chanjar.weixin.mp.bean.tag.WxTagListUser; import me.chanjar.weixin.mp.bean.tag.WxUserTag; +import org.testng.Assert; +import org.testng.annotations.Guice; +import org.testng.annotations.Test; + +import java.util.List; /** * @@ -64,6 +62,14 @@ public class WxMpUserTagServiceImplTest { Assert.assertNotNull(res); } + @Test + public void testBatchTagging() throws Exception { + String[] openids = new String[]{((WxXmlMpInMemoryConfigStorage) this.wxService.getWxMpConfigStorage()).getOpenid()}; + boolean res = this.wxService.getUserTagService().batchTagging(this.tagId, openids); + System.out.println(res); + Assert.assertTrue(res); + } + @Test public void testBatchUntagging() throws Exception { String[] openids = new String[]{((WxXmlMpInMemoryConfigStorage) this.wxService.getWxMpConfigStorage()).getOpenid()}; From 5fe1c061f27f1abde29078a2a1454097a578eb45 Mon Sep 17 00:00:00 2001 From: BinaryWang Date: Sat, 8 Oct 2016 17:07:36 +0800 Subject: [PATCH 15/83] =?UTF-8?q?=E9=87=8D=E6=9E=84=E5=BE=AE=E4=BF=A1?= =?UTF-8?q?=E6=94=AF=E4=BB=98=E7=94=B3=E8=AF=B7=E9=80=80=E6=AC=BE=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=20for=20issue=20#25?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../chanjar/weixin/mp/api/WxMpPayService.java | 35 +- .../mp/api/impl/WxMpPayServiceImpl.java | 147 ++++----- .../weixin/mp/api/impl/WxMpServiceImpl.java | 63 +--- .../mp/bean/pay/WxMpPayRefundRequest.java | 301 ++++++++++++++++++ .../mp/api/impl/WxMpPayServiceImplTest.java | 26 +- 5 files changed, 413 insertions(+), 159 deletions(-) create mode 100644 weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxMpPayRefundRequest.java diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpPayService.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpPayService.java index cf5bb8c3..45973443 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpPayService.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpPayService.java @@ -1,19 +1,11 @@ package me.chanjar.weixin.mp.api; +import me.chanjar.weixin.common.exception.WxErrorException; +import me.chanjar.weixin.mp.bean.pay.*; + import java.io.File; import java.util.Map; -import me.chanjar.weixin.common.exception.WxErrorException; -import me.chanjar.weixin.mp.bean.pay.WxEntPayRequest; -import me.chanjar.weixin.mp.bean.pay.WxEntPayResult; -import me.chanjar.weixin.mp.bean.pay.WxMpPayCallback; -import me.chanjar.weixin.mp.bean.pay.WxMpPayRefundResult; -import me.chanjar.weixin.mp.bean.pay.WxMpPayResult; -import me.chanjar.weixin.mp.bean.pay.WxRedpackResult; -import me.chanjar.weixin.mp.bean.pay.WxSendRedpackRequest; -import me.chanjar.weixin.mp.bean.pay.WxUnifiedOrderRequest; -import me.chanjar.weixin.mp.bean.pay.WxUnifiedOrderResult; - /** * 微信支付相关接口 * Created by Binary Wang on 2016/7/28. @@ -25,7 +17,7 @@ public interface WxMpPayService { * 统一下单(详见http://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1) * 在发起微信支付前,需要调用统一下单接口,获取"预支付交易会话标识" * 接口地址:https://api.mch.weixin.qq.com/pay/unifiedorder - * @throws WxErrorException + * @throws WxErrorException * */ WxUnifiedOrderResult unifiedOrder(WxUnifiedOrderRequest request) @@ -42,7 +34,7 @@ public interface WxMpPayService { /** * 该接口提供所有微信支付订单的查询,当支付通知处理异常戒丢失的情冴,商户可以通过该接口查询订单支付状态。 * 详见http://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_2 - * @throws WxErrorException + * @throws WxErrorException * */ WxMpPayResult getJSSDKPayResult(String transactionId, String outTradeNo) @@ -56,18 +48,15 @@ public interface WxMpPayService { WxMpPayCallback getJSSDKCallbackData(String xmlData); /** + *
        * 微信支付-申请退款
        * 详见 https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_4
    -   *
    -   * @param parameters 需要传入的退款参数的Map。以下几项为参数的必须项:
    - *
  • transaction_id - *
  • out_trade_no (仅在上述transaction_id为空时是必须项) - *
  • out_refund_no - *
  • total_fee - *
  • refund_fee + * 接口链接:https://api.mch.weixin.qq.com/secapi/pay/refund + *
  • + * @param keyFile 证书文件对象 * @return 退款操作结果 */ - WxMpPayRefundResult refundPay(Map parameters) throws WxErrorException; + WxMpPayRefundResult refund(WxMpPayRefundRequest request, File keyFile) throws WxErrorException; /** *
    @@ -80,7 +69,7 @@ public interface WxMpPayService {
     
       /**
        * 发送微信红包给个人用户
    -   * 
     
    +   * 
        * 文档详见:
        * 发送普通红包 https://pay.weixin.qq.com/wiki/doc/api/tools/cash_coupon.php?chapter=13_4&index=3
        * 发送裂变红包 https://pay.weixin.qq.com/wiki/doc/api/tools/cash_coupon.php?chapter=13_5&index=4
    @@ -89,7 +78,7 @@ public interface WxMpPayService {
       WxRedpackResult sendRedpack(WxSendRedpackRequest request) throws WxErrorException;
     
       /**
    -   * 
     
    +   * 
        * 企业付款业务是基于微信支付商户平台的资金管理能力,为了协助商户方便地实现企业向个人付款,针对部分有开发能力的商户,提供通过API完成企业付款的功能。
        * 比如目前的保险行业向客户退保、给付、理赔。
        * 企业付款将使用商户的可用余额,需确保可用余额充足。查看可用余额、充值、提现请登录商户平台“资金管理”https://pay.weixin.qq.com/进行操作。
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImpl.java
    index 79e2c312..a8d5dc3f 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImpl.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImpl.java
    @@ -1,19 +1,18 @@
     package me.chanjar.weixin.mp.api.impl;
     
    -import java.io.File;
    -import java.io.FileInputStream;
    -import java.lang.reflect.Field;
    -import java.security.KeyStore;
    -import java.util.HashMap;
    -import java.util.List;
    -import java.util.Map;
    -import java.util.Map.Entry;
    -import java.util.SortedMap;
    -import java.util.TreeMap;
    -
    -import javax.net.ssl.SSLContext;
    -
    +import com.google.common.collect.Lists;
    +import com.google.common.collect.Maps;
    +import com.thoughtworks.xstream.XStream;
    +import com.thoughtworks.xstream.annotations.XStreamAlias;
    +import me.chanjar.weixin.common.annotation.Required;
    +import me.chanjar.weixin.common.bean.result.WxError;
    +import me.chanjar.weixin.common.exception.WxErrorException;
    +import me.chanjar.weixin.common.util.xml.XStreamInitializer;
    +import me.chanjar.weixin.mp.api.WxMpPayService;
    +import me.chanjar.weixin.mp.api.WxMpService;
    +import me.chanjar.weixin.mp.bean.pay.*;
     import org.apache.commons.codec.digest.DigestUtils;
    +import org.apache.commons.lang3.ArrayUtils;
     import org.apache.commons.lang3.StringUtils;
     import org.apache.http.client.methods.CloseableHttpResponse;
     import org.apache.http.client.methods.HttpPost;
    @@ -26,26 +25,13 @@ import org.apache.http.ssl.SSLContexts;
     import org.apache.http.util.EntityUtils;
     import org.joor.Reflect;
     
    -import com.google.common.collect.Lists;
    -import com.google.common.collect.Maps;
    -import com.thoughtworks.xstream.XStream;
    -import com.thoughtworks.xstream.annotations.XStreamAlias;
    -
    -import me.chanjar.weixin.common.annotation.Required;
    -import me.chanjar.weixin.common.bean.result.WxError;
    -import me.chanjar.weixin.common.exception.WxErrorException;
    -import me.chanjar.weixin.common.util.xml.XStreamInitializer;
    -import me.chanjar.weixin.mp.api.WxMpPayService;
    -import me.chanjar.weixin.mp.api.WxMpService;
    -import me.chanjar.weixin.mp.bean.pay.WxEntPayRequest;
    -import me.chanjar.weixin.mp.bean.pay.WxEntPayResult;
    -import me.chanjar.weixin.mp.bean.pay.WxMpPayCallback;
    -import me.chanjar.weixin.mp.bean.pay.WxMpPayRefundResult;
    -import me.chanjar.weixin.mp.bean.pay.WxMpPayResult;
    -import me.chanjar.weixin.mp.bean.pay.WxRedpackResult;
    -import me.chanjar.weixin.mp.bean.pay.WxSendRedpackRequest;
    -import me.chanjar.weixin.mp.bean.pay.WxUnifiedOrderRequest;
    -import me.chanjar.weixin.mp.bean.pay.WxUnifiedOrderResult;
    +import javax.net.ssl.SSLContext;
    +import java.io.File;
    +import java.io.FileInputStream;
    +import java.lang.reflect.Field;
    +import java.security.KeyStore;
    +import java.util.*;
    +import java.util.Map.Entry;
     
     /**
      * Created by Binary Wang on 2016/7/28.
    @@ -55,8 +41,10 @@ import me.chanjar.weixin.mp.bean.pay.WxUnifiedOrderResult;
     public class WxMpPayServiceImpl implements WxMpPayService {
     
       private static final String PAY_BASE_URL = "https://api.mch.weixin.qq.com";
    -  private static final List TRADE_TYPES = Lists.newArrayList("JSAPI",
    -      "NATIVE", "APP");
    +  private static final String[] TRADE_TYPES = new String[]{"JSAPI","NATIVE", "APP"};
    +  private static final String[] REFUND_ACCOUNT =  new String[]{"REFUND_SOURCE_RECHARGE_FUNDS",
    +    "REFUND_SOURCE_UNSETTLED_FUNDS"};
    +
       private WxMpService wxMpService;
     
       public WxMpPayServiceImpl(WxMpService wxMpService) {
    @@ -115,33 +103,25 @@ public class WxMpPayServiceImpl implements WxMpPayService {
       }
     
       @Override
    -  public WxMpPayRefundResult refundPay(Map parameters)
    +  public WxMpPayRefundResult refund(WxMpPayRefundRequest request, File keyFile)
           throws WxErrorException {
    -    SortedMap refundParams = new TreeMap<>(parameters);
    -    refundParams.put("appid",
    -        this.wxMpService.getWxMpConfigStorage().getAppId());
    -    refundParams.put("mch_id",
    -        this.wxMpService.getWxMpConfigStorage().getPartnerId());
    -    refundParams.put("nonce_str", System.currentTimeMillis() + "");
    -    refundParams.put("op_user_id",
    -        this.wxMpService.getWxMpConfigStorage().getPartnerId());
    -    String sign = this.createSign(refundParams,
    -        this.wxMpService.getWxMpConfigStorage().getPartnerKey());
    -    refundParams.put("sign", sign);
    -
    -    StringBuilder request = new StringBuilder("");
    -    for (Map.Entry para : refundParams.entrySet()) {
    -      request.append(String.format("<%s>%s", para.getKey(),
    -          para.getValue(), para.getKey()));
    -    }
    -    request.append("");
    +    checkParameters(request);
     
    -    String url = PAY_BASE_URL + "/secapi/pay/refund";
    -    String responseContent = this.wxMpService.post(url, request.toString());
         XStream xstream = XStreamInitializer.getInstance();
         xstream.processAnnotations(WxMpPayRefundResult.class);
    -    WxMpPayRefundResult wxMpPayRefundResult = (WxMpPayRefundResult) xstream
    -        .fromXML(responseContent);
    +    xstream.processAnnotations(WxMpPayRefundRequest.class);
    +
    +    request.setAppid(this.wxMpService.getWxMpConfigStorage().getAppId());
    +    String partnerId = this.wxMpService.getWxMpConfigStorage().getPartnerId();
    +    request.setMchId(partnerId);
    +    request.setNonceStr( System.currentTimeMillis() + "");
    +    request.setOpUserId(partnerId);
    +    String sign = this.createSign(this.xmlBean2Map(request), this.wxMpService.getWxMpConfigStorage().getPartnerKey());
    +    request.setSign(sign);
    +
    +    String url = PAY_BASE_URL + "/secapi/pay/refund";
    +    String responseContent = this.executeRequestWithKeyFile(url, xstream.toXML(request), keyFile, partnerId);
    +    WxMpPayRefundResult wxMpPayRefundResult = (WxMpPayRefundResult) xstream.fromXML(responseContent);
     
         if (!"SUCCESS".equalsIgnoreCase(wxMpPayRefundResult.getResultCode())
             || !"SUCCESS".equalsIgnoreCase(wxMpPayRefundResult.getReturnCode())) {
    @@ -158,6 +138,20 @@ public class WxMpPayServiceImpl implements WxMpPayService {
         return wxMpPayRefundResult;
       }
     
    +  private void checkParameters(WxMpPayRefundRequest request) {
    +    checkNotNullParams(request);
    +
    +    if (StringUtils.isNotBlank(request.getRefundAccount())) {
    +      if(!ArrayUtils.contains(REFUND_ACCOUNT, request.getRefundAccount())){
    +        throw new IllegalArgumentException("refund_account目前必须为" + Arrays.toString(REFUND_ACCOUNT) + "其中之一");
    +      }
    +    }
    +
    +    if (StringUtils.isBlank(request.getOutTradeNo()) && StringUtils.isBlank(request.getTransactionId())) {
    +      throw new IllegalArgumentException("transaction_id 和 out_trade_no 不能同时为空,必须提供一个");
    +    }
    +  }
    +
       @Override
       public boolean checkJSSDKCallbackDataSignature(Map kvm,
           String signature) {
    @@ -176,7 +170,7 @@ public class WxMpPayServiceImpl implements WxMpPayService {
         request.setMchId(this.wxMpService.getWxMpConfigStorage().getPartnerId());
         request.setNonceStr(System.currentTimeMillis() + "");
     
    -    String sign = this.createSign(xmlBean2Map(request),
    +    String sign = this.createSign(this.xmlBean2Map(request),
             this.wxMpService.getWxMpConfigStorage().getPartnerKey());
         request.setSign(sign);
     
    @@ -258,7 +252,7 @@ public class WxMpPayServiceImpl implements WxMpPayService {
         request.setMchId(this.wxMpService.getWxMpConfigStorage().getPartnerId());
         request.setNonceStr(System.currentTimeMillis() + "");
     
    -    String sign = this.createSign(xmlBean2Map(request),
    +    String sign = this.createSign(this.xmlBean2Map(request),
             this.wxMpService.getWxMpConfigStorage().getPartnerKey());
         request.setSign(sign);
     
    @@ -274,16 +268,13 @@ public class WxMpPayServiceImpl implements WxMpPayService {
         }
     
         return result;
    -
       }
     
       private void checkParameters(WxUnifiedOrderRequest request) {
    -
         checkNotNullParams(request);
     
    -    if (!TRADE_TYPES.contains(request.getTradeType())) {
    -      throw new IllegalArgumentException("trade_type目前必须为" + TRADE_TYPES + "其中之一");
    -
    +    if (! ArrayUtils.contains(TRADE_TYPES, request.getTradeType())) {
    +      throw new IllegalArgumentException("trade_type目前必须为" + Arrays.toString(TRADE_TYPES) + "其中之一");
         }
     
         if ("JSAPI".equals(request.getTradeType()) && request.getOpenid() == null) {
    @@ -368,10 +359,19 @@ public class WxMpPayServiceImpl implements WxMpPayService {
     
         String url = PAY_BASE_URL + "/mmpaymkttransfers/promotion/transfers";
     
    -    try (FileInputStream instream = new FileInputStream(keyFile)) {
    -      String mchId = request.getMchId();
    +    String responseContent = this.executeRequestWithKeyFile(xstream.toXML(request), url, keyFile, request.getMchId());
    +    WxEntPayResult result = (WxEntPayResult) xstream.fromXML(responseContent);
    +    if ("FAIL".equals(result.getResultCode())) {
    +      throw new WxErrorException(
    +        WxError.newBuilder().setErrorMsg(result.getErrCode() + ":" + result.getErrCodeDes()).build());
    +    }
    +    return result;
    +  }
    +
    +  private String executeRequestWithKeyFile( String requestStr, String url, File keyFile, String mchId) throws WxErrorException {
    +    try (FileInputStream inputStream = new FileInputStream(keyFile)) {
           KeyStore keyStore = KeyStore.getInstance("PKCS12");
    -      keyStore.load(instream, mchId.toCharArray());
    +      keyStore.load(inputStream, mchId.toCharArray());
     
           SSLContext sslcontext = SSLContexts.custom().loadKeyMaterial(keyStore, mchId.toCharArray()).build();
           SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslcontext, new String[] { "TLSv1" }, null,
    @@ -379,17 +379,10 @@ public class WxMpPayServiceImpl implements WxMpPayService {
     
           try (CloseableHttpClient httpclient = HttpClients.custom().setSSLSocketFactory(sslsf).build()) {
             HttpPost httpPost = new HttpPost(url);
    -        httpPost.setEntity(new StringEntity(new String(xstream.toXML(request).getBytes("UTF-8"), "ISO-8859-1")));
    +        httpPost.setEntity(new StringEntity(new String(requestStr.getBytes("UTF-8"), "ISO-8859-1")));
     
             try (CloseableHttpResponse response = httpclient.execute(httpPost)) {
    -          String responseContent = EntityUtils.toString(response.getEntity());
    -          WxEntPayResult result = (WxEntPayResult) xstream.fromXML(responseContent);
    -          if ("FAIL".equals(result.getResultCode())) {
    -            throw new WxErrorException(
    -                WxError.newBuilder().setErrorMsg(result.getErrCode() + ":" + result.getErrCodeDes()).build());
    -          }
    -
    -          return result;
    +          return EntityUtils.toString(response.getEntity());
             }
           }
         } catch (Exception e) {
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpServiceImpl.java
    index 1a7ffe84..4cd26894 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpServiceImpl.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpServiceImpl.java
    @@ -1,23 +1,9 @@
     package me.chanjar.weixin.mp.api.impl;
     
    -import java.io.IOException;
    -
    -import org.apache.http.HttpHost;
    -import org.apache.http.client.config.RequestConfig;
    -import org.apache.http.client.methods.CloseableHttpResponse;
    -import org.apache.http.client.methods.HttpGet;
    -import org.apache.http.conn.ssl.DefaultHostnameVerifier;
    -import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
    -import org.apache.http.impl.client.BasicResponseHandler;
    -import org.apache.http.impl.client.CloseableHttpClient;
    -import org.slf4j.Logger;
    -import org.slf4j.LoggerFactory;
    -
     import com.google.gson.JsonArray;
     import com.google.gson.JsonElement;
     import com.google.gson.JsonObject;
     import com.google.gson.JsonParser;
    -
     import me.chanjar.weixin.common.bean.WxAccessToken;
     import me.chanjar.weixin.common.bean.WxJsapiSignature;
     import me.chanjar.weixin.common.bean.result.WxError;
    @@ -26,38 +12,22 @@ import me.chanjar.weixin.common.session.StandardSessionManager;
     import me.chanjar.weixin.common.session.WxSessionManager;
     import me.chanjar.weixin.common.util.RandomUtils;
     import me.chanjar.weixin.common.util.crypto.SHA1;
    -import me.chanjar.weixin.common.util.http.ApacheHttpClientBuilder;
    -import me.chanjar.weixin.common.util.http.DefaultApacheHttpClientBuilder;
    -import me.chanjar.weixin.common.util.http.RequestExecutor;
    -import me.chanjar.weixin.common.util.http.SimpleGetRequestExecutor;
    -import me.chanjar.weixin.common.util.http.SimplePostRequestExecutor;
    -import me.chanjar.weixin.common.util.http.URIUtil;
    -import me.chanjar.weixin.mp.api.WxMpCardService;
    -import me.chanjar.weixin.mp.api.WxMpConfigStorage;
    -import me.chanjar.weixin.mp.api.WxMpDataCubeService;
    -import me.chanjar.weixin.mp.api.WxMpKefuService;
    -import me.chanjar.weixin.mp.api.WxMpMaterialService;
    -import me.chanjar.weixin.mp.api.WxMpMenuService;
    -import me.chanjar.weixin.mp.api.WxMpPayService;
    -import me.chanjar.weixin.mp.api.WxMpQrcodeService;
    -import me.chanjar.weixin.mp.api.WxMpService;
    -import me.chanjar.weixin.mp.api.WxMpStoreService;
    -import me.chanjar.weixin.mp.api.WxMpUserBlacklistService;
    -import me.chanjar.weixin.mp.api.WxMpUserService;
    -import me.chanjar.weixin.mp.api.WxMpUserTagService;
    -import me.chanjar.weixin.mp.bean.WxMpIndustry;
    -import me.chanjar.weixin.mp.bean.WxMpMassNews;
    -import me.chanjar.weixin.mp.bean.WxMpMassOpenIdsMessage;
    -import me.chanjar.weixin.mp.bean.WxMpMassPreviewMessage;
    -import me.chanjar.weixin.mp.bean.WxMpMassTagMessage;
    -import me.chanjar.weixin.mp.bean.WxMpMassVideo;
    -import me.chanjar.weixin.mp.bean.WxMpSemanticQuery;
    -import me.chanjar.weixin.mp.bean.WxMpTemplateMessage;
    -import me.chanjar.weixin.mp.bean.result.WxMpMassSendResult;
    -import me.chanjar.weixin.mp.bean.result.WxMpMassUploadResult;
    -import me.chanjar.weixin.mp.bean.result.WxMpOAuth2AccessToken;
    -import me.chanjar.weixin.mp.bean.result.WxMpSemanticQueryResult;
    -import me.chanjar.weixin.mp.bean.result.WxMpUser;
    +import me.chanjar.weixin.common.util.http.*;
    +import me.chanjar.weixin.mp.api.*;
    +import me.chanjar.weixin.mp.bean.*;
    +import me.chanjar.weixin.mp.bean.result.*;
    +import org.apache.http.HttpHost;
    +import org.apache.http.client.config.RequestConfig;
    +import org.apache.http.client.methods.CloseableHttpResponse;
    +import org.apache.http.client.methods.HttpGet;
    +import org.apache.http.conn.ssl.DefaultHostnameVerifier;
    +import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
    +import org.apache.http.impl.client.BasicResponseHandler;
    +import org.apache.http.impl.client.CloseableHttpClient;
    +import org.slf4j.Logger;
    +import org.slf4j.LoggerFactory;
    +
    +import java.io.IOException;
     
     public class WxMpServiceImpl implements WxMpService {
     
    @@ -477,6 +447,7 @@ public class WxMpServiceImpl implements WxMpService {
           }
           return null;
         } catch (IOException e) {
    +      this.log.error("\n[URL]:  {}\n[PARAMS]: {}\n[EXECEPTION]: {}", uri, data, e.getMessage());
           throw new RuntimeException(e);
         }
       }
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxMpPayRefundRequest.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxMpPayRefundRequest.java
    new file mode 100644
    index 00000000..e375d64e
    --- /dev/null
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxMpPayRefundRequest.java
    @@ -0,0 +1,301 @@
    +package me.chanjar.weixin.mp.bean.pay;
    +
    +import com.thoughtworks.xstream.annotations.XStreamAlias;
    +import me.chanjar.weixin.common.annotation.Required;
    +
    +/**
    + * 
    + * 微信支付-申请退款请求参数
    + * 注释中各行每个字段描述对应如下:
    + * 
  • 字段名 + *
  • 变量名 + *
  • 是否必填 + *
  • 类型 + *
  • 示例值 + *
  • 描述 + *
  • + * + * @author binarywang(https://github.com/binarywang) + * Created by Binary Wang on 2016-10-08. + */ +@XStreamAlias("xml") +public class WxMpPayRefundRequest { + /** + *
    +   * 公众账号ID
    +   * appid
    +   * 是
    +   * String(32)
    +   * wx8888888888888888
    +   * 微信分配的公众账号ID(企业号corpid即为此appId)
    +   * 
    + */ + @XStreamAlias("appid") + private String appid; + + /** + *
    +   * 商户号
    +   * mch_id
    +   * 是
    +   * String(32)
    +   * 1900000109
    +   * 微信支付分配的商户号
    +   * 
    + */ + @XStreamAlias("mch_id") + private String mchId; + + /** + *
    +   * 设备号
    +   * device_info
    +   * 否
    +   * String(32)
    +   * 13467007045764
    +   * 终端设备号
    +   * 
    + */ + @XStreamAlias("device_info") + private String deviceInfo; + + /** + *
    +   * 随机字符串
    +   * nonce_str
    +   * 是
    +   * String(32)
    +   * 5K8264ILTKCH16CQ2502SI8ZNMTM67VS
    +   * 随机字符串,不长于32位。推荐随机数生成算法
    +   * 
    + */ + @XStreamAlias("nonce_str") + private String nonceStr; + + /** + *
    +   * 签名
    +   * sign
    +   * 是
    +   * String(32)
    +   * C380BEC2BFD727A4B6845133519F3AD6
    +   * 签名,详见签名生成算法
    +   * 
    + */ + @XStreamAlias("sign") + private String sign; + + /** + *
    +   * 微信订单号
    +   * transaction_id
    +   * 跟out_trade_no二选一
    +   * String(28)
    +   * 1217752501201400000000000000
    +   * 微信生成的订单号,在支付通知中有返回
    +   * 
    + */ + @XStreamAlias("transaction_id") + private String transactionId; + + /** + *
    +   * 商户订单号
    +   * out_trade_no
    +   * 跟transaction_id二选一
    +   * String(32)
    +   * 1217752501201400000000000000
    +   * 商户侧传给微信的订单号
    +   * 
    + */ + @XStreamAlias("out_trade_no") + private String outTradeNo; + + /** + *
    +   * 商户退款单号
    +   * out_refund_no
    +   * 是
    +   * String(32)
    +   * 1217752501201400000000000000
    +   * 商户系统内部的退款单号,商户系统内部唯一,同一退款单号多次请求只退一笔
    +   * 
    + */ + @Required + @XStreamAlias("out_refund_no") + private String outRefundNo; + + /** + *
    +   * 订单金额
    +   * total_fee
    +   * 是
    +   * Int
    +   * 100
    +   * 订单总金额,单位为分,只能为整数,详见支付金额
    +   * 
    + */ + @Required + @XStreamAlias("total_fee") + private Integer totalFee; + + /** + *
    +   * 退款金额
    +   * refund_fee
    +   * 是
    +   * Int
    +   * 100
    +   * 退款总金额,订单总金额,单位为分,只能为整数,详见支付金额
    +   * 
    + */ + @Required + @XStreamAlias("refund_fee") + private Integer refundFee; + + /** + *
    +   * 货币种类
    +   * refund_fee_type
    +   * 否
    +   * String(8)
    +   * CNY
    +   * 货币类型,符合ISO 4217标准的三位字母代码,默认人民币:CNY,其他值列表详见货币类型
    +   * 
    + */ + @XStreamAlias("refund_fee_type") + private String refundFeeType; + + /** + *
    +   * 操作员
    +   * op_user_id
    +   * 是
    +   * String(32)
    +   * 1900000109
    +   * 操作员帐号, 默认为商户号
    +   * 
    + */ + //@Required + @XStreamAlias("op_user_id") + private String opUserId; + + /** + *
    +   * 退款资金来源
    +   * refund_account
    +   * 否
    +   * String(30)
    +   * REFUND_SOURCE_RECHARGE_FUNDS
    +   * 仅针对老资金流商户使用,
    +   * 
  • REFUND_SOURCE_UNSETTLED_FUNDS---未结算资金退款(默认使用未结算资金退款), + *
  • REFUND_SOURCE_RECHARGE_FUNDS---可用余额退款 + *
  • + */ + @XStreamAlias("refund_account") + private String refundAccount; + + public String getAppid() { + return appid; + } + + public void setAppid(String appid) { + this.appid = appid; + } + + public String getMchId() { + return mchId; + } + + public void setMchId(String mchId) { + this.mchId = mchId; + } + + public String getDeviceInfo() { + return deviceInfo; + } + + public void setDeviceInfo(String deviceInfo) { + this.deviceInfo = deviceInfo; + } + + public String getNonceStr() { + return nonceStr; + } + + public void setNonceStr(String nonceStr) { + this.nonceStr = nonceStr; + } + + public String getSign() { + return sign; + } + + public void setSign(String sign) { + this.sign = sign; + } + + public String getTransactionId() { + return transactionId; + } + + public void setTransactionId(String transactionId) { + this.transactionId = transactionId; + } + + public String getOutTradeNo() { + return outTradeNo; + } + + public void setOutTradeNo(String outTradeNo) { + this.outTradeNo = outTradeNo; + } + + public String getOutRefundNo() { + return outRefundNo; + } + + public void setOutRefundNo(String outRefundNo) { + this.outRefundNo = outRefundNo; + } + + public Integer getTotalFee() { + return totalFee; + } + + public void setTotalFee(Integer totalFee) { + this.totalFee = totalFee; + } + + public Integer getRefundFee() { + return refundFee; + } + + public void setRefundFee(Integer refundFee) { + this.refundFee = refundFee; + } + + public String getRefundFeeType() { + return refundFeeType; + } + + public void setRefundFeeType(String refundFeeType) { + this.refundFeeType = refundFeeType; + } + + public String getOpUserId() { + return opUserId; + } + + public void setOpUserId(String opUserId) { + this.opUserId = opUserId; + } + + public String getRefundAccount() { + return refundAccount; + } + + public void setRefundAccount(String refundAccount) { + this.refundAccount = refundAccount; + } +} diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImplTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImplTest.java index 6199efeb..3f5dfe1a 100644 --- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImplTest.java +++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImplTest.java @@ -1,20 +1,14 @@ package me.chanjar.weixin.mp.api.impl; -import java.io.File; - -import org.testng.annotations.Guice; -import org.testng.annotations.Test; - import com.google.inject.Inject; - import me.chanjar.weixin.common.exception.WxErrorException; import me.chanjar.weixin.mp.api.ApiTestModule; import me.chanjar.weixin.mp.api.WxXmlMpInMemoryConfigStorage; -import me.chanjar.weixin.mp.bean.pay.WxEntPayRequest; -import me.chanjar.weixin.mp.bean.pay.WxRedpackResult; -import me.chanjar.weixin.mp.bean.pay.WxSendRedpackRequest; -import me.chanjar.weixin.mp.bean.pay.WxUnifiedOrderRequest; -import me.chanjar.weixin.mp.bean.pay.WxUnifiedOrderResult; +import me.chanjar.weixin.mp.bean.pay.*; +import org.testng.annotations.Guice; +import org.testng.annotations.Test; + +import java.io.File; /** * 测试支付相关接口 @@ -44,8 +38,14 @@ public class WxMpPayServiceImplTest { } @Test - public void testRefundPay() throws Exception { - + public void testRefund() throws Exception { + WxMpPayRefundRequest request = new WxMpPayRefundRequest(); + request.setOutRefundNo("aaa"); + request.setOutTradeNo("1111"); + request.setTotalFee(1222); + request.setRefundFee(111); + WxMpPayRefundResult result = this.wxService.getPayService().refund(request); + System.err.println(result); } @Test From a0dc8ca1ea7d9afd723067b910a33a22f7967867 Mon Sep 17 00:00:00 2001 From: BinaryWang Date: Sat, 8 Oct 2016 17:11:40 +0800 Subject: [PATCH 16/83] =?UTF-8?q?=E9=87=8D=E6=9E=84=E5=BE=AE=E4=BF=A1?= =?UTF-8?q?=E6=94=AF=E4=BB=98=E7=94=B3=E8=AF=B7=E9=80=80=E6=AC=BE=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=20for=20issue=20#25?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../me/chanjar/weixin/mp/api/impl/WxMpPayServiceImplTest.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImplTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImplTest.java index 3f5dfe1a..7f524fd1 100644 --- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImplTest.java +++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImplTest.java @@ -44,7 +44,8 @@ public class WxMpPayServiceImplTest { request.setOutTradeNo("1111"); request.setTotalFee(1222); request.setRefundFee(111); - WxMpPayRefundResult result = this.wxService.getPayService().refund(request); + File keyFile = new File("E:\\dlt.p12"); + WxMpPayRefundResult result = this.wxService.getPayService().refund(request, keyFile); System.err.println(result); } From 049eb957d8988569dc8f7c828e86a73f7e0caddc Mon Sep 17 00:00:00 2001 From: BinaryWang Date: Sat, 8 Oct 2016 17:46:31 +0800 Subject: [PATCH 17/83] =?UTF-8?q?=E6=A0=BC=E5=BC=8F=E5=8C=96javadoc?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/me/chanjar/weixin/mp/api/WxMpStoreService.java | 2 +- .../java/me/chanjar/weixin/mp/api/WxMpUserTagService.java | 2 +- .../me/chanjar/weixin/mp/api/impl/WxMpUserTagServiceImpl.java | 2 +- .../weixin/mp/bean/datacube/WxDataCubeArticleResult.java | 2 +- .../weixin/mp/bean/datacube/WxDataCubeArticleTotal.java | 2 +- .../weixin/mp/bean/datacube/WxDataCubeArticleTotalDetail.java | 2 +- .../chanjar/weixin/mp/bean/datacube/WxDataCubeBaseResult.java | 4 ++-- .../weixin/mp/bean/datacube/WxDataCubeInterfaceResult.java | 4 ++-- .../chanjar/weixin/mp/bean/datacube/WxDataCubeMsgResult.java | 2 +- .../me/chanjar/weixin/mp/bean/pay/WxMpPayRefundRequest.java | 2 +- .../me/chanjar/weixin/mp/bean/store/WxMpStoreBaseInfo.java | 2 +- .../me/chanjar/weixin/mp/bean/store/WxMpStoreListResult.java | 2 +- .../java/me/chanjar/weixin/mp/bean/tag/WxTagListUser.java | 2 +- .../main/java/me/chanjar/weixin/mp/bean/tag/WxUserTag.java | 2 +- .../chanjar/weixin/mp/api/impl/WxMpStoreServiceImplTest.java | 2 +- .../weixin/mp/api/impl/WxMpUserTagServiceImplTest.java | 2 +- 16 files changed, 18 insertions(+), 18 deletions(-) diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpStoreService.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpStoreService.java index 0ce7cc03..c214c46d 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpStoreService.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpStoreService.java @@ -9,7 +9,7 @@ import java.util.List; /** * 门店管理的相关接口代码 - * @author binarywang(https://github.com/binarywang) + * @author binarywang(Binary Wang) * Created by Binary Wang on 2016-09-23. */ public interface WxMpStoreService { diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpUserTagService.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpUserTagService.java index 0fcfb40f..90af7155 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpUserTagService.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpUserTagService.java @@ -9,7 +9,7 @@ import me.chanjar.weixin.mp.bean.tag.WxUserTag; /** * 用户标签管理相关接口 * Created by Binary Wang on 2016/9/2. - * @author binarywang(https://github.com/binarywang) + * @author binarywang(Binary Wang) * */ public interface WxMpUserTagService { diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpUserTagServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpUserTagServiceImpl.java index 94749c12..2cfb2884 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpUserTagServiceImpl.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpUserTagServiceImpl.java @@ -17,7 +17,7 @@ import java.util.List; /** * - * @author binarywang(https://github.com/binarywang) + * @author binarywang(Binary Wang) * Created by Binary Wang on 2016/9/2. */ public class WxMpUserTagServiceImpl implements WxMpUserTagService { diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeArticleResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeArticleResult.java index 3dd28459..d763543e 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeArticleResult.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeArticleResult.java @@ -10,7 +10,7 @@ import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; /** * 图文分析数据接口返回结果对象 - * @author binarywang(https://github.com/binarywang) + * @author binarywang(Binary Wang) * Created by Binary Wang on 2016/8/24. */ public class WxDataCubeArticleResult extends WxDataCubeBaseResult { diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeArticleTotal.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeArticleTotal.java index 37401cf8..d3236be3 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeArticleTotal.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeArticleTotal.java @@ -10,7 +10,7 @@ import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; /** * 图文分析数据接口返回结果对象 - * @author binarywang(https://github.com/binarywang) + * @author binarywang(Binary Wang) * Created by Binary Wang on 2016/8/24. */ public class WxDataCubeArticleTotal extends WxDataCubeBaseResult { diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeArticleTotalDetail.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeArticleTotalDetail.java index cbbf148f..e228a3cc 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeArticleTotalDetail.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeArticleTotalDetail.java @@ -4,7 +4,7 @@ import com.google.gson.annotations.SerializedName; /** * 获取图文群发总数据接口(getarticletotal)中的详细字段 - * @author binarywang(https://github.com/binarywang) + * @author binarywang(Binary Wang) * Created by Binary Wang on 2016/8/24. */ public class WxDataCubeArticleTotalDetail { diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeBaseResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeBaseResult.java index f819ab42..58fc0179 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeBaseResult.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeBaseResult.java @@ -6,7 +6,7 @@ import org.apache.commons.lang3.builder.ToStringStyle; /** * 统计接口的共用属性类 - * @author binarywang(https://github.com/binarywang) + * @author binarywang(Binary Wang) * Created by Binary Wang on 2016/8/25. */ public class WxDataCubeBaseResult { @@ -29,5 +29,5 @@ public class WxDataCubeBaseResult { public void setRefDate(String refDate) { this.refDate = refDate; } - + } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeInterfaceResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeInterfaceResult.java index 82a45dcf..2088453c 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeInterfaceResult.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeInterfaceResult.java @@ -10,7 +10,7 @@ import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; /** * 接口分析数据接口返回结果对象 - * @author binarywang(https://github.com/binarywang) + * @author binarywang(Binary Wang) * Created by Binary Wang on 2016/8/30. */ public class WxDataCubeInterfaceResult extends WxDataCubeBaseResult { @@ -98,5 +98,5 @@ public class WxDataCubeInterfaceResult extends WxDataCubeBaseResult { new TypeToken>() { }.getType()); } - + } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeMsgResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeMsgResult.java index 908dfca8..01e40e80 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeMsgResult.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeMsgResult.java @@ -10,7 +10,7 @@ import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; /** * 消息分析数据接口返回结果对象 - * @author binarywang(https://github.com/binarywang) + * @author binarywang(Binary Wang) * Created by Binary Wang on 2016/8/29. */ public class WxDataCubeMsgResult extends WxDataCubeBaseResult { diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxMpPayRefundRequest.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxMpPayRefundRequest.java index e375d64e..26f837b4 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxMpPayRefundRequest.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxMpPayRefundRequest.java @@ -15,7 +15,7 @@ import me.chanjar.weixin.common.annotation.Required; *
  • 描述 *
  • * - * @author binarywang(https://github.com/binarywang) + * @author binarywang(Binary Wang) * Created by Binary Wang on 2016-10-08. */ @XStreamAlias("xml") diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/store/WxMpStoreBaseInfo.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/store/WxMpStoreBaseInfo.java index dcfd3153..5dbd9e4e 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/store/WxMpStoreBaseInfo.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/store/WxMpStoreBaseInfo.java @@ -13,7 +13,7 @@ import java.util.List; /** * 门店基础信息 - * @author binarywang(https://github.com/binarywang) + * @author binarywang(Binary Wang) * Created by Binary Wang on 2016-09-23. */ public class WxMpStoreBaseInfo { diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/store/WxMpStoreListResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/store/WxMpStoreListResult.java index 2bc514ed..e02ae056 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/store/WxMpStoreListResult.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/store/WxMpStoreListResult.java @@ -11,7 +11,7 @@ import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; /** * 门店列表结果类 - * @author binarywang(https://github.com/binarywang) + * @author binarywang(Binary Wang) * Created by Binary Wang on 2016-09-27. * */ diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/tag/WxTagListUser.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/tag/WxTagListUser.java index b07314ba..3d7f57f3 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/tag/WxTagListUser.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/tag/WxTagListUser.java @@ -11,7 +11,7 @@ import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; /** * 获取标签下粉丝列表的结果对象 - * @author binarywang(https://github.com/binarywang) + * @author binarywang(Binary Wang) * Created by Binary Wang on 2016-09-19. */ public class WxTagListUser { diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/tag/WxUserTag.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/tag/WxUserTag.java index 53e247a7..281b9b30 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/tag/WxUserTag.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/tag/WxUserTag.java @@ -12,7 +12,7 @@ import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; /** * 用户标签对象 - * @author binarywang(https://github.com/binarywang) + * @author binarywang(Binary Wang) * Created by Binary Wang on 2016/9/2. */ public class WxUserTag { diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpStoreServiceImplTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpStoreServiceImplTest.java index 76685470..6e31b769 100644 --- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpStoreServiceImplTest.java +++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpStoreServiceImplTest.java @@ -15,7 +15,7 @@ import java.util.List; import static org.junit.Assert.assertNotNull; /** - * @author binarywang(https://github.com/binarywang) + * @author binarywang(Binary Wang) * Created by Binary Wang on 2016-09-23. * */ diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpUserTagServiceImplTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpUserTagServiceImplTest.java index 569b696d..4fca56be 100644 --- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpUserTagServiceImplTest.java +++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpUserTagServiceImplTest.java @@ -13,7 +13,7 @@ import java.util.List; /** * - * @author binarywang(https://github.com/binarywang) + * @author binarywang(Binary Wang) * Created by Binary Wang on 2016/9/2. */ @Test From d933ab43e04c65f4a221b63f08fc6c89cbc30ce1 Mon Sep 17 00:00:00 2001 From: BinaryWang Date: Sat, 8 Oct 2016 18:26:03 +0800 Subject: [PATCH 18/83] =?UTF-8?q?=E9=87=8D=E6=9E=84=E5=BE=AE=E4=BF=A1?= =?UTF-8?q?=E6=94=AF=E4=BB=98=E7=94=B3=E8=AF=B7=E9=80=80=E6=AC=BE=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=20for=20issue=20#25?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mp/bean/pay/WxMpPayRefundResult.java | 159 +++++++++--------- 1 file changed, 80 insertions(+), 79 deletions(-) diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxMpPayRefundResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxMpPayRefundResult.java index 3f917fe0..7e5d322d 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxMpPayRefundResult.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxMpPayRefundResult.java @@ -1,278 +1,279 @@ package me.chanjar.weixin.mp.bean.pay; -import java.io.Serializable; - import com.thoughtworks.xstream.annotations.XStreamAlias; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; + +import java.io.Serializable; /** + *
      * 微信支付-申请退款返回结果
      * https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_4
    + * 
    * @author liukaitj * */ @XStreamAlias("xml") public class WxMpPayRefundResult implements Serializable { - private static final long serialVersionUID = 1L; @XStreamAlias("return_code") private String returnCode; - + @XStreamAlias("return_msg") private String returnMsg; - + @XStreamAlias("result_code") private String resultCode; - + @XStreamAlias("err_code") private String errCode; - + @XStreamAlias("err_code_des") private String errCodeDes; - + @XStreamAlias("appid") private String appid; - + @XStreamAlias("mch_id") private String mchId; - + @XStreamAlias("device_info") private String deviceInfo; - + @XStreamAlias("nonce_str") private String nonceStr; - + @XStreamAlias("sign") private String sign; - + @XStreamAlias("transaction_id") private String transactionId; - + @XStreamAlias("out_trade_no") private String outTradeNo; - + @XStreamAlias("out_refund_no") private String outRefundNo; - + @XStreamAlias("refund_id") private String refundId; - + @XStreamAlias("refund_channel") private String refundChannel; - + @XStreamAlias("refund_fee") private String refundFee; - + @XStreamAlias("total_fee") private String totalFee; - + @XStreamAlias("fee_type") private String feeType; - + @XStreamAlias("cash_fee") private String cashFee; - + @XStreamAlias("cash_refund_fee") - private String cashRefundfee; - + private String cashRefundFee; + @XStreamAlias("coupon_refund_fee") private String couponRefundFee; - + @XStreamAlias("coupon_refund_count") private String couponRefundCount; - + @XStreamAlias("coupon_refund_id") private String couponRefundId; public String getReturnCode() { return this.returnCode; } - + public void setReturnCode(String returnCode) { this.returnCode = returnCode; } - + public String getReturnMsg() { return this.returnMsg; } - + public void setReturnMsg(String returnMsg) { this.returnMsg = returnMsg; } - + public String getResultCode() { return this.resultCode; } - + public void setResultCode(String resultCode) { this.resultCode = resultCode; } - + public String getErrCode() { return this.errCode; } - + public void setErrCode(String errCode) { this.errCode = errCode; } - + public String getErrCodeDes() { return this.errCodeDes; } - + public void setErrCodeDes(String errCodeDes) { this.errCodeDes = errCodeDes; } - + public String getAppid() { return this.appid; } - + public void setAppid(String appid) { this.appid = appid; } - + public String getMchId() { return this.mchId; } - + public void setMchId(String mchId) { this.mchId = mchId; } - + public String getDeviceInfo() { return this.deviceInfo; } - + public void setDeviceInfo(String deviceInfo) { this.deviceInfo = deviceInfo; } - + public String getNonceStr() { return this.nonceStr; } - + public void setNonceStr(String nonceStr) { this.nonceStr = nonceStr; } - + public String getSign() { return this.sign; } - + public void setSign(String sign) { this.sign = sign; } - + public String getTransactionId() { return this.transactionId; } - + public void setTransactionId(String transactionId) { this.transactionId = transactionId; } - + public String getOutTradeNo() { return this.outTradeNo; } - + public void setOutTradeNo(String outTradeNo) { this.outTradeNo = outTradeNo; } - + public String getOutRefundNo() { return this.outRefundNo; } - + public void setOutRefundNo(String outRefundNo) { this.outRefundNo = outRefundNo; } - + public String getRefundId() { return this.refundId; } - + public void setRefundId(String refundId) { this.refundId = refundId; } - + public String getRefundChannel() { return this.refundChannel; } - + public void setRefundChannel(String refundChannel) { this.refundChannel = refundChannel; } - + public String getRefundFee() { return this.refundFee; } - + public void setRefundFee(String refundFee) { this.refundFee = refundFee; } - + public String getTotalFee() { return this.totalFee; } - + public void setTotalFee(String totalFee) { this.totalFee = totalFee; } - + public String getFeeType() { return this.feeType; } - + public void setFeeType(String feeType) { this.feeType = feeType; } - + public String getCashFee() { return this.cashFee; } - + public void setCashFee(String cashFee) { this.cashFee = cashFee; } - - public String getCashRefundfee() { - return this.cashRefundfee; + + public String getCashRefundFee() { + return this.cashRefundFee; } - - public void setCashRefundfee(String cashRefundfee) { - this.cashRefundfee = cashRefundfee; + + public void setCashRefundFee(String cashRefundFee) { + this.cashRefundFee = cashRefundFee; } - + public String getCouponRefundFee() { return this.couponRefundFee; } - + public void setCouponRefundFee(String couponRefundFee) { this.couponRefundFee = couponRefundFee; } - + public String getCouponRefundCount() { return this.couponRefundCount; } - + public void setCouponRefundCount(String couponRefundCount) { this.couponRefundCount = couponRefundCount; } - + public String getCouponRefundId() { return this.couponRefundId; } - + public void setCouponRefundId(String couponRefundId) { this.couponRefundId = couponRefundId; } - + @Override public String toString() { - return "[" + - "return_code:" + this.returnCode + ";" + - "return_msg" + this.returnMsg + ";"; + return ToStringBuilder.reflectionToString(this, ToStringStyle.JSON_STYLE); } } From 076ae4fdfcea858d1653aa711450806ac9fd63c7 Mon Sep 17 00:00:00 2001 From: BinaryWang Date: Sun, 9 Oct 2016 18:52:42 +0800 Subject: [PATCH 19/83] fix a typo --- .../java/me/chanjar/weixin/mp/api/impl/WxMpServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpServiceImpl.java index 4cd26894..db8cfffa 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpServiceImpl.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpServiceImpl.java @@ -447,7 +447,7 @@ public class WxMpServiceImpl implements WxMpService { } return null; } catch (IOException e) { - this.log.error("\n[URL]: {}\n[PARAMS]: {}\n[EXECEPTION]: {}", uri, data, e.getMessage()); + this.log.error("\n[URL]: {}\n[PARAMS]: {}\n[EXCEPTION]: {}", uri, data, e.getMessage()); throw new RuntimeException(e); } } From a4642896a36bb712266a775daa2a7076ba636892 Mon Sep 17 00:00:00 2001 From: BinaryWang Date: Sun, 9 Oct 2016 19:00:07 +0800 Subject: [PATCH 20/83] =?UTF-8?q?=E6=9B=B4=E6=94=B9=E7=89=88=E6=9C=AC?= =?UTF-8?q?=EF=BC=8C=E5=8E=BB=E6=8E=89=E4=B8=80=E4=BA=9B=E6=97=A0=E7=94=A8?= =?UTF-8?q?=E7=9A=84jar=E4=BE=9D=E8=B5=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 7 +------ weixin-java-common/pom.xml | 2 +- weixin-java-cp/pom.xml | 2 +- weixin-java-mp/pom.xml | 2 +- 4 files changed, 4 insertions(+), 9 deletions(-) diff --git a/pom.xml b/pom.xml index e94e5fc1..804f3540 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ 4.0.0 com.github.binarywang weixin-java-parent - 2.2.0 + 2.3.0-SNAPSHOT pom WeiXin Java Tools - Parent 微信公众号、企业号上级POM @@ -72,11 +72,6 @@ ${logback.version} test - - org.apache.httpcomponents - fluent-hc - ${httpclient.version} - org.apache.httpcomponents httpmime diff --git a/weixin-java-common/pom.xml b/weixin-java-common/pom.xml index 667aaf76..fec020e7 100644 --- a/weixin-java-common/pom.xml +++ b/weixin-java-common/pom.xml @@ -6,7 +6,7 @@ com.github.binarywang weixin-java-parent - 2.2.0 + 2.3.0-SNAPSHOT weixin-java-common diff --git a/weixin-java-cp/pom.xml b/weixin-java-cp/pom.xml index e87e2ea1..f62f4d29 100644 --- a/weixin-java-cp/pom.xml +++ b/weixin-java-cp/pom.xml @@ -6,7 +6,7 @@ com.github.binarywang weixin-java-parent - 2.2.0 + 2.3.0-SNAPSHOT weixin-java-cp diff --git a/weixin-java-mp/pom.xml b/weixin-java-mp/pom.xml index 6fc42ee6..a06184a8 100644 --- a/weixin-java-mp/pom.xml +++ b/weixin-java-mp/pom.xml @@ -6,7 +6,7 @@ com.github.binarywang weixin-java-parent - 2.2.0 + 2.3.0-SNAPSHOT weixin-java-mp WeiXin Java Tools - MP From f7f7d12347c0a753148d316a7001959905832883 Mon Sep 17 00:00:00 2001 From: BinaryWang Date: Sun, 9 Oct 2016 19:00:26 +0800 Subject: [PATCH 21/83] =?UTF-8?q?=E5=8F=91=E9=80=81=E7=BA=A2=E5=8C=85?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E5=A2=9E=E5=8A=A0=E8=AF=81=E4=B9=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/me/chanjar/weixin/mp/api/WxMpPayService.java | 3 ++- .../me/chanjar/weixin/mp/api/impl/WxMpPayServiceImpl.java | 7 ++++--- .../chanjar/weixin/mp/api/impl/WxMpPayServiceImplTest.java | 3 ++- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpPayService.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpPayService.java index 45973443..bdba22ad 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpPayService.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpPayService.java @@ -74,8 +74,9 @@ public interface WxMpPayService { * 发送普通红包 https://pay.weixin.qq.com/wiki/doc/api/tools/cash_coupon.php?chapter=13_4&index=3 * 发送裂变红包 https://pay.weixin.qq.com/wiki/doc/api/tools/cash_coupon.php?chapter=13_5&index=4 *
    + * @param keyFile 证书文件对象 */ - WxRedpackResult sendRedpack(WxSendRedpackRequest request) throws WxErrorException; + WxRedpackResult sendRedpack(WxSendRedpackRequest request, File keyFile) throws WxErrorException; /** *
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImpl.java
    index a8d5dc3f..8e3e015e 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImpl.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImpl.java
    @@ -160,14 +160,15 @@ public class WxMpPayServiceImpl implements WxMpPayService {
       }
     
       @Override
    -  public WxRedpackResult sendRedpack(WxSendRedpackRequest request)
    +  public WxRedpackResult sendRedpack(WxSendRedpackRequest request, File keyFile)
           throws WxErrorException {
         XStream xstream = XStreamInitializer.getInstance();
         xstream.processAnnotations(WxSendRedpackRequest.class);
         xstream.processAnnotations(WxRedpackResult.class);
     
         request.setWxAppid(this.wxMpService.getWxMpConfigStorage().getAppId());
    -    request.setMchId(this.wxMpService.getWxMpConfigStorage().getPartnerId());
    +    String mchId = this.wxMpService.getWxMpConfigStorage().getPartnerId();
    +    request.setMchId(mchId);
         request.setNonceStr(System.currentTimeMillis() + "");
     
         String sign = this.createSign(this.xmlBean2Map(request),
    @@ -180,7 +181,7 @@ public class WxMpPayServiceImpl implements WxMpPayService {
           url = PAY_BASE_URL + "/mmpaymkttransfers/sendgroupredpack";
         }
     
    -    String responseContent = this.wxMpService.post(url, xstream.toXML(request));
    +    String responseContent = this.executeRequestWithKeyFile(url, xstream.toXML(request), keyFile, mchId);
         WxRedpackResult redpackResult = (WxRedpackResult) xstream
             .fromXML(responseContent);
         if ("FAIL".equals(redpackResult.getResultCode())) {
    diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImplTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImplTest.java
    index 7f524fd1..6d0b8a5c 100644
    --- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImplTest.java
    +++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImplTest.java
    @@ -62,7 +62,8 @@ public class WxMpPayServiceImplTest {
         request.setMchBillno("aaaa");
         request
             .setReOpenid(((WxXmlMpInMemoryConfigStorage) this.wxService.getWxMpConfigStorage()).getOpenid());
    -    WxRedpackResult redpackResult = this.wxService.getPayService().sendRedpack(request);
    +    File keyFile = new File("E:\\dlt.p12");
    +    WxRedpackResult redpackResult = this.wxService.getPayService().sendRedpack(request, keyFile);
         System.err.println(redpackResult);
       }
     
    
    From 3d9bc6be0fe54233d1f5139214de147c9f4e1e2d Mon Sep 17 00:00:00 2001
    From: BinaryWang 
    Date: Sun, 9 Oct 2016 19:43:09 +0800
    Subject: [PATCH 22/83] =?UTF-8?q?=E8=B0=83=E6=95=B4=E5=8F=82=E6=95=B0?=
     =?UTF-8?q?=E4=BD=8D=E7=BD=AE?=
    MIME-Version: 1.0
    Content-Type: text/plain; charset=UTF-8
    Content-Transfer-Encoding: 8bit
    
    ---
     .../me/chanjar/weixin/mp/api/impl/WxMpPayServiceImpl.java | 8 ++++----
     1 file changed, 4 insertions(+), 4 deletions(-)
    
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImpl.java
    index 8e3e015e..fa1a44c5 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImpl.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImpl.java
    @@ -120,7 +120,7 @@ public class WxMpPayServiceImpl implements WxMpPayService {
         request.setSign(sign);
     
         String url = PAY_BASE_URL + "/secapi/pay/refund";
    -    String responseContent = this.executeRequestWithKeyFile(url, xstream.toXML(request), keyFile, partnerId);
    +    String responseContent = this.executeRequestWithKeyFile(url, keyFile, xstream.toXML(request), partnerId);
         WxMpPayRefundResult wxMpPayRefundResult = (WxMpPayRefundResult) xstream.fromXML(responseContent);
     
         if (!"SUCCESS".equalsIgnoreCase(wxMpPayRefundResult.getResultCode())
    @@ -181,7 +181,7 @@ public class WxMpPayServiceImpl implements WxMpPayService {
           url = PAY_BASE_URL + "/mmpaymkttransfers/sendgroupredpack";
         }
     
    -    String responseContent = this.executeRequestWithKeyFile(url, xstream.toXML(request), keyFile, mchId);
    +    String responseContent = this.executeRequestWithKeyFile(url, keyFile, xstream.toXML(request), mchId);
         WxRedpackResult redpackResult = (WxRedpackResult) xstream
             .fromXML(responseContent);
         if ("FAIL".equals(redpackResult.getResultCode())) {
    @@ -360,7 +360,7 @@ public class WxMpPayServiceImpl implements WxMpPayService {
     
         String url = PAY_BASE_URL + "/mmpaymkttransfers/promotion/transfers";
     
    -    String responseContent = this.executeRequestWithKeyFile(xstream.toXML(request), url, keyFile, request.getMchId());
    +    String responseContent = this.executeRequestWithKeyFile(url, keyFile, xstream.toXML(request), request.getMchId());
         WxEntPayResult result = (WxEntPayResult) xstream.fromXML(responseContent);
         if ("FAIL".equals(result.getResultCode())) {
           throw new WxErrorException(
    @@ -369,7 +369,7 @@ public class WxMpPayServiceImpl implements WxMpPayService {
         return result;
       }
     
    -  private String executeRequestWithKeyFile( String requestStr, String url, File keyFile, String mchId) throws WxErrorException {
    +  private String executeRequestWithKeyFile( String url, File keyFile, String requestStr, String mchId) throws WxErrorException {
         try (FileInputStream inputStream = new FileInputStream(keyFile)) {
           KeyStore keyStore = KeyStore.getInstance("PKCS12");
           keyStore.load(inputStream, mchId.toCharArray());
    
    From 25064c5ff8f4bb477ee749ff967b62d012fc9e20 Mon Sep 17 00:00:00 2001
    From: ben 
    Date: Mon, 10 Oct 2016 11:00:14 +0800
    Subject: [PATCH 23/83] =?UTF-8?q?=E4=BF=AE=E6=AD=A3me.chanjar.weixin.commo?=
     =?UTF-8?q?n.util.http.DefaultApacheHttpClientBuilder#prepare=E8=B0=83?=
     =?UTF-8?q?=E7=94=A8=E9=97=AE=E9=A2=98=EF=BC=8Ctry=20to=20fix#52?=
    MIME-Version: 1.0
    Content-Type: text/plain; charset=UTF-8
    Content-Transfer-Encoding: 8bit
    
    ---
     .../common/util/http/DefaultApacheHttpClientBuilder.java  | 8 +-------
     1 file changed, 1 insertion(+), 7 deletions(-)
    
    diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/DefaultApacheHttpClientBuilder.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/DefaultApacheHttpClientBuilder.java
    index f69dcc6c..fda72a76 100644
    --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/DefaultApacheHttpClientBuilder.java
    +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/DefaultApacheHttpClientBuilder.java
    @@ -58,9 +58,8 @@ public class DefaultApacheHttpClientBuilder implements ApacheHttpClientBuilder {
     
       private HttpClientBuilder httpClientBuilder;
     
    -  private boolean prepared = false;
    -
       private DefaultApacheHttpClientBuilder() {
    +    prepare();
       }
     
       public static DefaultApacheHttpClientBuilder get() {
    @@ -153,11 +152,6 @@ public class DefaultApacheHttpClientBuilder implements ApacheHttpClientBuilder {
     
       @Override
       public CloseableHttpClient build() {
    -    if (!this.prepared) {
    -      prepare();
    -      this.prepared = true;
    -    }
    -
         return this.httpClientBuilder.build();
       }
     
    
    From a345f8a639380fe95915b6751594356e5592c8bf Mon Sep 17 00:00:00 2001
    From: HaiJun Liu 
    Date: Mon, 10 Oct 2016 20:59:03 +0800
    Subject: [PATCH 24/83] issue #58 : remove fluent-hc for optimization
    
    ---
     build.gradle | 1 -
     1 file changed, 1 deletion(-)
    
    diff --git a/build.gradle b/build.gradle
    index 108e69c0..ba12afc4 100644
    --- a/build.gradle
    +++ b/build.gradle
    @@ -20,7 +20,6 @@ subprojects {
     
       dependencies {
         compile group: 'org.slf4j', name: 'slf4j-api', version:'1.7.10'
    -    compile group: 'org.apache.httpcomponents', name: 'fluent-hc', version:'4.5'
         compile group: 'org.apache.httpcomponents', name: 'httpmime', version:'4.5'
         compile group: 'org.jodd', name: 'jodd-http', version:'3.6.7'
         compile group: 'com.google.code.gson', name: 'gson', version:'2.7'
    
    From 636ae33daf5a23e661d73aae4794f620d592245d Mon Sep 17 00:00:00 2001
    From: Binary Wang 
    Date: Tue, 11 Oct 2016 11:27:57 +0800
    Subject: [PATCH 25/83] Update README.md
    
    ---
     README.md | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/README.md b/README.md
    index c473c9cd..9be8db94 100644
    --- a/README.md
    +++ b/README.md
    @@ -67,7 +67,7 @@ compile 'com.github.binarywang:weixin-java-cp:2.2.0'
     * https://git.coding.net/binarywang/weixin-java-tools.git
     
     ===========
    -## 目前可参考的Demo项目有两个:
    +## 目前可参考的Demo项目有两个(目前都是公众号的,风格不同,欢迎提供更多的demo供新手参考):
     1. https://github.com/wechat-group/weixin-mp-demo
     1. https://github.com/wechat-group/weixin-java-tools-springmvc
     
    
    From e8d368f212e070d646bd2c4c11391029b4342ab9 Mon Sep 17 00:00:00 2001
    From: BinaryWang 
    Date: Wed, 12 Oct 2016 14:19:53 +0800
    Subject: [PATCH 26/83] =?UTF-8?q?toString()=E6=96=B9=E6=B3=95=E6=9B=BF?=
     =?UTF-8?q?=E6=8D=A2=E6=8E=89=E8=BE=83=E6=96=B0=E7=89=88=E6=9C=AC=E7=9A=84?=
     =?UTF-8?q?=20commons-lang3=E5=BC=95=E5=85=A5=E7=9A=84=20ToStringStyle.JSO?=
     =?UTF-8?q?N=5FSTYLE?=
    MIME-Version: 1.0
    Content-Type: text/plain; charset=UTF-8
    Content-Transfer-Encoding: 8bit
    
    ---
     .../chanjar/weixin/common/bean/WxCardApiSignature.java |  6 +++---
     .../chanjar/weixin/common/bean/menu/WxMenuButton.java  |  2 +-
     .../me/chanjar/weixin/common/bean/menu/WxMenuRule.java |  2 +-
     .../weixin/cp/api/WxCpInMemoryConfigStorage.java       |  2 +-
     .../weixin/mp/api/WxMpInMemoryConfigStorage.java       |  2 +-
     .../java/me/chanjar/weixin/mp/bean/WxMpXmlMessage.java | 10 +++++-----
     .../weixin/mp/bean/datacube/WxDataCubeBaseResult.java  |  2 +-
     .../mp/bean/datacube/WxDataCubeUserCumulate.java       |  2 +-
     .../weixin/mp/bean/datacube/WxDataCubeUserSummary.java |  2 +-
     .../mp/bean/kefu/request/WxMpKfSessionRequest.java     |  2 +-
     .../chanjar/weixin/mp/bean/kefu/result/WxMpKfInfo.java |  2 +-
     .../chanjar/weixin/mp/bean/kefu/result/WxMpKfList.java |  2 +-
     .../weixin/mp/bean/kefu/result/WxMpKfMsgList.java      |  2 +-
     .../weixin/mp/bean/kefu/result/WxMpKfMsgRecord.java    |  2 +-
     .../weixin/mp/bean/kefu/result/WxMpKfOnlineList.java   |  2 +-
     .../weixin/mp/bean/kefu/result/WxMpKfSession.java      |  2 +-
     .../mp/bean/kefu/result/WxMpKfSessionGetResult.java    |  2 +-
     .../weixin/mp/bean/kefu/result/WxMpKfSessionList.java  |  2 +-
     .../mp/bean/kefu/result/WxMpKfSessionWaitCaseList.java |  2 +-
     .../me/chanjar/weixin/mp/bean/pay/WxEntPayRequest.java |  2 +-
     .../me/chanjar/weixin/mp/bean/pay/WxEntPayResult.java  |  2 +-
     .../weixin/mp/bean/pay/WxMpPayRefundResult.java        |  2 +-
     .../me/chanjar/weixin/mp/bean/pay/WxMpPayResult.java   |  2 +-
     .../me/chanjar/weixin/mp/bean/pay/WxRedpackResult.java |  2 +-
     .../weixin/mp/bean/pay/WxUnifiedOrderRequest.java      |  2 +-
     .../weixin/mp/bean/pay/WxUnifiedOrderResult.java       |  2 +-
     .../chanjar/weixin/mp/bean/result/WxMpCardResult.java  |  2 +-
     .../me/chanjar/weixin/mp/bean/result/WxMpUser.java     |  2 +-
     .../weixin/mp/bean/store/WxMpStoreBaseInfo.java        |  2 +-
     .../me/chanjar/weixin/mp/bean/store/WxMpStoreInfo.java |  2 +-
     .../weixin/mp/bean/store/WxMpStoreListResult.java      |  2 +-
     .../me/chanjar/weixin/mp/bean/tag/WxTagListUser.java   |  4 ++--
     .../java/me/chanjar/weixin/mp/bean/tag/WxUserTag.java  |  2 +-
     33 files changed, 40 insertions(+), 40 deletions(-)
    
    diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/WxCardApiSignature.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/WxCardApiSignature.java
    index 2ff252c3..f50b72f2 100644
    --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/WxCardApiSignature.java
    +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/WxCardApiSignature.java
    @@ -1,10 +1,10 @@
     package me.chanjar.weixin.common.bean;
     
    +import java.io.Serializable;
    +
     import org.apache.commons.lang3.builder.ToStringBuilder;
     import org.apache.commons.lang3.builder.ToStringStyle;
     
    -import java.io.Serializable;
    -
     /**
      * 卡券Api签名
      *
    @@ -35,7 +35,7 @@ public class WxCardApiSignature implements Serializable {
     
       @Override
       public String toString() {
    -    return ToStringBuilder.reflectionToString(this, ToStringStyle.JSON_STYLE);
    +    return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
       }
     
       public String getAppId() {
    diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/menu/WxMenuButton.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/menu/WxMenuButton.java
    index 6a5e5426..1fe8bb90 100644
    --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/menu/WxMenuButton.java
    +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/menu/WxMenuButton.java
    @@ -19,7 +19,7 @@ public class WxMenuButton {
       @Override
       public String toString() {
         return ToStringBuilder.reflectionToString(this, 
    -        ToStringStyle.JSON_STYLE);
    +        ToStringStyle.MULTI_LINE_STYLE);
       }
       
       public String getType() {
    diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/menu/WxMenuRule.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/menu/WxMenuRule.java
    index b3e90886..ca6fdd24 100644
    --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/menu/WxMenuRule.java
    +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/menu/WxMenuRule.java
    @@ -70,6 +70,6 @@ public class WxMenuRule {
     
       @Override
       public String toString() {
    -    return ToStringBuilder.reflectionToString(this, ToStringStyle.JSON_STYLE);
    +    return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
       }
     }
    \ No newline at end of file
    diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpInMemoryConfigStorage.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpInMemoryConfigStorage.java
    index 17fda4ca..8914da53 100644
    --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpInMemoryConfigStorage.java
    +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpInMemoryConfigStorage.java
    @@ -203,7 +203,7 @@ public class WxCpInMemoryConfigStorage implements WxCpConfigStorage {
     
       @Override
       public String toString() {
    -    return ToStringBuilder.reflectionToString(this, ToStringStyle.JSON_STYLE);
    +    return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
       }
     
       @Override
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpInMemoryConfigStorage.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpInMemoryConfigStorage.java
    index 765f6d53..784cfddc 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpInMemoryConfigStorage.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpInMemoryConfigStorage.java
    @@ -229,7 +229,7 @@ public class WxMpInMemoryConfigStorage implements WxMpConfigStorage {
     
       @Override
       public String toString() {
    -    return ToStringBuilder.reflectionToString(this,ToStringStyle.JSON_STYLE);
    +    return ToStringBuilder.reflectionToString(this,ToStringStyle.MULTI_LINE_STYLE);
       }
     
       @Override
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlMessage.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlMessage.java
    index 9adcb54d..b938ceb0 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlMessage.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlMessage.java
    @@ -667,7 +667,7 @@ public class WxMpXmlMessage implements Serializable {
       public static class ScanCodeInfo {
         @Override
         public String toString() {
    -      return ToStringBuilder.reflectionToString(this, ToStringStyle.JSON_STYLE);
    +      return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
         }
     
         @XStreamAlias("ScanType")
    @@ -707,7 +707,7 @@ public class WxMpXmlMessage implements Serializable {
       public static class SendPicsInfo {
         @Override
         public String toString() {
    -      return ToStringBuilder.reflectionToString(this, ToStringStyle.JSON_STYLE);
    +      return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
         }
     
         @XStreamAlias("Count")
    @@ -733,7 +733,7 @@ public class WxMpXmlMessage implements Serializable {
           @Override
           public String toString() {
             return ToStringBuilder.reflectionToString(this,
    -            ToStringStyle.JSON_STYLE);
    +            ToStringStyle.MULTI_LINE_STYLE);
           }
     
           @XStreamAlias("PicMd5Sum")
    @@ -775,7 +775,7 @@ public class WxMpXmlMessage implements Serializable {
     
         @Override
         public String toString() {
    -      return ToStringBuilder.reflectionToString(this, ToStringStyle.JSON_STYLE);
    +      return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
         }
     
         public String getLocationX() {
    @@ -821,6 +821,6 @@ public class WxMpXmlMessage implements Serializable {
     
       @Override
       public String toString() {
    -    return ToStringBuilder.reflectionToString(this, ToStringStyle.JSON_STYLE);
    +    return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
       }
     }
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeBaseResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeBaseResult.java
    index 58fc0179..f3999fa2 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeBaseResult.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeBaseResult.java
    @@ -12,7 +12,7 @@ import org.apache.commons.lang3.builder.ToStringStyle;
     public class WxDataCubeBaseResult {
       @Override
       public String toString() {
    -    return ToStringBuilder.reflectionToString(this, ToStringStyle.JSON_STYLE);
    +    return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
       }
     
       /**
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeUserCumulate.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeUserCumulate.java
    index 039bd189..e764f244 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeUserCumulate.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeUserCumulate.java
    @@ -46,7 +46,7 @@ public class WxDataCubeUserCumulate implements Serializable {
     
       @Override
       public String toString() {
    -    return ToStringBuilder.reflectionToString(this, ToStringStyle.JSON_STYLE);
    +    return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
       }
     
       public static List fromJson(String json) {
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeUserSummary.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeUserSummary.java
    index 4802027e..54eb0d4a 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeUserSummary.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeUserSummary.java
    @@ -65,7 +65,7 @@ public class WxDataCubeUserSummary implements Serializable {
     
       @Override
       public String toString() {
    -    return ToStringBuilder.reflectionToString(this, ToStringStyle.JSON_STYLE);
    +    return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
       }
     
       public static List fromJson(String json) {
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/kefu/request/WxMpKfSessionRequest.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/kefu/request/WxMpKfSessionRequest.java
    index e821916e..420c0d62 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/kefu/request/WxMpKfSessionRequest.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/kefu/request/WxMpKfSessionRequest.java
    @@ -31,7 +31,7 @@ public class WxMpKfSessionRequest implements Serializable {
     
       @Override
       public String toString() {
    -    return ToStringBuilder.reflectionToString(this, ToStringStyle.JSON_STYLE);
    +    return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
       }
       
       public String toJson() {
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/kefu/result/WxMpKfInfo.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/kefu/result/WxMpKfInfo.java
    index 37154aa4..bcb811bc 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/kefu/result/WxMpKfInfo.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/kefu/result/WxMpKfInfo.java
    @@ -127,7 +127,7 @@ public class WxMpKfInfo implements Serializable {
     
       @Override
       public String toString() {
    -    return ToStringBuilder.reflectionToString(this, ToStringStyle.JSON_STYLE);
    +    return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
       }
     
       public String getWxAccount() {
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/kefu/result/WxMpKfList.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/kefu/result/WxMpKfList.java
    index 062ff9ac..3465073a 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/kefu/result/WxMpKfList.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/kefu/result/WxMpKfList.java
    @@ -19,7 +19,7 @@ public class WxMpKfList {
     
       @Override
       public String toString() {
    -    return ToStringBuilder.reflectionToString(this, ToStringStyle.JSON_STYLE);
    +    return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
       }
     
       public List getKfList() {
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/kefu/result/WxMpKfMsgList.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/kefu/result/WxMpKfMsgList.java
    index 570f2def..cfcbba92 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/kefu/result/WxMpKfMsgList.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/kefu/result/WxMpKfMsgList.java
    @@ -46,7 +46,7 @@ public class WxMpKfMsgList {
     
       @Override
       public String toString() {
    -    return ToStringBuilder.reflectionToString(this, ToStringStyle.JSON_STYLE);
    +    return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
       }
     
       public static WxMpKfMsgList fromJson(String responseContent) {
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/kefu/result/WxMpKfMsgRecord.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/kefu/result/WxMpKfMsgRecord.java
    index 7f326ac1..14b26567 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/kefu/result/WxMpKfMsgRecord.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/kefu/result/WxMpKfMsgRecord.java
    @@ -41,7 +41,7 @@ public class WxMpKfMsgRecord {
     
       @Override
       public String toString() {
    -    return ToStringBuilder.reflectionToString(this, ToStringStyle.JSON_STYLE);
    +    return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
       }
       public String getWorker() {
         return this.worker;
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/kefu/result/WxMpKfOnlineList.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/kefu/result/WxMpKfOnlineList.java
    index b4a418f6..1cc674c9 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/kefu/result/WxMpKfOnlineList.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/kefu/result/WxMpKfOnlineList.java
    @@ -19,7 +19,7 @@ public class WxMpKfOnlineList {
     
       @Override
       public String toString() {
    -    return ToStringBuilder.reflectionToString(this, ToStringStyle.JSON_STYLE);
    +    return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
       }
       
       public List getKfOnlineList() {
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/kefu/result/WxMpKfSession.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/kefu/result/WxMpKfSession.java
    index e29f45b8..8a9ef842 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/kefu/result/WxMpKfSession.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/kefu/result/WxMpKfSession.java
    @@ -39,7 +39,7 @@ public class WxMpKfSession {
     
       @Override
       public String toString() {
    -    return ToStringBuilder.reflectionToString(this, ToStringStyle.JSON_STYLE);
    +    return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
       }
       
       public String getKfAccount() {
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/kefu/result/WxMpKfSessionGetResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/kefu/result/WxMpKfSessionGetResult.java
    index 22a6cf24..eb78f3b6 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/kefu/result/WxMpKfSessionGetResult.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/kefu/result/WxMpKfSessionGetResult.java
    @@ -27,7 +27,7 @@ public class WxMpKfSessionGetResult {
     
       @Override
       public String toString() {
    -    return ToStringBuilder.reflectionToString(this, ToStringStyle.JSON_STYLE);
    +    return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
       }
       
       public static WxMpKfSessionGetResult fromJson(String json) {
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/kefu/result/WxMpKfSessionList.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/kefu/result/WxMpKfSessionList.java
    index dea7e243..8bcac0e4 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/kefu/result/WxMpKfSessionList.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/kefu/result/WxMpKfSessionList.java
    @@ -23,7 +23,7 @@ public class WxMpKfSessionList {
     
       @Override
       public String toString() {
    -    return ToStringBuilder.reflectionToString(this, ToStringStyle.JSON_STYLE);
    +    return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
       }
     
       public static WxMpKfSessionList fromJson(String json) {
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/kefu/result/WxMpKfSessionWaitCaseList.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/kefu/result/WxMpKfSessionWaitCaseList.java
    index dc2ab06b..7e876901 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/kefu/result/WxMpKfSessionWaitCaseList.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/kefu/result/WxMpKfSessionWaitCaseList.java
    @@ -29,7 +29,7 @@ public class WxMpKfSessionWaitCaseList {
     
       @Override
       public String toString() {
    -    return ToStringBuilder.reflectionToString(this, ToStringStyle.JSON_STYLE);
    +    return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
       }
     
       public static WxMpKfSessionWaitCaseList fromJson(String json) {
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxEntPayRequest.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxEntPayRequest.java
    index 38ed704a..07549ab3 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxEntPayRequest.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxEntPayRequest.java
    @@ -278,7 +278,7 @@ public class WxEntPayRequest {
     
       @Override
       public String toString() {
    -    return ToStringBuilder.reflectionToString(this, ToStringStyle.JSON_STYLE);
    +    return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
       }
     
     }
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxEntPayResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxEntPayResult.java
    index b2dbb8f1..86c2c010 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxEntPayResult.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxEntPayResult.java
    @@ -89,7 +89,7 @@ public class WxEntPayResult {
     
       @Override
       public String toString() {
    -    return ToStringBuilder.reflectionToString(this, ToStringStyle.JSON_STYLE);
    +    return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
       }
     
       public String getReturnCode() {
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxMpPayRefundResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxMpPayRefundResult.java
    index 7e5d322d..5462d44a 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxMpPayRefundResult.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxMpPayRefundResult.java
    @@ -273,7 +273,7 @@ public class WxMpPayRefundResult implements Serializable {
     
       @Override
       public String toString() {
    -    return ToStringBuilder.reflectionToString(this, ToStringStyle.JSON_STYLE);
    +    return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
       }
     
     }
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxMpPayResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxMpPayResult.java
    index 2978ba17..6f453204 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxMpPayResult.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxMpPayResult.java
    @@ -18,7 +18,7 @@ import org.apache.commons.lang3.builder.ToStringStyle;
     public class WxMpPayResult implements Serializable {
       @Override
       public String toString() {
    -    return ToStringBuilder.reflectionToString(this, ToStringStyle.JSON_STYLE);
    +    return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
       }
     
       private static final long serialVersionUID = -570934170727777190L;
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxRedpackResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxRedpackResult.java
    index 297e07d7..a8287be6 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxRedpackResult.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxRedpackResult.java
    @@ -100,6 +100,6 @@ public class WxRedpackResult implements Serializable {
       
       @Override
       public String toString() {
    -    return ToStringBuilder.reflectionToString(this, ToStringStyle.JSON_STYLE);
    +    return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
       }
     }
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxUnifiedOrderRequest.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxUnifiedOrderRequest.java
    index 4173c373..7cadd246 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxUnifiedOrderRequest.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxUnifiedOrderRequest.java
    @@ -484,7 +484,7 @@ public class WxUnifiedOrderRequest {
     
       @Override
       public String toString() {
    -    return ToStringBuilder.reflectionToString(this, ToStringStyle.JSON_STYLE);
    +    return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
       }
     
       public static WxUnifiedOrderRequestBuilder builder() {
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxUnifiedOrderResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxUnifiedOrderResult.java
    index 18817461..7dfc6598 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxUnifiedOrderResult.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxUnifiedOrderResult.java
    @@ -150,6 +150,6 @@ public class WxUnifiedOrderResult {
     
       @Override
       public String toString() {
    -    return ToStringBuilder.reflectionToString(this, ToStringStyle.JSON_STYLE);
    +    return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
       }
     }
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpCardResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpCardResult.java
    index 8ce5ca47..7a711ba1 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpCardResult.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpCardResult.java
    @@ -65,7 +65,7 @@ public class WxMpCardResult implements Serializable {
     
       @Override
       public String toString() {
    -    return ToStringBuilder.reflectionToString(this, ToStringStyle.JSON_STYLE);
    +    return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
       }
     
       public String getUserCardStatus() {
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpUser.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpUser.java
    index f56ccf5c..b885ea4c 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpUser.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpUser.java
    @@ -179,7 +179,7 @@ public class WxMpUser implements Serializable {
     
       @Override
       public String toString() {
    -    return ToStringBuilder.reflectionToString(this, ToStringStyle.JSON_STYLE);
    +    return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
       }
     
     }
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/store/WxMpStoreBaseInfo.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/store/WxMpStoreBaseInfo.java
    index 5dbd9e4e..409e41c3 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/store/WxMpStoreBaseInfo.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/store/WxMpStoreBaseInfo.java
    @@ -19,7 +19,7 @@ import java.util.List;
     public class WxMpStoreBaseInfo {
       @Override
       public String toString() {
    -    return ToStringBuilder.reflectionToString(this, ToStringStyle.JSON_STYLE);
    +    return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
       }
     
       public static WxMpStoreBaseInfo fromJson(String json) {
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/store/WxMpStoreInfo.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/store/WxMpStoreInfo.java
    index 864d9d2c..9d07eb03 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/store/WxMpStoreInfo.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/store/WxMpStoreInfo.java
    @@ -8,7 +8,7 @@ import com.google.gson.annotations.SerializedName;
     public class WxMpStoreInfo {
       @Override
       public String toString() {
    -    return ToStringBuilder.reflectionToString(this, ToStringStyle.JSON_STYLE);
    +    return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
       }
     
       @SerializedName("base_info")
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/store/WxMpStoreListResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/store/WxMpStoreListResult.java
    index e02ae056..f16c1534 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/store/WxMpStoreListResult.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/store/WxMpStoreListResult.java
    @@ -18,7 +18,7 @@ import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
     public class WxMpStoreListResult {
       @Override
       public String toString() {
    -    return ToStringBuilder.reflectionToString(this, ToStringStyle.JSON_STYLE);
    +    return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
       }
     
       public static WxMpStoreListResult fromJson(String json) {
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/tag/WxTagListUser.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/tag/WxTagListUser.java
    index 3d7f57f3..47ed067a 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/tag/WxTagListUser.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/tag/WxTagListUser.java
    @@ -26,7 +26,7 @@ public class WxTagListUser {
     
       @Override
       public String toString() {
    -    return ToStringBuilder.reflectionToString(this, ToStringStyle.JSON_STYLE);
    +    return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
       }
     
       /**
    @@ -74,7 +74,7 @@ public class WxTagListUser {
       public static class WxTagListUserData {
         @Override
         public String toString() {
    -      return ToStringBuilder.reflectionToString(this, ToStringStyle.JSON_STYLE);
    +      return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
         }
     
         /**
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/tag/WxUserTag.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/tag/WxUserTag.java
    index 281b9b30..67b443a4 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/tag/WxUserTag.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/tag/WxUserTag.java
    @@ -73,6 +73,6 @@ public class WxUserTag {
     
       @Override
       public String toString() {
    -    return ToStringBuilder.reflectionToString(this, ToStringStyle.JSON_STYLE);
    +    return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
       }
     }
    
    From cd026278c220e2d4533d56eb541a6f149d763cb8 Mon Sep 17 00:00:00 2001
    From: BinaryWang 
    Date: Thu, 13 Oct 2016 09:11:15 +0800
    Subject: [PATCH 27/83] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=96=B9=E6=B3=95?=
     =?UTF-8?q?=E8=BF=94=E5=9B=9E=E7=B1=BB=E5=9E=8B=EF=BC=8C=E4=BF=9D=E8=AF=81?=
     =?UTF-8?q?=E6=A0=87=E7=AD=BEId=E4=B8=8E=E5=85=B6=E4=BB=96=E5=9C=B0?=
     =?UTF-8?q?=E6=96=B9=E4=B8=80=E8=87=B4?=
    MIME-Version: 1.0
    Content-Type: text/plain; charset=UTF-8
    Content-Transfer-Encoding: 8bit
    
    ---
     .../chanjar/weixin/mp/api/WxMpUserTagService.java  |  4 ++--
     .../weixin/mp/api/impl/WxMpUserTagServiceImpl.java | 12 +++++++-----
     .../mp/api/impl/WxMpUserTagServiceImplTest.java    | 14 ++++++++------
     3 files changed, 17 insertions(+), 13 deletions(-)
    
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpUserTagService.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpUserTagService.java
    index 90af7155..4c0ab7c8 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpUserTagService.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpUserTagService.java
    @@ -94,8 +94,8 @@ public interface WxMpUserTagService {
        * 详情请见:用户标签管理
        * 接口url格式: https://api.weixin.qq.com/cgi-bin/tags/getidlist?access_token=ACCESS_TOKEN
        * 
    - * + * @return 标签Id的列表 */ - List userTagList(String openid) throws WxErrorException; + List userTagList(String openid) throws WxErrorException; } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpUserTagServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpUserTagServiceImpl.java index 2cfb2884..d1bdae1e 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpUserTagServiceImpl.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpUserTagServiceImpl.java @@ -1,9 +1,14 @@ package me.chanjar.weixin.mp.api.impl; +import java.util.List; + +import org.apache.commons.lang3.StringUtils; + import com.google.gson.JsonArray; import com.google.gson.JsonObject; import com.google.gson.JsonParser; import com.google.gson.reflect.TypeToken; + import me.chanjar.weixin.common.bean.result.WxError; import me.chanjar.weixin.common.exception.WxErrorException; import me.chanjar.weixin.mp.api.WxMpService; @@ -11,9 +16,6 @@ import me.chanjar.weixin.mp.api.WxMpUserTagService; import me.chanjar.weixin.mp.bean.tag.WxTagListUser; import me.chanjar.weixin.mp.bean.tag.WxUserTag; import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; -import org.apache.commons.lang3.StringUtils; - -import java.util.List; /** * @@ -144,7 +146,7 @@ public class WxMpUserTagServiceImpl implements WxMpUserTagService { } @Override - public List userTagList(String openid) throws WxErrorException { + public List userTagList(String openid) throws WxErrorException { String url = API_URL_PREFIX + "/getidlist"; JsonObject json = new JsonObject(); @@ -154,7 +156,7 @@ public class WxMpUserTagServiceImpl implements WxMpUserTagService { return WxMpGsonBuilder.create().fromJson( new JsonParser().parse(responseContent).getAsJsonObject().get("tagid_list"), - new TypeToken>() { + new TypeToken>() { }.getType()); } } diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpUserTagServiceImplTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpUserTagServiceImplTest.java index 4fca56be..2c67ea3f 100644 --- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpUserTagServiceImplTest.java +++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpUserTagServiceImplTest.java @@ -1,15 +1,17 @@ package me.chanjar.weixin.mp.api.impl; +import java.util.List; + +import org.testng.Assert; +import org.testng.annotations.Guice; +import org.testng.annotations.Test; + import com.google.inject.Inject; + import me.chanjar.weixin.mp.api.ApiTestModule; import me.chanjar.weixin.mp.api.WxXmlMpInMemoryConfigStorage; import me.chanjar.weixin.mp.bean.tag.WxTagListUser; import me.chanjar.weixin.mp.bean.tag.WxUserTag; -import org.testng.Assert; -import org.testng.annotations.Guice; -import org.testng.annotations.Test; - -import java.util.List; /** * @@ -80,7 +82,7 @@ public class WxMpUserTagServiceImplTest { @Test public void testUserTagList() throws Exception { - List res = this.wxService.getUserTagService().userTagList( + List res = this.wxService.getUserTagService().userTagList( ((WxXmlMpInMemoryConfigStorage) this.wxService.getWxMpConfigStorage()).getOpenid()); System.out.println(res); Assert.assertNotNull(res); From 2af7bee103d881469ef1a861bcd664f09dd9c371 Mon Sep 17 00:00:00 2001 From: BinaryWang Date: Thu, 13 Oct 2016 15:41:16 +0800 Subject: [PATCH 28/83] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E9=94=99=E8=AF=AF?= =?UTF-8?q?=E7=9A=84=E5=8D=95=E5=85=83=E6=B5=8B=E8=AF=95=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../me/chanjar/weixin/cp/bean/WxCpXmlOutNewsMessageTest.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/bean/WxCpXmlOutNewsMessageTest.java b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/bean/WxCpXmlOutNewsMessageTest.java index bd66743c..872c0ac3 100644 --- a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/bean/WxCpXmlOutNewsMessageTest.java +++ b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/bean/WxCpXmlOutNewsMessageTest.java @@ -19,12 +19,12 @@ public class WxCpXmlOutNewsMessageTest { item.setUrl("url"); m.addArticle(item); m.addArticle(item); + String expected = "" + "" + "" + "1122" + "" - + " 2" + " " + " " + " <![CDATA[title]]>" @@ -39,6 +39,7 @@ public class WxCpXmlOutNewsMessageTest { + " " + " " + " " + + " 2" + ""; System.out.println(m.toXml()); Assert.assertEquals(m.toXml().replaceAll("\\s", ""), expected.replaceAll("\\s", "")); @@ -62,7 +63,6 @@ public class WxCpXmlOutNewsMessageTest { + "" + "1122" + "" - + " 2" + " " + " " + " <![CDATA[title]]>" @@ -77,6 +77,7 @@ public class WxCpXmlOutNewsMessageTest { + " " + " " + " " + + " 2" + ""; System.out.println(m.toXml()); Assert.assertEquals( From 87f023e6807a91a75464f6061e107b69abd03617 Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Fri, 14 Oct 2016 13:47:19 +0800 Subject: [PATCH 29/83] =?UTF-8?q?CP=E9=83=A8=E5=88=86bean=E5=AE=9E?= =?UTF-8?q?=E7=8E=B0=E5=BA=8F=E5=88=97=E5=8F=B7=E6=8E=A5=E5=8F=A3=EF=BC=8C?= =?UTF-8?q?=E5=B9=B6=E6=B7=BB=E5=8A=A0serialVersionUID=20to=20fix=20#66?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../me/chanjar/weixin/cp/bean/WxCpDepart.java | 7 ++---- .../chanjar/weixin/cp/bean/WxCpMessage.java | 14 +++++++----- .../me/chanjar/weixin/cp/bean/WxCpTag.java | 7 ++---- .../me/chanjar/weixin/cp/bean/WxCpUser.java | 7 ++---- .../weixin/cp/bean/WxCpXmlMessage.java | 22 +++++++++---------- .../cp/bean/WxCpXmlOutImageMessage.java | 2 ++ .../weixin/cp/bean/WxCpXmlOutMessage.java | 6 ++++- .../weixin/cp/bean/WxCpXmlOutNewsMessage.java | 8 ++++--- .../weixin/cp/bean/WxCpXmlOutTextMessage.java | 2 ++ .../cp/bean/WxCpXmlOutVideoMessage.java | 2 ++ .../cp/bean/WxCpXmlOutVoiceMessage.java | 2 ++ 11 files changed, 42 insertions(+), 37 deletions(-) diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpDepart.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpDepart.java index c8735086..a679dffe 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpDepart.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpDepart.java @@ -1,9 +1,9 @@ package me.chanjar.weixin.cp.bean; -import me.chanjar.weixin.cp.util.json.WxCpGsonBuilder; - import java.io.Serializable; +import me.chanjar.weixin.cp.util.json.WxCpGsonBuilder; + /** * 微信部门 * @@ -11,9 +11,6 @@ import java.io.Serializable; */ public class WxCpDepart implements Serializable { - /** - * - */ private static final long serialVersionUID = -5028321625140879571L; private Integer id; private String name; diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpMessage.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpMessage.java index 6dba9091..e2422e3b 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpMessage.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpMessage.java @@ -1,12 +1,17 @@ package me.chanjar.weixin.cp.bean; -import me.chanjar.weixin.cp.bean.messagebuilder.*; -import me.chanjar.weixin.cp.util.json.WxCpGsonBuilder; - import java.io.Serializable; import java.util.ArrayList; import java.util.List; +import me.chanjar.weixin.cp.bean.messagebuilder.FileBuilder; +import me.chanjar.weixin.cp.bean.messagebuilder.ImageBuilder; +import me.chanjar.weixin.cp.bean.messagebuilder.NewsBuilder; +import me.chanjar.weixin.cp.bean.messagebuilder.TextBuilder; +import me.chanjar.weixin.cp.bean.messagebuilder.VideoBuilder; +import me.chanjar.weixin.cp.bean.messagebuilder.VoiceBuilder; +import me.chanjar.weixin.cp.util.json.WxCpGsonBuilder; + /** * 消息 * @@ -14,9 +19,6 @@ import java.util.List; */ public class WxCpMessage implements Serializable { - /** - * - */ private static final long serialVersionUID = -2082278303476631708L; private String toUser; private String toParty; diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpTag.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpTag.java index ca11cb1f..4e1c034f 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpTag.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpTag.java @@ -1,17 +1,14 @@ package me.chanjar.weixin.cp.bean; -import me.chanjar.weixin.cp.util.json.WxCpGsonBuilder; - import java.io.Serializable; +import me.chanjar.weixin.cp.util.json.WxCpGsonBuilder; + /** * Created by Daniel Qian */ public class WxCpTag implements Serializable { - /** - * - */ private static final long serialVersionUID = -7243320279646928402L; private String id; diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpUser.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpUser.java index d1737d5d..93c3e5fe 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpUser.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpUser.java @@ -1,11 +1,11 @@ package me.chanjar.weixin.cp.bean; -import me.chanjar.weixin.cp.util.json.WxCpGsonBuilder; - import java.io.Serializable; import java.util.ArrayList; import java.util.List; +import me.chanjar.weixin.cp.util.json.WxCpGsonBuilder; + /** * 微信用户信息 * @@ -13,9 +13,6 @@ import java.util.List; */ public class WxCpUser implements Serializable { - /** - * - */ private static final long serialVersionUID = -5696099236344075582L; private final List extAttrs = new ArrayList<>(); private String userId; diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpXmlMessage.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpXmlMessage.java index 352fa2e6..93ca45c3 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpXmlMessage.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpXmlMessage.java @@ -1,18 +1,20 @@ package me.chanjar.weixin.cp.bean; +import java.io.IOException; +import java.io.InputStream; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + +import org.apache.commons.io.IOUtils; + import com.thoughtworks.xstream.annotations.XStreamAlias; import com.thoughtworks.xstream.annotations.XStreamConverter; + import me.chanjar.weixin.common.util.xml.XStreamCDataConverter; import me.chanjar.weixin.cp.api.WxCpConfigStorage; import me.chanjar.weixin.cp.util.crypto.WxCpCryptUtil; import me.chanjar.weixin.cp.util.xml.XStreamTransformer; -import org.apache.commons.io.IOUtils; - -import java.io.IOException; -import java.io.InputStream; -import java.io.Serializable; -import java.util.ArrayList; -import java.util.List; /** *
    @@ -27,16 +29,12 @@ import java.util.List;
      */
     @XStreamAlias("xml")
     public class WxCpXmlMessage implements Serializable {
    +  private static final long serialVersionUID = -1042994982179476410L;
     
       ///////////////////////
       // 以下都是微信推送过来的消息的xml的element所对应的属性
       ///////////////////////
     
    -  /**
    -   * 
    -   */
    -  private static final long serialVersionUID = -1042994982179476410L;
    -
       @XStreamAlias("AgentID")
       private Integer agentId;
     
    diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpXmlOutImageMessage.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpXmlOutImageMessage.java
    index 44de8811..35cbe754 100644
    --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpXmlOutImageMessage.java
    +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpXmlOutImageMessage.java
    @@ -2,11 +2,13 @@ package me.chanjar.weixin.cp.bean;
     
     import com.thoughtworks.xstream.annotations.XStreamAlias;
     import com.thoughtworks.xstream.annotations.XStreamConverter;
    +
     import me.chanjar.weixin.common.api.WxConsts;
     import me.chanjar.weixin.common.util.xml.XStreamMediaIdConverter;
     
     @XStreamAlias("xml")
     public class WxCpXmlOutImageMessage extends WxCpXmlOutMessage {
    +  private static final long serialVersionUID = -1099446240667237313L;
     
       @XStreamAlias("Image")
       @XStreamConverter(value = XStreamMediaIdConverter.class)
    diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpXmlOutMessage.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpXmlOutMessage.java
    index 332b5e24..0d90a012 100644
    --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpXmlOutMessage.java
    +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpXmlOutMessage.java
    @@ -8,8 +8,12 @@ import me.chanjar.weixin.cp.bean.outxmlbuilder.*;
     import me.chanjar.weixin.cp.util.crypto.WxCpCryptUtil;
     import me.chanjar.weixin.cp.util.xml.XStreamTransformer;
     
    +import java.io.Serializable;
    +
     @XStreamAlias("xml")
    -public abstract class WxCpXmlOutMessage {
    +public abstract class WxCpXmlOutMessage implements Serializable {
    +
    +  private static final long serialVersionUID = 1418629839964153110L;
     
       @XStreamAlias("ToUserName")
       @XStreamConverter(value = XStreamCDataConverter.class)
    diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpXmlOutNewsMessage.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpXmlOutNewsMessage.java
    index 5906a324..8910f03f 100644
    --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpXmlOutNewsMessage.java
    +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpXmlOutNewsMessage.java
    @@ -1,15 +1,17 @@
     package me.chanjar.weixin.cp.bean;
     
    +import java.util.ArrayList;
    +import java.util.List;
    +
     import com.thoughtworks.xstream.annotations.XStreamAlias;
     import com.thoughtworks.xstream.annotations.XStreamConverter;
    +
     import me.chanjar.weixin.common.api.WxConsts;
     import me.chanjar.weixin.common.util.xml.XStreamCDataConverter;
     
    -import java.util.ArrayList;
    -import java.util.List;
    -
     @XStreamAlias("xml")
     public class WxCpXmlOutNewsMessage extends WxCpXmlOutMessage {
    +  private static final long serialVersionUID = -5796178637883178826L;
     
       @XStreamAlias("Articles")
       protected final List articles = new ArrayList<>();
    diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpXmlOutTextMessage.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpXmlOutTextMessage.java
    index 3c59edf9..532e06c3 100644
    --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpXmlOutTextMessage.java
    +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpXmlOutTextMessage.java
    @@ -2,11 +2,13 @@ package me.chanjar.weixin.cp.bean;
     
     import com.thoughtworks.xstream.annotations.XStreamAlias;
     import com.thoughtworks.xstream.annotations.XStreamConverter;
    +
     import me.chanjar.weixin.common.api.WxConsts;
     import me.chanjar.weixin.common.util.xml.XStreamCDataConverter;
     
     @XStreamAlias("xml")
     public class WxCpXmlOutTextMessage extends WxCpXmlOutMessage {
    +  private static final long serialVersionUID = 2569239617185930232L;
     
       @XStreamAlias("Content")
       @XStreamConverter(value = XStreamCDataConverter.class)
    diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpXmlOutVideoMessage.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpXmlOutVideoMessage.java
    index 6e2f268f..73c56d4c 100644
    --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpXmlOutVideoMessage.java
    +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpXmlOutVideoMessage.java
    @@ -2,11 +2,13 @@ package me.chanjar.weixin.cp.bean;
     
     import com.thoughtworks.xstream.annotations.XStreamAlias;
     import com.thoughtworks.xstream.annotations.XStreamConverter;
    +
     import me.chanjar.weixin.common.api.WxConsts;
     import me.chanjar.weixin.common.util.xml.XStreamCDataConverter;
     
     @XStreamAlias("xml")
     public class WxCpXmlOutVideoMessage extends WxCpXmlOutMessage {
    +  private static final long serialVersionUID = -8672761162722733622L;
     
       @XStreamAlias("Video")
       protected final Video video = new Video();
    diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpXmlOutVoiceMessage.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpXmlOutVoiceMessage.java
    index 1fd6d4ce..bba95cfd 100644
    --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpXmlOutVoiceMessage.java
    +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpXmlOutVoiceMessage.java
    @@ -2,11 +2,13 @@ package me.chanjar.weixin.cp.bean;
     
     import com.thoughtworks.xstream.annotations.XStreamAlias;
     import com.thoughtworks.xstream.annotations.XStreamConverter;
    +
     import me.chanjar.weixin.common.api.WxConsts;
     import me.chanjar.weixin.common.util.xml.XStreamMediaIdConverter;
     
     @XStreamAlias("xml")
     public class WxCpXmlOutVoiceMessage extends WxCpXmlOutMessage {
    +  private static final long serialVersionUID = -7947384031546099340L;
     
       @XStreamAlias("Voice")
       @XStreamConverter(value = XStreamMediaIdConverter.class)
    
    From 6682f5ff28117cda9a69ddfc79905e3459dbb261 Mon Sep 17 00:00:00 2001
    From: Binary Wang 
    Date: Fri, 14 Oct 2016 16:19:13 +0800
    Subject: [PATCH 30/83] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E9=94=99=E8=AF=AF?=
     =?UTF-8?q?=E7=9A=84=E5=8F=82=E6=95=B0=E5=90=8D=E7=A7=B0:=20agendid=20->?=
     =?UTF-8?q?=20agentid?=
    MIME-Version: 1.0
    Content-Type: text/plain; charset=UTF-8
    Content-Transfer-Encoding: 8bit
    
    ---
     .../weixin/cp/api/WxCpServiceImpl.java        | 53 +++++++------------
     1 file changed, 20 insertions(+), 33 deletions(-)
    
    diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpServiceImpl.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpServiceImpl.java
    index e3723a71..da95cab0 100644
    --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpServiceImpl.java
    +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpServiceImpl.java
    @@ -1,28 +1,7 @@
     package me.chanjar.weixin.cp.api;
     
    -import java.io.File;
    -import java.io.IOException;
    -import java.io.InputStream;
    -import java.util.List;
    -import java.util.UUID;
    -
    -import org.apache.http.HttpHost;
    -import org.apache.http.client.ClientProtocolException;
    -import org.apache.http.client.config.RequestConfig;
    -import org.apache.http.client.methods.CloseableHttpResponse;
    -import org.apache.http.client.methods.HttpGet;
    -import org.apache.http.impl.client.BasicResponseHandler;
    -import org.apache.http.impl.client.CloseableHttpClient;
    -import org.slf4j.Logger;
    -import org.slf4j.LoggerFactory;
    -
    -import com.google.gson.JsonArray;
    -import com.google.gson.JsonElement;
    -import com.google.gson.JsonObject;
    -import com.google.gson.JsonParser;
    -import com.google.gson.JsonPrimitive;
    +import com.google.gson.*;
     import com.google.gson.reflect.TypeToken;
    -
     import me.chanjar.weixin.common.bean.WxAccessToken;
     import me.chanjar.weixin.common.bean.WxJsapiSignature;
     import me.chanjar.weixin.common.bean.menu.WxMenu;
    @@ -36,20 +15,28 @@ import me.chanjar.weixin.common.util.RandomUtils;
     import me.chanjar.weixin.common.util.StringUtils;
     import me.chanjar.weixin.common.util.crypto.SHA1;
     import me.chanjar.weixin.common.util.fs.FileUtils;
    -import me.chanjar.weixin.common.util.http.ApacheHttpClientBuilder;
    -import me.chanjar.weixin.common.util.http.DefaultApacheHttpClientBuilder;
    -import me.chanjar.weixin.common.util.http.MediaDownloadRequestExecutor;
    -import me.chanjar.weixin.common.util.http.MediaUploadRequestExecutor;
    -import me.chanjar.weixin.common.util.http.RequestExecutor;
    -import me.chanjar.weixin.common.util.http.SimpleGetRequestExecutor;
    -import me.chanjar.weixin.common.util.http.SimplePostRequestExecutor;
    -import me.chanjar.weixin.common.util.http.URIUtil;
    +import me.chanjar.weixin.common.util.http.*;
     import me.chanjar.weixin.common.util.json.GsonHelper;
     import me.chanjar.weixin.cp.bean.WxCpDepart;
     import me.chanjar.weixin.cp.bean.WxCpMessage;
     import me.chanjar.weixin.cp.bean.WxCpTag;
     import me.chanjar.weixin.cp.bean.WxCpUser;
     import me.chanjar.weixin.cp.util.json.WxCpGsonBuilder;
    +import org.apache.http.HttpHost;
    +import org.apache.http.client.ClientProtocolException;
    +import org.apache.http.client.config.RequestConfig;
    +import org.apache.http.client.methods.CloseableHttpResponse;
    +import org.apache.http.client.methods.HttpGet;
    +import org.apache.http.impl.client.BasicResponseHandler;
    +import org.apache.http.impl.client.CloseableHttpClient;
    +import org.slf4j.Logger;
    +import org.slf4j.LoggerFactory;
    +
    +import java.io.File;
    +import java.io.IOException;
    +import java.io.InputStream;
    +import java.util.List;
    +import java.util.UUID;
     
     public class WxCpServiceImpl implements WxCpService {
     
    @@ -185,10 +172,10 @@ public class WxCpServiceImpl implements WxCpService {
         jsapiSignature.setNoncestr(noncestr);
         jsapiSignature.setUrl(url);
         jsapiSignature.setSignature(signature);
    -    
    +
         // Fixed bug
         jsapiSignature.setAppid(this.configStorage.getCorpId());
    -    
    +
         return jsapiSignature;
       }
     
    @@ -503,7 +490,7 @@ this.configStorage.getOauth2redirectUri(),
       public String[] oauth2getUserInfo(String agentId, String code) throws WxErrorException {
         String url = "https://qyapi.weixin.qq.com/cgi-bin/user/getuserinfo?"
                 + "code=" + code
    -            + "&agendid=" + agentId;
    +            + "&agentid=" + agentId;
         String responseText = get(url, null);
         JsonElement je = new JsonParser().parse(responseText);
         JsonObject jo = je.getAsJsonObject();
    
    From 77db3c2dae5756930ce00772e26f112a26497fba Mon Sep 17 00:00:00 2001
    From: Binary Wang 
    Date: Fri, 14 Oct 2016 19:33:34 +0800
    Subject: [PATCH 31/83] =?UTF-8?q?=E5=B0=86=E6=A8=A1=E6=9D=BF=E6=B6=88?=
     =?UTF-8?q?=E6=81=AF=E7=9B=B8=E5=85=B3=E6=8E=A5=E5=8F=A3=E4=BB=A3=E7=A0=81?=
     =?UTF-8?q?=E7=A7=BB=E5=88=B0=E5=8D=95=E7=8B=AC=E7=9A=84service=EF=BC=8C?=
     =?UTF-8?q?=E5=B9=B6=E4=BD=9C=E7=9B=B8=E5=BA=94=E9=87=8D=E6=9E=84=E8=B0=83?=
     =?UTF-8?q?=E6=95=B4=EF=BC=8C=E5=A2=9E=E5=8A=A0=E5=8D=95=E5=85=83=E6=B5=8B?=
     =?UTF-8?q?=E8=AF=95=20for=20issue=20#63?=
    MIME-Version: 1.0
    Content-Type: text/plain; charset=UTF-8
    Content-Transfer-Encoding: 8bit
    
    ---
     .../me/chanjar/weixin/mp/api/WxMpService.java | 53 ++--------
     .../weixin/mp/api/WxMpTemplateMsgService.java | 49 ++++++++++
     .../weixin/mp/api/impl/WxMpServiceImpl.java   | 36 ++-----
     .../api/impl/WxMpTemplateMsgServiceImpl.java  | 58 +++++++++++
     .../me/chanjar/weixin/mp/bean/Industry.java   | 38 -------
     .../chanjar/weixin/mp/bean/WxMpIndustry.java  | 98 ++++++++++++++++---
     .../mp/util/json/WxMpIndustryGsonAdapter.java | 18 +---
     .../mp/api/impl/WxMpServiceImplTest.java      | 28 +-----
     .../impl/WxMpTemplateMsgServiceImplTest.java  | 59 +++++++++++
     9 files changed, 273 insertions(+), 164 deletions(-)
     create mode 100644 weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpTemplateMsgService.java
     create mode 100644 weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpTemplateMsgServiceImpl.java
     delete mode 100644 weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/Industry.java
     create mode 100644 weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpTemplateMsgServiceImplTest.java
    
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpService.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpService.java
    index 292c5645..e77b60d9 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpService.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpService.java
    @@ -3,19 +3,8 @@ package me.chanjar.weixin.mp.api;
     import me.chanjar.weixin.common.bean.WxJsapiSignature;
     import me.chanjar.weixin.common.exception.WxErrorException;
     import me.chanjar.weixin.common.util.http.RequestExecutor;
    -import me.chanjar.weixin.mp.bean.WxMpIndustry;
    -import me.chanjar.weixin.mp.bean.WxMpMassTagMessage;
    -import me.chanjar.weixin.mp.bean.WxMpMassNews;
    -import me.chanjar.weixin.mp.bean.WxMpMassOpenIdsMessage;
    -import me.chanjar.weixin.mp.bean.WxMpMassPreviewMessage;
    -import me.chanjar.weixin.mp.bean.WxMpMassVideo;
    -import me.chanjar.weixin.mp.bean.WxMpSemanticQuery;
    -import me.chanjar.weixin.mp.bean.WxMpTemplateMessage;
    -import me.chanjar.weixin.mp.bean.result.WxMpMassSendResult;
    -import me.chanjar.weixin.mp.bean.result.WxMpMassUploadResult;
    -import me.chanjar.weixin.mp.bean.result.WxMpOAuth2AccessToken;
    -import me.chanjar.weixin.mp.bean.result.WxMpSemanticQueryResult;
    -import me.chanjar.weixin.mp.bean.result.WxMpUser;
    +import me.chanjar.weixin.mp.bean.*;
    +import me.chanjar.weixin.mp.bean.result.*;
     
     /**
      * 微信API的Service
    @@ -133,16 +122,6 @@ public interface WxMpService {
        */
       String shortUrl(String long_url) throws WxErrorException;
     
    -  /**
    -   * 
    -   * 发送模板消息
    -   * 详情请见: http://mp.weixin.qq.com/wiki/index.php?title=模板消息接口
    -   * 
    - * - * @return msgid - */ - String templateSend(WxMpTemplateMessage templateMessage) throws WxErrorException; - /** *
        * 语义查询接口
    @@ -266,27 +245,6 @@ public interface WxMpService {
        */
       WxMpMassSendResult massMessagePreview(WxMpMassPreviewMessage wxMpMassPreviewMessage) throws Exception;
     
    -  /**
    -   * 
    -   * 设置所属行业
    -   * 官方文档中暂未告知响应内容
    -   * 详情请见:http://mp.weixin.qq.com/wiki/5/6dde9eaa909f83354e0094dc3ad99e05.html#.E8.AE.BE.E7.BD.AE.E6.89.80.E5.B1.9E.E8.A1.8C.E4.B8.9A
    -   * 
    - * - * @return JsonObject - */ - String setIndustry(WxMpIndustry wxMpIndustry) throws WxErrorException; - - /*** - *
    -   * 获取设置的行业信息
    -   * 详情请见:http://mp.weixin.qq.com/wiki/5/6dde9eaa909f83354e0094dc3ad99e05.html#.E8.AE.BE.E7.BD.AE.E6.89.80.E5.B1.9E.E8.A1.8C.E4.B8.9A
    -   * 
    - * - * @return wxMpIndustry - */ - WxMpIndustry getIndustry() throws WxErrorException; - /** * 获取WxMpConfigStorage 对象 * @@ -370,4 +328,11 @@ public interface WxMpService { * @return WxMpStoreService */ WxMpStoreService getStoreService(); + + /** + * 返回模板消息相关接口方法的实现类对象,以方便调用其各种接口 + * + * @return WxMpTemplateMsgService + */ + WxMpTemplateMsgService getTemplateMsgService(); } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpTemplateMsgService.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpTemplateMsgService.java new file mode 100644 index 00000000..d468a89e --- /dev/null +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpTemplateMsgService.java @@ -0,0 +1,49 @@ +package me.chanjar.weixin.mp.api; + +import me.chanjar.weixin.common.exception.WxErrorException; +import me.chanjar.weixin.mp.bean.WxMpIndustry; +import me.chanjar.weixin.mp.bean.WxMpTemplateMessage; + +/** + *
    + * 模板消息接口
    + * http://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1433751277&token=&lang=zh_CN
    + * Created by Binary Wang on 2016-10-14.
    + * @author miller.lin
    + * @author binarywang(Binary Wang)
    + * 
    + */ +public interface WxMpTemplateMsgService { + + /** + *
    +   * 设置所属行业
    +   * 官方文档中暂未告知响应内容
    +   * 详情请见:http://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1433751277&token=&lang=zh_CN
    +   * 
    + * + * @return 是否成功 + */ + boolean setIndustry(WxMpIndustry wxMpIndustry) throws WxErrorException; + + /*** + *
    +   * 获取设置的行业信息
    +   * 详情请见:http://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1433751277&token=&lang=zh_CN
    +   * 
    + * + * @return wxMpIndustry + */ + WxMpIndustry getIndustry() throws WxErrorException; + + /** + *
    +   * 发送模板消息
    +   * 详情请见: http://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1433751277&token=&lang=zh_CN
    +   * 
    + * + * @return 消息Id + */ + String sendTemplateMsg(WxMpTemplateMessage templateMessage) throws WxErrorException; + +} diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpServiceImpl.java index db8cfffa..7b5171f5 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpServiceImpl.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpServiceImpl.java @@ -69,6 +69,8 @@ public class WxMpServiceImpl implements WxMpService { private WxMpUserBlacklistService blackListService = new WxMpUserBlacklistServiceImpl(this); + private WxMpTemplateMsgService templateMsgService = new WxMpTemplateMsgServiceImpl(this); + private CloseableHttpClient httpClient; private HttpHost httpProxy; @@ -221,35 +223,6 @@ public class WxMpServiceImpl implements WxMpService { return tmpJsonElement.getAsJsonObject().get("short_url").getAsString(); } - @Override - public String templateSend(WxMpTemplateMessage templateMessage) throws WxErrorException { - String url = "https://api.weixin.qq.com/cgi-bin/message/template/send"; - String responseContent = this.post(url, templateMessage.toJson()); - final JsonObject jsonObject = JSON_PARSER.parse(responseContent).getAsJsonObject(); - if (jsonObject.get("errcode").getAsInt() == 0){ - return jsonObject.get("msgid").getAsString(); - } - - throw new WxErrorException(WxError.fromJson(responseContent)); - } - - @Override - public String setIndustry(WxMpIndustry wxMpIndustry) throws WxErrorException { - if (null == wxMpIndustry.getPrimaryIndustry() || null == wxMpIndustry.getPrimaryIndustry().getId() - || null == wxMpIndustry.getSecondIndustry() || null == wxMpIndustry.getSecondIndustry().getId()) { - throw new IllegalArgumentException("industry id is empty"); - } - String url = "https://api.weixin.qq.com/cgi-bin/template/api_set_industry"; - return this.post(url, wxMpIndustry.toJson()); - } - - @Override - public WxMpIndustry getIndustry() throws WxErrorException { - String url = "https://api.weixin.qq.com/cgi-bin/template/get_industry"; - String responseContent = this.get(url, null); - return WxMpIndustry.fromJson(responseContent); - } - @Override public WxMpSemanticQueryResult semanticQuery(WxMpSemanticQuery semanticQuery) throws WxErrorException { String url = "https://api.weixin.qq.com/semantic/semproxy/search"; @@ -562,4 +535,9 @@ public class WxMpServiceImpl implements WxMpService { return this.storeService; } + @Override + public WxMpTemplateMsgService getTemplateMsgService() { + return this.templateMsgService; + } + } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpTemplateMsgServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpTemplateMsgServiceImpl.java new file mode 100644 index 00000000..d4f03ec9 --- /dev/null +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpTemplateMsgServiceImpl.java @@ -0,0 +1,58 @@ +package me.chanjar.weixin.mp.api.impl; + +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import me.chanjar.weixin.common.bean.result.WxError; +import me.chanjar.weixin.common.exception.WxErrorException; +import me.chanjar.weixin.mp.api.WxMpService; +import me.chanjar.weixin.mp.api.WxMpTemplateMsgService; +import me.chanjar.weixin.mp.bean.WxMpIndustry; +import me.chanjar.weixin.mp.bean.WxMpTemplateMessage; + +/** + *
    + * Created by Binary Wang on 2016-10-14.
    + * @author binarywang(Binary Wang)
    + * 
    + */ +public class WxMpTemplateMsgServiceImpl implements WxMpTemplateMsgService { + public static final String API_URL_PREFIX = "https://api.weixin.qq.com/cgi-bin/template"; + private static final JsonParser JSON_PARSER = new JsonParser(); + + private WxMpService wxMpService; + + public WxMpTemplateMsgServiceImpl(WxMpService wxMpService) { + this.wxMpService = wxMpService; + } + + @Override + public String sendTemplateMsg(WxMpTemplateMessage templateMessage) throws WxErrorException { + String url = "https://api.weixin.qq.com/cgi-bin/message/template/send"; + String responseContent = this.wxMpService.post(url, templateMessage.toJson()); + final JsonObject jsonObject = JSON_PARSER.parse(responseContent).getAsJsonObject(); + if (jsonObject.get("errcode").getAsInt() == 0) { + return jsonObject.get("msgid").getAsString(); + } + throw new WxErrorException(WxError.fromJson(responseContent)); + } + + @Override + public boolean setIndustry(WxMpIndustry wxMpIndustry) throws WxErrorException { + if (null == wxMpIndustry.getPrimaryIndustry() || null == wxMpIndustry.getPrimaryIndustry().getId() + || null == wxMpIndustry.getSecondIndustry() || null == wxMpIndustry.getSecondIndustry().getId()) { + throw new IllegalArgumentException("行业Id不能为空,请核实"); + } + + String url = API_URL_PREFIX + "/api_set_industry"; + this.wxMpService.post(url, wxMpIndustry.toJson()); + return true; + } + + @Override + public WxMpIndustry getIndustry() throws WxErrorException { + String url = API_URL_PREFIX + "/get_industry"; + String responseContent = this.wxMpService.get(url, null); + return WxMpIndustry.fromJson(responseContent); + } + +} diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/Industry.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/Industry.java deleted file mode 100644 index da5b5134..00000000 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/Industry.java +++ /dev/null @@ -1,38 +0,0 @@ -package me.chanjar.weixin.mp.bean; - -import java.io.Serializable; - -/** - * @author miller - * 官方文档中,创建和获取的数据结构不一样。所以采用冗余字段的方式,实现相应的接口 - */ -public class Industry implements Serializable { - private static final long serialVersionUID = -1707184885588012142L; - private String id; - private String firstClass; - private String secondClass; - - public String getId() { - return this.id; - } - - public void setId(String id) { - this.id = id; - } - - public String getFirstClass() { - return this.firstClass; - } - - public void setFirstClass(String firstClass) { - this.firstClass = firstClass; - } - - public String getSecondClass() { - return this.secondClass; - } - - public void setSecondClass(String secondClass) { - this.secondClass = secondClass; - } -} diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpIndustry.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpIndustry.java index 281b9315..b94fe10b 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpIndustry.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpIndustry.java @@ -2,6 +2,8 @@ package me.chanjar.weixin.mp.bean; import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; import java.io.Serializable; @@ -9,31 +11,97 @@ import java.io.Serializable; * @author miller */ public class WxMpIndustry implements Serializable { - private static final long serialVersionUID = -7700398224795914722L; - private Industry primaryIndustry; - private Industry secondIndustry; + private static final long serialVersionUID = -7700398224795914722L; + private Industry primaryIndustry; + private Industry secondIndustry; - public static WxMpIndustry fromJson(String json) { - return WxMpGsonBuilder.create().fromJson(json, WxMpIndustry.class); + public WxMpIndustry() { + } + + public WxMpIndustry(Industry primaryIndustry, Industry secondIndustry) { + this.primaryIndustry = primaryIndustry; + this.secondIndustry = secondIndustry; + } + + /** + * @author miller + * 官方文档中,创建和获取的数据结构不一样。所以采用冗余字段的方式,实现相应的接口 + */ + public static class Industry implements Serializable { + private static final long serialVersionUID = -1707184885588012142L; + private String id; + private String firstClass; + private String secondClass; + + public Industry() { + } + + public Industry(String id) { + this.id = id; + } + + public Industry(String id, String firstClass, String secondClass) { + this.id = id; + this.firstClass = firstClass; + this.secondClass = secondClass; + } + + @Override + public String toString() { + return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE); } - public String toJson() { - return WxMpGsonBuilder.create().toJson(this); + public String getId() { + return this.id; } - public Industry getPrimaryIndustry() { - return this.primaryIndustry; + public void setId(String id) { + this.id = id; } - public void setPrimaryIndustry(Industry primaryIndustry) { - this.primaryIndustry = primaryIndustry; + public String getFirstClass() { + return this.firstClass; } - public Industry getSecondIndustry() { - return this.secondIndustry; + public void setFirstClass(String firstClass) { + this.firstClass = firstClass; } - public void setSecondIndustry(Industry secondIndustry) { - this.secondIndustry = secondIndustry; + public String getSecondClass() { + return this.secondClass; } + + public void setSecondClass(String secondClass) { + this.secondClass = secondClass; + } + } + + @Override + public String toString() { + return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE); + } + + public static WxMpIndustry fromJson(String json) { + return WxMpGsonBuilder.create().fromJson(json, WxMpIndustry.class); + } + + public String toJson() { + return WxMpGsonBuilder.create().toJson(this); + } + + public Industry getPrimaryIndustry() { + return this.primaryIndustry; + } + + public void setPrimaryIndustry(Industry primaryIndustry) { + this.primaryIndustry = primaryIndustry; + } + + public Industry getSecondIndustry() { + return this.secondIndustry; + } + + public void setSecondIndustry(Industry secondIndustry) { + this.secondIndustry = secondIndustry; + } } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpIndustryGsonAdapter.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpIndustryGsonAdapter.java index 60361249..ea715a70 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpIndustryGsonAdapter.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpIndustryGsonAdapter.java @@ -1,19 +1,11 @@ package me.chanjar.weixin.mp.util.json; -import java.lang.reflect.Type; - -import com.google.gson.JsonDeserializationContext; -import com.google.gson.JsonDeserializer; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import com.google.gson.JsonParseException; -import com.google.gson.JsonSerializationContext; -import com.google.gson.JsonSerializer; - +import com.google.gson.*; import me.chanjar.weixin.common.util.json.GsonHelper; -import me.chanjar.weixin.mp.bean.Industry; import me.chanjar.weixin.mp.bean.WxMpIndustry; +import java.lang.reflect.Type; + /** * @author miller */ @@ -42,8 +34,8 @@ public class WxMpIndustryGsonAdapter return wxMpIndustry; } - private static Industry convertFromJson(JsonObject json) { - Industry industry = new Industry(); + private static WxMpIndustry.Industry convertFromJson(JsonObject json) { + WxMpIndustry.Industry industry = new WxMpIndustry.Industry(); industry.setFirstClass(GsonHelper.getString(json, "first_class")); industry.setSecondClass(GsonHelper.getString(json, "second_class")); return industry; diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpServiceImplTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpServiceImplTest.java index c108d575..49316948 100644 --- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpServiceImplTest.java +++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpServiceImplTest.java @@ -1,20 +1,12 @@ package me.chanjar.weixin.mp.api.impl; -import java.text.SimpleDateFormat; -import java.util.Date; - -import org.testng.Assert; -import org.testng.annotations.Guice; -import org.testng.annotations.Test; - import com.google.inject.Inject; - import me.chanjar.weixin.common.api.WxConsts; -import me.chanjar.weixin.common.exception.WxErrorException; import me.chanjar.weixin.mp.api.ApiTestModule; import me.chanjar.weixin.mp.api.WxXmlMpInMemoryConfigStorage; -import me.chanjar.weixin.mp.bean.WxMpTemplateData; -import me.chanjar.weixin.mp.bean.WxMpTemplateMessage; +import org.testng.Assert; +import org.testng.annotations.Guice; +import org.testng.annotations.Test; @Test @Guice(modules = ApiTestModule.class) @@ -88,20 +80,6 @@ public class WxMpServiceImplTest { Assert.fail("Not yet implemented"); } - @Test(invocationCount = 100, threadPoolSize = 30) - public void testTemplateSend() throws WxErrorException { - SimpleDateFormat dateFormat = new SimpleDateFormat( - "yyyy-MM-dd HH:mm:ss.SSS"); - WxXmlMpInMemoryConfigStorage configStorage = (WxXmlMpInMemoryConfigStorage) this.wxService - .getWxMpConfigStorage(); - WxMpTemplateMessage templateMessage = WxMpTemplateMessage.builder() - .toUser(configStorage.getOpenid()) - .templateId(configStorage.getTemplateId()).build(); - templateMessage.addWxMpTemplateData( - new WxMpTemplateData("first", dateFormat.format(new Date()))); - this.wxService.templateSend(templateMessage); - } - @Test public void testSetIndustry() { Assert.fail("Not yet implemented"); diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpTemplateMsgServiceImplTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpTemplateMsgServiceImplTest.java new file mode 100644 index 00000000..5fb8061e --- /dev/null +++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpTemplateMsgServiceImplTest.java @@ -0,0 +1,59 @@ +package me.chanjar.weixin.mp.api.impl; + +import com.google.inject.Inject; +import me.chanjar.weixin.common.exception.WxErrorException; +import me.chanjar.weixin.mp.api.ApiTestModule; +import me.chanjar.weixin.mp.api.WxXmlMpInMemoryConfigStorage; +import me.chanjar.weixin.mp.bean.WxMpIndustry; +import me.chanjar.weixin.mp.bean.WxMpTemplateData; +import me.chanjar.weixin.mp.bean.WxMpTemplateMessage; +import org.testng.Assert; +import org.testng.annotations.Guice; +import org.testng.annotations.Test; + +import java.text.SimpleDateFormat; +import java.util.Date; + +/** + *
    + * Created by Binary Wang on 2016-10-14.
    + * @author binarywang(Binary Wang)
    + * 
    + */ +@Guice(modules = ApiTestModule.class) +public class WxMpTemplateMsgServiceImplTest { + @Inject + protected WxMpServiceImpl wxService; + + @Test(invocationCount = 10, threadPoolSize = 10) + public void testSendTemplateMsg() throws WxErrorException { + SimpleDateFormat dateFormat = new SimpleDateFormat( + "yyyy-MM-dd HH:mm:ss.SSS"); + WxXmlMpInMemoryConfigStorage configStorage = (WxXmlMpInMemoryConfigStorage) this.wxService + .getWxMpConfigStorage(); + WxMpTemplateMessage templateMessage = WxMpTemplateMessage.builder() + .toUser(configStorage.getOpenid()) + .templateId(configStorage.getTemplateId()).build(); + templateMessage.addWxMpTemplateData( + new WxMpTemplateData("first", dateFormat.format(new Date()))); + String msgId = this.wxService.getTemplateMsgService().sendTemplateMsg(templateMessage); + Assert.assertNotNull(msgId); + System.out.println(msgId); + } + + @Test + public void testGetIndustry() throws Exception { + final WxMpIndustry industry = this.wxService.getTemplateMsgService().getIndustry(); + Assert.assertNotNull(industry); + System.out.println(industry); + } + + @Test + public void testSetIndustry() throws Exception { + WxMpIndustry industry = new WxMpIndustry(new WxMpIndustry.Industry("1"), + new WxMpIndustry.Industry("04")); + boolean result = this.wxService.getTemplateMsgService().setIndustry(industry); + Assert.assertTrue(result); + } + +} From d7298ab790a3b36d4b8f39e93680a4cdd521a8a3 Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Mon, 17 Oct 2016 23:43:31 +0800 Subject: [PATCH 32/83] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E8=8E=B7=E5=BE=97?= =?UTF-8?q?=E6=A8=A1=E6=9D=BFID=E7=9A=84=E6=8E=A5=E5=8F=A3=E6=96=B9?= =?UTF-8?q?=E6=B3=95=E5=AE=9E=E7=8E=B0=20for=20issue=20#63?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../weixin/mp/api/WxMpTemplateMsgService.java | 11 ++++++++++ .../api/impl/WxMpTemplateMsgServiceImpl.java | 15 +++++++++++++ .../impl/WxMpTemplateMsgServiceImplTest.java | 21 +++++++++++++------ 3 files changed, 41 insertions(+), 6 deletions(-) diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpTemplateMsgService.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpTemplateMsgService.java index d468a89e..9f696597 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpTemplateMsgService.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpTemplateMsgService.java @@ -46,4 +46,15 @@ public interface WxMpTemplateMsgService { */ String sendTemplateMsg(WxMpTemplateMessage templateMessage) throws WxErrorException; + /** + *
    +   * 获得模板ID
    +   * 从行业模板库选择模板到帐号后台,获得模板ID的过程可在MP中完成
    +   * 详情请见: http://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1433751277&token=&lang=zh_CN
    +   * 接口地址格式:https://api.weixin.qq.com/cgi-bin/template/api_add_template?access_token=ACCESS_TOKEN
    +   * 
    + *@param shortTemplateId 模板库中模板的编号,有“TM**”和“OPENTMTM**”等形式 + * @return templateId 模板Id + */ + String addTemplate(String shortTemplateId) throws WxErrorException; } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpTemplateMsgServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpTemplateMsgServiceImpl.java index d4f03ec9..a404cb02 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpTemplateMsgServiceImpl.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpTemplateMsgServiceImpl.java @@ -2,6 +2,7 @@ package me.chanjar.weixin.mp.api.impl; import com.google.gson.JsonObject; import com.google.gson.JsonParser; + import me.chanjar.weixin.common.bean.result.WxError; import me.chanjar.weixin.common.exception.WxErrorException; import me.chanjar.weixin.mp.api.WxMpService; @@ -55,4 +56,18 @@ public class WxMpTemplateMsgServiceImpl implements WxMpTemplateMsgService { return WxMpIndustry.fromJson(responseContent); } + @Override + public String addTemplate(String shortTemplateId) throws WxErrorException { + String url = API_URL_PREFIX + "/api_add_template"; + JsonObject jsonObject = new JsonObject(); + jsonObject.addProperty("template_id_short", shortTemplateId); + String responseContent = this.wxMpService.post(url, jsonObject.toString()); + final JsonObject result = JSON_PARSER.parse(responseContent).getAsJsonObject(); + if (result.get("errcode").getAsInt() == 0) { + return result.get("template_id").getAsString(); + } + + throw new WxErrorException(WxError.fromJson(responseContent)); + } + } diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpTemplateMsgServiceImplTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpTemplateMsgServiceImplTest.java index 5fb8061e..b967719f 100644 --- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpTemplateMsgServiceImplTest.java +++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpTemplateMsgServiceImplTest.java @@ -1,18 +1,20 @@ package me.chanjar.weixin.mp.api.impl; +import java.text.SimpleDateFormat; +import java.util.Date; + +import org.testng.Assert; +import org.testng.annotations.Guice; +import org.testng.annotations.Test; + import com.google.inject.Inject; + import me.chanjar.weixin.common.exception.WxErrorException; import me.chanjar.weixin.mp.api.ApiTestModule; import me.chanjar.weixin.mp.api.WxXmlMpInMemoryConfigStorage; import me.chanjar.weixin.mp.bean.WxMpIndustry; import me.chanjar.weixin.mp.bean.WxMpTemplateData; import me.chanjar.weixin.mp.bean.WxMpTemplateMessage; -import org.testng.Assert; -import org.testng.annotations.Guice; -import org.testng.annotations.Test; - -import java.text.SimpleDateFormat; -import java.util.Date; /** *
    @@ -56,4 +58,11 @@ public class WxMpTemplateMsgServiceImplTest {
         Assert.assertTrue(result);
       }
     
    +  @Test
    +  public void testAddTemplate() throws Exception {
    +    String result = this.wxService.getTemplateMsgService().addTemplate("TM00015");
    +    Assert.assertNotNull(result);
    +    System.err.println(result);
    +  }
    +
     }
    
    From 6dc0481d1d0bfbc711470bfd3dec1db3318336a9 Mon Sep 17 00:00:00 2001
    From: Binary Wang 
    Date: Tue, 18 Oct 2016 00:07:14 +0800
    Subject: [PATCH 33/83] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E8=8E=B7=E5=BE=97?=
     =?UTF-8?q?=E6=A8=A1=E6=9D=BF=E5=88=97=E8=A1=A8=E7=9A=84=E6=8E=A5=E5=8F=A3?=
     =?UTF-8?q?=E6=96=B9=E6=B3=95=EF=BC=8C=E5=B9=B6=E9=87=8D=E6=9E=84=E6=A8=A1?=
     =?UTF-8?q?=E6=9D=BF=E6=B6=88=E6=81=AF=E7=9B=B8=E5=85=B3=E7=B1=BB=E5=8C=85?=
     =?UTF-8?q?=E7=BB=93=E6=9E=84=20for=20issue=20#63?=
    MIME-Version: 1.0
    Content-Type: text/plain; charset=UTF-8
    Content-Transfer-Encoding: 8bit
    
    ---
     .../weixin/mp/api/WxMpTemplateMsgService.java |  25 +++-
     .../api/impl/WxMpTemplateMsgServiceImpl.java  |  19 ++-
     .../weixin/mp/bean/template/WxMpTemplate.java | 126 ++++++++++++++++++
     .../bean/{ => template}/WxMpTemplateData.java |   2 +-
     .../WxMpTemplateIndustry.java}                |  12 +-
     .../{ => template}/WxMpTemplateMessage.java   |   2 +-
     .../weixin/mp/util/json/WxMpGsonBuilder.java  |   6 +-
     .../mp/util/json/WxMpIndustryGsonAdapter.java |  14 +-
     .../json/WxMpTemplateMessageGsonAdapter.java  |   5 +-
     .../impl/WxMpTemplateMsgServiceImplTest.java  |  21 ++-
     10 files changed, 196 insertions(+), 36 deletions(-)
     create mode 100644 weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/template/WxMpTemplate.java
     rename weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/{ => template}/WxMpTemplateData.java (95%)
     rename weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/{WxMpIndustry.java => template/WxMpTemplateIndustry.java} (86%)
     rename weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/{ => template}/WxMpTemplateMessage.java (98%)
    
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpTemplateMsgService.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpTemplateMsgService.java
    index 9f696597..4788bf3e 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpTemplateMsgService.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpTemplateMsgService.java
    @@ -1,8 +1,11 @@
     package me.chanjar.weixin.mp.api;
     
    +import java.util.List;
    +
     import me.chanjar.weixin.common.exception.WxErrorException;
    -import me.chanjar.weixin.mp.bean.WxMpIndustry;
    -import me.chanjar.weixin.mp.bean.WxMpTemplateMessage;
    +import me.chanjar.weixin.mp.bean.template.WxMpTemplate;
    +import me.chanjar.weixin.mp.bean.template.WxMpTemplateIndustry;
    +import me.chanjar.weixin.mp.bean.template.WxMpTemplateMessage;
     
     /**
      * 
    @@ -24,7 +27,7 @@ public interface WxMpTemplateMsgService {
        *
        * @return 是否成功
        */
    -  boolean setIndustry(WxMpIndustry wxMpIndustry) throws WxErrorException;
    +  boolean setIndustry(WxMpTemplateIndustry wxMpIndustry) throws WxErrorException;
     
       /***
        * 
    @@ -34,7 +37,7 @@ public interface WxMpTemplateMsgService {
        *
        * @return wxMpIndustry
        */
    -  WxMpIndustry getIndustry() throws WxErrorException;
    +  WxMpTemplateIndustry getIndustry() throws WxErrorException;
     
       /**
        * 
    @@ -53,8 +56,20 @@ public interface WxMpTemplateMsgService {
        * 详情请见: http://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1433751277&token=&lang=zh_CN
        * 接口地址格式:https://api.weixin.qq.com/cgi-bin/template/api_add_template?access_token=ACCESS_TOKEN
        * 
    - *@param shortTemplateId 模板库中模板的编号,有“TM**”和“OPENTMTM**”等形式 + * @param shortTemplateId 模板库中模板的编号,有“TM**”和“OPENTMTM**”等形式 * @return templateId 模板Id */ String addTemplate(String shortTemplateId) throws WxErrorException; + + /** + *
    +   * 获取模板列表
    +   * 获取已添加至帐号下所有模板列表,可在MP中查看模板列表信息,为方便第三方开发者,提供通过接口调用的方式来获取帐号下所有模板信息
    +   * 详情请见: http://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1433751277&token=&lang=zh_CN
    +   * 接口地址格式:https://api.weixin.qq.com/cgi-bin/template/get_all_private_template?access_token=ACCESS_TOKEN
    +   * 
    + * + * @return templateId 模板Id + */ + List getAllPrivateTemplate() throws WxErrorException; } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpTemplateMsgServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpTemplateMsgServiceImpl.java index a404cb02..e4ee2a1b 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpTemplateMsgServiceImpl.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpTemplateMsgServiceImpl.java @@ -1,5 +1,7 @@ package me.chanjar.weixin.mp.api.impl; +import java.util.List; + import com.google.gson.JsonObject; import com.google.gson.JsonParser; @@ -7,8 +9,9 @@ import me.chanjar.weixin.common.bean.result.WxError; import me.chanjar.weixin.common.exception.WxErrorException; import me.chanjar.weixin.mp.api.WxMpService; import me.chanjar.weixin.mp.api.WxMpTemplateMsgService; -import me.chanjar.weixin.mp.bean.WxMpIndustry; -import me.chanjar.weixin.mp.bean.WxMpTemplateMessage; +import me.chanjar.weixin.mp.bean.template.WxMpTemplate; +import me.chanjar.weixin.mp.bean.template.WxMpTemplateIndustry; +import me.chanjar.weixin.mp.bean.template.WxMpTemplateMessage; /** *
    @@ -38,7 +41,7 @@ public class WxMpTemplateMsgServiceImpl implements WxMpTemplateMsgService {
       }
     
       @Override
    -  public boolean setIndustry(WxMpIndustry wxMpIndustry) throws WxErrorException {
    +  public boolean setIndustry(WxMpTemplateIndustry wxMpIndustry) throws WxErrorException {
         if (null == wxMpIndustry.getPrimaryIndustry() || null == wxMpIndustry.getPrimaryIndustry().getId()
           || null == wxMpIndustry.getSecondIndustry() || null == wxMpIndustry.getSecondIndustry().getId()) {
           throw new IllegalArgumentException("行业Id不能为空,请核实");
    @@ -50,10 +53,10 @@ public class WxMpTemplateMsgServiceImpl implements WxMpTemplateMsgService {
       }
     
       @Override
    -  public WxMpIndustry getIndustry() throws WxErrorException {
    +  public WxMpTemplateIndustry getIndustry() throws WxErrorException {
         String url = API_URL_PREFIX + "/get_industry";
         String responseContent = this.wxMpService.get(url, null);
    -    return WxMpIndustry.fromJson(responseContent);
    +    return WxMpTemplateIndustry.fromJson(responseContent);
       }
     
       @Override
    @@ -70,4 +73,10 @@ public class WxMpTemplateMsgServiceImpl implements WxMpTemplateMsgService {
         throw new WxErrorException(WxError.fromJson(responseContent));
       }
     
    +  @Override
    +  public List getAllPrivateTemplate() throws WxErrorException {
    +    String url = API_URL_PREFIX + "/get_all_private_template";
    +    return WxMpTemplate.fromJson(this.wxMpService.get(url, null));
    +  }
    +
     }
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/template/WxMpTemplate.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/template/WxMpTemplate.java
    new file mode 100644
    index 00000000..ffa2711f
    --- /dev/null
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/template/WxMpTemplate.java
    @@ -0,0 +1,126 @@
    +package me.chanjar.weixin.mp.bean.template;
    +
    +import java.util.List;
    +
    +import org.apache.commons.lang3.builder.ToStringBuilder;
    +import org.apache.commons.lang3.builder.ToStringStyle;
    +
    +import com.google.gson.JsonParser;
    +import com.google.gson.annotations.SerializedName;
    +import com.google.gson.reflect.TypeToken;
    +
    +import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
    +
    +/**
    + * 
    + * 模板列表信息
    + * Created by Binary Wang on 2016-10-17.
    + * @author binarywang(Binary Wang)
    + * 
    + */ +public class WxMpTemplate { + + private static final JsonParser JSON_PARSER = new JsonParser(); + + public static List fromJson(String json) { + return WxMpGsonBuilder.create().fromJson(JSON_PARSER.parse(json).getAsJsonObject().get("template_list"), + new TypeToken>() { + }.getType()); + } + + @Override + public String toString() { + return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE); + } + + /** + * template_id + * 模板ID + */ + @SerializedName("template_id") + private String templateId; + + /** + * title + * 模板标题 + */ + @SerializedName("title") + private String title; + + /** + * primary_industry + * 模板所属行业的一级行业 + */ + @SerializedName("primary_industry") + private String primaryIndustry; + + /** + * deputy_industry + * 模板所属行业的二级行业 + */ + @SerializedName("deputy_industry") + private String deputyIndustry; + + /** + * content + * 模板内容 + */ + @SerializedName("content") + private String content; + + /** + * example + * 模板示例 + */ + @SerializedName("example") + private String example; + + public String getTemplateId() { + return templateId; + } + + public void setTemplateId(String templateId) { + this.templateId = templateId; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getPrimaryIndustry() { + return primaryIndustry; + } + + public void setPrimaryIndustry(String primaryIndustry) { + this.primaryIndustry = primaryIndustry; + } + + public String getDeputyIndustry() { + return deputyIndustry; + } + + public void setDeputyIndustry(String deputyIndustry) { + this.deputyIndustry = deputyIndustry; + } + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } + + public String getExample() { + return example; + } + + public void setExample(String example) { + this.example = example; + } + +} diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpTemplateData.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/template/WxMpTemplateData.java similarity index 95% rename from weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpTemplateData.java rename to weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/template/WxMpTemplateData.java index d46ae24b..0eb0eaa5 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpTemplateData.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/template/WxMpTemplateData.java @@ -1,4 +1,4 @@ -package me.chanjar.weixin.mp.bean; +package me.chanjar.weixin.mp.bean.template; import java.io.Serializable; diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpIndustry.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/template/WxMpTemplateIndustry.java similarity index 86% rename from weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpIndustry.java rename to weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/template/WxMpTemplateIndustry.java index b94fe10b..b0f689a4 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpIndustry.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/template/WxMpTemplateIndustry.java @@ -1,4 +1,4 @@ -package me.chanjar.weixin.mp.bean; +package me.chanjar.weixin.mp.bean.template; import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; @@ -10,15 +10,15 @@ import java.io.Serializable; /** * @author miller */ -public class WxMpIndustry implements Serializable { +public class WxMpTemplateIndustry implements Serializable { private static final long serialVersionUID = -7700398224795914722L; private Industry primaryIndustry; private Industry secondIndustry; - public WxMpIndustry() { + public WxMpTemplateIndustry() { } - public WxMpIndustry(Industry primaryIndustry, Industry secondIndustry) { + public WxMpTemplateIndustry(Industry primaryIndustry, Industry secondIndustry) { this.primaryIndustry = primaryIndustry; this.secondIndustry = secondIndustry; } @@ -81,8 +81,8 @@ public class WxMpIndustry implements Serializable { return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE); } - public static WxMpIndustry fromJson(String json) { - return WxMpGsonBuilder.create().fromJson(json, WxMpIndustry.class); + public static WxMpTemplateIndustry fromJson(String json) { + return WxMpGsonBuilder.create().fromJson(json, WxMpTemplateIndustry.class); } public String toJson() { diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpTemplateMessage.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/template/WxMpTemplateMessage.java similarity index 98% rename from weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpTemplateMessage.java rename to weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/template/WxMpTemplateMessage.java index 408abb50..106e5fb6 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpTemplateMessage.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/template/WxMpTemplateMessage.java @@ -1,4 +1,4 @@ -package me.chanjar.weixin.mp.bean; +package me.chanjar.weixin.mp.bean.template; import java.io.Serializable; import java.util.ArrayList; diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpGsonBuilder.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpGsonBuilder.java index df63ac64..e2f215e6 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpGsonBuilder.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpGsonBuilder.java @@ -5,7 +5,6 @@ import com.google.gson.GsonBuilder; import me.chanjar.weixin.mp.bean.WxMpCard; import me.chanjar.weixin.mp.bean.WxMpCustomMessage; -import me.chanjar.weixin.mp.bean.WxMpIndustry; import me.chanjar.weixin.mp.bean.WxMpMassNews; import me.chanjar.weixin.mp.bean.WxMpMassOpenIdsMessage; import me.chanjar.weixin.mp.bean.WxMpMassPreviewMessage; @@ -13,7 +12,6 @@ import me.chanjar.weixin.mp.bean.WxMpMassTagMessage; import me.chanjar.weixin.mp.bean.WxMpMassVideo; import me.chanjar.weixin.mp.bean.WxMpMaterialArticleUpdate; import me.chanjar.weixin.mp.bean.WxMpMaterialNews; -import me.chanjar.weixin.mp.bean.WxMpTemplateMessage; import me.chanjar.weixin.mp.bean.datacube.WxDataCubeUserCumulate; import me.chanjar.weixin.mp.bean.datacube.WxDataCubeUserSummary; import me.chanjar.weixin.mp.bean.result.WxMediaImgUploadResult; @@ -31,6 +29,8 @@ import me.chanjar.weixin.mp.bean.result.WxMpSemanticQueryResult; import me.chanjar.weixin.mp.bean.result.WxMpUser; import me.chanjar.weixin.mp.bean.result.WxMpUserBlacklistGetResult; import me.chanjar.weixin.mp.bean.result.WxMpUserList; +import me.chanjar.weixin.mp.bean.template.WxMpTemplateIndustry; +import me.chanjar.weixin.mp.bean.template.WxMpTemplateMessage; public class WxMpGsonBuilder { @@ -68,7 +68,7 @@ public class WxMpGsonBuilder { INSTANCE.registerTypeAdapter(WxMpCard.class, new WxMpCardGsonAdapter()); INSTANCE.registerTypeAdapter(WxMpMassPreviewMessage.class, new WxMpMassPreviewMessageGsonAdapter()); INSTANCE.registerTypeAdapter(WxMediaImgUploadResult.class, new WxMediaImgUploadResultGsonAdapter()); - INSTANCE.registerTypeAdapter(WxMpIndustry.class, new WxMpIndustryGsonAdapter()); + INSTANCE.registerTypeAdapter(WxMpTemplateIndustry.class, new WxMpIndustryGsonAdapter()); INSTANCE.registerTypeAdapter(WxMpUserBlacklistGetResult.class, new WxUserBlacklistGetResultGsonAdapter()); } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpIndustryGsonAdapter.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpIndustryGsonAdapter.java index ea715a70..68106bb6 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpIndustryGsonAdapter.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpIndustryGsonAdapter.java @@ -2,7 +2,7 @@ package me.chanjar.weixin.mp.util.json; import com.google.gson.*; import me.chanjar.weixin.common.util.json.GsonHelper; -import me.chanjar.weixin.mp.bean.WxMpIndustry; +import me.chanjar.weixin.mp.bean.template.WxMpTemplateIndustry; import java.lang.reflect.Type; @@ -10,9 +10,9 @@ import java.lang.reflect.Type; * @author miller */ public class WxMpIndustryGsonAdapter - implements JsonSerializer, JsonDeserializer { + implements JsonSerializer, JsonDeserializer { @Override - public JsonElement serialize(WxMpIndustry wxMpIndustry, Type type, + public JsonElement serialize(WxMpTemplateIndustry wxMpIndustry, Type type, JsonSerializationContext jsonSerializationContext) { JsonObject json = new JsonObject(); json.addProperty("industry_id1", wxMpIndustry.getPrimaryIndustry().getId()); @@ -21,10 +21,10 @@ public class WxMpIndustryGsonAdapter } @Override - public WxMpIndustry deserialize(JsonElement jsonElement, Type type, + public WxMpTemplateIndustry deserialize(JsonElement jsonElement, Type type, JsonDeserializationContext jsonDeserializationContext) throws JsonParseException { - WxMpIndustry wxMpIndustry = new WxMpIndustry(); + WxMpTemplateIndustry wxMpIndustry = new WxMpTemplateIndustry(); JsonObject primaryIndustry = jsonElement.getAsJsonObject() .get("primary_industry").getAsJsonObject(); wxMpIndustry.setPrimaryIndustry(convertFromJson(primaryIndustry)); @@ -34,8 +34,8 @@ public class WxMpIndustryGsonAdapter return wxMpIndustry; } - private static WxMpIndustry.Industry convertFromJson(JsonObject json) { - WxMpIndustry.Industry industry = new WxMpIndustry.Industry(); + private static WxMpTemplateIndustry.Industry convertFromJson(JsonObject json) { + WxMpTemplateIndustry.Industry industry = new WxMpTemplateIndustry.Industry(); industry.setFirstClass(GsonHelper.getString(json, "first_class")); industry.setSecondClass(GsonHelper.getString(json, "second_class")); return industry; diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpTemplateMessageGsonAdapter.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpTemplateMessageGsonAdapter.java index 4c2d1227..4e263020 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpTemplateMessageGsonAdapter.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpTemplateMessageGsonAdapter.java @@ -12,8 +12,9 @@ import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonSerializationContext; import com.google.gson.JsonSerializer; -import me.chanjar.weixin.mp.bean.WxMpTemplateData; -import me.chanjar.weixin.mp.bean.WxMpTemplateMessage; + +import me.chanjar.weixin.mp.bean.template.WxMpTemplateData; +import me.chanjar.weixin.mp.bean.template.WxMpTemplateMessage; import java.lang.reflect.Type; diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpTemplateMsgServiceImplTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpTemplateMsgServiceImplTest.java index b967719f..3c6fd0b4 100644 --- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpTemplateMsgServiceImplTest.java +++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpTemplateMsgServiceImplTest.java @@ -2,6 +2,7 @@ package me.chanjar.weixin.mp.api.impl; import java.text.SimpleDateFormat; import java.util.Date; +import java.util.List; import org.testng.Assert; import org.testng.annotations.Guice; @@ -12,9 +13,10 @@ import com.google.inject.Inject; import me.chanjar.weixin.common.exception.WxErrorException; import me.chanjar.weixin.mp.api.ApiTestModule; import me.chanjar.weixin.mp.api.WxXmlMpInMemoryConfigStorage; -import me.chanjar.weixin.mp.bean.WxMpIndustry; -import me.chanjar.weixin.mp.bean.WxMpTemplateData; -import me.chanjar.weixin.mp.bean.WxMpTemplateMessage; +import me.chanjar.weixin.mp.bean.template.WxMpTemplate; +import me.chanjar.weixin.mp.bean.template.WxMpTemplateData; +import me.chanjar.weixin.mp.bean.template.WxMpTemplateIndustry; +import me.chanjar.weixin.mp.bean.template.WxMpTemplateMessage; /** *
    @@ -45,15 +47,15 @@ public class WxMpTemplateMsgServiceImplTest {
     
       @Test
       public void testGetIndustry() throws Exception {
    -    final WxMpIndustry industry = this.wxService.getTemplateMsgService().getIndustry();
    +    final WxMpTemplateIndustry industry = this.wxService.getTemplateMsgService().getIndustry();
         Assert.assertNotNull(industry);
         System.out.println(industry);
       }
     
       @Test
       public void testSetIndustry() throws Exception {
    -    WxMpIndustry industry = new WxMpIndustry(new WxMpIndustry.Industry("1"),
    -        new WxMpIndustry.Industry("04"));
    +    WxMpTemplateIndustry industry = new WxMpTemplateIndustry(new WxMpTemplateIndustry.Industry("1"),
    +        new WxMpTemplateIndustry.Industry("04"));
         boolean result = this.wxService.getTemplateMsgService().setIndustry(industry);
         Assert.assertTrue(result);
       }
    @@ -65,4 +67,11 @@ public class WxMpTemplateMsgServiceImplTest {
         System.err.println(result);
       }
     
    +  @Test
    +  public void testGetAllPrivateTemplate() throws Exception {
    +    List result = this.wxService.getTemplateMsgService().getAllPrivateTemplate();
    +    Assert.assertNotNull(result);
    +    System.err.println(result);
    +  }
    +
     }
    
    From 550bbe3d1b321b596742fb0c231b53a2d0197d5e Mon Sep 17 00:00:00 2001
    From: Binary Wang 
    Date: Tue, 18 Oct 2016 00:13:53 +0800
    Subject: [PATCH 34/83] update readme
    
    ---
     README.md | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/README.md b/README.md
    index 9be8db94..7c1cee44 100644
    --- a/README.md
    +++ b/README.md
    @@ -5,7 +5,7 @@
     ### 注意:
     1. ***本项目Fork自chanjarster/weixin-java-tools,但由于原项目已停止维护,故单独维护和发布,且发布到maven上的groupId也会不同,详细信息见下文。***
     1. ***自2.0.0版本以来,公众号的接口调整比较大,主要是为了解决主接口类过于庞大不方便管理的问题,将接口实现代码按模块进行拆分。***
    -1. 本SDK要求的最低JDK版本是7,为解决少量还在使用JDK6的用户,特意抽出独立的代码分支项目,请参考 https://github.com/binarywang/weixin-java-tools-for-jdk6 ,其他更早的JDK版本则需要自己改造实现;
    +1. 本SDK要求的最低JDK版本是7,为满足少量还在使用JDK6的用户的需求,特意抽出独立的代码分支项目,请参考 https://github.com/binarywang/weixin-java-tools-for-jdk6 ,其他更早的JDK版本则需要自己改造实现;
     1. 最新更新:2016-09-30 发布2.2.0正式版!
     
     ===========
    
    From acc129111a2fe2452d375de5576bb5b96f0d41a0 Mon Sep 17 00:00:00 2001
    From: Binary Wang 
    Date: Tue, 18 Oct 2016 18:29:43 +0800
    Subject: [PATCH 35/83] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=88=A0=E9=99=A4?=
     =?UTF-8?q?=E6=A8=A1=E6=9D=BF=E7=9A=84=E6=8E=A5=E5=8F=A3=E6=96=B9=E6=B3=95?=
     =?UTF-8?q?=E5=AE=9E=E7=8E=B0=20for=20issue=20#63?=
    MIME-Version: 1.0
    Content-Type: text/plain; charset=UTF-8
    Content-Transfer-Encoding: 8bit
    
    ---
     .../weixin/mp/api/WxMpTemplateMsgService.java | 18 ++++++++++++---
     .../api/impl/WxMpTemplateMsgServiceImpl.java  | 19 ++++++++++++---
     .../impl/WxMpTemplateMsgServiceImplTest.java  | 23 +++++++++++--------
     3 files changed, 45 insertions(+), 15 deletions(-)
    
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpTemplateMsgService.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpTemplateMsgService.java
    index 4788bf3e..9b66f722 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpTemplateMsgService.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpTemplateMsgService.java
    @@ -1,12 +1,12 @@
     package me.chanjar.weixin.mp.api;
     
    -import java.util.List;
    -
     import me.chanjar.weixin.common.exception.WxErrorException;
     import me.chanjar.weixin.mp.bean.template.WxMpTemplate;
     import me.chanjar.weixin.mp.bean.template.WxMpTemplateIndustry;
     import me.chanjar.weixin.mp.bean.template.WxMpTemplateMessage;
     
    +import java.util.List;
    +
     /**
      * 
      * 模板消息接口
    @@ -68,8 +68,20 @@ public interface WxMpTemplateMsgService {
        * 详情请见: http://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1433751277&token=&lang=zh_CN
        * 接口地址格式:https://api.weixin.qq.com/cgi-bin/template/get_all_private_template?access_token=ACCESS_TOKEN
        * 
    - * + * * @return templateId 模板Id */ List getAllPrivateTemplate() throws WxErrorException; + + /** + *
    +   * 删除模板
    +   * 删除模板可在MP中完成,为方便第三方开发者,提供通过接口调用的方式来删除某帐号下的模板
    +   * 详情请见: http://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1433751277&token=&lang=zh_CN
    +   * 接口地址格式:https://api.weixin.qq.com/cgi-bin/template/del_private_template?access_token=ACCESS_TOKEN
    +   * 
    + * + * @param templateId 模板Id + */ + boolean delPrivateTemplate(String templateId) throws WxErrorException; } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpTemplateMsgServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpTemplateMsgServiceImpl.java index e4ee2a1b..82ce829c 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpTemplateMsgServiceImpl.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpTemplateMsgServiceImpl.java @@ -1,10 +1,7 @@ package me.chanjar.weixin.mp.api.impl; -import java.util.List; - import com.google.gson.JsonObject; import com.google.gson.JsonParser; - import me.chanjar.weixin.common.bean.result.WxError; import me.chanjar.weixin.common.exception.WxErrorException; import me.chanjar.weixin.mp.api.WxMpService; @@ -13,6 +10,8 @@ import me.chanjar.weixin.mp.bean.template.WxMpTemplate; import me.chanjar.weixin.mp.bean.template.WxMpTemplateIndustry; import me.chanjar.weixin.mp.bean.template.WxMpTemplateMessage; +import java.util.List; + /** *
      * Created by Binary Wang on 2016-10-14.
    @@ -79,4 +78,18 @@ public class WxMpTemplateMsgServiceImpl implements WxMpTemplateMsgService {
         return WxMpTemplate.fromJson(this.wxMpService.get(url, null));
       }
     
    +  @Override
    +  public boolean delPrivateTemplate(String templateId) throws WxErrorException {
    +    String url = API_URL_PREFIX + "/del_private_template";
    +    JsonObject jsonObject = new JsonObject();
    +    jsonObject.addProperty("template_id", templateId);
    +    String responseContent = this.wxMpService.post(url, jsonObject.toString());
    +    WxError error = WxError.fromJson(responseContent);
    +    if (error.getErrorCode() == 0) {
    +      return true;
    +    }
    +
    +    throw new WxErrorException(error);
    +  }
    +
     }
    diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpTemplateMsgServiceImplTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpTemplateMsgServiceImplTest.java
    index 3c6fd0b4..d6f479b5 100644
    --- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpTemplateMsgServiceImplTest.java
    +++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpTemplateMsgServiceImplTest.java
    @@ -1,15 +1,6 @@
     package me.chanjar.weixin.mp.api.impl;
     
    -import java.text.SimpleDateFormat;
    -import java.util.Date;
    -import java.util.List;
    -
    -import org.testng.Assert;
    -import org.testng.annotations.Guice;
    -import org.testng.annotations.Test;
    -
     import com.google.inject.Inject;
    -
     import me.chanjar.weixin.common.exception.WxErrorException;
     import me.chanjar.weixin.mp.api.ApiTestModule;
     import me.chanjar.weixin.mp.api.WxXmlMpInMemoryConfigStorage;
    @@ -17,6 +8,13 @@ import me.chanjar.weixin.mp.bean.template.WxMpTemplate;
     import me.chanjar.weixin.mp.bean.template.WxMpTemplateData;
     import me.chanjar.weixin.mp.bean.template.WxMpTemplateIndustry;
     import me.chanjar.weixin.mp.bean.template.WxMpTemplateMessage;
    +import org.testng.Assert;
    +import org.testng.annotations.Guice;
    +import org.testng.annotations.Test;
    +
    +import java.text.SimpleDateFormat;
    +import java.util.Date;
    +import java.util.List;
     
     /**
      * 
    @@ -74,4 +72,11 @@ public class WxMpTemplateMsgServiceImplTest {
         System.err.println(result);
       }
     
    +  @Test
    +  public void testDelPrivateTemplate() throws Exception {
    +    String templateId = "RPcTe7-4BkU5A2J3imC6W0b4JbjEERcJg0whOMKJKIc";
    +    boolean result = this.wxService.getTemplateMsgService().delPrivateTemplate(templateId);
    +    Assert.assertTrue(result);
    +  }
    +
     }
    
    From f54097e19a45404bcb668e414cbad3e0aff1df02 Mon Sep 17 00:00:00 2001
    From: Binary Wang 
    Date: Tue, 18 Oct 2016 23:33:52 +0800
    Subject: [PATCH 36/83] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=BE=AE=E4=BF=A1?=
     =?UTF-8?q?=E8=AE=A4=E8=AF=81=E4=BA=8B=E4=BB=B6=E6=8E=A8=E9=80=81=E6=B6=88?=
     =?UTF-8?q?=E6=81=AF=E7=9A=84=E6=94=AF=E6=8C=81=EF=BC=8C=E5=8C=85=E6=8B=AC?=
     =?UTF-8?q?=E5=B8=B8=E9=87=8F=E7=9A=84=E5=AE=9A=E4=B9=89=E4=BB=A5=E5=8F=8A?=
     =?UTF-8?q?=E6=8E=A5=E6=94=B6=E6=B6=88=E6=81=AF=E5=AD=97=E6=AE=B5=E7=9A=84?=
     =?UTF-8?q?=E5=AE=9A=E4=B9=89=E3=80=82=20finish=20#63?=
    MIME-Version: 1.0
    Content-Type: text/plain; charset=UTF-8
    Content-Transfer-Encoding: 8bit
    
    ---
     .../chanjar/weixin/common/api/WxConsts.java   | 26 ++++++++++
     .../weixin/mp/bean/WxMpXmlMessage.java        | 48 +++++++++++++++++++
     2 files changed, 74 insertions(+)
    
    diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/api/WxConsts.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/api/WxConsts.java
    index 6a1e4380..b3122863 100644
    --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/api/WxConsts.java
    +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/api/WxConsts.java
    @@ -63,6 +63,7 @@ public class WxConsts {
        * 群发反馈消息代码所对应的文字描述
        */
       public static final Map MASS_ST_2_DESC = new HashMap<>();
    +
       ///////////////////////
       // 微信端推送过来的事件类型
       ///////////////////////
    @@ -94,6 +95,31 @@ public class WxConsts {
       public static final String EVT_KF_CLOSE_SESSION = "kf_close_session"; // 客服关闭会话
       public static final String EVT_KF_SWITCH_SESSION = "kf_switch_session"; // 客服转接会话
       public static final String EVT_POI_CHECK_NOTIFY = "poi_check_notify"; //门店审核事件推送
    +  //以下为微信认证事件
    +  /**
    +   * 资质认证成功
    +   */
    +  public static final String EVT_QUALIFICATION_VERIFY_SUCCESS = "qualification_verify_success";
    +  /**
    +   * 资质认证失败
    +   */
    +  public static final String EVT_QUALIFICATION_VERIFY_FAIL = "qualification_verify_fail";
    +  /**
    +   * 名称认证成功
    +   */
    +  public static final String EVT_NAMING_VERIFY_SUCCESS = "naming_verify_success";
    +  /**
    +   * 名称认证失败
    +   */
    +  public static final String EVT_NAMING_VERIFY_FAIL = "naming_verify_fail";
    +  /**
    +   * 年审通知
    +   */
    +  public static final String EVT_ANNUAL_RENEW = "annual_renew";
    +  /**
    +   * 认证过期失效通知
    +   */
    +  public static final String EVT_VERIFY_EXPIRED = "verify_expired";
     
       ///////////////////////
       // 上传多媒体文件的类型
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlMessage.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlMessage.java
    index b938ceb0..864b0d98 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlMessage.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlMessage.java
    @@ -239,6 +239,54 @@ public class WxMpXmlMessage implements Serializable {
       @XStreamAlias("msg")
       private String msg;
     
    +  ///////////////////////////////////////
    +  // 微信认证事件推送
    +  ///////////////////////////////////////
    +  /**
    +   * ExpiredTime
    +   * 资质认证成功/名称认证成功: 有效期 (整形),指的是时间戳,将于该时间戳认证过期
    +   * 年审通知: 有效期 (整形),指的是时间戳,将于该时间戳认证过期,需尽快年审
    +   * 认证过期失效通知: 有效期 (整形),指的是时间戳,表示已于该时间戳认证过期,需要重新发起微信认证
    +   */
    +  @XStreamAlias("ExpiredTime")
    +  private Long expiredTime;
    +  /**
    +   * FailTime
    +   * 失败发生时间 (整形),时间戳
    +   */
    +  @XStreamAlias("FailTime")
    +  private Long failTime;
    +  /**
    +   * FailReason
    +   * 认证失败的原因
    +   */
    +  @XStreamAlias("FailReason")
    +  private String failReason;
    +
    +  public Long getExpiredTime() {
    +    return this.expiredTime;
    +  }
    +
    +  public void setExpiredTime(Long expiredTime) {
    +    this.expiredTime = expiredTime;
    +  }
    +
    +  public Long getFailTime() {
    +    return this.failTime;
    +  }
    +
    +  public void setFailTime(Long failTime) {
    +    this.failTime = failTime;
    +  }
    +
    +  public String getFailReason() {
    +    return this.failReason;
    +  }
    +
    +  public void setFailReason(String failReason) {
    +    this.failReason = failReason;
    +  }
    +
       public String getStoreUniqId() {
         return this.storeUniqId;
       }
    
    From f0192cc0169e152e51e6f7699e955d0d0590e8ec Mon Sep 17 00:00:00 2001
    From: Binary Wang 
    Date: Wed, 19 Oct 2016 20:28:47 +0800
    Subject: [PATCH 37/83] =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E6=9F=A5=E8=AF=A2?=
     =?UTF-8?q?=E4=BC=81=E4=B8=9A=E4=BB=98=E6=AC=BE=E7=9A=84API=E3=80=82=20fin?=
     =?UTF-8?q?ish=20#51?=
    MIME-Version: 1.0
    Content-Type: text/plain; charset=UTF-8
    Content-Transfer-Encoding: 8bit
    
    ---
     .../chanjar/weixin/mp/api/WxMpPayService.java |  21 +-
     .../mp/api/impl/WxMpPayServiceImpl.java       |  25 ++
     .../mp/bean/pay/WxEntPayQueryRequest.java     | 135 ++++++++++
     .../mp/bean/pay/WxEntPayQueryResult.java      | 230 ++++++++++++++++++
     .../mp/api/impl/WxMpPayServiceImplTest.java   |   9 +
     5 files changed, 417 insertions(+), 3 deletions(-)
     create mode 100644 weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxEntPayQueryRequest.java
     create mode 100644 weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxEntPayQueryResult.java
    
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpPayService.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpPayService.java
    index bdba22ad..ffbbabd8 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpPayService.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpPayService.java
    @@ -18,6 +18,7 @@ public interface WxMpPayService {
        * 在发起微信支付前,需要调用统一下单接口,获取"预支付交易会话标识"
        * 接口地址:https://api.mch.weixin.qq.com/pay/unifiedorder
        * @throws WxErrorException
    +   * @param request 请求对象
        *
        */
       WxUnifiedOrderResult unifiedOrder(WxUnifiedOrderRequest request)
    @@ -26,11 +27,10 @@ public interface WxMpPayService {
       /**
        * 该接口调用“统一下单”接口,并拼装发起支付请求需要的参数
        * 详见http://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115&token=&lang=zh_CN
    -   *
    +   * @param request 请求对象
        */
       Map getPayInfo(WxUnifiedOrderRequest request) throws WxErrorException;
     
    -
       /**
        * 该接口提供所有微信支付订单的查询,当支付通知处理异常戒丢失的情冴,商户可以通过该接口查询订单支付状态。
        * 详见http://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_2
    @@ -53,6 +53,7 @@ public interface WxMpPayService {
        * 详见 https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_4
        * 接口链接:https://api.mch.weixin.qq.com/secapi/pay/refund
        * 
    + * @param request 请求对象 * @param keyFile 证书文件对象 * @return 退款操作结果 */ @@ -74,6 +75,7 @@ public interface WxMpPayService { * 发送普通红包 https://pay.weixin.qq.com/wiki/doc/api/tools/cash_coupon.php?chapter=13_4&index=3 * 发送裂变红包 https://pay.weixin.qq.com/wiki/doc/api/tools/cash_coupon.php?chapter=13_5&index=4 *
    + * @param request 请求对象 * @param keyFile 证书文件对象 */ WxRedpackResult sendRedpack(WxSendRedpackRequest request, File keyFile) throws WxErrorException; @@ -86,9 +88,22 @@ public interface WxMpPayService { * 注意:与商户微信支付收款资金并非同一账户,需要单独充值。 * 文档详见:https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=14_2 * 接口链接:https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers - * @param keyFile 证书文件对象 *
    + * @param request 请求对象 + * @param keyFile 证书文件对象 */ WxEntPayResult entPay(WxEntPayRequest request, File keyFile) throws WxErrorException; + /** + *
    +   * 查询企业付款API
    +   * 用于商户的企业付款操作进行结果查询,返回付款操作详细结果。
    +   * 文档详见:https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=14_3
    +   * 接口链接:https://api.mch.weixin.qq.com/mmpaymkttransfers/gettransferinfo
    +   * 
    + * @param partnerTradeNo 商户订单号 + * @param keyFile 证书文件对象 + */ + WxEntPayQueryResult queryEntPay(String partnerTradeNo, File keyFile) throws WxErrorException; + } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImpl.java index fa1a44c5..6da1001e 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImpl.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImpl.java @@ -369,6 +369,31 @@ public class WxMpPayServiceImpl implements WxMpPayService { return result; } + @Override + public WxEntPayQueryResult queryEntPay(String partnerTradeNo, File keyFile) throws WxErrorException { + XStream xstream = XStreamInitializer.getInstance(); + xstream.processAnnotations(WxEntPayQueryRequest.class); + xstream.processAnnotations(WxEntPayQueryResult.class); + + WxEntPayQueryRequest request = new WxEntPayQueryRequest(); + request.setAppid(this.wxMpService.getWxMpConfigStorage().getAppId()); + request.setMchId(this.wxMpService.getWxMpConfigStorage().getPartnerId()); + request.setNonceStr(System.currentTimeMillis() + ""); + + String sign = this.createSign(xmlBean2Map(request), this.wxMpService.getWxMpConfigStorage().getPartnerKey()); + request.setSign(sign); + + String url = PAY_BASE_URL + "/mmpaymkttransfers/gettransferinfo"; + + String responseContent = this.executeRequestWithKeyFile(url, keyFile, xstream.toXML(request), request.getMchId()); + WxEntPayQueryResult result = (WxEntPayQueryResult) xstream.fromXML(responseContent); + if ("FAIL".equals(result.getResultCode())) { + throw new WxErrorException( + WxError.newBuilder().setErrorMsg(result.getErrCode() + ":" + result.getErrCodeDes()).build()); + } + return result; + } + private String executeRequestWithKeyFile( String url, File keyFile, String requestStr, String mchId) throws WxErrorException { try (FileInputStream inputStream = new FileInputStream(keyFile)) { KeyStore keyStore = KeyStore.getInstance("PKCS12"); diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxEntPayQueryRequest.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxEntPayQueryRequest.java new file mode 100644 index 00000000..c1f540a4 --- /dev/null +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxEntPayQueryRequest.java @@ -0,0 +1,135 @@ +package me.chanjar.weixin.mp.bean.pay; + +import com.thoughtworks.xstream.annotations.XStreamAlias; +import me.chanjar.weixin.common.annotation.Required; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; + +/** + *
    + * 企业付款请求对象
    + * 注释中各行每个字段描述对应如下:
    + * 
  • 字段名 + *
  • 变量名 + *
  • 是否必填 + *
  • 类型 + *
  • 示例值 + *
  • 描述 + *
  • + * Created by Binary Wang on 2016/10/19. + * @author binarywang (https://github.com/binarywang) + */ +@XStreamAlias("xml") +public class WxEntPayQueryRequest { + /** + *
    +   * Appid
    +   * appid
    +   * 是
    +   * wxe062425f740d30d8
    +   * String(32)
    +   * 商户号的appid
    +   * 
    + */ + @XStreamAlias("appid") + private String appid; + + /** + *
    +   * 商户号
    +   * mch_id
    +   * 是
    +   * 10000098
    +   * String(32)
    +   * 微信支付分配的商户号
    +   * 
    + */ + @XStreamAlias("mchid") + private String mchId; + + /** + *
    +   * 随机字符串
    +   * nonce_str
    +   * 是
    +   * 5K8264ILTKCH16CQ2502SI8ZNMTM67VS
    +   * String(32)
    +   * 随机字符串,不长于32位
    +   * 
    + */ + @XStreamAlias("nonce_str") + private String nonceStr; + + /** + *
    +  * 签名
    +  * sign
    +  * 是
    +  * C380BEC2BFD727A4B6845133519F3AD6
    +  * String(32)
    +  *签名,详见签名算法
    +   * 
    + */ + @XStreamAlias("sign") + private String sign; + + /** + *
    +  * 商户订单号
    +  * partner_trade_no
    +  * 是
    +  * 10000098201411111234567890
    +  * String
    +  * 商户订单号
    +   * 
    + */ + @Required + @XStreamAlias("partner_trade_no") + private String partnerTradeNo; + + public String getAppid() { + return appid; + } + + public void setAppid(String appid) { + this.appid = appid; + } + + public String getMchId() { + return mchId; + } + + public void setMchId(String mchId) { + this.mchId = mchId; + } + + public String getNonceStr() { + return nonceStr; + } + + public void setNonceStr(String nonceStr) { + this.nonceStr = nonceStr; + } + + public String getSign() { + return sign; + } + + public void setSign(String sign) { + this.sign = sign; + } + + public String getPartnerTradeNo() { + return partnerTradeNo; + } + + public void setPartnerTradeNo(String partnerTradeNo) { + this.partnerTradeNo = partnerTradeNo; + } + + @Override + public String toString() { + return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE); + } + +} diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxEntPayQueryResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxEntPayQueryResult.java new file mode 100644 index 00000000..55659ca4 --- /dev/null +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxEntPayQueryResult.java @@ -0,0 +1,230 @@ +package me.chanjar.weixin.mp.bean.pay; + +import com.thoughtworks.xstream.annotations.XStreamAlias; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; + +/** + * 企业付款查询返回结果 + * Created by Binary Wang on 2016/10/19. + * @author binarywang (https://github.com/binarywang) + */ +@XStreamAlias("xml") +public class WxEntPayQueryResult { + + /** + * 返回状态码 + */ + @XStreamAlias("return_code") + private String returnCode; + + /** + * 返回信息 + */ + @XStreamAlias("return_msg") + private String returnMsg; + + //############以下字段在return_code为SUCCESS的时候有返回 + /** + * 业务结果 + */ + @XStreamAlias("result_code") + private String resultCode; + /** + * 错误代码 + */ + @XStreamAlias("err_code") + private String errCode; + + /** + * 错误代码描述 + */ + @XStreamAlias("err_code_des") + private String errCodeDes; + + //############以下字段在return_code 和result_code都为SUCCESS的时候有返回############## + /** + * 商户订单号 + */ + @XStreamAlias("partner_trade_no") + private String partnerTradeNo; + + /** + * 商户号 + */ + @XStreamAlias("mchid") + private String mchId; + + /** + * 付款单号 + */ + @XStreamAlias("detail_id") + private String detailId; + + /** + * 转账状态 + */ + @XStreamAlias("status") + private String status; + + /** + * 失败原因 + */ + @XStreamAlias("reason") + private String reason; + + /** + * 收款用户openid + */ + @XStreamAlias("openid") + private String openid; + + /** + * 收款用户姓名 + */ + @XStreamAlias("transfer_name") + private String transferName; + + /** + * 付款金额 + */ + @XStreamAlias("payment_amount") + private Integer paymentAmount; + + /** + * 转账时间 + */ + @XStreamAlias("transfer_time") + private String transferTime; + + /** + * 付款描述 + */ + @XStreamAlias("desc") + private String desc; + + @Override + public String toString() { + return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE); + } + + public String getReturnCode() { + return returnCode; + } + + public void setReturnCode(String returnCode) { + this.returnCode = returnCode; + } + + public String getReturnMsg() { + return returnMsg; + } + + public void setReturnMsg(String returnMsg) { + this.returnMsg = returnMsg; + } + + public String getResultCode() { + return resultCode; + } + + public void setResultCode(String resultCode) { + this.resultCode = resultCode; + } + + public String getErrCode() { + return errCode; + } + + public void setErrCode(String errCode) { + this.errCode = errCode; + } + + public String getErrCodeDes() { + return errCodeDes; + } + + public void setErrCodeDes(String errCodeDes) { + this.errCodeDes = errCodeDes; + } + + public String getPartnerTradeNo() { + return partnerTradeNo; + } + + public void setPartnerTradeNo(String partnerTradeNo) { + this.partnerTradeNo = partnerTradeNo; + } + + public String getMchId() { + return mchId; + } + + public void setMchId(String mchId) { + this.mchId = mchId; + } + + public String getDetailId() { + return detailId; + } + + public void setDetailId(String detailId) { + this.detailId = detailId; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getReason() { + return reason; + } + + public void setReason(String reason) { + this.reason = reason; + } + + public String getOpenid() { + return openid; + } + + public void setOpenid(String openid) { + this.openid = openid; + } + + public String getTransferName() { + return transferName; + } + + public void setTransferName(String transferName) { + this.transferName = transferName; + } + + public Integer getPaymentAmount() { + return paymentAmount; + } + + public void setPaymentAmount(Integer paymentAmount) { + this.paymentAmount = paymentAmount; + } + + public String getTransferTime() { + return transferTime; + } + + public void setTransferTime(String transferTime) { + this.transferTime = transferTime; + } + + public String getDesc() { + return desc; + } + + public void setDesc(String desc) { + this.desc = desc; + } +} diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImplTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImplTest.java index 6d0b8a5c..17cf5eec 100644 --- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImplTest.java +++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImplTest.java @@ -91,4 +91,13 @@ public class WxMpPayServiceImplTest { System.err.println(this.wxService.getPayService().entPay(request, keyFile)); } + /** + * Test method for {@link me.chanjar.weixin.mp.api.impl.WxMpPayServiceImpl#queryEntPay(String, File)}. + * @throws WxErrorException + */ + @Test + public final void testQueryEntPay() throws WxErrorException { + File keyFile = new File("E:\\dlt.p12"); + System.err.println(this.wxService.getPayService().queryEntPay("11212121", keyFile)); + } } From 81b7a2cbcfb3136a47811180359a6091629b49b5 Mon Sep 17 00:00:00 2001 From: HaiJun Liu Date: Thu, 20 Oct 2016 15:18:23 +0800 Subject: [PATCH 38/83] Fix issue #62 : add osgi support --- pom.xml | 4 +- weixin-java-osgi/pom.xml | 141 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 143 insertions(+), 2 deletions(-) create mode 100644 weixin-java-osgi/pom.xml diff --git a/pom.xml b/pom.xml index 804f3540..390c8cc7 100644 --- a/pom.xml +++ b/pom.xml @@ -39,6 +39,7 @@ weixin-java-common weixin-java-cp weixin-java-mp + weixin-java-osgi @@ -106,7 +107,7 @@ redis.clients jedis ${jedis.version} - provided + true com.google.guava @@ -295,5 +296,4 @@ - diff --git a/weixin-java-osgi/pom.xml b/weixin-java-osgi/pom.xml new file mode 100644 index 00000000..381ec5f9 --- /dev/null +++ b/weixin-java-osgi/pom.xml @@ -0,0 +1,141 @@ + + + 4.0.0 + + com.github.binarywang + weixin-java-parent + 2.3.0-SNAPSHOT + + + weixin-java-osgi + bundle + WeiXin Java Tools - OSGI + 微信公众号Java SDK OSGI + + + + org.jodd + jodd-bean + ${jodd-http.version} + + + org.apache.servicemix.bundles + org.apache.servicemix.bundles.xmlpull + 1.1.3.1_2 + + + org.apache.servicemix.bundles + org.apache.servicemix.bundles.xpp3 + 1.1.4c_7 + + + com.thoughtworks.xstream + xstream + 1.4.7 + provided + + + xmlpull + xmlpull + + + xpp3 + xpp3_min + + + + + org.apache.httpcomponents + httpcore + 4.4.1 + provided + + + org.apache.httpcomponents + httpclient + ${httpclient.version} + provided + + + org.apache.httpcomponents + httpmime + ${httpclient.version} + provided + + + com.github.binarywang + weixin-java-common + ${project.version} + provided + + + com.github.binarywang + weixin-java-cp + ${project.version} + provided + + + com.github.binarywang + weixin-java-mp + ${project.version} + provided + + + + + + + org.apache.felix + maven-bundle-plugin + 3.2.0 + true + + + + weixin-java-common;inline=true + ,weixin-java-cp;inline=true + ,weixin-java-mp;inline=true + ,httpcore;inline=true + ,httpclient;inline=true + ,httpmime;inline=true + ,xstream;inline=true + + me.chanjar.weixin.* + + !org.apache.commons.logging + ,com.bea.xml.stream;resolution:=optional + ,com.ctc.wstx.stax;resolution:=optional + ,javax.xml.namespace;resolution:=optional + ,javax.xml.stream;resolution:=optional, + ,net.sf.cglib.proxy;resolution:=optional + ,nu.xom;resolution:=optional + ,org.codehaus.jettison;version="[1.2,2)";resolution:=optional + ,org.codehaus.jettison.mapped;version="[1.2,2)";resolution:=optional + ,org.dom4j;resolution:=optional + ,org.dom4j.io;resolution:=optional + ,org.dom4j.tree;resolution:=op + tional,org.jdom;resolution:=optional + ,org.jdom.input;resolution:=optional + ,org.jdom2;resolution:=optional + ,org.jdom2.input;resolution:=optional + ,org.joda.time;version="[1.6,2)";resolution:=optional + ,org.joda.time.format;version="[1.6,2)";resolution:=optional + ,org.kxml2.io;resolution:=optional + ,org.w3c.dom;resolution:=optional + ,* + + + + + org.apache.felix + org.apache.felix.dependencymanager.annotation + 4.1.0 + + + + + + + From 9ee6d257d8805815b8d8f0829d2216c1a716a187 Mon Sep 17 00:00:00 2001 From: HaiJun Liu Date: Thu, 20 Oct 2016 15:22:03 +0800 Subject: [PATCH 39/83] ignore temp files on mac os --- .gitignore | 77 ++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 49 insertions(+), 28 deletions(-) diff --git a/.gitignore b/.gitignore index dd377af1..a2b51e4a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,28 +1,49 @@ -*.class -test-output - -# Mobile Tools for Java (J2ME) -.mtj.tmp/ - -# Package Files # -*.jar -*.war -*.ear - -# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml -hs_err_pid* - -target -bin -.project -.classpath -.settings - -sw-pom.xml -*.iml -test-config.xml -.idea -/.gradle/ -/gradle/ -*.bat -/gradlew +*.class +test-output + +# Mobile Tools for Java (J2ME) +.mtj.tmp/ + +# Package Files # +*.jar +*.war +*.ear + +# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml +hs_err_pid* + +target +bin +.project +.classpath +.settings + +sw-pom.xml +*.iml +test-config.xml +.idea +/.gradle/ +/gradle/ +*.bat +/gradlew + +# OSX +# Icon must end with two \r +Icon + + +._* +.DS_Store +.AppleDouble +.LSOverride +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk From 4477e44de8bcb8eb88f9a2a70228e5ffaa1ca0f3 Mon Sep 17 00:00:00 2001 From: HaiJun Liu Date: Thu, 20 Oct 2016 15:38:03 +0800 Subject: [PATCH 40/83] =?UTF-8?q?=E6=A0=B9=E6=8D=AEjavabean=E8=A7=84?= =?UTF-8?q?=E8=8C=83=EF=BC=8C=E4=BF=9D=E7=95=99=E4=B8=80=E4=B8=AAget?= =?UTF-8?q?=E6=96=B9=E6=B3=95=EF=BC=8C=E4=BB=A5=E4=BE=BF=E7=94=A8=E4=BA=8E?= =?UTF-8?q?=E4=B8=80=E4=BA=9B=E5=8F=8D=E5=B0=84=E7=9A=84=E4=BD=BF=E7=94=A8?= =?UTF-8?q?=E5=9C=BA=E6=99=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/me/chanjar/weixin/mp/bean/result/WxMpUser.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpUser.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpUser.java index b885ea4c..e3e894cb 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpUser.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpUser.java @@ -41,10 +41,6 @@ public class WxMpUser implements Serializable { return this.subscribe; } - public Boolean isSubscribe() { - return this.subscribe; - } - public void setSubscribe(Boolean subscribe) { this.subscribe = subscribe; } From 5885ce826eb28b47dc134e6cccbaf3d3d70e366f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Binary=EF=BC=88=E7=8F=AD=E7=BA=B3=E7=9D=BF=EF=BC=89?= Date: Fri, 21 Oct 2016 12:31:12 +0800 Subject: [PATCH 41/83] Update README.md --- README.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 7c1cee44..07040c52 100644 --- a/README.md +++ b/README.md @@ -11,9 +11,11 @@ =========== ## 开发交流方式: -1. ***入群须知:为保证入群成员质量,请申请入群前,先Star本项目,然后在申请入群时,输入您的Github帐号ID,以便管理员核对,ID即你的github主页地址https://github.com/XXXX 中最后的部分XXXX的内容,或者在github网页右上角点击头像后查看Signed in as后方内容。*** +1. ***QQ群入群须知:为保证入群成员质量,请申请入群前,先Star本项目,然后在申请入群时,输入您的Github帐号ID,以便管理员核对,ID即你的github主页地址https://github.com/XXXX 中最后的部分XXXX的内容,或者在github网页右上角点击头像后查看Signed in as后方内容。*** +1. 新手提问前,请先阅读此文章:http://t.cn/RV93MRB +1. 寻求帮助时需贴代码或大长串异常信息的,请利用http://paste.ubuntu.com 1. QQ群:343954419 [![Join QQ Group](http://pub.idqqimg.com/wpa/images/group.png)](http://shang.qq.com/wpa/qunwpa?idkey=078f7a153d243853e24cf2b542e7a6ccbf2a592bc138080f84d11297f736ec46) -1. 微信群: 因二维码有时间限制,如有想加入微信群的,请入QQ群后咨询获取最新入群二维码; +1. 微信群: 因微信群已达到100人限制,故如有想加入微信群的,请入QQ群后联系管理员,提供微信号以便邀请加入; 1. 有功能需求或由于微信官方接口调整导致的代码问题,可以直接提出issue,便于讨论追踪问题; 1. 详细开发文档请看 [Wiki](https://github.com/wechat-group/weixin-java-tools/wiki)。 From 4b88c3d426361b3069d86924c4d20b3bc728cc84 Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Fri, 21 Oct 2016 15:23:23 +0800 Subject: [PATCH 42/83] =?UTF-8?q?=E5=8E=BB=E6=8E=89joor=E7=9A=84=E4=BE=9D?= =?UTF-8?q?=E8=B5=96=EF=BC=8C=E5=B9=B6=E9=87=8D=E6=9E=84=E7=9B=B8=E5=85=B3?= =?UTF-8?q?=E5=8F=8D=E5=B0=84=E4=BB=A3=E7=A0=81=20for=20#58?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 10 --- .../chanjar/weixin/common/util/BeanUtils.java | 82 +++++++++++++++++++ .../mp/api/impl/WxMpPayServiceImpl.java | 72 +++------------- .../mp/api/impl/WxMpStoreServiceImpl.java | 30 +------ .../mp/api/impl/WxMpStoreServiceImplTest.java | 1 + .../mp/bean/pay/WxSendRedpackRequestTest.java | 33 -------- 6 files changed, 96 insertions(+), 132 deletions(-) create mode 100644 weixin-java-common/src/main/java/me/chanjar/weixin/common/util/BeanUtils.java delete mode 100644 weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/pay/WxSendRedpackRequestTest.java diff --git a/pom.xml b/pom.xml index 390c8cc7..81e4412e 100644 --- a/pom.xml +++ b/pom.xml @@ -53,7 +53,6 @@ 2.9.0 2.7 19.0 - 0.9.6 3.4 2.5 1.10 @@ -113,10 +112,6 @@ com.google.guava guava - - org.jooq - joor - @@ -162,11 +157,6 @@ guava ${guava.version} - - org.jooq - joor - ${joor.version} - diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/BeanUtils.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/BeanUtils.java new file mode 100644 index 00000000..c73f1600 --- /dev/null +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/BeanUtils.java @@ -0,0 +1,82 @@ +package me.chanjar.weixin.common.util; + +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; +import com.thoughtworks.xstream.annotations.XStreamAlias; +import me.chanjar.weixin.common.annotation.Required; +import me.chanjar.weixin.common.bean.result.WxError; +import me.chanjar.weixin.common.exception.WxErrorException; + +import java.lang.reflect.Field; +import java.util.List; +import java.util.Map; + +/** + *
    + * bean操作的一些工具类
    + * Created by Binary Wang on 2016-10-21.
    + * @author binarywang(Binary Wang)
    + * 
    + */ +public class BeanUtils { + + /** + * 检查bean里标记为@Required的field是否为空,为空则抛异常 + * @param bean 要检查的bean对象 + * @throws WxErrorException + */ + public static void checkRequiredFields(Object bean) throws WxErrorException { + List nullFields = Lists.newArrayList(); + + for (Field field : bean.getClass().getDeclaredFields()) { + try { + boolean isAccessible = field.isAccessible(); + field.setAccessible(true); + if (field.isAnnotationPresent(Required.class) + && field.get(bean) == null) { + nullFields.add(field.getName()); + } + field.setAccessible(isAccessible); + } catch (SecurityException | IllegalArgumentException + | IllegalAccessException e) { + e.printStackTrace(); + } + } + + if (!nullFields.isEmpty()) { + throw new WxErrorException(WxError.newBuilder().setErrorMsg("必填字段 " + nullFields + " 必须提供值").build()); + } + } + + /** + * 将bean按照@XStreamAlias标识的字符串内容生成以之为key的map对象 + * @param bean 包含@XStreamAlias的xml bean对象 + * @return map对象 + */ + public static Map xmlBean2Map(Object bean) { + Map result = Maps.newHashMap(); + for (Field field : bean.getClass().getDeclaredFields()) { + try { + boolean isAccessible = field.isAccessible(); + field.setAccessible(true); + if (field.get(bean) == null) { + field.setAccessible(isAccessible); + continue; + } + + if (field.isAnnotationPresent(XStreamAlias.class)) { + result.put(field.getAnnotation(XStreamAlias.class).value(), + field.get(bean).toString()); + } + + field.setAccessible(isAccessible); + } catch (SecurityException | IllegalArgumentException + | IllegalAccessException e) { + e.printStackTrace(); + } + + } + + return result; + } +} diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImpl.java index 6da1001e..9745e22c 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImpl.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImpl.java @@ -1,12 +1,9 @@ package me.chanjar.weixin.mp.api.impl; -import com.google.common.collect.Lists; -import com.google.common.collect.Maps; import com.thoughtworks.xstream.XStream; -import com.thoughtworks.xstream.annotations.XStreamAlias; -import me.chanjar.weixin.common.annotation.Required; import me.chanjar.weixin.common.bean.result.WxError; import me.chanjar.weixin.common.exception.WxErrorException; +import me.chanjar.weixin.common.util.BeanUtils; import me.chanjar.weixin.common.util.xml.XStreamInitializer; import me.chanjar.weixin.mp.api.WxMpPayService; import me.chanjar.weixin.mp.api.WxMpService; @@ -23,15 +20,12 @@ import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.ssl.SSLContexts; import org.apache.http.util.EntityUtils; -import org.joor.Reflect; import javax.net.ssl.SSLContext; import java.io.File; import java.io.FileInputStream; -import java.lang.reflect.Field; import java.security.KeyStore; import java.util.*; -import java.util.Map.Entry; /** * Created by Binary Wang on 2016/7/28. @@ -116,7 +110,7 @@ public class WxMpPayServiceImpl implements WxMpPayService { request.setMchId(partnerId); request.setNonceStr( System.currentTimeMillis() + ""); request.setOpUserId(partnerId); - String sign = this.createSign(this.xmlBean2Map(request), this.wxMpService.getWxMpConfigStorage().getPartnerKey()); + String sign = this.createSign(BeanUtils.xmlBean2Map(request), this.wxMpService.getWxMpConfigStorage().getPartnerKey()); request.setSign(sign); String url = PAY_BASE_URL + "/secapi/pay/refund"; @@ -138,8 +132,8 @@ public class WxMpPayServiceImpl implements WxMpPayService { return wxMpPayRefundResult; } - private void checkParameters(WxMpPayRefundRequest request) { - checkNotNullParams(request); + private void checkParameters(WxMpPayRefundRequest request) throws WxErrorException { + BeanUtils.checkRequiredFields(request); if (StringUtils.isNotBlank(request.getRefundAccount())) { if(!ArrayUtils.contains(REFUND_ACCOUNT, request.getRefundAccount())){ @@ -171,7 +165,7 @@ public class WxMpPayServiceImpl implements WxMpPayService { request.setMchId(mchId); request.setNonceStr(System.currentTimeMillis() + ""); - String sign = this.createSign(this.xmlBean2Map(request), + String sign = this.createSign(BeanUtils.xmlBean2Map(request), this.wxMpService.getWxMpConfigStorage().getPartnerKey()); request.setSign(sign); @@ -194,29 +188,6 @@ public class WxMpPayServiceImpl implements WxMpPayService { return redpackResult; } - private Map xmlBean2Map(Object bean) { - Map result = Maps.newHashMap(); - for (Entry entry : Reflect.on(bean).fields().entrySet()) { - Reflect reflect = entry.getValue(); - if (reflect.get() == null) { - continue; - } - - try { - Field field = bean.getClass().getDeclaredField(entry.getKey()); - if (field.isAnnotationPresent(XStreamAlias.class)) { - result.put(field.getAnnotation(XStreamAlias.class).value(), - reflect.get().toString()); - } - } catch (NoSuchFieldException | SecurityException e) { - e.printStackTrace(); - } - - } - - return result; - } - /** * 微信公众号支付签名算法(详见:https://pay.weixin.qq.com/wiki/doc/api/tools/cash_coupon.php?chapter=4_3) * @param packageParams 原始参数 @@ -253,7 +224,7 @@ public class WxMpPayServiceImpl implements WxMpPayService { request.setMchId(this.wxMpService.getWxMpConfigStorage().getPartnerId()); request.setNonceStr(System.currentTimeMillis() + ""); - String sign = this.createSign(this.xmlBean2Map(request), + String sign = this.createSign(BeanUtils.xmlBean2Map(request), this.wxMpService.getWxMpConfigStorage().getPartnerKey()); request.setSign(sign); @@ -271,8 +242,8 @@ public class WxMpPayServiceImpl implements WxMpPayService { return result; } - private void checkParameters(WxUnifiedOrderRequest request) { - checkNotNullParams(request); + private void checkParameters(WxUnifiedOrderRequest request) throws WxErrorException { + BeanUtils.checkRequiredFields(request); if (! ArrayUtils.contains(TRADE_TYPES, request.getTradeType())) { throw new IllegalArgumentException("trade_type目前必须为" + Arrays.toString(TRADE_TYPES) + "其中之一"); @@ -287,27 +258,6 @@ public class WxMpPayServiceImpl implements WxMpPayService { } } - private void checkNotNullParams(Object request) { - List nullFields = Lists.newArrayList(); - for (Entry entry : Reflect.on(request).fields() - .entrySet()) { - Reflect reflect = entry.getValue(); - try { - Field field = request.getClass().getDeclaredField(entry.getKey()); - if (field.isAnnotationPresent(Required.class) - && reflect.get() == null) { - nullFields.add(entry.getKey()); - } - } catch (NoSuchFieldException | SecurityException e) { - e.printStackTrace(); - } - } - - if (!nullFields.isEmpty()) { - throw new IllegalArgumentException("必填字段[" + nullFields + "]必须提供值"); - } - } - @Override public Map getPayInfo(WxUnifiedOrderRequest request) throws WxErrorException { WxUnifiedOrderResult unifiedOrderResult = this.unifiedOrder(request); @@ -345,7 +295,7 @@ public class WxMpPayServiceImpl implements WxMpPayService { @Override public WxEntPayResult entPay(WxEntPayRequest request, File keyFile) throws WxErrorException { - checkNotNullParams(request); + BeanUtils.checkRequiredFields(request); XStream xstream = XStreamInitializer.getInstance(); xstream.processAnnotations(WxEntPayRequest.class); @@ -355,7 +305,7 @@ public class WxMpPayServiceImpl implements WxMpPayService { request.setMchId(this.wxMpService.getWxMpConfigStorage().getPartnerId()); request.setNonceStr(System.currentTimeMillis() + ""); - String sign = this.createSign(xmlBean2Map(request), this.wxMpService.getWxMpConfigStorage().getPartnerKey()); + String sign = this.createSign(BeanUtils.xmlBean2Map(request), this.wxMpService.getWxMpConfigStorage().getPartnerKey()); request.setSign(sign); String url = PAY_BASE_URL + "/mmpaymkttransfers/promotion/transfers"; @@ -380,7 +330,7 @@ public class WxMpPayServiceImpl implements WxMpPayService { request.setMchId(this.wxMpService.getWxMpConfigStorage().getPartnerId()); request.setNonceStr(System.currentTimeMillis() + ""); - String sign = this.createSign(xmlBean2Map(request), this.wxMpService.getWxMpConfigStorage().getPartnerKey()); + String sign = this.createSign(BeanUtils.xmlBean2Map(request), this.wxMpService.getWxMpConfigStorage().getPartnerKey()); request.setSign(sign); String url = PAY_BASE_URL + "/mmpaymkttransfers/gettransferinfo"; diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpStoreServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpStoreServiceImpl.java index 39c7f729..e1984204 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpStoreServiceImpl.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpStoreServiceImpl.java @@ -1,23 +1,19 @@ package me.chanjar.weixin.mp.api.impl; -import com.google.common.collect.Lists; import com.google.gson.JsonObject; import com.google.gson.JsonParser; import com.google.gson.reflect.TypeToken; -import me.chanjar.weixin.common.annotation.Required; import me.chanjar.weixin.common.bean.result.WxError; import me.chanjar.weixin.common.exception.WxErrorException; +import me.chanjar.weixin.common.util.BeanUtils; import me.chanjar.weixin.mp.api.WxMpService; import me.chanjar.weixin.mp.api.WxMpStoreService; import me.chanjar.weixin.mp.bean.store.WxMpStoreBaseInfo; import me.chanjar.weixin.mp.bean.store.WxMpStoreInfo; import me.chanjar.weixin.mp.bean.store.WxMpStoreListResult; import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; -import org.joor.Reflect; -import java.lang.reflect.Field; import java.util.List; -import java.util.Map.Entry; /** * Created by Binary Wang on 2016/9/26. @@ -35,7 +31,7 @@ public class WxMpStoreServiceImpl implements WxMpStoreService { @Override public void add(WxMpStoreBaseInfo request) throws WxErrorException { - checkParameters(request); + BeanUtils.checkRequiredFields(request); String url = API_BASE_URL + "/addpoi"; String response = this.wxMpService.post(url, request.toJson()); @@ -71,28 +67,6 @@ public class WxMpStoreServiceImpl implements WxMpStoreService { } } - private void checkParameters(WxMpStoreBaseInfo request) { - List nullFields = Lists.newArrayList(); - for (Entry entry : Reflect.on(request).fields() - .entrySet()) { - Reflect reflect = entry.getValue(); - try { - Field field = request.getClass().getDeclaredField(entry.getKey()); - if (field.isAnnotationPresent(Required.class) - && reflect.get() == null) { - nullFields.add(entry.getKey()); - } - } catch (NoSuchFieldException | SecurityException e) { - e.printStackTrace(); - } - } - - if (!nullFields.isEmpty()) { - throw new IllegalArgumentException("必填字段[" + nullFields + "]必须提供值"); - } - - } - @Override public WxMpStoreListResult list(int begin, int limit) throws WxErrorException { diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpStoreServiceImplTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpStoreServiceImplTest.java index 6e31b769..e610204b 100644 --- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpStoreServiceImplTest.java +++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpStoreServiceImplTest.java @@ -30,6 +30,7 @@ public class WxMpStoreServiceImplTest { * @throws WxErrorException */ public void testAdd() throws WxErrorException { + this.wxMpService.getStoreService().add(WxMpStoreBaseInfo.builder().build()); this.wxMpService.getStoreService() .add(WxMpStoreBaseInfo.builder().businessName("haha").branchName("abc") .province("aaa").district("aaa").telephone("122").address("abc").categories(new String[] { "美食,江浙菜" }) diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/pay/WxSendRedpackRequestTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/pay/WxSendRedpackRequestTest.java deleted file mode 100644 index feb50c5a..00000000 --- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/pay/WxSendRedpackRequestTest.java +++ /dev/null @@ -1,33 +0,0 @@ -package me.chanjar.weixin.mp.bean.pay; - -import java.lang.reflect.Field; -import java.util.Map.Entry; - -import org.joor.Reflect; -import org.testng.annotations.Test; - -import com.thoughtworks.xstream.annotations.XStreamAlias; - -@Test -public class WxSendRedpackRequestTest { - - public void test() throws NoSuchFieldException, SecurityException { - - WxSendRedpackRequest request = new WxSendRedpackRequest(); - request.setMchBillno("123"); - request.setActName("ab"); - for (Entry entry : Reflect.on(request).fields().entrySet()) { - Reflect reflect = entry.getValue(); - if (reflect.get() == null) { - continue; - } - - Field field = WxSendRedpackRequest.class.getDeclaredField(entry.getKey()); - if (field.isAnnotationPresent(XStreamAlias.class)) { - System.err.println(reflect.get() + " = " + field.getAnnotation(XStreamAlias.class).value()); - } - } - - } - -} From 3448eda65ec5fd0c0a89051cf709297e4b6a4a62 Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Fri, 21 Oct 2016 15:24:27 +0800 Subject: [PATCH 43/83] =?UTF-8?q?gradle=E9=85=8D=E7=BD=AE=E9=87=8C=20?= =?UTF-8?q?=E5=8E=BB=E6=8E=89joor=E7=9A=84=E4=BE=9D=E8=B5=96=20for=20#58?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 1 - 1 file changed, 1 deletion(-) diff --git a/build.gradle b/build.gradle index ba12afc4..defc5a25 100644 --- a/build.gradle +++ b/build.gradle @@ -24,7 +24,6 @@ subprojects { compile group: 'org.jodd', name: 'jodd-http', version:'3.6.7' compile group: 'com.google.code.gson', name: 'gson', version:'2.7' compile group: 'com.google.guava', name: 'guava', version:'19.0' - compile group: 'org.jooq', name: 'joor', version:'0.9.6' compile group: 'commons-codec', name: 'commons-codec', version:'1.10' compile group: 'commons-io', name: 'commons-io', version:'2.5' compile group: 'org.apache.commons', name: 'commons-lang3', version:'3.4' From 6757af8429cd3bf045300667ee30bbc40bc83178 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Binary=EF=BC=88=E7=8F=AD=E7=BA=B3=E7=9D=BF=EF=BC=89?= Date: Sun, 23 Oct 2016 16:07:14 +0800 Subject: [PATCH 44/83] Update README.md --- README.md | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 07040c52..0c8848a2 100644 --- a/README.md +++ b/README.md @@ -10,12 +10,11 @@ =========== -## 开发交流方式: -1. ***QQ群入群须知:为保证入群成员质量,请申请入群前,先Star本项目,然后在申请入群时,输入您的Github帐号ID,以便管理员核对,ID即你的github主页地址https://github.com/XXXX 中最后的部分XXXX的内容,或者在github网页右上角点击头像后查看Signed in as后方内容。*** -1. 新手提问前,请先阅读此文章:http://t.cn/RV93MRB -1. 寻求帮助时需贴代码或大长串异常信息的,请利用http://paste.ubuntu.com +## 开发交流方式及注意事项: 1. QQ群:343954419 [![Join QQ Group](http://pub.idqqimg.com/wpa/images/group.png)](http://shang.qq.com/wpa/qunwpa?idkey=078f7a153d243853e24cf2b542e7a6ccbf2a592bc138080f84d11297f736ec46) 1. 微信群: 因微信群已达到100人限制,故如有想加入微信群的,请入QQ群后联系管理员,提供微信号以便邀请加入; +1. 新手提问前,请先阅读此文章:http://t.cn/RV93MRB +1. 寻求帮助时需贴代码或大长串异常信息的,请利用http://paste.ubuntu.com 1. 有功能需求或由于微信官方接口调整导致的代码问题,可以直接提出issue,便于讨论追踪问题; 1. 详细开发文档请看 [Wiki](https://github.com/wechat-group/weixin-java-tools/wiki)。 From 773c764872b426bb01e96e04685f20dd744c79ce Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Mon, 24 Oct 2016 11:52:16 +0800 Subject: [PATCH 45/83] =?UTF-8?q?=E5=8D=87=E7=BA=A7commons-lang3=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E5=8F=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 81e4412e..2724dfcc 100644 --- a/pom.xml +++ b/pom.xml @@ -53,7 +53,7 @@ 2.9.0 2.7 19.0 - 3.4 + 3.5 2.5 1.10 9.3.0.M0 From dff627b32743323be1a7cffa8ebae348754d166c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Binary=EF=BC=88=E7=8F=AD=E7=BA=B3=E7=9D=BF=EF=BC=89?= Date: Mon, 24 Oct 2016 15:28:37 +0800 Subject: [PATCH 46/83] Update README.md --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 0c8848a2..96b2bcd8 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ # Weixin Java Tools 微信公众号/企业号开发Java SDK -## [![Open Source Love](https://badges.frapsoft.com/os/v1/open-source.svg?v=103)](https://github.com/ellerbrock/open-source-badge/) ![Maven Central](https://img.shields.io/maven-central/v/com.github.binarywang/weixin-java-parent.svg) [![Build Status](https://travis-ci.org/wechat-group/weixin-java-tools.svg?branch=develop)](https://travis-ci.org/wechat-group/weixin-java-tools) +## ![Maven Central](https://img.shields.io/maven-central/v/com.github.binarywang/weixin-java-parent.svg) [![Build Status](https://travis-ci.org/wechat-group/weixin-java-tools.svg?branch=develop)](https://travis-ci.org/wechat-group/weixin-java-tools) [![Join QQ Group](http://pub.idqqimg.com/wpa/images/group.png)](http://jq.qq.com/?_wv=1027&k=40lRskK) ### 注意: @@ -11,12 +11,12 @@ =========== ## 开发交流方式及注意事项: -1. QQ群:343954419 [![Join QQ Group](http://pub.idqqimg.com/wpa/images/group.png)](http://shang.qq.com/wpa/qunwpa?idkey=078f7a153d243853e24cf2b542e7a6ccbf2a592bc138080f84d11297f736ec46) +1. QQ群:343954419(因群人数限制即将爆满,故开启付费加群方式并不定期清理不活跃人群,感谢理解) [![Join QQ Group](http://pub.idqqimg.com/wpa/images/group.png)](http://jq.qq.com/?_wv=1027&k=40lRskK) 1. 微信群: 因微信群已达到100人限制,故如有想加入微信群的,请入QQ群后联系管理员,提供微信号以便邀请加入; 1. 新手提问前,请先阅读此文章:http://t.cn/RV93MRB 1. 寻求帮助时需贴代码或大长串异常信息的,请利用http://paste.ubuntu.com 1. 有功能需求或由于微信官方接口调整导致的代码问题,可以直接提出issue,便于讨论追踪问题; -1. 详细开发文档请看 [Wiki](https://github.com/wechat-group/weixin-java-tools/wiki)。 +1. 详细开发文档请看 [Wiki](https://github.com/wechat-group/weixin-java-tools/wiki),部分文档可能未能及时更新,如有发现,可以及时上报或者自行修改。 =========== From e30138f931dfdcdcb9dca78b4132036caf75ab0e Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Tue, 25 Oct 2016 10:27:29 +0800 Subject: [PATCH 47/83] =?UTF-8?q?#53=20=E5=AE=9E=E7=8E=B0=E5=BE=AE?= =?UTF-8?q?=E4=BF=A1=E6=94=AF=E4=BB=98=E6=9F=A5=E8=AF=A2=E8=AE=A2=E5=8D=95?= =?UTF-8?q?=E7=9A=84=E6=8E=A5=E5=8F=A3=EF=BC=8C=E5=B9=B6=E9=87=8D=E6=9E=84?= =?UTF-8?q?=E8=A7=84=E8=8C=83=E5=8C=96=E5=BE=AE=E4=BF=A1=E6=94=AF=E4=BB=98?= =?UTF-8?q?=E7=9B=B8=E5=85=B3=E6=8E=A5=E5=8F=A3=E7=B1=BB=E7=9A=84=E5=91=BD?= =?UTF-8?q?=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../chanjar/weixin/mp/api/WxMpPayService.java | 37 +- .../mp/api/impl/WxMpPayServiceImpl.java | 114 +++-- .../mp/bean/pay/WxEntPayQueryRequest.java | 41 +- .../mp/bean/pay/WxEntPayQueryResult.java | 77 +-- .../weixin/mp/bean/pay/WxEntPayResult.java | 109 +---- .../weixin/mp/bean/pay/WxMpPayResult.java | 259 ---------- .../weixin/mp/bean/pay/WxPayBaseRequest.java | 107 +++++ ...dOrderResult.java => WxPayBaseResult.java} | 162 +++---- ...yCallback.java => WxPayJsSDKCallback.java} | 8 +- .../mp/bean/pay/WxPayOrderQueryRequest.java | 63 +++ .../mp/bean/pay/WxPayOrderQueryResult.java | 444 ++++++++++++++++++ ...ndRequest.java => WxPayRefundRequest.java} | 2 +- ...fundResult.java => WxPayRefundResult.java} | 92 +--- ...uest.java => WxPaySendRedpackRequest.java} | 10 +- .../mp/bean/pay/WxPaySendRedpackResult.java | 82 ++++ ...est.java => WxPayUnifiedOrderRequest.java} | 69 +-- .../mp/bean/pay/WxPayUnifiedOrderResult.java | 48 ++ .../weixin/mp/bean/pay/WxRedpackResult.java | 105 ----- .../mp/api/impl/WxMpPayServiceImplTest.java | 30 +- .../weixin/mp/bean/WxRedpackResultTest.java | 60 +-- 20 files changed, 964 insertions(+), 955 deletions(-) delete mode 100644 weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxMpPayResult.java create mode 100644 weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxPayBaseRequest.java rename weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/{WxUnifiedOrderResult.java => WxPayBaseResult.java} (61%) rename weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/{WxMpPayCallback.java => WxPayJsSDKCallback.java} (97%) create mode 100644 weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxPayOrderQueryRequest.java create mode 100644 weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxPayOrderQueryResult.java rename weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/{WxMpPayRefundRequest.java => WxPayRefundRequest.java} (99%) rename weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/{WxMpPayRefundResult.java => WxPayRefundResult.java} (68%) rename weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/{WxSendRedpackRequest.java => WxPaySendRedpackRequest.java} (96%) create mode 100644 weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxPaySendRedpackResult.java rename weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/{WxUnifiedOrderRequest.java => WxPayUnifiedOrderRequest.java} (91%) create mode 100644 weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxPayUnifiedOrderResult.java delete mode 100644 weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxRedpackResult.java diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpPayService.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpPayService.java index ffbbabd8..a1dabfa0 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpPayService.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpPayService.java @@ -13,6 +13,23 @@ import java.util.Map; */ public interface WxMpPayService { + /** + *
    +   * 查询订单(详见https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_2)
    +   * 该接口提供所有微信支付订单的查询,商户可以通过查询订单接口主动查询订单状态,完成下一步的业务逻辑。
    +   * 需要调用查询接口的情况:
    +   ◆ 当商户后台、网络、服务器等出现异常,商户系统最终未接收到支付通知;
    +   ◆ 调用支付接口后,返回系统错误或未知交易状态情况;
    +   ◆ 调用被扫支付API,返回USERPAYING的状态;
    +   ◆ 调用关单或撤销接口API之前,需确认支付状态;
    +   * 接口地址:https://api.mch.weixin.qq.com/pay/orderquery
    +   * 
    + * @param transactionId 微信支付分配的商户号 + * @param outTradeNo 商户系统内部的订单号,当没提供transaction_id时需要传这个。 + * @throws WxErrorException + */ + WxPayOrderQueryResult queryOrder(String transactionId, String outTradeNo) throws WxErrorException; + /** * 统一下单(详见http://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1) * 在发起微信支付前,需要调用统一下单接口,获取"预支付交易会话标识" @@ -21,31 +38,21 @@ public interface WxMpPayService { * @param request 请求对象 * */ - WxUnifiedOrderResult unifiedOrder(WxUnifiedOrderRequest request) - throws WxErrorException; + WxPayUnifiedOrderResult unifiedOrder(WxPayUnifiedOrderRequest request) throws WxErrorException; /** * 该接口调用“统一下单”接口,并拼装发起支付请求需要的参数 * 详见http://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115&token=&lang=zh_CN * @param request 请求对象 */ - Map getPayInfo(WxUnifiedOrderRequest request) throws WxErrorException; - - /** - * 该接口提供所有微信支付订单的查询,当支付通知处理异常戒丢失的情冴,商户可以通过该接口查询订单支付状态。 - * 详见http://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_2 - * @throws WxErrorException - * - */ - WxMpPayResult getJSSDKPayResult(String transactionId, String outTradeNo) - throws WxErrorException; + Map getPayInfo(WxPayUnifiedOrderRequest request) throws WxErrorException; /** * 读取支付结果通知 * 详见http://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_7 * */ - WxMpPayCallback getJSSDKCallbackData(String xmlData); + WxPayJsSDKCallback getJSSDKCallbackData(String xmlData); /** *
    @@ -57,7 +64,7 @@ public interface WxMpPayService {
        * @param keyFile  证书文件对象
        * @return 退款操作结果
        */
    -  WxMpPayRefundResult refund(WxMpPayRefundRequest request, File keyFile) throws WxErrorException;
    +  WxPayRefundResult refund(WxPayRefundRequest request, File keyFile) throws WxErrorException;
     
       /**
        * 
    @@ -78,7 +85,7 @@ public interface WxMpPayService {
        * @param request 请求对象
        * @param keyFile  证书文件对象
        */
    -  WxRedpackResult sendRedpack(WxSendRedpackRequest request, File keyFile) throws WxErrorException;
    +  WxPaySendRedpackResult sendRedpack(WxPaySendRedpackRequest request, File keyFile) throws WxErrorException;
     
       /**
        * 
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImpl.java
    index 9745e22c..8cb737c6 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImpl.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImpl.java
    @@ -46,64 +46,26 @@ public class WxMpPayServiceImpl implements WxMpPayService {
       }
     
       @Override
    -  public WxMpPayResult getJSSDKPayResult(String transactionId,
    -      String outTradeNo) throws WxErrorException {
    -    String nonce_str = System.currentTimeMillis() + "";
    -
    -    SortedMap packageParams = new TreeMap<>();
    -    packageParams.put("appid",
    -        this.wxMpService.getWxMpConfigStorage().getAppId());
    -    packageParams.put("mch_id",
    -        this.wxMpService.getWxMpConfigStorage().getPartnerId());
    -
    -    if (transactionId != null && !"".equals(transactionId.trim())) {
    -      packageParams.put("transaction_id", transactionId);
    -    } else if (outTradeNo != null && !"".equals(outTradeNo.trim())) {
    -      packageParams.put("out_trade_no", outTradeNo);
    -    } else {
    -      throw new IllegalArgumentException(
    -          "Either 'transactionId' or 'outTradeNo' must be given.");
    -    }
    -
    -    packageParams.put("nonce_str", nonce_str);
    -    packageParams.put("sign", this.createSign(packageParams,
    -        this.wxMpService.getWxMpConfigStorage().getPartnerKey()));
    -
    -    StringBuilder request = new StringBuilder("");
    -    for (Map.Entry para : packageParams.entrySet()) {
    -      request.append(String.format("<%s>%s", para.getKey(),
    -          para.getValue(), para.getKey()));
    -    }
    -    request.append("");
    -
    -    String url = PAY_BASE_URL + "/pay/orderquery";
    -    String responseContent = this.wxMpService.post(url, request.toString());
    -    XStream xstream = XStreamInitializer.getInstance();
    -    xstream.alias("xml", WxMpPayResult.class);
    -    return (WxMpPayResult) xstream.fromXML(responseContent);
    -  }
    -
    -  @Override
    -  public WxMpPayCallback getJSSDKCallbackData(String xmlData) {
    +  public WxPayJsSDKCallback getJSSDKCallbackData(String xmlData) {
         try {
           XStream xstream = XStreamInitializer.getInstance();
    -      xstream.alias("xml", WxMpPayCallback.class);
    -      return (WxMpPayCallback) xstream.fromXML(xmlData);
    +      xstream.alias("xml", WxPayJsSDKCallback.class);
    +      return (WxPayJsSDKCallback) xstream.fromXML(xmlData);
         } catch (Exception e) {
           e.printStackTrace();
         }
     
    -    return new WxMpPayCallback();
    +    return new WxPayJsSDKCallback();
       }
     
       @Override
    -  public WxMpPayRefundResult refund(WxMpPayRefundRequest request, File keyFile)
    +  public WxPayRefundResult refund(WxPayRefundRequest request, File keyFile)
           throws WxErrorException {
         checkParameters(request);
     
         XStream xstream = XStreamInitializer.getInstance();
    -    xstream.processAnnotations(WxMpPayRefundResult.class);
    -    xstream.processAnnotations(WxMpPayRefundRequest.class);
    +    xstream.processAnnotations(WxPayRefundResult.class);
    +    xstream.processAnnotations(WxPayRefundRequest.class);
     
         request.setAppid(this.wxMpService.getWxMpConfigStorage().getAppId());
         String partnerId = this.wxMpService.getWxMpConfigStorage().getPartnerId();
    @@ -115,7 +77,7 @@ public class WxMpPayServiceImpl implements WxMpPayService {
     
         String url = PAY_BASE_URL + "/secapi/pay/refund";
         String responseContent = this.executeRequestWithKeyFile(url, keyFile, xstream.toXML(request), partnerId);
    -    WxMpPayRefundResult wxMpPayRefundResult = (WxMpPayRefundResult) xstream.fromXML(responseContent);
    +    WxPayRefundResult wxMpPayRefundResult = (WxPayRefundResult) xstream.fromXML(responseContent);
     
         if (!"SUCCESS".equalsIgnoreCase(wxMpPayRefundResult.getResultCode())
             || !"SUCCESS".equalsIgnoreCase(wxMpPayRefundResult.getReturnCode())) {
    @@ -132,7 +94,7 @@ public class WxMpPayServiceImpl implements WxMpPayService {
         return wxMpPayRefundResult;
       }
     
    -  private void checkParameters(WxMpPayRefundRequest request) throws WxErrorException {
    +  private void checkParameters(WxPayRefundRequest request) throws WxErrorException {
         BeanUtils.checkRequiredFields(request);
     
         if (StringUtils.isNotBlank(request.getRefundAccount())) {
    @@ -154,11 +116,11 @@ public class WxMpPayServiceImpl implements WxMpPayService {
       }
     
       @Override
    -  public WxRedpackResult sendRedpack(WxSendRedpackRequest request, File keyFile)
    +  public WxPaySendRedpackResult sendRedpack(WxPaySendRedpackRequest request, File keyFile)
           throws WxErrorException {
         XStream xstream = XStreamInitializer.getInstance();
    -    xstream.processAnnotations(WxSendRedpackRequest.class);
    -    xstream.processAnnotations(WxRedpackResult.class);
    +    xstream.processAnnotations(WxPaySendRedpackRequest.class);
    +    xstream.processAnnotations(WxPaySendRedpackResult.class);
     
         request.setWxAppid(this.wxMpService.getWxMpConfigStorage().getAppId());
         String mchId = this.wxMpService.getWxMpConfigStorage().getPartnerId();
    @@ -176,7 +138,7 @@ public class WxMpPayServiceImpl implements WxMpPayService {
         }
     
         String responseContent = this.executeRequestWithKeyFile(url, keyFile, xstream.toXML(request), mchId);
    -    WxRedpackResult redpackResult = (WxRedpackResult) xstream
    +    WxPaySendRedpackResult redpackResult = (WxPaySendRedpackResult) xstream
             .fromXML(responseContent);
         if ("FAIL".equals(redpackResult.getResultCode())) {
           throw new WxErrorException(WxError.newBuilder()
    @@ -212,13 +174,49 @@ public class WxMpPayServiceImpl implements WxMpPayService {
       }
     
       @Override
    -  public WxUnifiedOrderResult unifiedOrder(WxUnifiedOrderRequest request)
    +  public WxPayOrderQueryResult queryOrder(String transactionId, String outTradeNo) throws WxErrorException {
    +    if ((StringUtils.isBlank(transactionId) && StringUtils.isBlank(outTradeNo)) ||
    +      (StringUtils.isNotBlank(transactionId) && StringUtils.isNotBlank(outTradeNo))) {
    +      throw new IllegalArgumentException("transaction_id 和 out_trade_no 不能同时存在或同时为空,必须二选一");
    +    }
    +
    +    XStream xstream = XStreamInitializer.getInstance();
    +    xstream.processAnnotations(WxPayOrderQueryRequest.class);
    +    xstream.processAnnotations(WxPayOrderQueryResult.class);
    +
    +    WxPayOrderQueryRequest request = new WxPayOrderQueryRequest();
    +    request.setOutTradeNo(StringUtils.trimToNull(outTradeNo));
    +    request.setTransactionId(StringUtils.trimToNull(transactionId));
    +    request.setAppid(this.wxMpService.getWxMpConfigStorage().getAppId());
    +    request.setMchId(this.wxMpService.getWxMpConfigStorage().getPartnerId());
    +    request.setNonceStr(System.currentTimeMillis() + "");
    +
    +    String sign = this.createSign(BeanUtils.xmlBean2Map(request),
    +      this.wxMpService.getWxMpConfigStorage().getPartnerKey());
    +    request.setSign(sign);
    +
    +    String url = PAY_BASE_URL + "/pay/orderquery";
    +
    +    String responseContent = this.wxMpService.post(url, xstream.toXML(request));
    +    WxPayOrderQueryResult result = (WxPayOrderQueryResult) xstream.fromXML(responseContent);
    +    result.composeCoupons(responseContent);
    +    if ("FAIL".equals(result.getResultCode())) {
    +      throw new WxErrorException(WxError.newBuilder()
    +        .setErrorMsg(result.getErrCode() + ":" + result.getErrCodeDes())
    +        .build());
    +    }
    +
    +    return result;
    +  }
    +
    +  @Override
    +  public WxPayUnifiedOrderResult unifiedOrder(WxPayUnifiedOrderRequest request)
           throws WxErrorException {
         checkParameters(request);
     
         XStream xstream = XStreamInitializer.getInstance();
    -    xstream.processAnnotations(WxUnifiedOrderRequest.class);
    -    xstream.processAnnotations(WxUnifiedOrderResult.class);
    +    xstream.processAnnotations(WxPayUnifiedOrderRequest.class);
    +    xstream.processAnnotations(WxPayUnifiedOrderResult.class);
     
         request.setAppid(this.wxMpService.getWxMpConfigStorage().getAppId());
         request.setMchId(this.wxMpService.getWxMpConfigStorage().getPartnerId());
    @@ -231,7 +229,7 @@ public class WxMpPayServiceImpl implements WxMpPayService {
         String url = PAY_BASE_URL + "/pay/unifiedorder";
     
         String responseContent = this.wxMpService.post(url, xstream.toXML(request));
    -    WxUnifiedOrderResult result = (WxUnifiedOrderResult) xstream
    +    WxPayUnifiedOrderResult result = (WxPayUnifiedOrderResult) xstream
             .fromXML(responseContent);
         if ("FAIL".equals(result.getResultCode())) {
           throw new WxErrorException(WxError.newBuilder()
    @@ -242,7 +240,7 @@ public class WxMpPayServiceImpl implements WxMpPayService {
         return result;
       }
     
    -  private void checkParameters(WxUnifiedOrderRequest request) throws WxErrorException {
    +  private void checkParameters(WxPayUnifiedOrderRequest request) throws WxErrorException {
         BeanUtils.checkRequiredFields(request);
     
         if (! ArrayUtils.contains(TRADE_TYPES, request.getTradeType())) {
    @@ -259,8 +257,8 @@ public class WxMpPayServiceImpl implements WxMpPayService {
       }
     
       @Override
    -  public Map getPayInfo(WxUnifiedOrderRequest request) throws WxErrorException {
    -    WxUnifiedOrderResult unifiedOrderResult = this.unifiedOrder(request);
    +  public Map getPayInfo(WxPayUnifiedOrderRequest request) throws WxErrorException {
    +    WxPayUnifiedOrderResult unifiedOrderResult = this.unifiedOrder(request);
     
         if (!"SUCCESS".equalsIgnoreCase(unifiedOrderResult.getReturnCode())
             || !"SUCCESS".equalsIgnoreCase(unifiedOrderResult.getResultCode())) {
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxEntPayQueryRequest.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxEntPayQueryRequest.java
    index c1f540a4..512ac159 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxEntPayQueryRequest.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxEntPayQueryRequest.java
    @@ -20,20 +20,7 @@ import org.apache.commons.lang3.builder.ToStringStyle;
      * @author binarywang (https://github.com/binarywang)
      */
     @XStreamAlias("xml")
    -public class WxEntPayQueryRequest {
    -  /**
    -   * 
    -   * Appid
    -   * appid
    -   * 是
    -   * wxe062425f740d30d8
    -   * String(32)
    -   * 商户号的appid
    -   * 
    - */ - @XStreamAlias("appid") - private String appid; - +public class WxEntPayQueryRequest extends WxPayBaseRequest { /** *
        * 商户号
    @@ -47,32 +34,6 @@ public class WxEntPayQueryRequest {
       @XStreamAlias("mchid")
       private String mchId;
     
    -  /**
    -   * 
    -   * 随机字符串
    -   * nonce_str
    -   * 是
    -   * 5K8264ILTKCH16CQ2502SI8ZNMTM67VS
    -   * String(32)
    -   * 随机字符串,不长于32位
    -   * 
    - */ - @XStreamAlias("nonce_str") - private String nonceStr; - - /** - *
    -  * 签名
    -  * sign
    -  * 是
    -  * C380BEC2BFD727A4B6845133519F3AD6
    -  * String(32)
    -  *签名,详见签名算法
    -   * 
    - */ - @XStreamAlias("sign") - private String sign; - /** *
       * 商户订单号
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxEntPayQueryResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxEntPayQueryResult.java
    index 55659ca4..382a8858 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxEntPayQueryResult.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxEntPayQueryResult.java
    @@ -1,8 +1,6 @@
     package me.chanjar.weixin.mp.bean.pay;
     
     import com.thoughtworks.xstream.annotations.XStreamAlias;
    -import org.apache.commons.lang3.builder.ToStringBuilder;
    -import org.apache.commons.lang3.builder.ToStringStyle;
     
     /**
      * 企业付款查询返回结果
    @@ -10,37 +8,7 @@ import org.apache.commons.lang3.builder.ToStringStyle;
      * @author binarywang (https://github.com/binarywang)
      */
     @XStreamAlias("xml")
    -public class WxEntPayQueryResult {
    -
    -  /**
    -   * 返回状态码
    -   */
    -  @XStreamAlias("return_code")
    -  private String returnCode;
    -
    -  /**
    -   * 返回信息
    -   */
    -  @XStreamAlias("return_msg")
    -  private String returnMsg;
    -
    -  //############以下字段在return_code为SUCCESS的时候有返回
    -  /**
    -   * 业务结果
    -   */
    -  @XStreamAlias("result_code")
    -  private String resultCode;
    -  /**
    -   * 错误代码
    -   */
    -  @XStreamAlias("err_code")
    -  private String errCode;
    -
    -  /**
    -   * 错误代码描述
    -   */
    -  @XStreamAlias("err_code_des")
    -  private String errCodeDes;
    +public class WxEntPayQueryResult extends WxPayBaseResult {
     
       //############以下字段在return_code 和result_code都为SUCCESS的时候有返回##############
       /**
    @@ -49,12 +17,6 @@ public class WxEntPayQueryResult {
       @XStreamAlias("partner_trade_no")
       private String partnerTradeNo;
     
    -  /**
    -   * 商户号
    -   */
    -  @XStreamAlias("mchid")
    -  private String mchId;
    -
       /**
        * 付款单号
        */
    @@ -103,11 +65,6 @@ public class WxEntPayQueryResult {
       @XStreamAlias("desc")
       private String desc;
     
    -  @Override
    -  public String toString() {
    -    return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
    -  }
    -
       public String getReturnCode() {
         return returnCode;
       }
    @@ -124,30 +81,6 @@ public class WxEntPayQueryResult {
         this.returnMsg = returnMsg;
       }
     
    -  public String getResultCode() {
    -    return resultCode;
    -  }
    -
    -  public void setResultCode(String resultCode) {
    -    this.resultCode = resultCode;
    -  }
    -
    -  public String getErrCode() {
    -    return errCode;
    -  }
    -
    -  public void setErrCode(String errCode) {
    -    this.errCode = errCode;
    -  }
    -
    -  public String getErrCodeDes() {
    -    return errCodeDes;
    -  }
    -
    -  public void setErrCodeDes(String errCodeDes) {
    -    this.errCodeDes = errCodeDes;
    -  }
    -
       public String getPartnerTradeNo() {
         return partnerTradeNo;
       }
    @@ -156,14 +89,6 @@ public class WxEntPayQueryResult {
         this.partnerTradeNo = partnerTradeNo;
       }
     
    -  public String getMchId() {
    -    return mchId;
    -  }
    -
    -  public void setMchId(String mchId) {
    -    this.mchId = mchId;
    -  }
    -
       public String getDetailId() {
         return detailId;
       }
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxEntPayResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxEntPayResult.java
    index 86c2c010..07bac47b 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxEntPayResult.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxEntPayResult.java
    @@ -1,8 +1,5 @@
     package me.chanjar.weixin.mp.bean.pay;
     
    -import org.apache.commons.lang3.builder.ToStringBuilder;
    -import org.apache.commons.lang3.builder.ToStringStyle;
    -
     import com.thoughtworks.xstream.annotations.XStreamAlias;
     
     /**
    @@ -11,21 +8,7 @@ import com.thoughtworks.xstream.annotations.XStreamAlias;
      * @author binarywang (https://github.com/binarywang)
      */
     @XStreamAlias("xml")
    -public class WxEntPayResult {
    -
    -  /**
    -   * 返回状态码
    -   */
    -  @XStreamAlias("return_code")
    -  private String returnCode;
    -
    -  /**
    -   * 返回信息
    -   */
    -  @XStreamAlias("return_msg")
    -  private String returnMsg;
    -
    -  //############以下字段在return_code为SUCCESS的时候有返回
    +public class WxEntPayResult extends WxPayBaseResult {
     
       /**
        * 商户appid
    @@ -33,41 +16,12 @@ public class WxEntPayResult {
       @XStreamAlias("mch_appid")
       private String mchAppid;
     
    -  /**
    -   * 商户号
    -   */
    -  @XStreamAlias("mchid")
    -  private String mchId;
    -
       /**
        * 设备号
        */
       @XStreamAlias("device_info")
       private String deviceInfo;
     
    -  /**
    -   * 随机字符串
    -   */
    -  @XStreamAlias("nonce_str")
    -  private String nonceStr;
    -
    -  /**
    -   * 业务结果
    -   */
    -  @XStreamAlias("result_code")
    -  private String resultCode;
    -  /**
    -   * 错误代码
    -   */
    -  @XStreamAlias("err_code")
    -  private String errCode;
    -
    -  /**
    -   * 错误代码描述
    -   */
    -  @XStreamAlias("err_code_des")
    -  private String errCodeDes;
    -
       //############以下字段在return_code 和result_code都为SUCCESS的时候有返回##############
       /**
        * 商户订单号
    @@ -87,27 +41,6 @@ public class WxEntPayResult {
       @XStreamAlias("payment_time")
       private String paymentTime;
     
    -  @Override
    -  public String toString() {
    -    return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
    -  }
    -
    -  public String getReturnCode() {
    -    return returnCode;
    -  }
    -
    -  public void setReturnCode(String returnCode) {
    -    this.returnCode = returnCode;
    -  }
    -
    -  public String getReturnMsg() {
    -    return returnMsg;
    -  }
    -
    -  public void setReturnMsg(String returnMsg) {
    -    this.returnMsg = returnMsg;
    -  }
    -
       public String getMchAppid() {
         return mchAppid;
       }
    @@ -116,14 +49,6 @@ public class WxEntPayResult {
         this.mchAppid = mchAppid;
       }
     
    -  public String getMchId() {
    -    return mchId;
    -  }
    -
    -  public void setMchId(String mchId) {
    -    this.mchId = mchId;
    -  }
    -
       public String getDeviceInfo() {
         return deviceInfo;
       }
    @@ -132,38 +57,6 @@ public class WxEntPayResult {
         this.deviceInfo = deviceInfo;
       }
     
    -  public String getNonceStr() {
    -    return nonceStr;
    -  }
    -
    -  public void setNonceStr(String nonceStr) {
    -    this.nonceStr = nonceStr;
    -  }
    -
    -  public String getResultCode() {
    -    return resultCode;
    -  }
    -
    -  public void setResultCode(String resultCode) {
    -    this.resultCode = resultCode;
    -  }
    -
    -  public String getErrCode() {
    -    return errCode;
    -  }
    -
    -  public void setErrCode(String errCode) {
    -    this.errCode = errCode;
    -  }
    -
    -  public String getErrCodeDes() {
    -    return errCodeDes;
    -  }
    -
    -  public void setErrCodeDes(String errCodeDes) {
    -    this.errCodeDes = errCodeDes;
    -  }
    -
       public String getPartnerTradeNo() {
         return partnerTradeNo;
       }
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxMpPayResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxMpPayResult.java
    deleted file mode 100644
    index 6f453204..00000000
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxMpPayResult.java
    +++ /dev/null
    @@ -1,259 +0,0 @@
    -package me.chanjar.weixin.mp.bean.pay;
    -
    -import java.io.Serializable;
    -
    -import org.apache.commons.lang3.builder.ToStringBuilder;
    -import org.apache.commons.lang3.builder.ToStringStyle;
    -
    -/**
    - * 
    - * 查询订单支付状态返回的结果
    - * 
    - * 查询订单(详见http://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_2)
    - *
    - * 
    - * - * @author ukid - */ -public class WxMpPayResult implements Serializable { - @Override - public String toString() { - return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE); - } - - private static final long serialVersionUID = -570934170727777190L; - - private String return_code; - private String return_msg; - private String appid; - private String mch_id; - private String nonce_str; - private String sign; - private String result_code; - private String err_code; - private String err_code_des; - private String trade_state; - private String trade_state_desc; - private String device_info; - private String openid; - private String is_subscribe; - private String trade_type; - private String bank_type; - private String total_fee; - private String coupon_fee; - private String fee_type; - private String transaction_id; - private String out_trade_no; - private String attach; - private String time_end; - /** - * 现金支付金额 cash_fee 是 Int 100 现金支付金额订单现金支付金额,详见支付金额 - */ - private String cash_fee; - - /** - * 现金支付货币类型 cash_fee_type 否 - * - */ - private String cash_fee_type; - - public String getReturn_code() { - return this.return_code; - } - - public String getReturn_msg() { - return this.return_msg; - } - - public String getAppid() { - return this.appid; - } - - public String getMch_id() { - return this.mch_id; - } - - public String getNonce_str() { - return this.nonce_str; - } - - public String getSign() { - return this.sign; - } - - public String getResult_code() { - return this.result_code; - } - - public String getErr_code() { - return this.err_code; - } - - public String getErr_code_des() { - return this.err_code_des; - } - - public String getTrade_state() { - return this.trade_state; - } - - public String getDevice_info() { - return this.device_info; - } - - public String getOpenid() { - return this.openid; - } - - public String getIs_subscribe() { - return this.is_subscribe; - } - - public String getTrade_type() { - return this.trade_type; - } - - public String getBank_type() { - return this.bank_type; - } - - public String getTotal_fee() { - return this.total_fee; - } - - public String getCoupon_fee() { - return this.coupon_fee; - } - - public String getFee_type() { - return this.fee_type; - } - - public String getTransaction_id() { - return this.transaction_id; - } - - public String getOut_trade_no() { - return this.out_trade_no; - } - - public String getAttach() { - return this.attach; - } - - public String getTime_end() { - return this.time_end; - } - - public void setReturn_code(String return_code) { - this.return_code = return_code; - } - - public void setReturn_msg(String return_msg) { - this.return_msg = return_msg; - } - - public void setAppid(String appid) { - this.appid = appid; - } - - public void setMch_id(String mch_id) { - this.mch_id = mch_id; - } - - public void setNonce_str(String nonce_str) { - this.nonce_str = nonce_str; - } - - public void setSign(String sign) { - this.sign = sign; - } - - public void setResult_code(String result_code) { - this.result_code = result_code; - } - - public void setErr_code(String err_code) { - this.err_code = err_code; - } - - public void setErr_code_des(String err_code_des) { - this.err_code_des = err_code_des; - } - - public void setTrade_state(String trade_state) { - this.trade_state = trade_state; - } - - public void setDevice_info(String device_info) { - this.device_info = device_info; - } - - public void setOpenid(String openid) { - this.openid = openid; - } - - public void setIs_subscribe(String is_subscribe) { - this.is_subscribe = is_subscribe; - } - - public void setTrade_type(String trade_type) { - this.trade_type = trade_type; - } - - public void setBank_type(String bank_type) { - this.bank_type = bank_type; - } - - public void setTotal_fee(String total_fee) { - this.total_fee = total_fee; - } - - public void setCoupon_fee(String coupon_fee) { - this.coupon_fee = coupon_fee; - } - - public void setFee_type(String fee_type) { - this.fee_type = fee_type; - } - - public void setTransaction_id(String transaction_id) { - this.transaction_id = transaction_id; - } - - public void setOut_trade_no(String out_trade_no) { - this.out_trade_no = out_trade_no; - } - - public void setAttach(String attach) { - this.attach = attach; - } - - public void setTime_end(String time_end) { - this.time_end = time_end; - } - - public String getTrade_state_desc() { - return this.trade_state_desc; - } - - public void setTrade_state_desc(String trade_state_desc) { - this.trade_state_desc = trade_state_desc; - } - - public String getCash_fee() { - return this.cash_fee; - } - - public void setCash_fee(String cash_fee) { - this.cash_fee = cash_fee; - } - - public String getCash_fee_type() { - return this.cash_fee_type; - } - - public void setCash_fee_type(String cash_fee_type) { - this.cash_fee_type = cash_fee_type; - } -} diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxPayBaseRequest.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxPayBaseRequest.java new file mode 100644 index 00000000..062152d8 --- /dev/null +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxPayBaseRequest.java @@ -0,0 +1,107 @@ +package me.chanjar.weixin.mp.bean.pay; + +import com.thoughtworks.xstream.annotations.XStreamAlias; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; + +/** + *
    + * Created by Binary Wang on 2016-10-24.
    + *  微信支付请求对象共用的参数存放类
    + * 注释中各行每个字段描述对应如下:
    + * 
  • 字段名 + *
  • 变量名 + *
  • 是否必填 + *
  • 类型 + *
  • 示例值 + *
  • 描述 + *
  • + * @author binarywang(Binary Wang) + */ +public abstract class WxPayBaseRequest { + /** + *
    +   * 公众账号ID
    +   * appid
    +   * 是
    +   * String(32)
    +   * wxd678efh567hg6787
    +   * 微信分配的公众账号ID(企业号corpid即为此appId)
    +   * 
    + */ + @XStreamAlias("appid") + protected String appid; + /** + *
    +   * 商户号
    +   * mch_id
    +   * 是
    +   * String(32)
    +   * 1230000109
    +   * 微信支付分配的商户号
    +   * 
    + */ + @XStreamAlias("mch_id") + protected String mchId; + /** + *
    +   * 随机字符串
    +   * nonce_str
    +   * 是
    +   * String(32)
    +   * 5K8264ILTKCH16CQ2502SI8ZNMTM67VS
    +   * 随机字符串,不长于32位。推荐随机数生成算法
    +   * 
    + */ + @XStreamAlias("nonce_str") + protected String nonceStr; + /** + *
    +   * 签名
    +   * sign
    +   * 是
    +   * String(32)
    +   * C380BEC2BFD727A4B6845133519F3AD6
    +   * 签名,详见签名生成算法
    +   * 
    + */ + @XStreamAlias("sign") + protected String sign; + + public String getAppid() { + return appid; + } + + public void setAppid(String appid) { + this.appid = appid; + } + + public String getMchId() { + return mchId; + } + + public void setMchId(String mchId) { + this.mchId = mchId; + } + + public String getNonceStr() { + return nonceStr; + } + + public void setNonceStr(String nonceStr) { + this.nonceStr = nonceStr; + } + + public String getSign() { + return sign; + } + + public void setSign(String sign) { + this.sign = sign; + } + + @Override + public String toString() { + return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE); + } +} diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxUnifiedOrderResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxPayBaseResult.java similarity index 61% rename from weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxUnifiedOrderResult.java rename to weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxPayBaseResult.java index 7dfc6598..cdec8273 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxUnifiedOrderResult.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxPayBaseResult.java @@ -1,59 +1,78 @@ package me.chanjar.weixin.mp.bean.pay; +import com.thoughtworks.xstream.annotations.XStreamAlias; import org.apache.commons.lang3.builder.ToStringBuilder; import org.apache.commons.lang3.builder.ToStringStyle; -import com.thoughtworks.xstream.annotations.XStreamAlias; - /** *
    - * 在发起微信支付前,需要调用统一下单接口,获取"预支付交易会话标识"返回的结果
    - * 统一下单(详见http://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1)
    + * 微信支付结果共用属性类
    + * Created by Binary Wang on 2016-10-24.
    + * @author binarywang(Binary Wang)
      * 
    - * - * @author chanjarster */ -@XStreamAlias("xml") -public class WxUnifiedOrderResult { +public abstract class WxPayBaseResult { + @Override + public String toString() { + return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE); + } + /** + * 返回状态码 + */ @XStreamAlias("return_code") - private String returnCode; + protected String returnCode; + /** + * 返回信息 + */ @XStreamAlias("return_msg") - private String returnMsg; + protected String returnMsg; + + /** + * 业务结果 + */ + @XStreamAlias("result_code") + private String resultCode; + + /** + * 错误代码 + */ + @XStreamAlias("err_code") + private String errCode; + + /** + * 错误代码描述 + */ + @XStreamAlias("err_code_des") + private String errCodeDes; + /** + * 公众账号ID + */ @XStreamAlias("appid") private String appid; + /** + * 商户号 + */ @XStreamAlias("mch_id") private String mchId; + /** + * 随机字符串 + */ @XStreamAlias("nonce_str") private String nonceStr; + /** + * 签名 + */ @XStreamAlias("sign") private String sign; - @XStreamAlias("result_code") - private String resultCode; - - @XStreamAlias("prepay_id") - private String prepayId; - - @XStreamAlias("trade_type") - private String tradeType; - - @XStreamAlias("err_code") - private String errCode; - - @XStreamAlias("err_code_des") - private String errCodeDes; - - @XStreamAlias("code_url") - private String codeURL; - public String getReturnCode() { - return this.returnCode; + return returnCode; } public void setReturnCode(String returnCode) { @@ -61,95 +80,66 @@ public class WxUnifiedOrderResult { } public String getReturnMsg() { - return this.returnMsg; + return returnMsg; } public void setReturnMsg(String returnMsg) { this.returnMsg = returnMsg; } - public String getAppid() { - return this.appid; - } - - public void setAppid(String appid) { - this.appid = appid; - } - - public String getMchId() { - return this.mchId; - } - - public void setMchId(String mchId) { - this.mchId = mchId; - } - - public String getNonceStr() { - return this.nonceStr; - } - - public void setNonceStr(String nonceStr) { - this.nonceStr = nonceStr; - } - - public String getSign() { - return this.sign; - } - - public void setSign(String sign) { - this.sign = sign; - } - public String getResultCode() { - return this.resultCode; + return resultCode; } public void setResultCode(String resultCode) { this.resultCode = resultCode; } - public String getPrepayId() { - return this.prepayId; + public String getErrCode() { + return errCode; } - public void setPrepayId(String prepayId) { - this.prepayId = prepayId; + public void setErrCode(String errCode) { + this.errCode = errCode; } - public String getTradeType() { - return this.tradeType; + public String getErrCodeDes() { + return errCodeDes; } - public void setTradeType(String tradeType) { - this.tradeType = tradeType; + public void setErrCodeDes(String errCodeDes) { + this.errCodeDes = errCodeDes; } - public String getErrCode() { - return this.errCode; + public String getAppid() { + return appid; } - public void setErrCode(String errCode) { - this.errCode = errCode; + public void setAppid(String appid) { + this.appid = appid; } - public String getErrCodeDes() { - return this.errCodeDes; + public String getMchId() { + return mchId; } - public void setErrCodeDes(String errCodeDes) { - this.errCodeDes = errCodeDes; + public void setMchId(String mchId) { + this.mchId = mchId; } - public String getCodeURL() { - return this.codeURL; + public String getNonceStr() { + return nonceStr; } - public void setCodeURL(String codeURL) { - this.codeURL = codeURL; + public void setNonceStr(String nonceStr) { + this.nonceStr = nonceStr; } - @Override - public String toString() { - return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE); + public String getSign() { + return sign; + } + + public void setSign(String sign) { + this.sign = sign; } } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxMpPayCallback.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxPayJsSDKCallback.java similarity index 97% rename from weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxMpPayCallback.java rename to weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxPayJsSDKCallback.java index e32e721e..11b8b0d5 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxMpPayCallback.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxPayJsSDKCallback.java @@ -4,16 +4,16 @@ import java.io.Serializable; /** * pre> 订单支付状态回调 - * + * * 支付结果通知(详见http://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_7) * * /pre> * * @author ukid */ -public class WxMpPayCallback implements Serializable { +public class WxPayJsSDKCallback implements Serializable { /** - * + * */ private static final long serialVersionUID = -4143804055690843641L; private String return_code; @@ -263,7 +263,7 @@ public class WxMpPayCallback implements Serializable { @Override public String toString() { - return "WxMpPayCallback [return_code=" + this.return_code + ", return_msg=" + return "WxPayJsSDKCallback [return_code=" + this.return_code + ", return_msg=" + this.return_msg + ", appid=" + this.appid + ", mch_id=" + this.mch_id + ", device_info=" + this.device_info + ", nonce_str=" + this.nonce_str + ", sign=" + this.sign + ", result_code=" + this.result_code diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxPayOrderQueryRequest.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxPayOrderQueryRequest.java new file mode 100644 index 00000000..ede1b06a --- /dev/null +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxPayOrderQueryRequest.java @@ -0,0 +1,63 @@ +package me.chanjar.weixin.mp.bean.pay; + +import com.thoughtworks.xstream.annotations.XStreamAlias; + +/** + *
    + * 订单查询请求对象
    + * Created by Binary Wang on 2016-10-24.
    + * 注释中各行每个字段描述对应如下:
    + * 
  • 字段名 + *
  • 变量名 + *
  • 是否必填 + *
  • 类型 + *
  • 示例值 + *
  • 描述 + *
  • + * @author binarywang(Binary Wang) + */ +@XStreamAlias("xml") +public class WxPayOrderQueryRequest extends WxPayBaseRequest { + + /** + *
    +   * 微信订单号
    +   * transaction_id
    +   * 二选一
    +   * String(32)
    +   * 1009660380201506130728806387
    +   * 微信的订单号,优先使用
    +   * 
    + */ + @XStreamAlias("transaction_id") + private String transactionId; + + /** + *
    +   * 商户订单号
    +   * out_trade_no
    +   * 二选一
    +   * String(32)
    +   * 20150806125346
    +   * 商户系统内部的订单号,当没提供transaction_id时需要传这个。
    +   * 
    + */ + @XStreamAlias("out_trade_no") + private String outTradeNo; + + public String getTransactionId() { + return transactionId; + } + + public void setTransactionId(String transactionId) { + this.transactionId = transactionId; + } + + public String getOutTradeNo() { + return outTradeNo; + } + + public void setOutTradeNo(String outTradeNo) { + this.outTradeNo = outTradeNo; + } +} diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxPayOrderQueryResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxPayOrderQueryResult.java new file mode 100644 index 00000000..25dc6cc8 --- /dev/null +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxPayOrderQueryResult.java @@ -0,0 +1,444 @@ +package me.chanjar.weixin.mp.bean.pay; + +import com.google.common.collect.Lists; +import com.thoughtworks.xstream.annotations.XStreamAlias; + +import java.util.List; + +/** + *
    + *  查询订单 返回结果对象
    + * Created by Binary Wang on 2016-10-24.
    + * 注释中各行每个字段描述对应如下:
    + * 
  • 字段名 + *
  • 变量名 + *
  • 是否必填 + *
  • 类型 + *
  • 示例值 + *
  • 描述 + *
  • + * @author binarywang(Binary Wang) + */ +@XStreamAlias("xml") +public class WxPayOrderQueryResult extends WxPayBaseResult { + + /** + *
    设备号
    +   * device_info
    +   * 否
    +   * String(32)
    +   * 013467007045764
    +   * 微信支付分配的终端设备号,
    +   * 
    + */ + @XStreamAlias("device_info") + private String deviceInfo; + + /** + *
    用户标识
    +   * openid
    +   * 是
    +   * String(128)
    +   * oUpF8uMuAJO_M2pxb1Q9zNjWeS6o
    +   * 用户在商户appid下的唯一标识
    +   * 
    + */ + @XStreamAlias("openid") + private String openid; + + /** + *
    是否关注公众账号
    +   * is_subscribe
    +   * 否
    +   * String(1)
    +   * Y
    +   * 用户是否关注公众账号,Y-关注,N-未关注,仅在公众账号类型支付有效
    +   * 
    + */ + @XStreamAlias("is_subscribe") + private String isSubscribe; + + /** + *
    交易类型
    +   * trade_type
    +   * 是
    +   * String(16)
    +   * JSAPI
    +   * 调用接口提交的交易类型,取值如下:JSAPI,NATIVE,APP,MICROPAY,详细说明见参数规定
    +   * 
    + */ + @XStreamAlias("trade_type") + private String tradeType; + + /** + *
    交易状态
    +   * trade_state
    +   * 是
    +   * String(32)
    +   * SUCCESS
    +   * SUCCESS—支付成功,REFUND—转入退款,NOTPAY—未支付,CLOSED—已关闭,REVOKED—已撤销(刷卡支付),USERPAYING--用户支付中,PAYERROR--支付失败(其他原因,如银行返回失败)
    +   * 
    + */ + @XStreamAlias("trade_state") + private String tradeState; + + /** + *
    付款银行
    +   * bank_type
    +   * 是
    +   * String(16)
    +   * CMC
    +   * 银行类型,采用字符串类型的银行标识
    +   * 
    + */ + @XStreamAlias("bank_type") + private String bankType; + + /** + *
    订单金额
    +   * total_fee
    +   * 是
    +   * Int
    +   * 100
    +   * 订单总金额,单位为分
    +   * 
    + */ + @XStreamAlias("total_fee") + private Integer totalFee; + + /** + *
    应结订单金额
    +   * settlement_total_fee
    +   * 否
    +   * Int
    +   * 100
    +   * 应结订单金额=订单金额-非充值代金券金额,应结订单金额<=订单金额。
    +   * 
    + */ + @XStreamAlias("settlement_total_fee") + private Integer settlementTotalFee; + + /** + *
    货币种类
    +   * fee_type
    +   * 否
    +   * String(8)
    +   * CNY
    +   * 货币类型,符合ISO 4217标准的三位字母代码,默认人民币:CNY,其他值列表详见货币类型
    +   * 
    + */ + @XStreamAlias("fee_type") + private String feeType; + + /** + *
    现金支付金额
    +   * cash_fee
    +   * 是
    +   * Int
    +   * 100
    +   * 现金支付金额订单现金支付金额,详见支付金额
    +   * 
    + */ + @XStreamAlias("cash_fee") + private Integer cashFee; + + /** + *
    现金支付货币类型
    +   * cash_fee_type
    +   * 否
    +   * String(16)
    +   * CNY
    +   * 货币类型,符合ISO 4217标准的三位字母代码,默认人民币:CNY,其他值列表详见货币类型
    +   * 
    + */ + @XStreamAlias("cash_fee_type") + private String cashFeeType; + + /** + *
    代金券金额
    +   * coupon_fee
    +   * 否
    +   * Int
    +   * 100
    +   * “代金券”金额<=订单金额,订单金额-“代金券”金额=现金支付金额,详见支付金额
    +   * 
    + */ + @XStreamAlias("coupon_fee") + private Integer couponFee; + + /** + *
    代金券使用数量
    +   * coupon_count
    +   * 否
    +   * Int
    +   * 1
    +   * 代金券使用数量
    +   * 
    + */ + @XStreamAlias("coupon_count") + private Integer couponCount; + + private List coupons; + + public static class Coupon { + /** + *
    代金券类型
    +     * coupon_type_$n
    +     * 否
    +     * String
    +     * CASH
    +     * 
  • CASH--充值代金券 + *
  • NO_CASH---非充值代金券 + * 订单使用代金券时有返回(取值:CASH、NO_CASH)。$n为下标,从0开始编号,举例:coupon_type_$0 + *
  • + */ + private String couponType; + + /** + *
    代金券ID
    +     * coupon_id_$n
    +     * 否
    +     * String(20)
    +     * 10000
    +     * 代金券ID, $n为下标,从0开始编号
    +     * 
    + */ + private String couponId; + + /** + *
    单个代金券支付金额
    +     * coupon_fee_$n
    +     * 否
    +     * Int
    +     * 100
    +     * 单个代金券支付金额, $n为下标,从0开始编号
    +     * 
    + */ + private Integer couponFee; + + public Coupon(String couponType, String couponId, Integer couponFee) { + this.couponType = couponType; + this.couponId = couponId; + this.couponFee = couponFee; + } + } + + /** + *
    微信支付订单号
    +   * transaction_id
    +   * 是
    +   * String(32)
    +   * 1009660380201506130728806387
    +   * 微信支付订单号
    +   * 
    + */ + @XStreamAlias("transaction_id") + private String transactionId; + + /** + *
    商户订单号
    +   * out_trade_no
    +   * 是
    +   * String(32)
    +   * 20150806125346
    +   * 商户系统的订单号,与请求一致。
    +   * 
    + */ + @XStreamAlias("out_trade_no") + private String outTradeNo; + + /** + *
    附加数据
    +   * attach
    +   * 否
    +   * String(128)
    +   * 深圳分店
    +   * 附加数据,原样返回
    +   * 
    + */ + @XStreamAlias("attach") + private String attach; + + /** + *
    支付完成时间
    +   * time_end
    +   * 是
    +   * String(14)
    +   * 20141030133525
    +   * 订单支付时间,格式为yyyyMMddHHmmss,如2009年12月25日9点10分10秒表示为20091225091010。其他详见时间规则
    +   * 
    + */ + @XStreamAlias("time_end") + private String timeEnd; + + /** + *
    交易状态描述
    +   * trade_state_desc
    +   * 是
    +   * String(256)
    +   * 支付失败,请重新下单支付
    +   * 对当前查询订单状态的描述和下一步操作的指引
    +   * 
    + */ + @XStreamAlias("trade_state_desc") + private String tradeStateDesc; + + public String getDeviceInfo() { + return deviceInfo; + } + + public void setDeviceInfo(String deviceInfo) { + this.deviceInfo = deviceInfo; + } + + public String getOpenid() { + return openid; + } + + public void setOpenid(String openid) { + this.openid = openid; + } + + public String getIsSubscribe() { + return isSubscribe; + } + + public void setIsSubscribe(String isSubscribe) { + this.isSubscribe = isSubscribe; + } + + public String getTradeType() { + return tradeType; + } + + public void setTradeType(String tradeType) { + this.tradeType = tradeType; + } + + public String getTradeState() { + return tradeState; + } + + public void setTradeState(String tradeState) { + this.tradeState = tradeState; + } + + public String getBankType() { + return bankType; + } + + public void setBankType(String bankType) { + this.bankType = bankType; + } + + public Integer getTotalFee() { + return totalFee; + } + + public void setTotalFee(Integer totalFee) { + this.totalFee = totalFee; + } + + public Integer getSettlementTotalFee() { + return settlementTotalFee; + } + + public void setSettlementTotalFee(Integer settlementTotalFee) { + this.settlementTotalFee = settlementTotalFee; + } + + public String getFeeType() { + return feeType; + } + + public void setFeeType(String feeType) { + this.feeType = feeType; + } + + public Integer getCashFee() { + return cashFee; + } + + public void setCashFee(Integer cashFee) { + this.cashFee = cashFee; + } + + public String getCashFeeType() { + return cashFeeType; + } + + public void setCashFeeType(String cashFeeType) { + this.cashFeeType = cashFeeType; + } + + public Integer getCouponFee() { + return couponFee; + } + + public void setCouponFee(Integer couponFee) { + this.couponFee = couponFee; + } + + public Integer getCouponCount() { + return couponCount; + } + + public void setCouponCount(Integer couponCount) { + this.couponCount = couponCount; + } + + public List getCoupons() { + return coupons; + } + + public void setCoupons(List coupons) { + this.coupons = coupons; + } + + public String getTransactionId() { + return transactionId; + } + + public void setTransactionId(String transactionId) { + this.transactionId = transactionId; + } + + public String getOutTradeNo() { + return outTradeNo; + } + + public void setOutTradeNo(String outTradeNo) { + this.outTradeNo = outTradeNo; + } + + public String getAttach() { + return attach; + } + + public void setAttach(String attach) { + this.attach = attach; + } + + public String getTimeEnd() { + return timeEnd; + } + + public void setTimeEnd(String timeEnd) { + this.timeEnd = timeEnd; + } + + public String getTradeStateDesc() { + return tradeStateDesc; + } + + public void setTradeStateDesc(String tradeStateDesc) { + this.tradeStateDesc = tradeStateDesc; + } + + public void composeCoupons(String xmlString){ + if(this.couponCount > 0 ){ + this.coupons = Lists.newArrayList(); + //TODO 暂时待实现 + } + } +} diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxMpPayRefundRequest.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxPayRefundRequest.java similarity index 99% rename from weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxMpPayRefundRequest.java rename to weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxPayRefundRequest.java index 26f837b4..bc2802b7 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxMpPayRefundRequest.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxPayRefundRequest.java @@ -19,7 +19,7 @@ import me.chanjar.weixin.common.annotation.Required; * Created by Binary Wang on 2016-10-08. */ @XStreamAlias("xml") -public class WxMpPayRefundRequest { +public class WxPayRefundRequest { /** *
        * 公众账号ID
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxMpPayRefundResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxPayRefundResult.java
    similarity index 68%
    rename from weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxMpPayRefundResult.java
    rename to weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxPayRefundResult.java
    index 5462d44a..ad20b8f1 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxMpPayRefundResult.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxPayRefundResult.java
    @@ -1,8 +1,6 @@
     package me.chanjar.weixin.mp.bean.pay;
     
     import com.thoughtworks.xstream.annotations.XStreamAlias;
    -import org.apache.commons.lang3.builder.ToStringBuilder;
    -import org.apache.commons.lang3.builder.ToStringStyle;
     
     import java.io.Serializable;
     
    @@ -15,39 +13,12 @@ import java.io.Serializable;
      *
      */
     @XStreamAlias("xml")
    -public class WxMpPayRefundResult implements Serializable {
    +public class WxPayRefundResult extends WxPayBaseResult implements Serializable{
       private static final long serialVersionUID = 1L;
     
    -  @XStreamAlias("return_code")
    -  private String returnCode;
    -
    -  @XStreamAlias("return_msg")
    -  private String returnMsg;
    -
    -  @XStreamAlias("result_code")
    -  private String resultCode;
    -
    -  @XStreamAlias("err_code")
    -  private String errCode;
    -
    -  @XStreamAlias("err_code_des")
    -  private String errCodeDes;
    -
    -  @XStreamAlias("appid")
    -  private String appid;
    -
    -  @XStreamAlias("mch_id")
    -  private String mchId;
    -
       @XStreamAlias("device_info")
       private String deviceInfo;
     
    -  @XStreamAlias("nonce_str")
    -  private String nonceStr;
    -
    -  @XStreamAlias("sign")
    -  private String sign;
    -
       @XStreamAlias("transaction_id")
       private String transactionId;
     
    @@ -103,46 +74,6 @@ public class WxMpPayRefundResult implements Serializable {
         this.returnMsg = returnMsg;
       }
     
    -  public String getResultCode() {
    -    return this.resultCode;
    -  }
    -
    -  public void setResultCode(String resultCode) {
    -    this.resultCode = resultCode;
    -  }
    -
    -  public String getErrCode() {
    -    return this.errCode;
    -  }
    -
    -  public void setErrCode(String errCode) {
    -    this.errCode = errCode;
    -  }
    -
    -  public String getErrCodeDes() {
    -    return this.errCodeDes;
    -  }
    -
    -  public void setErrCodeDes(String errCodeDes) {
    -    this.errCodeDes = errCodeDes;
    -  }
    -
    -  public String getAppid() {
    -    return this.appid;
    -  }
    -
    -  public void setAppid(String appid) {
    -    this.appid = appid;
    -  }
    -
    -  public String getMchId() {
    -    return this.mchId;
    -  }
    -
    -  public void setMchId(String mchId) {
    -    this.mchId = mchId;
    -  }
    -
       public String getDeviceInfo() {
         return this.deviceInfo;
       }
    @@ -151,22 +82,6 @@ public class WxMpPayRefundResult implements Serializable {
         this.deviceInfo = deviceInfo;
       }
     
    -  public String getNonceStr() {
    -    return this.nonceStr;
    -  }
    -
    -  public void setNonceStr(String nonceStr) {
    -    this.nonceStr = nonceStr;
    -  }
    -
    -  public String getSign() {
    -    return this.sign;
    -  }
    -
    -  public void setSign(String sign) {
    -    this.sign = sign;
    -  }
    -
       public String getTransactionId() {
         return this.transactionId;
       }
    @@ -271,9 +186,4 @@ public class WxMpPayRefundResult implements Serializable {
         this.couponRefundId = couponRefundId;
       }
     
    -  @Override
    -  public String toString() {
    -    return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
    -  }
    -
     }
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxSendRedpackRequest.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxPaySendRedpackRequest.java
    similarity index 96%
    rename from weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxSendRedpackRequest.java
    rename to weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxPaySendRedpackRequest.java
    index abe0d68f..27a46a71 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxSendRedpackRequest.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxPaySendRedpackRequest.java
    @@ -8,7 +8,7 @@ import com.thoughtworks.xstream.annotations.XStreamAlias;
      * @author binarywang (https://github.com/binarywang)
      */
     @XStreamAlias("xml")
    -public class WxSendRedpackRequest {
    +public class WxPaySendRedpackRequest {
       /**
       * mch_billno
       * 商户订单号(每个订单号必须唯一)  组成:mch_id+yyyymmdd+10位一天内不能重复的数字。  接口根据商户订单号支持重入,如出现超时可再调用。
    @@ -18,7 +18,7 @@ public class WxSendRedpackRequest {
     
       /**
        * send_name
    -   * 商户名称 
    +   * 商户名称
        * 红包发送者名称
        */
       @XStreamAlias("send_name")
    @@ -117,7 +117,7 @@ public class WxSendRedpackRequest {
        * 场景id
        * PRODUCT_1:商品促销
        * PRODUCT_2:抽奖
    -   * PRODUCT_3:虚拟物品兑奖 
    +   * PRODUCT_3:虚拟物品兑奖
        * PRODUCT_4:企业内部福利
        * PRODUCT_5:渠道分润
        * PRODUCT_6:保险回馈
    @@ -135,7 +135,7 @@ public class WxSendRedpackRequest {
        * 活动信息
        * posttime:用户操作的时间戳
        * mobile:业务系统账号的手机号,国家代码-手机号。不需要+号
    -   * deviceid :mac 地址或者设备唯一标识 
    +   * deviceid :mac 地址或者设备唯一标识
        * clientversion :用户操作的客户端版本
        * 把值为非空的信息用key=value进行拼接,再进行urlencode
        * urlencode(posttime=xx&mobile=xx&deviceid=xx)
    @@ -150,7 +150,7 @@ public class WxSendRedpackRequest {
        * consume_mch_id
        * 资金授权商户号
        * 资金授权商户号
    -   * 服务商替特约商户发放时使用  
    +   * 服务商替特约商户发放时使用
        * 非必填字段
        * 
    */ diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxPaySendRedpackResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxPaySendRedpackResult.java new file mode 100644 index 00000000..4a5ab146 --- /dev/null +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxPaySendRedpackResult.java @@ -0,0 +1,82 @@ +package me.chanjar.weixin.mp.bean.pay; + +import com.thoughtworks.xstream.annotations.XStreamAlias; + +import java.io.Serializable; + +/** + * 向微信用户个人发现金红包返回结果 + * https://pay.weixin.qq.com/wiki/doc/api/cash_coupon.php?chapter=13_5 + * @author kane + * + */ +@XStreamAlias("xml") +public class WxPaySendRedpackResult extends WxPayBaseResult implements Serializable { + private static final long serialVersionUID = -4837415036337132073L; + + @XStreamAlias("mch_billno") + private String mchBillno; + + @XStreamAlias("wxappid") + private String wxappid; + + @XStreamAlias("re_openid") + private String reOpenid; + + @XStreamAlias("total_amount") + private int totalAmount; + + @XStreamAlias("send_time") + private String sendTime; + + @XStreamAlias("send_listid") + private String sendListid; + + public String getMchBillno() { + return mchBillno; + } + + public void setMchBillno(String mchBillno) { + this.mchBillno = mchBillno; + } + + public String getWxappid() { + return wxappid; + } + + public void setWxappid(String wxappid) { + this.wxappid = wxappid; + } + + public String getReOpenid() { + return reOpenid; + } + + public void setReOpenid(String reOpenid) { + this.reOpenid = reOpenid; + } + + public int getTotalAmount() { + return totalAmount; + } + + public void setTotalAmount(int totalAmount) { + this.totalAmount = totalAmount; + } + + public String getSendTime() { + return sendTime; + } + + public void setSendTime(String sendTime) { + this.sendTime = sendTime; + } + + public String getSendListid() { + return sendListid; + } + + public void setSendListid(String sendListid) { + this.sendListid = sendListid; + } +} diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxUnifiedOrderRequest.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxPayUnifiedOrderRequest.java similarity index 91% rename from weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxUnifiedOrderRequest.java rename to weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxPayUnifiedOrderRequest.java index 7cadd246..de3518ae 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxUnifiedOrderRequest.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxPayUnifiedOrderRequest.java @@ -1,10 +1,6 @@ package me.chanjar.weixin.mp.bean.pay; -import org.apache.commons.lang3.builder.ToStringBuilder; -import org.apache.commons.lang3.builder.ToStringStyle; - import com.thoughtworks.xstream.annotations.XStreamAlias; - import me.chanjar.weixin.common.annotation.Required; /** @@ -23,33 +19,7 @@ import me.chanjar.weixin.common.annotation.Required; * @author binarywang (https://github.com/binarywang) */ @XStreamAlias("xml") -public class WxUnifiedOrderRequest { - - /** - *
    -   * 公众账号ID
    -   * appid
    -   * 是
    -   * String(32)
    -   * wxd678efh567hg6787
    -   * 微信分配的公众账号ID(企业号corpid即为此appId)
    -   * 
    - */ - @XStreamAlias("appid") - private String appid; - - /** - *
    -   * 商户号
    -   * mch_id
    -   * 是
    -   * String(32)
    -   * 1230000109
    -   * 微信支付分配的商户号
    -   * 
    - */ - @XStreamAlias("mch_id") - private String mchId; +public class WxPayUnifiedOrderRequest extends WxPayBaseRequest { /** *
    @@ -64,32 +34,6 @@ public class WxUnifiedOrderRequest {
       @XStreamAlias("device_info")
       private String deviceInfo;
     
    -  /**
    -   * 
    -   * 随机字符串
    -   * nonce_str
    -   * 是
    -   * String(32)
    -   * 5K8264ILTKCH16CQ2502SI8ZNMTM67VS
    -   * 随机字符串,不长于32位。推荐随机数生成算法
    -   * 
    - */ - @XStreamAlias("nonce_str") - private String nonceStr; - - /** - *
    -   * 签名
    -   * sign
    -   * 是
    -   * String(32)
    -   * C380BEC2BFD727A4B6845133519F3AD6
    -   * 签名,详见签名生成算法
    -   * 
    - */ - @XStreamAlias("sign") - private String sign; - /** *
        * 商品描述
    @@ -482,11 +426,6 @@ public class WxUnifiedOrderRequest {
         this.openid = openid;
       }
     
    -  @Override
    -  public String toString() {
    -    return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
    -  }
    -
       public static WxUnifiedOrderRequestBuilder builder() {
         return new WxUnifiedOrderRequestBuilder();
       }
    @@ -613,7 +552,7 @@ public class WxUnifiedOrderRequest {
           return this;
         }
     
    -    public WxUnifiedOrderRequestBuilder from(WxUnifiedOrderRequest origin) {
    +    public WxUnifiedOrderRequestBuilder from(WxPayUnifiedOrderRequest origin) {
           this.appid(origin.appid);
           this.mchId(origin.mchId);
           this.deviceInfo(origin.deviceInfo);
    @@ -637,8 +576,8 @@ public class WxUnifiedOrderRequest {
           return this;
         }
     
    -    public WxUnifiedOrderRequest build() {
    -      WxUnifiedOrderRequest m = new WxUnifiedOrderRequest();
    +    public WxPayUnifiedOrderRequest build() {
    +      WxPayUnifiedOrderRequest m = new WxPayUnifiedOrderRequest();
           m.appid = this.appid;
           m.mchId = this.mchId;
           m.deviceInfo = this.deviceInfo;
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxPayUnifiedOrderResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxPayUnifiedOrderResult.java
    new file mode 100644
    index 00000000..012da5a4
    --- /dev/null
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxPayUnifiedOrderResult.java
    @@ -0,0 +1,48 @@
    +package me.chanjar.weixin.mp.bean.pay;
    +
    +import com.thoughtworks.xstream.annotations.XStreamAlias;
    +
    +/**
    + * 
    + * 在发起微信支付前,需要调用统一下单接口,获取"预支付交易会话标识"返回的结果
    + * 统一下单(详见http://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1)
    + * 
    + * + * @author chanjarster + */ +@XStreamAlias("xml") +public class WxPayUnifiedOrderResult extends WxPayBaseResult { + + @XStreamAlias("prepay_id") + private String prepayId; + + @XStreamAlias("trade_type") + private String tradeType; + + @XStreamAlias("code_url") + private String codeURL; + + public String getPrepayId() { + return this.prepayId; + } + + public void setPrepayId(String prepayId) { + this.prepayId = prepayId; + } + + public String getTradeType() { + return this.tradeType; + } + + public void setTradeType(String tradeType) { + this.tradeType = tradeType; + } + + public String getCodeURL() { + return this.codeURL; + } + + public void setCodeURL(String codeURL) { + this.codeURL = codeURL; + } +} diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxRedpackResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxRedpackResult.java deleted file mode 100644 index a8287be6..00000000 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxRedpackResult.java +++ /dev/null @@ -1,105 +0,0 @@ -package me.chanjar.weixin.mp.bean.pay; - -import java.io.Serializable; - -import org.apache.commons.lang3.builder.ToStringBuilder; -import org.apache.commons.lang3.builder.ToStringStyle; - -import com.thoughtworks.xstream.annotations.XStreamAlias; - -/** - * 向微信用户个人发现金红包返回结果 - * https://pay.weixin.qq.com/wiki/doc/api/cash_coupon.php?chapter=13_5 - * @author kane - * - */ -@XStreamAlias("xml") -public class WxRedpackResult implements Serializable { - - private static final long serialVersionUID = -4837415036337132073L; - - @XStreamAlias("return_code") - private String returnCode; - @XStreamAlias("return_msg") - private String returnMsg; - @XStreamAlias("sign") - private String sign; - @XStreamAlias("result_code") - private String resultCode; - - @XStreamAlias("err_code") - private String errCode; - @XStreamAlias("err_code_des") - private String errCodeDes; - @XStreamAlias("mch_billno") - private String mchBillno; - @XStreamAlias("mch_id") - private String mchId; - @XStreamAlias("wxappid") - private String wxappid; - @XStreamAlias("re_openid") - private String reOpenid; - @XStreamAlias("total_amount") - private int totalAmount; - @XStreamAlias("send_time") - private String sendTime; - @XStreamAlias("send_listid") - private String sendListid; - - public String getErrCode() { - return this.errCode; - } - - public String getErrCodeDes() { - return this.errCodeDes; - } - - public String getReturnCode() { - return this.returnCode; - } - - public String getReturnMsg() { - return this.returnMsg; - } - - public String getSign() { - return this.sign; - } - - public String getResultCode() { - return this.resultCode; - } - - public String getMchBillno() { - return this.mchBillno; - } - - public String getMchId() { - return this.mchId; - } - - public String getWxappid() { - return this.wxappid; - } - - public String getReOpenid() { - return this.reOpenid; - } - - public int getTotalAmount() { - return this.totalAmount; - } - - public String getSendTime() { - return this.sendTime; - } - - public String getSendListid() { - return this.sendListid; - } - - @Override - public String toString() { - return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE); - } -} diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImplTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImplTest.java index 17cf5eec..51414e1b 100644 --- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImplTest.java +++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImplTest.java @@ -27,11 +27,6 @@ public class WxMpPayServiceImplTest { } - @Test - public void testGetJSSDKPayResult() throws Exception { - - } - @Test public void testGetJSSDKCallbackData() throws Exception { @@ -39,13 +34,13 @@ public class WxMpPayServiceImplTest { @Test public void testRefund() throws Exception { - WxMpPayRefundRequest request = new WxMpPayRefundRequest(); + WxPayRefundRequest request = new WxPayRefundRequest(); request.setOutRefundNo("aaa"); request.setOutTradeNo("1111"); request.setTotalFee(1222); request.setRefundFee(111); File keyFile = new File("E:\\dlt.p12"); - WxMpPayRefundResult result = this.wxService.getPayService().refund(request, keyFile); + WxPayRefundResult result = this.wxService.getPayService().refund(request, keyFile); System.err.println(result); } @@ -56,30 +51,41 @@ public class WxMpPayServiceImplTest { @Test public void testSendRedpack() throws Exception { - WxSendRedpackRequest request = new WxSendRedpackRequest(); + WxPaySendRedpackRequest request = new WxPaySendRedpackRequest(); request.setActName("abc"); request.setClientIp("aaa"); request.setMchBillno("aaaa"); request .setReOpenid(((WxXmlMpInMemoryConfigStorage) this.wxService.getWxMpConfigStorage()).getOpenid()); File keyFile = new File("E:\\dlt.p12"); - WxRedpackResult redpackResult = this.wxService.getPayService().sendRedpack(request, keyFile); + WxPaySendRedpackResult redpackResult = this.wxService.getPayService().sendRedpack(request, keyFile); System.err.println(redpackResult); } /** - * Test method for {@link me.chanjar.weixin.mp.api.impl.WxMpPayServiceImpl#unifiedOrder(me.chanjar.weixin.mp.bean.pay.WxUnifiedOrderRequest)}. + * Test method for {@link me.chanjar.weixin.mp.api.impl.WxMpPayServiceImpl#unifiedOrder(WxPayUnifiedOrderRequest)}. * @throws WxErrorException */ @Test public void testUnifiedOrder() throws WxErrorException { - WxUnifiedOrderResult result = this.wxService.getPayService() - .unifiedOrder(WxUnifiedOrderRequest.builder().body("1111111") + WxPayUnifiedOrderResult result = this.wxService.getPayService() + .unifiedOrder(WxPayUnifiedOrderRequest.builder().body("1111111") .totalFee(1).spbillCreateIp("111111").notifyURL("111111") .tradeType("JSAPI").openid("122").outTradeNo("111111").build()); System.err.println(result); } + /** + * Test method for {@link me.chanjar.weixin.mp.api.impl.WxMpPayServiceImpl#queryOrder(String, String)} . + * @throws WxErrorException + */ + @Test + public final void testQueryOrder() throws WxErrorException { + //System.err.println(this.wxService.getPayService().queryOrder(null, null)); + System.err.println(this.wxService.getPayService().queryOrder("11212121", null)); + System.err.println(this.wxService.getPayService().queryOrder(null, "11111")); + } + /** * Test method for {@link me.chanjar.weixin.mp.api.impl.WxMpPayServiceImpl#entPay(WxEntPayRequest, File)}. * @throws WxErrorException diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/WxRedpackResultTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/WxRedpackResultTest.java index 5a5275d4..557065ca 100644 --- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/WxRedpackResultTest.java +++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/WxRedpackResultTest.java @@ -8,7 +8,7 @@ import org.junit.Test; import com.thoughtworks.xstream.XStream; import me.chanjar.weixin.common.util.xml.XStreamInitializer; -import me.chanjar.weixin.mp.bean.pay.WxRedpackResult; +import me.chanjar.weixin.mp.bean.pay.WxPaySendRedpackResult; public class WxRedpackResultTest { @@ -17,44 +17,44 @@ public class WxRedpackResultTest { @Before public void setup() { this.xstream = XStreamInitializer.getInstance(); - this.xstream.processAnnotations(WxRedpackResult.class); + this.xstream.processAnnotations(WxPaySendRedpackResult.class); } - + @Test public void loadSuccessResult() { - final String successSample = "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "10010404\n" + - "\n" + - "\n" + - "1\n" + - "100000000020150520314766074200\n" + - "20150520102602\n" + + final String successSample = "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "10010404\n" + + "\n" + + "\n" + + "1\n" + + "100000000020150520314766074200\n" + + "20150520102602\n" + ""; - WxRedpackResult wxMpRedpackResult = (WxRedpackResult) this.xstream.fromXML(successSample); + WxPaySendRedpackResult wxMpRedpackResult = (WxPaySendRedpackResult) this.xstream.fromXML(successSample); assertEquals("SUCCESS", wxMpRedpackResult.getReturnCode()); assertEquals("SUCCESS", wxMpRedpackResult.getResultCode()); assertEquals("20150520102602", wxMpRedpackResult.getSendTime()); } - + @Test public void loadFailureResult() { - final String failureSample = "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "10010404\n" + - "\n" + - "\n" + - "1\n" + + final String failureSample = "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "10010404\n" + + "\n" + + "\n" + + "1\n" + ""; - WxRedpackResult wxMpRedpackResult = (WxRedpackResult) this.xstream.fromXML(failureSample); + WxPaySendRedpackResult wxMpRedpackResult = (WxPaySendRedpackResult) this.xstream.fromXML(failureSample); assertEquals("FAIL", wxMpRedpackResult.getReturnCode()); assertEquals("FAIL", wxMpRedpackResult.getResultCode()); assertEquals("onqOjjmM1tad-3ROpncN-yUfa6uI", wxMpRedpackResult.getReOpenid()); From 585cee0fd5f679680906b29b7a9fb6b0c1345e5c Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Tue, 25 Oct 2016 10:46:43 +0800 Subject: [PATCH 48/83] =?UTF-8?q?=E4=BF=AE=E6=94=B9pom=E6=96=87=E4=BB=B6?= =?UTF-8?q?=EF=BC=8C=E5=A2=9E=E5=8A=A0=E8=B4=A1=E7=8C=AE=E8=80=85=E4=BF=A1?= =?UTF-8?q?=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/pom.xml b/pom.xml index 2724dfcc..7418974e 100644 --- a/pom.xml +++ b/pom.xml @@ -9,7 +9,7 @@ pom WeiXin Java Tools - Parent 微信公众号、企业号上级POM - https://github.com/binarywang/weixin-java-tools + https://github.com/wechat-group/weixin-java-tools @@ -22,17 +22,24 @@ Daniel Qian chanjarster@gmail.com + https://github.com/chanjarster Binary Wang binarywang@gmail.com + https://github.com/binarywang + + + gaigeshen + gaigeshen@qq.com + https://github.com/gaigeshen - scm:git:https://github.com/binarywang/weixin-java-tools.git - scm:git:git@github.com:binarywang/weixin-java-tools.git - https://github.com/binarywang/weixin-java-tools + scm:git:https://github.com/wechat-group/weixin-java-tools.git + scm:git:git@github.com:wechat-group/weixin-java-tools.git + https://github.com/wechat-group/weixin-java-tools From 912ef628412b1a8e965eaccd88ba46f04094ec88 Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Tue, 25 Oct 2016 12:05:50 +0800 Subject: [PATCH 49/83] =?UTF-8?q?=E9=87=8D=E6=9E=84=E5=AE=A2=E6=9C=8D?= =?UTF-8?q?=E6=B6=88=E6=81=AF=E7=9B=B8=E5=85=B3=E5=91=BD=E5=90=8D=EF=BC=8C?= =?UTF-8?q?=E6=9B=BF=E6=8D=A2=E4=B8=8D=E5=90=88=E7=90=86=E7=9A=84=E5=91=BD?= =?UTF-8?q?=E5=90=8D=EF=BC=9ACustomMessage=20->=20KefuMessage?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../weixin/mp/api/WxMpKefuService.java | 17 ++--- .../mp/api/impl/WxMpKefuServiceImpl.java | 4 +- ...ava => WxMpXmlOutTransferKefuMessage.java} | 6 +- .../mp/bean/custombuilder/BaseBuilder.java | 6 +- .../mp/bean/custombuilder/ImageBuilder.java | 8 +-- .../mp/bean/custombuilder/MusicBuilder.java | 8 +-- .../mp/bean/custombuilder/NewsBuilder.java | 14 ++--- .../mp/bean/custombuilder/TextBuilder.java | 8 +-- .../mp/bean/custombuilder/VideoBuilder.java | 8 +-- .../mp/bean/custombuilder/VoiceBuilder.java | 8 +-- .../mp/bean/custombuilder/WxCardBuilder.java | 8 +-- .../WxMpKefuMessage.java} | 16 ++--- .../TransferCustomerServiceBuilder.java | 12 ++-- .../weixin/mp/util/json/WxMpGsonBuilder.java | 4 +- ...r.java => WxMpKefuMessageGsonAdapter.java} | 21 +++---- .../mp/util/xml/XStreamTransformer.java | 8 +-- .../mp/api/impl/WxMpKefuServiceImplTest.java | 10 +-- ...=> WxMpXmlOutTransferKefuMessageTest.java} | 10 +-- .../WxMpKefuMessageTest.java} | 62 +++++++++---------- .../mp/demo/DemoGuessNumberHandler.java | 22 +++---- weixin-java-mp/src/test/resources/testng.xml | 2 +- 21 files changed, 125 insertions(+), 137 deletions(-) rename weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/{WxMpXmlOutTransferCustomerServiceMessage.java => WxMpXmlOutTransferKefuMessage.java} (87%) rename weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/{WxMpCustomMessage.java => kefu/WxMpKefuMessage.java} (89%) rename weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/{WxMpCustomMessageGsonAdapter.java => WxMpKefuMessageGsonAdapter.java} (89%) rename weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/{WxMpXmlOutTransferCustomerServiceMessageTest.java => WxMpXmlOutTransferKefuMessageTest.java} (84%) rename weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/{WxMpCustomMessageTest.java => kefu/WxMpKefuMessageTest.java} (80%) diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpKefuService.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpKefuService.java index fc678b42..5bad7da2 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpKefuService.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpKefuService.java @@ -1,17 +1,12 @@ package me.chanjar.weixin.mp.api; -import java.io.File; -import java.util.Date; - import me.chanjar.weixin.common.exception.WxErrorException; -import me.chanjar.weixin.mp.bean.WxMpCustomMessage; +import me.chanjar.weixin.mp.bean.kefu.WxMpKefuMessage; import me.chanjar.weixin.mp.bean.kefu.request.WxMpKfAccountRequest; -import me.chanjar.weixin.mp.bean.kefu.result.WxMpKfList; -import me.chanjar.weixin.mp.bean.kefu.result.WxMpKfMsgList; -import me.chanjar.weixin.mp.bean.kefu.result.WxMpKfOnlineList; -import me.chanjar.weixin.mp.bean.kefu.result.WxMpKfSessionGetResult; -import me.chanjar.weixin.mp.bean.kefu.result.WxMpKfSessionList; -import me.chanjar.weixin.mp.bean.kefu.result.WxMpKfSessionWaitCaseList; +import me.chanjar.weixin.mp.bean.kefu.result.*; + +import java.io.File; +import java.util.Date; /** * 客服接口 , @@ -29,7 +24,7 @@ public interface WxMpKefuService { * 详情请见: 发送客服消息 *
    */ - boolean customMessageSend(WxMpCustomMessage message) throws WxErrorException; + boolean sendKefuMessage(WxMpKefuMessage message) throws WxErrorException; //*******************客服管理接口***********************// diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpKefuServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpKefuServiceImpl.java index e83c17ac..09a68adf 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpKefuServiceImpl.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpKefuServiceImpl.java @@ -3,6 +3,7 @@ package me.chanjar.weixin.mp.api.impl; import java.io.File; import java.util.Date; +import me.chanjar.weixin.mp.bean.kefu.WxMpKefuMessage; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -14,7 +15,6 @@ import me.chanjar.weixin.common.exception.WxErrorException; import me.chanjar.weixin.common.util.http.MediaUploadRequestExecutor; import me.chanjar.weixin.mp.api.WxMpKefuService; import me.chanjar.weixin.mp.api.WxMpService; -import me.chanjar.weixin.mp.bean.WxMpCustomMessage; import me.chanjar.weixin.mp.bean.kefu.request.WxMpKfAccountRequest; import me.chanjar.weixin.mp.bean.kefu.request.WxMpKfSessionRequest; import me.chanjar.weixin.mp.bean.kefu.result.WxMpKfList; @@ -41,7 +41,7 @@ public class WxMpKefuServiceImpl implements WxMpKefuService { } @Override - public boolean customMessageSend(WxMpCustomMessage message) + public boolean sendKefuMessage(WxMpKefuMessage message) throws WxErrorException { String url = "https://api.weixin.qq.com/cgi-bin/message/custom/send"; String responseContent = this.wxMpService.post(url, message.toJson()); diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlOutTransferCustomerServiceMessage.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlOutTransferKefuMessage.java similarity index 87% rename from weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlOutTransferCustomerServiceMessage.java rename to weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlOutTransferKefuMessage.java index a1a48bbe..3022e70d 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlOutTransferCustomerServiceMessage.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlOutTransferKefuMessage.java @@ -6,13 +6,13 @@ import me.chanjar.weixin.common.api.WxConsts; import me.chanjar.weixin.common.util.xml.XStreamCDataConverter; @XStreamAlias("xml") -public class WxMpXmlOutTransferCustomerServiceMessage extends WxMpXmlOutMessage { +public class WxMpXmlOutTransferKefuMessage extends WxMpXmlOutMessage { private static final long serialVersionUID = 1850903037285841322L; - + @XStreamAlias("TransInfo") protected TransInfo transInfo; - public WxMpXmlOutTransferCustomerServiceMessage() { + public WxMpXmlOutTransferKefuMessage() { this.msgType = WxConsts.CUSTOM_MSG_TRANSFER_CUSTOMER_SERVICE; } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/custombuilder/BaseBuilder.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/custombuilder/BaseBuilder.java index 18bf81f9..911e3f62 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/custombuilder/BaseBuilder.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/custombuilder/BaseBuilder.java @@ -1,6 +1,6 @@ package me.chanjar.weixin.mp.bean.custombuilder; -import me.chanjar.weixin.mp.bean.WxMpCustomMessage; +import me.chanjar.weixin.mp.bean.kefu.WxMpKefuMessage; public class BaseBuilder { protected String msgType; @@ -11,8 +11,8 @@ public class BaseBuilder { return (T) this; } - public WxMpCustomMessage build() { - WxMpCustomMessage m = new WxMpCustomMessage(); + public WxMpKefuMessage build() { + WxMpKefuMessage m = new WxMpKefuMessage(); m.setMsgType(this.msgType); m.setToUser(this.toUser); return m; diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/custombuilder/ImageBuilder.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/custombuilder/ImageBuilder.java index 1fb5363c..85855d25 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/custombuilder/ImageBuilder.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/custombuilder/ImageBuilder.java @@ -1,12 +1,12 @@ package me.chanjar.weixin.mp.bean.custombuilder; import me.chanjar.weixin.common.api.WxConsts; -import me.chanjar.weixin.mp.bean.WxMpCustomMessage; +import me.chanjar.weixin.mp.bean.kefu.WxMpKefuMessage; /** * 获得消息builder *
    - * 用法: WxMpCustomMessage m = WxMpCustomMessage.IMAGE().mediaId(...).toUser(...).build();
    + * 用法: WxMpKefuMessage m = WxMpKefuMessage.IMAGE().mediaId(...).toUser(...).build();
      * 
    * @author chanjarster * @@ -24,8 +24,8 @@ public final class ImageBuilder extends BaseBuilder { } @Override - public WxMpCustomMessage build() { - WxMpCustomMessage m = super.build(); + public WxMpKefuMessage build() { + WxMpKefuMessage m = super.build(); m.setMediaId(this.mediaId); return m; } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/custombuilder/MusicBuilder.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/custombuilder/MusicBuilder.java index 7a9994ad..3555f7a9 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/custombuilder/MusicBuilder.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/custombuilder/MusicBuilder.java @@ -1,12 +1,12 @@ package me.chanjar.weixin.mp.bean.custombuilder; import me.chanjar.weixin.common.api.WxConsts; -import me.chanjar.weixin.mp.bean.WxMpCustomMessage; +import me.chanjar.weixin.mp.bean.kefu.WxMpKefuMessage; /** * 音乐消息builder *
    - * 用法: WxMpCustomMessage m = WxMpCustomMessage.MUSIC()
    + * 用法: WxMpKefuMessage m = WxMpKefuMessage.MUSIC()
      *                      .musicUrl(...)
      *                      .hqMusicUrl(...)
      *                      .title(...)
    @@ -53,8 +53,8 @@ public final class MusicBuilder extends BaseBuilder {
       }
     
       @Override
    -  public WxMpCustomMessage build() {
    -    WxMpCustomMessage m = super.build();
    +  public WxMpKefuMessage build() {
    +    WxMpKefuMessage m = super.build();
         m.setMusicUrl(this.musicUrl);
         m.setHqMusicUrl(this.hqMusicUrl);
         m.setTitle(this.title);
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/custombuilder/NewsBuilder.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/custombuilder/NewsBuilder.java
    index ad0efb23..d909eb7d 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/custombuilder/NewsBuilder.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/custombuilder/NewsBuilder.java
    @@ -1,7 +1,7 @@
     package me.chanjar.weixin.mp.bean.custombuilder;
     
     import me.chanjar.weixin.common.api.WxConsts;
    -import me.chanjar.weixin.mp.bean.WxMpCustomMessage;
    +import me.chanjar.weixin.mp.bean.kefu.WxMpKefuMessage;
     
     import java.util.ArrayList;
     import java.util.List;
    @@ -10,27 +10,27 @@ import java.util.List;
      * 图文消息builder
      * 
      * 用法:
    - * WxMpCustomMessage m = WxMpCustomMessage.NEWS().addArticle(article).toUser(...).build();
    + * WxMpKefuMessage m = WxMpKefuMessage.NEWS().addArticle(article).toUser(...).build();
      * 
    * @author chanjarster * */ public final class NewsBuilder extends BaseBuilder { - private List articles = new ArrayList<>(); - + private List articles = new ArrayList<>(); + public NewsBuilder() { this.msgType = WxConsts.CUSTOM_MSG_NEWS; } - public NewsBuilder addArticle(WxMpCustomMessage.WxArticle article) { + public NewsBuilder addArticle(WxMpKefuMessage.WxArticle article) { this.articles.add(article); return this; } @Override - public WxMpCustomMessage build() { - WxMpCustomMessage m = super.build(); + public WxMpKefuMessage build() { + WxMpKefuMessage m = super.build(); m.setArticles(this.articles); return m; } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/custombuilder/TextBuilder.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/custombuilder/TextBuilder.java index 7f458457..770675f5 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/custombuilder/TextBuilder.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/custombuilder/TextBuilder.java @@ -1,12 +1,12 @@ package me.chanjar.weixin.mp.bean.custombuilder; import me.chanjar.weixin.common.api.WxConsts; -import me.chanjar.weixin.mp.bean.WxMpCustomMessage; +import me.chanjar.weixin.mp.bean.kefu.WxMpKefuMessage; /** * 文本消息builder *
    - * 用法: WxMpCustomMessage m = WxMpCustomMessage.TEXT().content(...).toUser(...).build();
    + * 用法: WxMpKefuMessage m = WxMpKefuMessage.TEXT().content(...).toUser(...).build();
      * 
    * @author chanjarster * @@ -24,8 +24,8 @@ public final class TextBuilder extends BaseBuilder { } @Override - public WxMpCustomMessage build() { - WxMpCustomMessage m = super.build(); + public WxMpKefuMessage build() { + WxMpKefuMessage m = super.build(); m.setContent(this.content); return m; } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/custombuilder/VideoBuilder.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/custombuilder/VideoBuilder.java index bda6ef7c..f9740e2f 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/custombuilder/VideoBuilder.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/custombuilder/VideoBuilder.java @@ -1,12 +1,12 @@ package me.chanjar.weixin.mp.bean.custombuilder; import me.chanjar.weixin.common.api.WxConsts; -import me.chanjar.weixin.mp.bean.WxMpCustomMessage; +import me.chanjar.weixin.mp.bean.kefu.WxMpKefuMessage; /** * 视频消息builder *
    - * 用法: WxMpCustomMessage m = WxMpCustomMessage.VOICE()
    + * 用法: WxMpKefuMessage m = WxMpKefuMessage.VOICE()
      *                              .mediaId(...)
      *                              .title(...)
      *                              .thumbMediaId(..)
    @@ -48,8 +48,8 @@ public final class VideoBuilder extends BaseBuilder {
       }
     
       @Override
    -  public WxMpCustomMessage build() {
    -    WxMpCustomMessage m = super.build();
    +  public WxMpKefuMessage build() {
    +    WxMpKefuMessage m = super.build();
         m.setMediaId(this.mediaId);
         m.setTitle(this.title);
         m.setDescription(this.description);
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/custombuilder/VoiceBuilder.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/custombuilder/VoiceBuilder.java
    index 867c8aff..7686a56d 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/custombuilder/VoiceBuilder.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/custombuilder/VoiceBuilder.java
    @@ -1,12 +1,12 @@
     package me.chanjar.weixin.mp.bean.custombuilder;
     
     import me.chanjar.weixin.common.api.WxConsts;
    -import me.chanjar.weixin.mp.bean.WxMpCustomMessage;
    +import me.chanjar.weixin.mp.bean.kefu.WxMpKefuMessage;
     
     /**
      * 语音消息builder
      * 
    - * 用法: WxMpCustomMessage m = WxMpCustomMessage.VOICE().mediaId(...).toUser(...).build();
    + * 用法: WxMpKefuMessage m = WxMpKefuMessage.VOICE().mediaId(...).toUser(...).build();
      * 
    * @author chanjarster * @@ -24,8 +24,8 @@ public final class VoiceBuilder extends BaseBuilder { } @Override - public WxMpCustomMessage build() { - WxMpCustomMessage m = super.build(); + public WxMpKefuMessage build() { + WxMpKefuMessage m = super.build(); m.setMediaId(this.mediaId); return m; } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/custombuilder/WxCardBuilder.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/custombuilder/WxCardBuilder.java index 8620cd84..fb5e81c2 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/custombuilder/WxCardBuilder.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/custombuilder/WxCardBuilder.java @@ -1,12 +1,12 @@ package me.chanjar.weixin.mp.bean.custombuilder; import me.chanjar.weixin.common.api.WxConsts; -import me.chanjar.weixin.mp.bean.WxMpCustomMessage; +import me.chanjar.weixin.mp.bean.kefu.WxMpKefuMessage; /** * 卡券消息builder *
    - * 用法: WxMpCustomMessage m = WxMpCustomMessage.WXCARD().cardId(...).toUser(...).build();
    + * 用法: WxMpKefuMessage m = WxMpKefuMessage.WXCARD().cardId(...).toUser(...).build();
      * 
    * @author mgcnrx11 * @@ -24,8 +24,8 @@ public final class WxCardBuilder extends BaseBuilder { } @Override - public WxMpCustomMessage build() { - WxMpCustomMessage m = super.build(); + public WxMpKefuMessage build() { + WxMpKefuMessage m = super.build(); m.setCardId(this.cardId); return m; } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpCustomMessage.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/kefu/WxMpKefuMessage.java similarity index 89% rename from weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpCustomMessage.java rename to weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/kefu/WxMpKefuMessage.java index a7f1670f..7963f53e 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpCustomMessage.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/kefu/WxMpKefuMessage.java @@ -1,24 +1,18 @@ -package me.chanjar.weixin.mp.bean; +package me.chanjar.weixin.mp.bean.kefu; + +import me.chanjar.weixin.mp.bean.custombuilder.*; +import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; import java.io.Serializable; import java.util.ArrayList; import java.util.List; -import me.chanjar.weixin.mp.bean.custombuilder.ImageBuilder; -import me.chanjar.weixin.mp.bean.custombuilder.MusicBuilder; -import me.chanjar.weixin.mp.bean.custombuilder.NewsBuilder; -import me.chanjar.weixin.mp.bean.custombuilder.TextBuilder; -import me.chanjar.weixin.mp.bean.custombuilder.VideoBuilder; -import me.chanjar.weixin.mp.bean.custombuilder.VoiceBuilder; -import me.chanjar.weixin.mp.bean.custombuilder.WxCardBuilder; -import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; - /** * 客服消息 * @author chanjarster * */ -public class WxMpCustomMessage implements Serializable { +public class WxMpKefuMessage implements Serializable { private static final long serialVersionUID = -9196732086954365246L; private String toUser; diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/outxmlbuilder/TransferCustomerServiceBuilder.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/outxmlbuilder/TransferCustomerServiceBuilder.java index 87ec3a04..b89e31b4 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/outxmlbuilder/TransferCustomerServiceBuilder.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/outxmlbuilder/TransferCustomerServiceBuilder.java @@ -1,17 +1,17 @@ package me.chanjar.weixin.mp.bean.outxmlbuilder; import me.chanjar.weixin.common.util.StringUtils; -import me.chanjar.weixin.mp.bean.WxMpXmlOutTransferCustomerServiceMessage; +import me.chanjar.weixin.mp.bean.WxMpXmlOutTransferKefuMessage; /** * 客服消息builder *
    - * 用法: WxMpCustomMessage m = WxMpXmlOutMessage.TRANSFER_CUSTOMER_SERVICE().content(...).toUser(...).build();
    + * 用法: WxMpKefuMessage m = WxMpXmlOutMessage.TRANSFER_CUSTOMER_SERVICE().content(...).toUser(...).build();
      * 
    * * @author chanjarster */ -public final class TransferCustomerServiceBuilder extends BaseBuilder { +public final class TransferCustomerServiceBuilder extends BaseBuilder { private String kfAccount; public TransferCustomerServiceBuilder kfAccount(String kf) { @@ -20,11 +20,11 @@ public final class TransferCustomerServiceBuilder extends BaseBuilder { +public class WxMpKefuMessageGsonAdapter implements JsonSerializer { @Override - public JsonElement serialize(WxMpCustomMessage message, Type typeOfSrc, JsonSerializationContext context) { + public JsonElement serialize(WxMpKefuMessage message, Type typeOfSrc, JsonSerializationContext context) { JsonObject messageJson = new JsonObject(); messageJson.addProperty("touser", message.getToUser()); messageJson.addProperty("msgtype", message.getMsgType()); - + if (WxConsts.CUSTOM_MSG_TEXT.equals(message.getMsgType())) { JsonObject text = new JsonObject(); text.addProperty("content", message.getContent()); @@ -60,11 +59,11 @@ public class WxMpCustomMessageGsonAdapter implements JsonSerializerHello World"); - this.wxService.getKefuService().customMessageSend(message); + this.wxService.getKefuService().sendKefuMessage(message); } public void testSendCustomMessageWithKfAccount() throws WxErrorException { WxXmlMpInMemoryConfigStorage configStorage = (WxXmlMpInMemoryConfigStorage) this.wxService .getWxMpConfigStorage(); - WxMpCustomMessage message = new WxMpCustomMessage(); + WxMpKefuMessage message = new WxMpKefuMessage(); message.setMsgType(WxConsts.CUSTOM_MSG_TEXT); message.setToUser(configStorage.getOpenid()); message.setKfAccount(configStorage.getKfAccount()); message.setContent( "欢迎欢迎,热烈欢迎\n换行测试\n超链接:Hello World"); - this.wxService.getKefuService().customMessageSend(message); + this.wxService.getKefuService().sendKefuMessage(message); } public void testKfList() throws WxErrorException { diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/WxMpXmlOutTransferCustomerServiceMessageTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/WxMpXmlOutTransferKefuMessageTest.java similarity index 84% rename from weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/WxMpXmlOutTransferCustomerServiceMessageTest.java rename to weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/WxMpXmlOutTransferKefuMessageTest.java index 012a0986..ad167738 100644 --- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/WxMpXmlOutTransferCustomerServiceMessageTest.java +++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/WxMpXmlOutTransferKefuMessageTest.java @@ -6,10 +6,10 @@ import org.testng.annotations.Test; /** * Created by ben on 2015/12/29. */ -public class WxMpXmlOutTransferCustomerServiceMessageTest { +public class WxMpXmlOutTransferKefuMessageTest { @Test public void test() { - WxMpXmlOutTransferCustomerServiceMessage m = new WxMpXmlOutTransferCustomerServiceMessage(); + WxMpXmlOutTransferKefuMessage m = new WxMpXmlOutTransferKefuMessage(); m.setCreateTime(1399197672L); m.setFromUserName("fromuser"); m.setToUserName("touser"); @@ -32,7 +32,7 @@ public class WxMpXmlOutTransferCustomerServiceMessageTest { "" + "" + ""; - WxMpXmlOutTransferCustomerServiceMessage.TransInfo transInfo = new WxMpXmlOutTransferCustomerServiceMessage.TransInfo(); + WxMpXmlOutTransferKefuMessage.TransInfo transInfo = new WxMpXmlOutTransferKefuMessage.TransInfo(); transInfo.setKfAccount("test1@test"); m.setTransInfo(transInfo); System.out.println(m.toXml()); @@ -41,7 +41,7 @@ public class WxMpXmlOutTransferCustomerServiceMessageTest { @Test public void testBuild() { - WxMpXmlOutTransferCustomerServiceMessage m = WxMpXmlOutMessage.TRANSFER_CUSTOMER_SERVICE().fromUser("fromuser").toUser("touser").build(); + WxMpXmlOutTransferKefuMessage m = WxMpXmlOutMessage.TRANSFER_CUSTOMER_SERVICE().fromUser("fromuser").toUser("touser").build(); m.setCreateTime(1399197672L); String expected = "" + "" + @@ -67,4 +67,4 @@ public class WxMpXmlOutTransferCustomerServiceMessageTest { System.out.println(m.toXml()); Assert.assertEquals(m.toXml().replaceAll("\\s", ""), expected.replaceAll("\\s", "")); } -} \ No newline at end of file +} diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/WxMpCustomMessageTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/kefu/WxMpKefuMessageTest.java similarity index 80% rename from weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/WxMpCustomMessageTest.java rename to weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/kefu/WxMpKefuMessageTest.java index aa8de0df..9f19029e 100644 --- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/WxMpCustomMessageTest.java +++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/kefu/WxMpKefuMessageTest.java @@ -1,54 +1,54 @@ -package me.chanjar.weixin.mp.bean; +package me.chanjar.weixin.mp.bean.kefu; import me.chanjar.weixin.common.api.WxConsts; -import me.chanjar.weixin.mp.bean.WxMpCustomMessage.WxArticle; +import me.chanjar.weixin.mp.bean.kefu.WxMpKefuMessage.WxArticle; import org.testng.Assert; import org.testng.annotations.Test; @Test -public class WxMpCustomMessageTest { +public class WxMpKefuMessageTest { public void testTextReply() { - WxMpCustomMessage reply = new WxMpCustomMessage(); + WxMpKefuMessage reply = new WxMpKefuMessage(); reply.setToUser("OPENID"); reply.setMsgType(WxConsts.CUSTOM_MSG_TEXT); reply.setContent("sfsfdsdf"); Assert.assertEquals(reply.toJson(), "{\"touser\":\"OPENID\",\"msgtype\":\"text\",\"text\":{\"content\":\"sfsfdsdf\"}}"); } - + public void testTextBuild() { - WxMpCustomMessage reply = WxMpCustomMessage.TEXT().toUser("OPENID").content("sfsfdsdf").build(); + WxMpKefuMessage reply = WxMpKefuMessage.TEXT().toUser("OPENID").content("sfsfdsdf").build(); Assert.assertEquals(reply.toJson(), "{\"touser\":\"OPENID\",\"msgtype\":\"text\",\"text\":{\"content\":\"sfsfdsdf\"}}"); } - + public void testImageReply() { - WxMpCustomMessage reply = new WxMpCustomMessage(); + WxMpKefuMessage reply = new WxMpKefuMessage(); reply.setToUser("OPENID"); reply.setMsgType(WxConsts.CUSTOM_MSG_IMAGE); reply.setMediaId("MEDIA_ID"); Assert.assertEquals(reply.toJson(), "{\"touser\":\"OPENID\",\"msgtype\":\"image\",\"image\":{\"media_id\":\"MEDIA_ID\"}}"); } - + public void testImageBuild() { - WxMpCustomMessage reply = WxMpCustomMessage.IMAGE().toUser("OPENID").mediaId("MEDIA_ID").build(); + WxMpKefuMessage reply = WxMpKefuMessage.IMAGE().toUser("OPENID").mediaId("MEDIA_ID").build(); Assert.assertEquals(reply.toJson(), "{\"touser\":\"OPENID\",\"msgtype\":\"image\",\"image\":{\"media_id\":\"MEDIA_ID\"}}"); } - + public void testVoiceReply() { - WxMpCustomMessage reply = new WxMpCustomMessage(); + WxMpKefuMessage reply = new WxMpKefuMessage(); reply.setToUser("OPENID"); reply.setMsgType(WxConsts.CUSTOM_MSG_VOICE); reply.setMediaId("MEDIA_ID"); Assert.assertEquals(reply.toJson(), "{\"touser\":\"OPENID\",\"msgtype\":\"voice\",\"voice\":{\"media_id\":\"MEDIA_ID\"}}"); } - + public void testVoiceBuild() { - WxMpCustomMessage reply = WxMpCustomMessage.VOICE().toUser("OPENID").mediaId("MEDIA_ID").build(); + WxMpKefuMessage reply = WxMpKefuMessage.VOICE().toUser("OPENID").mediaId("MEDIA_ID").build(); Assert.assertEquals(reply.toJson(), "{\"touser\":\"OPENID\",\"msgtype\":\"voice\",\"voice\":{\"media_id\":\"MEDIA_ID\"}}"); } - + public void testVideoReply() { - WxMpCustomMessage reply = new WxMpCustomMessage(); + WxMpKefuMessage reply = new WxMpKefuMessage(); reply.setToUser("OPENID"); reply.setMsgType(WxConsts.CUSTOM_MSG_VIDEO); reply.setMediaId("MEDIA_ID"); @@ -57,14 +57,14 @@ public class WxMpCustomMessageTest { reply.setDescription("DESCRIPTION"); Assert.assertEquals(reply.toJson(), "{\"touser\":\"OPENID\",\"msgtype\":\"video\",\"video\":{\"media_id\":\"MEDIA_ID\",\"thumb_media_id\":\"MEDIA_ID\",\"title\":\"TITLE\",\"description\":\"DESCRIPTION\"}}"); } - + public void testVideoBuild() { - WxMpCustomMessage reply = WxMpCustomMessage.VIDEO().toUser("OPENID").title("TITLE").mediaId("MEDIA_ID").thumbMediaId("MEDIA_ID").description("DESCRIPTION").build(); + WxMpKefuMessage reply = WxMpKefuMessage.VIDEO().toUser("OPENID").title("TITLE").mediaId("MEDIA_ID").thumbMediaId("MEDIA_ID").description("DESCRIPTION").build(); Assert.assertEquals(reply.toJson(), "{\"touser\":\"OPENID\",\"msgtype\":\"video\",\"video\":{\"media_id\":\"MEDIA_ID\",\"thumb_media_id\":\"MEDIA_ID\",\"title\":\"TITLE\",\"description\":\"DESCRIPTION\"}}"); } - + public void testMusicReply() { - WxMpCustomMessage reply = new WxMpCustomMessage(); + WxMpKefuMessage reply = new WxMpKefuMessage(); reply.setToUser("OPENID"); reply.setMsgType(WxConsts.CUSTOM_MSG_MUSIC); reply.setThumbMediaId("MEDIA_ID"); @@ -74,9 +74,9 @@ public class WxMpCustomMessageTest { reply.setHqMusicUrl("HQ_MUSIC_URL"); Assert.assertEquals(reply.toJson(), "{\"touser\":\"OPENID\",\"msgtype\":\"music\",\"music\":{\"title\":\"TITLE\",\"description\":\"DESCRIPTION\",\"thumb_media_id\":\"MEDIA_ID\",\"musicurl\":\"MUSIC_URL\",\"hqmusicurl\":\"HQ_MUSIC_URL\"}}"); } - + public void testMusicBuild() { - WxMpCustomMessage reply = WxMpCustomMessage.MUSIC() + WxMpKefuMessage reply = WxMpKefuMessage.MUSIC() .toUser("OPENID") .title("TITLE") .thumbMediaId("MEDIA_ID") @@ -86,19 +86,19 @@ public class WxMpCustomMessageTest { .build(); Assert.assertEquals(reply.toJson(), "{\"touser\":\"OPENID\",\"msgtype\":\"music\",\"music\":{\"title\":\"TITLE\",\"description\":\"DESCRIPTION\",\"thumb_media_id\":\"MEDIA_ID\",\"musicurl\":\"MUSIC_URL\",\"hqmusicurl\":\"HQ_MUSIC_URL\"}}"); } - + public void testNewsReply() { - WxMpCustomMessage reply = new WxMpCustomMessage(); + WxMpKefuMessage reply = new WxMpKefuMessage(); reply.setToUser("OPENID"); reply.setMsgType(WxConsts.CUSTOM_MSG_NEWS); - + WxArticle article1 = new WxArticle(); article1.setUrl("URL"); article1.setPicUrl("PIC_URL"); article1.setDescription("Is Really A Happy Day"); article1.setTitle("Happy Day"); reply.getArticles().add(article1); - + WxArticle article2 = new WxArticle(); article2.setUrl("URL"); article2.setPicUrl("PIC_URL"); @@ -106,26 +106,26 @@ public class WxMpCustomMessageTest { article2.setTitle("Happy Day"); reply.getArticles().add(article2); - + Assert.assertEquals(reply.toJson(), "{\"touser\":\"OPENID\",\"msgtype\":\"news\",\"news\":{\"articles\":[{\"title\":\"Happy Day\",\"description\":\"Is Really A Happy Day\",\"url\":\"URL\",\"picurl\":\"PIC_URL\"},{\"title\":\"Happy Day\",\"description\":\"Is Really A Happy Day\",\"url\":\"URL\",\"picurl\":\"PIC_URL\"}]}}"); } - + public void testNewsBuild() { WxArticle article1 = new WxArticle(); article1.setUrl("URL"); article1.setPicUrl("PIC_URL"); article1.setDescription("Is Really A Happy Day"); article1.setTitle("Happy Day"); - + WxArticle article2 = new WxArticle(); article2.setUrl("URL"); article2.setPicUrl("PIC_URL"); article2.setDescription("Is Really A Happy Day"); article2.setTitle("Happy Day"); - WxMpCustomMessage reply = WxMpCustomMessage.NEWS().toUser("OPENID").addArticle(article1).addArticle(article2).build(); + WxMpKefuMessage reply = WxMpKefuMessage.NEWS().toUser("OPENID").addArticle(article1).addArticle(article2).build(); Assert.assertEquals(reply.toJson(), "{\"touser\":\"OPENID\",\"msgtype\":\"news\",\"news\":{\"articles\":[{\"title\":\"Happy Day\",\"description\":\"Is Really A Happy Day\",\"url\":\"URL\",\"picurl\":\"PIC_URL\"},{\"title\":\"Happy Day\",\"description\":\"Is Really A Happy Day\",\"url\":\"URL\",\"picurl\":\"PIC_URL\"}]}}"); } - + } diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/DemoGuessNumberHandler.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/DemoGuessNumberHandler.java index f35b3b87..604531b1 100644 --- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/DemoGuessNumberHandler.java +++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/DemoGuessNumberHandler.java @@ -10,7 +10,7 @@ import me.chanjar.weixin.common.session.WxSessionManager; import me.chanjar.weixin.mp.api.WxMpMessageHandler; import me.chanjar.weixin.mp.api.WxMpMessageMatcher; import me.chanjar.weixin.mp.api.WxMpService; -import me.chanjar.weixin.mp.bean.WxMpCustomMessage; +import me.chanjar.weixin.mp.bean.kefu.WxMpKefuMessage; import me.chanjar.weixin.mp.bean.WxMpXmlMessage; import me.chanjar.weixin.mp.bean.WxMpXmlOutMessage; @@ -52,19 +52,19 @@ public class DemoGuessNumberHandler implements WxMpMessageHandler, WxMpMessageMa protected void letsGo(WxMpXmlMessage wxMessage, WxMpService wxMpService, WxSessionManager sessionManager) throws WxErrorException { WxSession session = sessionManager.getSession(wxMessage.getFromUser()); if (session.getAttribute("guessing") == null) { - WxMpCustomMessage m = WxMpCustomMessage + WxMpKefuMessage m = WxMpKefuMessage .TEXT() .toUser(wxMessage.getFromUser()) .content("请猜一个100以内的数字") .build(); - wxMpService.getKefuService().customMessageSend(m); + wxMpService.getKefuService().sendKefuMessage(m); } else { - WxMpCustomMessage m = WxMpCustomMessage + WxMpKefuMessage m = WxMpKefuMessage .TEXT() .toUser(wxMessage.getFromUser()) .content("放弃了吗?那请重新猜一个100以内的数字") .build(); - wxMpService.getKefuService().customMessageSend(m); + wxMpService.getKefuService().sendKefuMessage(m); } session.setAttribute("guessing", Boolean.TRUE); @@ -87,28 +87,28 @@ public class DemoGuessNumberHandler implements WxMpMessageHandler, WxMpMessageMa int answer = (Integer) session.getAttribute("number"); int guessNumber = Integer.valueOf(wxMessage.getContent()); if (guessNumber < answer) { - WxMpCustomMessage m = WxMpCustomMessage + WxMpKefuMessage m = WxMpKefuMessage .TEXT() .toUser(wxMessage.getFromUser()) .content("小了") .build(); - wxMpService.getKefuService().customMessageSend(m); + wxMpService.getKefuService().sendKefuMessage(m); } else if (guessNumber > answer) { - WxMpCustomMessage m = WxMpCustomMessage + WxMpKefuMessage m = WxMpKefuMessage .TEXT() .toUser(wxMessage.getFromUser()) .content("大了") .build(); - wxMpService.getKefuService().customMessageSend(m); + wxMpService.getKefuService().sendKefuMessage(m); } else { - WxMpCustomMessage m = WxMpCustomMessage + WxMpKefuMessage m = WxMpKefuMessage .TEXT() .toUser(wxMessage.getFromUser()) .content("Bingo!") .build(); session.removeAttribute("guessing"); - wxMpService.getKefuService().customMessageSend(m); + wxMpService.getKefuService().sendKefuMessage(m); } } diff --git a/weixin-java-mp/src/test/resources/testng.xml b/weixin-java-mp/src/test/resources/testng.xml index 6d5310ce..addf7be4 100644 --- a/weixin-java-mp/src/test/resources/testng.xml +++ b/weixin-java-mp/src/test/resources/testng.xml @@ -17,7 +17,7 @@ - + From a3ada2c0aead836f8c2f64bd0a742ca59783afc1 Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Tue, 25 Oct 2016 12:06:26 +0800 Subject: [PATCH 50/83] =?UTF-8?q?=E9=87=8D=E6=9E=84=E8=A7=84=E8=8C=83?= =?UTF-8?q?=E5=8C=96=E5=BE=AE=E4=BF=A1=E6=94=AF=E4=BB=98=E7=9B=B8=E5=85=B3?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E7=B1=BB=E7=9A=84=E5=91=BD=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../chanjar/weixin/mp/api/WxMpPayService.java | 13 +- .../mp/api/impl/WxMpPayServiceImpl.java | 16 +- .../mp/bean/pay/WxPayJsSDKCallback.java | 520 +++++++++--------- .../{ => request}/WxEntPayQueryRequest.java | 2 +- .../pay/{ => request}/WxEntPayRequest.java | 2 +- .../pay/{ => request}/WxPayBaseRequest.java | 2 +- .../{ => request}/WxPayOrderQueryRequest.java | 2 +- .../pay/{ => request}/WxPayRefundRequest.java | 2 +- .../WxPaySendRedpackRequest.java | 2 +- .../WxPayUnifiedOrderRequest.java | 2 +- .../pay/{ => result}/WxEntPayQueryResult.java | 2 +- .../bean/pay/{ => result}/WxEntPayResult.java | 2 +- .../pay/{ => result}/WxPayBaseResult.java | 2 +- .../{ => result}/WxPayOrderQueryResult.java | 4 +- .../pay/{ => result}/WxPayRefundResult.java | 2 +- .../{ => result}/WxPaySendRedpackResult.java | 2 +- .../{ => result}/WxPayUnifiedOrderResult.java | 2 +- .../mp/api/impl/WxMpPayServiceImplTest.java | 13 +- .../result/WxPaySendRedpackResultTest.java} | 36 +- 19 files changed, 304 insertions(+), 324 deletions(-) rename weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/{ => request}/WxEntPayQueryRequest.java (97%) rename weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/{ => request}/WxEntPayRequest.java (99%) rename weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/{ => request}/WxPayBaseRequest.java (97%) rename weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/{ => request}/WxPayOrderQueryRequest.java (96%) rename weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/{ => request}/WxPayRefundRequest.java (99%) rename weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/{ => request}/WxPaySendRedpackRequest.java (99%) rename weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/{ => request}/WxPayUnifiedOrderRequest.java (99%) rename weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/{ => result}/WxEntPayQueryResult.java (98%) rename weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/{ => result}/WxEntPayResult.java (97%) rename weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/{ => result}/WxPayBaseResult.java (98%) rename weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/{ => result}/WxPayOrderQueryResult.java (98%) rename weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/{ => result}/WxPayRefundResult.java (98%) rename weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/{ => result}/WxPaySendRedpackResult.java (97%) rename weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/{ => result}/WxPayUnifiedOrderResult.java (95%) rename weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/{WxRedpackResultTest.java => pay/result/WxPaySendRedpackResultTest.java} (71%) diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpPayService.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpPayService.java index a1dabfa0..411c2abf 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpPayService.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpPayService.java @@ -1,7 +1,11 @@ package me.chanjar.weixin.mp.api; import me.chanjar.weixin.common.exception.WxErrorException; -import me.chanjar.weixin.mp.bean.pay.*; +import me.chanjar.weixin.mp.bean.pay.request.WxEntPayRequest; +import me.chanjar.weixin.mp.bean.pay.request.WxPayRefundRequest; +import me.chanjar.weixin.mp.bean.pay.request.WxPaySendRedpackRequest; +import me.chanjar.weixin.mp.bean.pay.request.WxPayUnifiedOrderRequest; +import me.chanjar.weixin.mp.bean.pay.result.*; import java.io.File; import java.util.Map; @@ -47,13 +51,6 @@ public interface WxMpPayService { */ Map getPayInfo(WxPayUnifiedOrderRequest request) throws WxErrorException; - /** - * 读取支付结果通知 - * 详见http://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_7 - * - */ - WxPayJsSDKCallback getJSSDKCallbackData(String xmlData); - /** *
        * 微信支付-申请退款
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImpl.java
    index 8cb737c6..3b3b7510 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImpl.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImpl.java
    @@ -7,7 +7,8 @@ import me.chanjar.weixin.common.util.BeanUtils;
     import me.chanjar.weixin.common.util.xml.XStreamInitializer;
     import me.chanjar.weixin.mp.api.WxMpPayService;
     import me.chanjar.weixin.mp.api.WxMpService;
    -import me.chanjar.weixin.mp.bean.pay.*;
    +import me.chanjar.weixin.mp.bean.pay.request.*;
    +import me.chanjar.weixin.mp.bean.pay.result.*;
     import org.apache.commons.codec.digest.DigestUtils;
     import org.apache.commons.lang3.ArrayUtils;
     import org.apache.commons.lang3.StringUtils;
    @@ -45,19 +46,6 @@ public class WxMpPayServiceImpl implements WxMpPayService {
         this.wxMpService = wxMpService;
       }
     
    -  @Override
    -  public WxPayJsSDKCallback getJSSDKCallbackData(String xmlData) {
    -    try {
    -      XStream xstream = XStreamInitializer.getInstance();
    -      xstream.alias("xml", WxPayJsSDKCallback.class);
    -      return (WxPayJsSDKCallback) xstream.fromXML(xmlData);
    -    } catch (Exception e) {
    -      e.printStackTrace();
    -    }
    -
    -    return new WxPayJsSDKCallback();
    -  }
    -
       @Override
       public WxPayRefundResult refund(WxPayRefundRequest request, File keyFile)
           throws WxErrorException {
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxPayJsSDKCallback.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxPayJsSDKCallback.java
    index 11b8b0d5..742f5e18 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxPayJsSDKCallback.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxPayJsSDKCallback.java
    @@ -3,281 +3,277 @@ package me.chanjar.weixin.mp.bean.pay;
     import java.io.Serializable;
     
     /**
    - * pre> 订单支付状态回调
    - *
    + * 
    + * 订单支付状态回调
      * 支付结果通知(详见http://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_7)
    - *
      * /pre>
      *
      * @author ukid
      */
     public class WxPayJsSDKCallback implements Serializable {
    -    /**
    -   *
    -   */
       private static final long serialVersionUID = -4143804055690843641L;
    -    private String return_code;
    -    private String return_msg;
    -
    -    private String appid;
    -    private String mch_id;
    -    private String device_info;
    -    private String nonce_str;
    -    private String sign;
    -    private String result_code;
    -    private String err_code;
    -    private String err_code_des;
    -    private String openid;
    -    private String is_subscribe;
    -    private String trade_type;
    -    private String bank_type;
    -    private String total_fee;
    -    private String fee_type;
    -    private String cash_fee;
    -    private String cash_fee_type;
    -    private String coupon_fee;
    -    private String coupon_count;
    -    private String coupon_batch_id_$n;
    -    private String coupon_id_$n;
    -    private String coupon_fee_$n;
    -    private String transaction_id;
    -    private String out_trade_no;
    -    private String attach;
    -    private String time_end;
    -
    -    public String getReturn_code() {
    -        return this.return_code;
    -    }
    -
    -    public String getReturn_msg() {
    -        return this.return_msg;
    -    }
    -
    -    public String getAppid() {
    -        return this.appid;
    -    }
    -
    -    public String getMch_id() {
    -        return this.mch_id;
    -    }
    -
    -    public String getDevice_info() {
    -        return this.device_info;
    -    }
    -
    -    public String getNonce_str() {
    -        return this.nonce_str;
    -    }
    -
    -    public String getSign() {
    -        return this.sign;
    -    }
    -
    -    public String getResult_code() {
    -        return this.result_code;
    -    }
    -
    -    public String getErr_code() {
    -        return this.err_code;
    -    }
    -
    -    public String getErr_code_des() {
    -        return this.err_code_des;
    -    }
    -
    -    public String getOpenid() {
    -        return this.openid;
    -    }
    -
    -    public String getIs_subscribe() {
    -        return this.is_subscribe;
    -    }
    -
    -    public String getTrade_type() {
    -        return this.trade_type;
    -    }
    -
    -    public String getBank_type() {
    -        return this.bank_type;
    -    }
    -
    -    public String getTotal_fee() {
    -        return this.total_fee;
    -    }
    -
    -    public String getFee_type() {
    -        return this.fee_type;
    -    }
    -
    -    public String getCash_fee() {
    -        return this.cash_fee;
    -    }
    -
    -    public String getCash_fee_type() {
    -        return this.cash_fee_type;
    -    }
    -
    -    public String getCoupon_fee() {
    -        return this.coupon_fee;
    -    }
    -
    -    public String getCoupon_count() {
    -        return this.coupon_count;
    -    }
    -
    -    public String getCoupon_batch_id_$n() {
    -        return this.coupon_batch_id_$n;
    -    }
    -
    -    public String getCoupon_id_$n() {
    -        return this.coupon_id_$n;
    -    }
    -
    -    public String getCoupon_fee_$n() {
    -        return this.coupon_fee_$n;
    -    }
    -
    -    public String getTransaction_id() {
    -        return this.transaction_id;
    -    }
    +  private String return_code;
    +  private String return_msg;
    +
    +  private String appid;
    +  private String mch_id;
    +  private String device_info;
    +  private String nonce_str;
    +  private String sign;
    +  private String result_code;
    +  private String err_code;
    +  private String err_code_des;
    +  private String openid;
    +  private String is_subscribe;
    +  private String trade_type;
    +  private String bank_type;
    +  private String total_fee;
    +  private String fee_type;
    +  private String cash_fee;
    +  private String cash_fee_type;
    +  private String coupon_fee;
    +  private String coupon_count;
    +  private String coupon_batch_id_$n;
    +  private String coupon_id_$n;
    +  private String coupon_fee_$n;
    +  private String transaction_id;
    +  private String out_trade_no;
    +  private String attach;
    +  private String time_end;
    +
    +  public String getReturn_code() {
    +    return this.return_code;
    +  }
    +
    +  public void setReturn_code(String return_code) {
    +    this.return_code = return_code;
    +  }
    +
    +  public String getReturn_msg() {
    +    return this.return_msg;
    +  }
    +
    +  public void setReturn_msg(String return_msg) {
    +    this.return_msg = return_msg;
    +  }
    +
    +  public String getAppid() {
    +    return this.appid;
    +  }
    +
    +  public void setAppid(String appid) {
    +    this.appid = appid;
    +  }
    +
    +  public String getMch_id() {
    +    return this.mch_id;
    +  }
    +
    +  public void setMch_id(String mch_id) {
    +    this.mch_id = mch_id;
    +  }
    +
    +  public String getDevice_info() {
    +    return this.device_info;
    +  }
    +
    +  public void setDevice_info(String device_info) {
    +    this.device_info = device_info;
    +  }
    +
    +  public String getNonce_str() {
    +    return this.nonce_str;
    +  }
    +
    +  public void setNonce_str(String nonce_str) {
    +    this.nonce_str = nonce_str;
    +  }
    +
    +  public String getSign() {
    +    return this.sign;
    +  }
    +
    +  public void setSign(String sign) {
    +    this.sign = sign;
    +  }
    +
    +  public String getResult_code() {
    +    return this.result_code;
    +  }
    +
    +  public void setResult_code(String result_code) {
    +    this.result_code = result_code;
    +  }
    +
    +  public String getErr_code() {
    +    return this.err_code;
    +  }
    +
    +  public void setErr_code(String err_code) {
    +    this.err_code = err_code;
    +  }
    +
    +  public String getErr_code_des() {
    +    return this.err_code_des;
    +  }
    +
    +  public void setErr_code_des(String err_code_des) {
    +    this.err_code_des = err_code_des;
    +  }
    +
    +  public String getOpenid() {
    +    return this.openid;
    +  }
    +
    +  public void setOpenid(String openid) {
    +    this.openid = openid;
    +  }
    +
    +  public String getIs_subscribe() {
    +    return this.is_subscribe;
    +  }
    +
    +  public void setIs_subscribe(String is_subscribe) {
    +    this.is_subscribe = is_subscribe;
    +  }
     
    -    public String getOut_trade_no() {
    -        return this.out_trade_no;
    -    }
    +  public String getTrade_type() {
    +    return this.trade_type;
    +  }
     
    -    public String getAttach() {
    -        return this.attach;
    -    }
    +  public void setTrade_type(String trade_type) {
    +    this.trade_type = trade_type;
    +  }
     
    -    public String getTime_end() {
    -        return this.time_end;
    -    }
    +  public String getBank_type() {
    +    return this.bank_type;
    +  }
     
    -    public void setReturn_code(String return_code) {
    -        this.return_code = return_code;
    -    }
    +  public void setBank_type(String bank_type) {
    +    this.bank_type = bank_type;
    +  }
     
    -    public void setReturn_msg(String return_msg) {
    -        this.return_msg = return_msg;
    -    }
    +  public String getTotal_fee() {
    +    return this.total_fee;
    +  }
     
    -    public void setAppid(String appid) {
    -        this.appid = appid;
    -    }
    +  public void setTotal_fee(String total_fee) {
    +    this.total_fee = total_fee;
    +  }
     
    -    public void setMch_id(String mch_id) {
    -        this.mch_id = mch_id;
    -    }
    -
    -    public void setDevice_info(String device_info) {
    -        this.device_info = device_info;
    -    }
    -
    -    public void setNonce_str(String nonce_str) {
    -        this.nonce_str = nonce_str;
    -    }
    -
    -    public void setSign(String sign) {
    -        this.sign = sign;
    -    }
    -
    -    public void setResult_code(String result_code) {
    -        this.result_code = result_code;
    -    }
    -
    -    public void setErr_code(String err_code) {
    -        this.err_code = err_code;
    -    }
    -
    -    public void setErr_code_des(String err_code_des) {
    -        this.err_code_des = err_code_des;
    -    }
    -
    -    public void setOpenid(String openid) {
    -        this.openid = openid;
    -    }
    -
    -    public void setIs_subscribe(String is_subscribe) {
    -        this.is_subscribe = is_subscribe;
    -    }
    -
    -    public void setTrade_type(String trade_type) {
    -        this.trade_type = trade_type;
    -    }
    -
    -    public void setBank_type(String bank_type) {
    -        this.bank_type = bank_type;
    -    }
    -
    -    public void setTotal_fee(String total_fee) {
    -        this.total_fee = total_fee;
    -    }
    -
    -    public void setFee_type(String fee_type) {
    -        this.fee_type = fee_type;
    -    }
    -
    -    public void setCash_fee(String cash_fee) {
    -        this.cash_fee = cash_fee;
    -    }
    -
    -    public void setCash_fee_type(String cash_fee_type) {
    -        this.cash_fee_type = cash_fee_type;
    -    }
    -
    -    public void setCoupon_fee(String coupon_fee) {
    -        this.coupon_fee = coupon_fee;
    -    }
    -
    -    public void setCoupon_count(String coupon_count) {
    -        this.coupon_count = coupon_count;
    -    }
    -
    -    public void setCoupon_batch_id_$n(String coupon_batch_id_$n) {
    -        this.coupon_batch_id_$n = coupon_batch_id_$n;
    -    }
    -
    -    public void setCoupon_id_$n(String coupon_id_$n) {
    -        this.coupon_id_$n = coupon_id_$n;
    -    }
    -
    -    public void setCoupon_fee_$n(String coupon_fee_$n) {
    -        this.coupon_fee_$n = coupon_fee_$n;
    -    }
    -
    -    public void setTransaction_id(String transaction_id) {
    -        this.transaction_id = transaction_id;
    -    }
    -
    -    public void setOut_trade_no(String out_trade_no) {
    -        this.out_trade_no = out_trade_no;
    -    }
    -
    -    public void setAttach(String attach) {
    -        this.attach = attach;
    -    }
    -
    -    public void setTime_end(String time_end) {
    -        this.time_end = time_end;
    -    }
    -
    -    @Override
    -    public String toString() {
    -        return "WxPayJsSDKCallback [return_code=" + this.return_code + ", return_msg="
    -                + this.return_msg + ", appid=" + this.appid + ", mch_id=" + this.mch_id
    -                + ", device_info=" + this.device_info + ", nonce_str=" + this.nonce_str
    -                + ", sign=" + this.sign + ", result_code=" + this.result_code
    -                + ", err_code=" + this.err_code + ", err_code_des=" + this.err_code_des
    -                + ", openid=" + this.openid + ", is_subscribe=" + this.is_subscribe
    -                + ", trade_type=" + this.trade_type + ", bank_type=" + this.bank_type
    -                + ", total_fee=" + this.total_fee + ", fee_type=" + this.fee_type
    -                + ", cash_fee=" + this.cash_fee + ", cash_fee_type=" + this.cash_fee_type
    -                + ", coupon_fee=" + this.coupon_fee + ", coupon_count="
    -                + this.coupon_count + ", coupon_batch_id_$n=" + this.coupon_batch_id_$n
    -                + ", coupon_id_$n=" + this.coupon_id_$n + ", coupon_fee_$n="
    -                + this.coupon_fee_$n + ", transaction_id=" + this.transaction_id
    -                + ", out_trade_no=" + this.out_trade_no + ", attach=" + this.attach
    -                + ", time_end=" + this.time_end + "]";
    -    }
    +  public String getFee_type() {
    +    return this.fee_type;
    +  }
    +
    +  public void setFee_type(String fee_type) {
    +    this.fee_type = fee_type;
    +  }
    +
    +  public String getCash_fee() {
    +    return this.cash_fee;
    +  }
    +
    +  public void setCash_fee(String cash_fee) {
    +    this.cash_fee = cash_fee;
    +  }
    +
    +  public String getCash_fee_type() {
    +    return this.cash_fee_type;
    +  }
    +
    +  public void setCash_fee_type(String cash_fee_type) {
    +    this.cash_fee_type = cash_fee_type;
    +  }
    +
    +  public String getCoupon_fee() {
    +    return this.coupon_fee;
    +  }
    +
    +  public void setCoupon_fee(String coupon_fee) {
    +    this.coupon_fee = coupon_fee;
    +  }
    +
    +  public String getCoupon_count() {
    +    return this.coupon_count;
    +  }
    +
    +  public void setCoupon_count(String coupon_count) {
    +    this.coupon_count = coupon_count;
    +  }
    +
    +  public String getCoupon_batch_id_$n() {
    +    return this.coupon_batch_id_$n;
    +  }
    +
    +  public void setCoupon_batch_id_$n(String coupon_batch_id_$n) {
    +    this.coupon_batch_id_$n = coupon_batch_id_$n;
    +  }
    +
    +  public String getCoupon_id_$n() {
    +    return this.coupon_id_$n;
    +  }
    +
    +  public void setCoupon_id_$n(String coupon_id_$n) {
    +    this.coupon_id_$n = coupon_id_$n;
    +  }
    +
    +  public String getCoupon_fee_$n() {
    +    return this.coupon_fee_$n;
    +  }
    +
    +  public void setCoupon_fee_$n(String coupon_fee_$n) {
    +    this.coupon_fee_$n = coupon_fee_$n;
    +  }
    +
    +  public String getTransaction_id() {
    +    return this.transaction_id;
    +  }
    +
    +  public void setTransaction_id(String transaction_id) {
    +    this.transaction_id = transaction_id;
    +  }
    +
    +  public String getOut_trade_no() {
    +    return this.out_trade_no;
    +  }
    +
    +  public void setOut_trade_no(String out_trade_no) {
    +    this.out_trade_no = out_trade_no;
    +  }
    +
    +  public String getAttach() {
    +    return this.attach;
    +  }
    +
    +  public void setAttach(String attach) {
    +    this.attach = attach;
    +  }
    +
    +  public String getTime_end() {
    +    return this.time_end;
    +  }
    +
    +  public void setTime_end(String time_end) {
    +    this.time_end = time_end;
    +  }
    +
    +  @Override
    +  public String toString() {
    +    return "WxPayJsSDKCallback [return_code=" + this.return_code + ", return_msg="
    +      + this.return_msg + ", appid=" + this.appid + ", mch_id=" + this.mch_id
    +      + ", device_info=" + this.device_info + ", nonce_str=" + this.nonce_str
    +      + ", sign=" + this.sign + ", result_code=" + this.result_code
    +      + ", err_code=" + this.err_code + ", err_code_des=" + this.err_code_des
    +      + ", openid=" + this.openid + ", is_subscribe=" + this.is_subscribe
    +      + ", trade_type=" + this.trade_type + ", bank_type=" + this.bank_type
    +      + ", total_fee=" + this.total_fee + ", fee_type=" + this.fee_type
    +      + ", cash_fee=" + this.cash_fee + ", cash_fee_type=" + this.cash_fee_type
    +      + ", coupon_fee=" + this.coupon_fee + ", coupon_count="
    +      + this.coupon_count + ", coupon_batch_id_$n=" + this.coupon_batch_id_$n
    +      + ", coupon_id_$n=" + this.coupon_id_$n + ", coupon_fee_$n="
    +      + this.coupon_fee_$n + ", transaction_id=" + this.transaction_id
    +      + ", out_trade_no=" + this.out_trade_no + ", attach=" + this.attach
    +      + ", time_end=" + this.time_end + "]";
    +  }
     
     }
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxEntPayQueryRequest.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/request/WxEntPayQueryRequest.java
    similarity index 97%
    rename from weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxEntPayQueryRequest.java
    rename to weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/request/WxEntPayQueryRequest.java
    index 512ac159..47612ad3 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxEntPayQueryRequest.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/request/WxEntPayQueryRequest.java
    @@ -1,4 +1,4 @@
    -package me.chanjar.weixin.mp.bean.pay;
    +package me.chanjar.weixin.mp.bean.pay.request;
     
     import com.thoughtworks.xstream.annotations.XStreamAlias;
     import me.chanjar.weixin.common.annotation.Required;
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxEntPayRequest.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/request/WxEntPayRequest.java
    similarity index 99%
    rename from weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxEntPayRequest.java
    rename to weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/request/WxEntPayRequest.java
    index 07549ab3..6f019c1e 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxEntPayRequest.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/request/WxEntPayRequest.java
    @@ -1,4 +1,4 @@
    -package me.chanjar.weixin.mp.bean.pay;
    +package me.chanjar.weixin.mp.bean.pay.request;
     
     import org.apache.commons.lang3.builder.ToStringBuilder;
     import org.apache.commons.lang3.builder.ToStringStyle;
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxPayBaseRequest.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/request/WxPayBaseRequest.java
    similarity index 97%
    rename from weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxPayBaseRequest.java
    rename to weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/request/WxPayBaseRequest.java
    index 062152d8..a66f9379 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxPayBaseRequest.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/request/WxPayBaseRequest.java
    @@ -1,4 +1,4 @@
    -package me.chanjar.weixin.mp.bean.pay;
    +package me.chanjar.weixin.mp.bean.pay.request;
     
     import com.thoughtworks.xstream.annotations.XStreamAlias;
     import org.apache.commons.lang3.builder.ToStringBuilder;
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxPayOrderQueryRequest.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/request/WxPayOrderQueryRequest.java
    similarity index 96%
    rename from weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxPayOrderQueryRequest.java
    rename to weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/request/WxPayOrderQueryRequest.java
    index ede1b06a..153831d3 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxPayOrderQueryRequest.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/request/WxPayOrderQueryRequest.java
    @@ -1,4 +1,4 @@
    -package me.chanjar.weixin.mp.bean.pay;
    +package me.chanjar.weixin.mp.bean.pay.request;
     
     import com.thoughtworks.xstream.annotations.XStreamAlias;
     
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxPayRefundRequest.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/request/WxPayRefundRequest.java
    similarity index 99%
    rename from weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxPayRefundRequest.java
    rename to weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/request/WxPayRefundRequest.java
    index bc2802b7..f816fd0c 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxPayRefundRequest.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/request/WxPayRefundRequest.java
    @@ -1,4 +1,4 @@
    -package me.chanjar.weixin.mp.bean.pay;
    +package me.chanjar.weixin.mp.bean.pay.request;
     
     import com.thoughtworks.xstream.annotations.XStreamAlias;
     import me.chanjar.weixin.common.annotation.Required;
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxPaySendRedpackRequest.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/request/WxPaySendRedpackRequest.java
    similarity index 99%
    rename from weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxPaySendRedpackRequest.java
    rename to weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/request/WxPaySendRedpackRequest.java
    index 27a46a71..cad2cc52 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxPaySendRedpackRequest.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/request/WxPaySendRedpackRequest.java
    @@ -1,4 +1,4 @@
    -package me.chanjar.weixin.mp.bean.pay;
    +package me.chanjar.weixin.mp.bean.pay.request;
     
     import com.thoughtworks.xstream.annotations.XStreamAlias;
     
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxPayUnifiedOrderRequest.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/request/WxPayUnifiedOrderRequest.java
    similarity index 99%
    rename from weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxPayUnifiedOrderRequest.java
    rename to weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/request/WxPayUnifiedOrderRequest.java
    index de3518ae..1a6f3f80 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxPayUnifiedOrderRequest.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/request/WxPayUnifiedOrderRequest.java
    @@ -1,4 +1,4 @@
    -package me.chanjar.weixin.mp.bean.pay;
    +package me.chanjar.weixin.mp.bean.pay.request;
     
     import com.thoughtworks.xstream.annotations.XStreamAlias;
     import me.chanjar.weixin.common.annotation.Required;
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxEntPayQueryResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/result/WxEntPayQueryResult.java
    similarity index 98%
    rename from weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxEntPayQueryResult.java
    rename to weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/result/WxEntPayQueryResult.java
    index 382a8858..5682a393 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxEntPayQueryResult.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/result/WxEntPayQueryResult.java
    @@ -1,4 +1,4 @@
    -package me.chanjar.weixin.mp.bean.pay;
    +package me.chanjar.weixin.mp.bean.pay.result;
     
     import com.thoughtworks.xstream.annotations.XStreamAlias;
     
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxEntPayResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/result/WxEntPayResult.java
    similarity index 97%
    rename from weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxEntPayResult.java
    rename to weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/result/WxEntPayResult.java
    index 07bac47b..61679b6a 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxEntPayResult.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/result/WxEntPayResult.java
    @@ -1,4 +1,4 @@
    -package me.chanjar.weixin.mp.bean.pay;
    +package me.chanjar.weixin.mp.bean.pay.result;
     
     import com.thoughtworks.xstream.annotations.XStreamAlias;
     
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxPayBaseResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/result/WxPayBaseResult.java
    similarity index 98%
    rename from weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxPayBaseResult.java
    rename to weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/result/WxPayBaseResult.java
    index cdec8273..18b33748 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxPayBaseResult.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/result/WxPayBaseResult.java
    @@ -1,4 +1,4 @@
    -package me.chanjar.weixin.mp.bean.pay;
    +package me.chanjar.weixin.mp.bean.pay.result;
     
     import com.thoughtworks.xstream.annotations.XStreamAlias;
     import org.apache.commons.lang3.builder.ToStringBuilder;
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxPayOrderQueryResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/result/WxPayOrderQueryResult.java
    similarity index 98%
    rename from weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxPayOrderQueryResult.java
    rename to weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/result/WxPayOrderQueryResult.java
    index 25dc6cc8..679c70c9 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxPayOrderQueryResult.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/result/WxPayOrderQueryResult.java
    @@ -1,4 +1,4 @@
    -package me.chanjar.weixin.mp.bean.pay;
    +package me.chanjar.weixin.mp.bean.pay.result;
     
     import com.google.common.collect.Lists;
     import com.thoughtworks.xstream.annotations.XStreamAlias;
    @@ -436,7 +436,7 @@ public class WxPayOrderQueryResult extends WxPayBaseResult {
       }
     
       public void composeCoupons(String xmlString){
    -    if(this.couponCount > 0 ){
    +    if(this.couponCount != null && this.couponCount > 0 ){
           this.coupons = Lists.newArrayList();
           //TODO 暂时待实现
         }
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxPayRefundResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/result/WxPayRefundResult.java
    similarity index 98%
    rename from weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxPayRefundResult.java
    rename to weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/result/WxPayRefundResult.java
    index ad20b8f1..5be68d94 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxPayRefundResult.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/result/WxPayRefundResult.java
    @@ -1,4 +1,4 @@
    -package me.chanjar.weixin.mp.bean.pay;
    +package me.chanjar.weixin.mp.bean.pay.result;
     
     import com.thoughtworks.xstream.annotations.XStreamAlias;
     
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxPaySendRedpackResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/result/WxPaySendRedpackResult.java
    similarity index 97%
    rename from weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxPaySendRedpackResult.java
    rename to weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/result/WxPaySendRedpackResult.java
    index 4a5ab146..d53fb693 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxPaySendRedpackResult.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/result/WxPaySendRedpackResult.java
    @@ -1,4 +1,4 @@
    -package me.chanjar.weixin.mp.bean.pay;
    +package me.chanjar.weixin.mp.bean.pay.result;
     
     import com.thoughtworks.xstream.annotations.XStreamAlias;
     
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxPayUnifiedOrderResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/result/WxPayUnifiedOrderResult.java
    similarity index 95%
    rename from weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxPayUnifiedOrderResult.java
    rename to weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/result/WxPayUnifiedOrderResult.java
    index 012da5a4..70c13519 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxPayUnifiedOrderResult.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/result/WxPayUnifiedOrderResult.java
    @@ -1,4 +1,4 @@
    -package me.chanjar.weixin.mp.bean.pay;
    +package me.chanjar.weixin.mp.bean.pay.result;
     
     import com.thoughtworks.xstream.annotations.XStreamAlias;
     
    diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImplTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImplTest.java
    index 51414e1b..0f946dc3 100644
    --- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImplTest.java
    +++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImplTest.java
    @@ -4,7 +4,13 @@ import com.google.inject.Inject;
     import me.chanjar.weixin.common.exception.WxErrorException;
     import me.chanjar.weixin.mp.api.ApiTestModule;
     import me.chanjar.weixin.mp.api.WxXmlMpInMemoryConfigStorage;
    -import me.chanjar.weixin.mp.bean.pay.*;
    +import me.chanjar.weixin.mp.bean.pay.request.WxEntPayRequest;
    +import me.chanjar.weixin.mp.bean.pay.request.WxPayRefundRequest;
    +import me.chanjar.weixin.mp.bean.pay.request.WxPaySendRedpackRequest;
    +import me.chanjar.weixin.mp.bean.pay.request.WxPayUnifiedOrderRequest;
    +import me.chanjar.weixin.mp.bean.pay.result.WxPayRefundResult;
    +import me.chanjar.weixin.mp.bean.pay.result.WxPaySendRedpackResult;
    +import me.chanjar.weixin.mp.bean.pay.result.WxPayUnifiedOrderResult;
     import org.testng.annotations.Guice;
     import org.testng.annotations.Test;
     
    @@ -27,11 +33,6 @@ public class WxMpPayServiceImplTest {
     
       }
     
    -  @Test
    -  public void testGetJSSDKCallbackData() throws Exception {
    -
    -  }
    -
       @Test
       public void testRefund() throws Exception {
         WxPayRefundRequest request = new WxPayRefundRequest();
    diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/WxRedpackResultTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/pay/result/WxPaySendRedpackResultTest.java
    similarity index 71%
    rename from weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/WxRedpackResultTest.java
    rename to weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/pay/result/WxPaySendRedpackResultTest.java
    index 557065ca..a07ec972 100644
    --- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/WxRedpackResultTest.java
    +++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/pay/result/WxPaySendRedpackResultTest.java
    @@ -1,26 +1,23 @@
    -package me.chanjar.weixin.mp.bean;
    -
    -import static org.junit.Assert.assertEquals;
    -
    -import org.junit.Before;
    -import org.junit.Test;
    +package me.chanjar.weixin.mp.bean.pay.result;
     
     import com.thoughtworks.xstream.XStream;
    -
     import me.chanjar.weixin.common.util.xml.XStreamInitializer;
    -import me.chanjar.weixin.mp.bean.pay.WxPaySendRedpackResult;
    +import org.testng.Assert;
    +import org.testng.annotations.BeforeTest;
    +import org.testng.annotations.Test;
     
    -public class WxRedpackResultTest {
    +public class WxPaySendRedpackResultTest {
     
       private XStream xstream;
     
    -  @Before
    +  @BeforeTest
       public void setup() {
          this.xstream = XStreamInitializer.getInstance();
          this.xstream.processAnnotations(WxPaySendRedpackResult.class);
       }
     
    -  @Test public void loadSuccessResult() {
    +  @Test
    +  public void loadSuccessResult() {
         final String successSample = "\n" +
             "\n" +
             "\n" +
    @@ -36,12 +33,13 @@ public class WxRedpackResultTest {
             "20150520102602\n" +
             "";
         WxPaySendRedpackResult wxMpRedpackResult = (WxPaySendRedpackResult) this.xstream.fromXML(successSample);
    -    assertEquals("SUCCESS", wxMpRedpackResult.getReturnCode());
    -    assertEquals("SUCCESS", wxMpRedpackResult.getResultCode());
    -    assertEquals("20150520102602", wxMpRedpackResult.getSendTime());
    +    Assert.assertEquals("SUCCESS", wxMpRedpackResult.getReturnCode());
    +    Assert.assertEquals("SUCCESS", wxMpRedpackResult.getResultCode());
    +    Assert.assertEquals("20150520102602", wxMpRedpackResult.getSendTime());
       }
     
    -  @Test public void loadFailureResult() {
    +  @Test
    +  public void loadFailureResult() {
         final String failureSample = "\n" +
             "\n" +
             "\n" +
    @@ -55,9 +53,9 @@ public class WxRedpackResultTest {
             "1\n" +
             "";
         WxPaySendRedpackResult wxMpRedpackResult = (WxPaySendRedpackResult) this.xstream.fromXML(failureSample);
    -    assertEquals("FAIL", wxMpRedpackResult.getReturnCode());
    -    assertEquals("FAIL", wxMpRedpackResult.getResultCode());
    -    assertEquals("onqOjjmM1tad-3ROpncN-yUfa6uI", wxMpRedpackResult.getReOpenid());
    -    assertEquals(1, wxMpRedpackResult.getTotalAmount());
    +    Assert.assertEquals("FAIL", wxMpRedpackResult.getReturnCode());
    +    Assert.assertEquals("FAIL", wxMpRedpackResult.getResultCode());
    +    Assert.assertEquals("onqOjjmM1tad-3ROpncN-yUfa6uI", wxMpRedpackResult.getReOpenid());
    +    Assert.assertEquals(1, wxMpRedpackResult.getTotalAmount());
       }
     }
    
    From 8a376f5dc9725e49e0d976221e87a004231c8f18 Mon Sep 17 00:00:00 2001
    From: Binary Wang 
    Date: Tue, 25 Oct 2016 14:26:37 +0800
    Subject: [PATCH 51/83] =?UTF-8?q?=E9=87=8D=E6=9E=84=E8=A7=84=E8=8C=83?=
     =?UTF-8?q?=E5=8C=96=E5=BE=AE=E4=BF=A1=E6=94=AF=E4=BB=98=E7=9B=B8=E5=85=B3?=
     =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E7=B1=BB?=
    MIME-Version: 1.0
    Content-Type: text/plain; charset=UTF-8
    Content-Transfer-Encoding: 8bit
    
    ---
     .../pay/request/WxEntPayQueryRequest.java     | 37 +++-------
     .../mp/bean/pay/request/WxEntPayRequest.java  | 24 +++----
     .../mp/bean/pay/request/WxPayBaseRequest.java | 11 +--
     .../pay/request/WxPayOrderQueryRequest.java   |  4 +-
     .../bean/pay/request/WxPayRefundRequest.java  | 27 ++++----
     .../pay/request/WxPayUnifiedOrderRequest.java | 32 +--------
     .../bean/pay/result/WxEntPayQueryResult.java  | 22 +++---
     .../mp/bean/pay/result/WxEntPayResult.java    | 10 +--
     .../mp/bean/pay/result/WxPayBaseResult.java   | 21 +++---
     .../pay/result/WxPayOrderQueryResult.java     | 67 +++++++++++++------
     .../mp/bean/pay/result/WxPayRefundResult.java | 20 +-----
     .../pay/result/WxPaySendRedpackResult.java    | 16 ++---
     12 files changed, 127 insertions(+), 164 deletions(-)
    
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/request/WxEntPayQueryRequest.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/request/WxEntPayQueryRequest.java
    index 47612ad3..499e111d 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/request/WxEntPayQueryRequest.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/request/WxEntPayQueryRequest.java
    @@ -1,10 +1,12 @@
     package me.chanjar.weixin.mp.bean.pay.request;
     
    -import com.thoughtworks.xstream.annotations.XStreamAlias;
    -import me.chanjar.weixin.common.annotation.Required;
     import org.apache.commons.lang3.builder.ToStringBuilder;
     import org.apache.commons.lang3.builder.ToStringStyle;
     
    +import com.thoughtworks.xstream.annotations.XStreamAlias;
    +
    +import me.chanjar.weixin.common.annotation.Required;
    +
     /**
      * 
      * 企业付款请求对象
    @@ -31,6 +33,7 @@ public class WxEntPayQueryRequest extends WxPayBaseRequest {
        * 微信支付分配的商户号
        * 
    */ + @SuppressWarnings("hiding") @XStreamAlias("mchid") private String mchId; @@ -48,40 +51,18 @@ public class WxEntPayQueryRequest extends WxPayBaseRequest { @XStreamAlias("partner_trade_no") private String partnerTradeNo; - public String getAppid() { - return appid; - } - - public void setAppid(String appid) { - this.appid = appid; - } - + @Override public String getMchId() { - return mchId; + return this.mchId; } + @Override public void setMchId(String mchId) { this.mchId = mchId; } - public String getNonceStr() { - return nonceStr; - } - - public void setNonceStr(String nonceStr) { - this.nonceStr = nonceStr; - } - - public String getSign() { - return sign; - } - - public void setSign(String sign) { - this.sign = sign; - } - public String getPartnerTradeNo() { - return partnerTradeNo; + return this.partnerTradeNo; } public void setPartnerTradeNo(String partnerTradeNo) { diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/request/WxEntPayRequest.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/request/WxEntPayRequest.java index 6f019c1e..196ef95f 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/request/WxEntPayRequest.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/request/WxEntPayRequest.java @@ -181,7 +181,7 @@ public class WxEntPayRequest { private String spbillCreateIp; public String getMchAppid() { - return mchAppid; + return this.mchAppid; } public void setMchAppid(String mchAppid) { @@ -189,7 +189,7 @@ public class WxEntPayRequest { } public String getMchId() { - return mchId; + return this.mchId; } public void setMchId(String mchId) { @@ -197,7 +197,7 @@ public class WxEntPayRequest { } public String getDeviceInfo() { - return deviceInfo; + return this.deviceInfo; } public void setDeviceInfo(String deviceInfo) { @@ -205,7 +205,7 @@ public class WxEntPayRequest { } public String getNonceStr() { - return nonceStr; + return this.nonceStr; } public void setNonceStr(String nonceStr) { @@ -213,7 +213,7 @@ public class WxEntPayRequest { } public String getSign() { - return sign; + return this.sign; } public void setSign(String sign) { @@ -221,7 +221,7 @@ public class WxEntPayRequest { } public String getPartnerTradeNo() { - return partnerTradeNo; + return this.partnerTradeNo; } public void setPartnerTradeNo(String partnerTradeNo) { @@ -229,7 +229,7 @@ public class WxEntPayRequest { } public String getOpenid() { - return openid; + return this.openid; } public void setOpenid(String openid) { @@ -237,7 +237,7 @@ public class WxEntPayRequest { } public String getCheckName() { - return checkName; + return this.checkName; } public void setCheckName(String checkName) { @@ -245,7 +245,7 @@ public class WxEntPayRequest { } public String getReUserName() { - return reUserName; + return this.reUserName; } public void setReUserName(String reUserName) { @@ -253,7 +253,7 @@ public class WxEntPayRequest { } public Integer getAmount() { - return amount; + return this.amount; } public void setAmount(Integer amount) { @@ -261,7 +261,7 @@ public class WxEntPayRequest { } public String getDescription() { - return description; + return this.description; } public void setDescription(String description) { @@ -269,7 +269,7 @@ public class WxEntPayRequest { } public String getSpbillCreateIp() { - return spbillCreateIp; + return this.spbillCreateIp; } public void setSpbillCreateIp(String spbillCreateIp) { diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/request/WxPayBaseRequest.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/request/WxPayBaseRequest.java index a66f9379..aabbdfd1 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/request/WxPayBaseRequest.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/request/WxPayBaseRequest.java @@ -1,9 +1,10 @@ package me.chanjar.weixin.mp.bean.pay.request; -import com.thoughtworks.xstream.annotations.XStreamAlias; import org.apache.commons.lang3.builder.ToStringBuilder; import org.apache.commons.lang3.builder.ToStringStyle; +import com.thoughtworks.xstream.annotations.XStreamAlias; + /** *
      * Created by Binary Wang on 2016-10-24.
    @@ -69,7 +70,7 @@ public abstract class WxPayBaseRequest {
       protected String sign;
     
       public String getAppid() {
    -    return appid;
    +    return this.appid;
       }
     
       public void setAppid(String appid) {
    @@ -77,7 +78,7 @@ public abstract class WxPayBaseRequest {
       }
     
       public String getMchId() {
    -    return mchId;
    +    return this.mchId;
       }
     
       public void setMchId(String mchId) {
    @@ -85,7 +86,7 @@ public abstract class WxPayBaseRequest {
       }
     
       public String getNonceStr() {
    -    return nonceStr;
    +    return this.nonceStr;
       }
     
       public void setNonceStr(String nonceStr) {
    @@ -93,7 +94,7 @@ public abstract class WxPayBaseRequest {
       }
     
       public String getSign() {
    -    return sign;
    +    return this.sign;
       }
     
       public void setSign(String sign) {
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/request/WxPayOrderQueryRequest.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/request/WxPayOrderQueryRequest.java
    index 153831d3..3cc7dd2b 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/request/WxPayOrderQueryRequest.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/request/WxPayOrderQueryRequest.java
    @@ -46,7 +46,7 @@ public class WxPayOrderQueryRequest extends WxPayBaseRequest {
       private String outTradeNo;
     
       public String getTransactionId() {
    -    return transactionId;
    +    return this.transactionId;
       }
     
       public void setTransactionId(String transactionId) {
    @@ -54,7 +54,7 @@ public class WxPayOrderQueryRequest extends WxPayBaseRequest {
       }
     
       public String getOutTradeNo() {
    -    return outTradeNo;
    +    return this.outTradeNo;
       }
     
       public void setOutTradeNo(String outTradeNo) {
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/request/WxPayRefundRequest.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/request/WxPayRefundRequest.java
    index f816fd0c..9a0c0178 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/request/WxPayRefundRequest.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/request/WxPayRefundRequest.java
    @@ -1,6 +1,7 @@
     package me.chanjar.weixin.mp.bean.pay.request;
     
     import com.thoughtworks.xstream.annotations.XStreamAlias;
    +
     import me.chanjar.weixin.common.annotation.Required;
     
     /**
    @@ -196,7 +197,7 @@ public class WxPayRefundRequest {
       private String refundAccount;
     
       public String getAppid() {
    -    return appid;
    +    return this.appid;
       }
     
       public void setAppid(String appid) {
    @@ -204,7 +205,7 @@ public class WxPayRefundRequest {
       }
     
       public String getMchId() {
    -    return mchId;
    +    return this.mchId;
       }
     
       public void setMchId(String mchId) {
    @@ -212,7 +213,7 @@ public class WxPayRefundRequest {
       }
     
       public String getDeviceInfo() {
    -    return deviceInfo;
    +    return this.deviceInfo;
       }
     
       public void setDeviceInfo(String deviceInfo) {
    @@ -220,7 +221,7 @@ public class WxPayRefundRequest {
       }
     
       public String getNonceStr() {
    -    return nonceStr;
    +    return this.nonceStr;
       }
     
       public void setNonceStr(String nonceStr) {
    @@ -228,7 +229,7 @@ public class WxPayRefundRequest {
       }
     
       public String getSign() {
    -    return sign;
    +    return this.sign;
       }
     
       public void setSign(String sign) {
    @@ -236,7 +237,7 @@ public class WxPayRefundRequest {
       }
     
       public String getTransactionId() {
    -    return transactionId;
    +    return this.transactionId;
       }
     
       public void setTransactionId(String transactionId) {
    @@ -244,7 +245,7 @@ public class WxPayRefundRequest {
       }
     
       public String getOutTradeNo() {
    -    return outTradeNo;
    +    return this.outTradeNo;
       }
     
       public void setOutTradeNo(String outTradeNo) {
    @@ -252,7 +253,7 @@ public class WxPayRefundRequest {
       }
     
       public String getOutRefundNo() {
    -    return outRefundNo;
    +    return this.outRefundNo;
       }
     
       public void setOutRefundNo(String outRefundNo) {
    @@ -260,7 +261,7 @@ public class WxPayRefundRequest {
       }
     
       public Integer getTotalFee() {
    -    return totalFee;
    +    return this.totalFee;
       }
     
       public void setTotalFee(Integer totalFee) {
    @@ -268,7 +269,7 @@ public class WxPayRefundRequest {
       }
     
       public Integer getRefundFee() {
    -    return refundFee;
    +    return this.refundFee;
       }
     
       public void setRefundFee(Integer refundFee) {
    @@ -276,7 +277,7 @@ public class WxPayRefundRequest {
       }
     
       public String getRefundFeeType() {
    -    return refundFeeType;
    +    return this.refundFeeType;
       }
     
       public void setRefundFeeType(String refundFeeType) {
    @@ -284,7 +285,7 @@ public class WxPayRefundRequest {
       }
     
       public String getOpUserId() {
    -    return opUserId;
    +    return this.opUserId;
       }
     
       public void setOpUserId(String opUserId) {
    @@ -292,7 +293,7 @@ public class WxPayRefundRequest {
       }
     
       public String getRefundAccount() {
    -    return refundAccount;
    +    return this.refundAccount;
       }
     
       public void setRefundAccount(String refundAccount) {
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/request/WxPayUnifiedOrderRequest.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/request/WxPayUnifiedOrderRequest.java
    index 1a6f3f80..195e13b0 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/request/WxPayUnifiedOrderRequest.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/request/WxPayUnifiedOrderRequest.java
    @@ -1,6 +1,7 @@
     package me.chanjar.weixin.mp.bean.pay.request;
     
     import com.thoughtworks.xstream.annotations.XStreamAlias;
    +
     import me.chanjar.weixin.common.annotation.Required;
     
     /**
    @@ -266,21 +267,6 @@ public class WxPayUnifiedOrderRequest extends WxPayBaseRequest {
       @XStreamAlias("openid")
       private String openid;
     
    -  public String getAppid() {
    -    return this.appid;
    -  }
    -
    -  public void setAppid(String appid) {
    -    this.appid = appid;
    -  }
    -
    -  public String getMchId() {
    -    return this.mchId;
    -  }
    -
    -  public void setMchId(String mchId) {
    -    this.mchId = mchId;
    -  }
     
       public String getDeviceInfo() {
         return this.deviceInfo;
    @@ -290,22 +276,6 @@ public class WxPayUnifiedOrderRequest extends WxPayBaseRequest {
         this.deviceInfo = deviceInfo;
       }
     
    -  public String getNonceStr() {
    -    return this.nonceStr;
    -  }
    -
    -  public void setNonceStr(String nonceStr) {
    -    this.nonceStr = nonceStr;
    -  }
    -
    -  public String getSign() {
    -    return this.sign;
    -  }
    -
    -  public void setSign(String sign) {
    -    this.sign = sign;
    -  }
    -
       public String getBody() {
         return this.body;
       }
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/result/WxEntPayQueryResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/result/WxEntPayQueryResult.java
    index 5682a393..d74c0b41 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/result/WxEntPayQueryResult.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/result/WxEntPayQueryResult.java
    @@ -66,7 +66,7 @@ public class WxEntPayQueryResult extends WxPayBaseResult {
       private String desc;
     
       public String getReturnCode() {
    -    return returnCode;
    +    return this.returnCode;
       }
     
       public void setReturnCode(String returnCode) {
    @@ -74,7 +74,7 @@ public class WxEntPayQueryResult extends WxPayBaseResult {
       }
     
       public String getReturnMsg() {
    -    return returnMsg;
    +    return this.returnMsg;
       }
     
       public void setReturnMsg(String returnMsg) {
    @@ -82,7 +82,7 @@ public class WxEntPayQueryResult extends WxPayBaseResult {
       }
     
       public String getPartnerTradeNo() {
    -    return partnerTradeNo;
    +    return this.partnerTradeNo;
       }
     
       public void setPartnerTradeNo(String partnerTradeNo) {
    @@ -90,7 +90,7 @@ public class WxEntPayQueryResult extends WxPayBaseResult {
       }
     
       public String getDetailId() {
    -    return detailId;
    +    return this.detailId;
       }
     
       public void setDetailId(String detailId) {
    @@ -98,7 +98,7 @@ public class WxEntPayQueryResult extends WxPayBaseResult {
       }
     
       public String getStatus() {
    -    return status;
    +    return this.status;
       }
     
       public void setStatus(String status) {
    @@ -106,7 +106,7 @@ public class WxEntPayQueryResult extends WxPayBaseResult {
       }
     
       public String getReason() {
    -    return reason;
    +    return this.reason;
       }
     
       public void setReason(String reason) {
    @@ -114,7 +114,7 @@ public class WxEntPayQueryResult extends WxPayBaseResult {
       }
     
       public String getOpenid() {
    -    return openid;
    +    return this.openid;
       }
     
       public void setOpenid(String openid) {
    @@ -122,7 +122,7 @@ public class WxEntPayQueryResult extends WxPayBaseResult {
       }
     
       public String getTransferName() {
    -    return transferName;
    +    return this.transferName;
       }
     
       public void setTransferName(String transferName) {
    @@ -130,7 +130,7 @@ public class WxEntPayQueryResult extends WxPayBaseResult {
       }
     
       public Integer getPaymentAmount() {
    -    return paymentAmount;
    +    return this.paymentAmount;
       }
     
       public void setPaymentAmount(Integer paymentAmount) {
    @@ -138,7 +138,7 @@ public class WxEntPayQueryResult extends WxPayBaseResult {
       }
     
       public String getTransferTime() {
    -    return transferTime;
    +    return this.transferTime;
       }
     
       public void setTransferTime(String transferTime) {
    @@ -146,7 +146,7 @@ public class WxEntPayQueryResult extends WxPayBaseResult {
       }
     
       public String getDesc() {
    -    return desc;
    +    return this.desc;
       }
     
       public void setDesc(String desc) {
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/result/WxEntPayResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/result/WxEntPayResult.java
    index 61679b6a..5a8c4b75 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/result/WxEntPayResult.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/result/WxEntPayResult.java
    @@ -42,7 +42,7 @@ public class WxEntPayResult extends WxPayBaseResult {
       private String paymentTime;
     
       public String getMchAppid() {
    -    return mchAppid;
    +    return this.mchAppid;
       }
     
       public void setMchAppid(String mchAppid) {
    @@ -50,7 +50,7 @@ public class WxEntPayResult extends WxPayBaseResult {
       }
     
       public String getDeviceInfo() {
    -    return deviceInfo;
    +    return this.deviceInfo;
       }
     
       public void setDeviceInfo(String deviceInfo) {
    @@ -58,7 +58,7 @@ public class WxEntPayResult extends WxPayBaseResult {
       }
     
       public String getPartnerTradeNo() {
    -    return partnerTradeNo;
    +    return this.partnerTradeNo;
       }
     
       public void setPartnerTradeNo(String partnerTradeNo) {
    @@ -66,7 +66,7 @@ public class WxEntPayResult extends WxPayBaseResult {
       }
     
       public String getPaymentNo() {
    -    return paymentNo;
    +    return this.paymentNo;
       }
     
       public void setPaymentNo(String paymentNo) {
    @@ -74,7 +74,7 @@ public class WxEntPayResult extends WxPayBaseResult {
       }
     
       public String getPaymentTime() {
    -    return paymentTime;
    +    return this.paymentTime;
       }
     
       public void setPaymentTime(String paymentTime) {
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/result/WxPayBaseResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/result/WxPayBaseResult.java
    index 18b33748..79f8dbb5 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/result/WxPayBaseResult.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/result/WxPayBaseResult.java
    @@ -1,9 +1,10 @@
     package me.chanjar.weixin.mp.bean.pay.result;
     
    -import com.thoughtworks.xstream.annotations.XStreamAlias;
     import org.apache.commons.lang3.builder.ToStringBuilder;
     import org.apache.commons.lang3.builder.ToStringStyle;
     
    +import com.thoughtworks.xstream.annotations.XStreamAlias;
    +
     /**
      * 
      * 微信支付结果共用属性类
    @@ -72,7 +73,7 @@ public abstract class WxPayBaseResult {
       private String sign;
     
       public String getReturnCode() {
    -    return returnCode;
    +    return this.returnCode;
       }
     
       public void setReturnCode(String returnCode) {
    @@ -80,7 +81,7 @@ public abstract class WxPayBaseResult {
       }
     
       public String getReturnMsg() {
    -    return returnMsg;
    +    return this.returnMsg;
       }
     
       public void setReturnMsg(String returnMsg) {
    @@ -88,7 +89,7 @@ public abstract class WxPayBaseResult {
       }
     
       public String getResultCode() {
    -    return resultCode;
    +    return this.resultCode;
       }
     
       public void setResultCode(String resultCode) {
    @@ -96,7 +97,7 @@ public abstract class WxPayBaseResult {
       }
     
       public String getErrCode() {
    -    return errCode;
    +    return this.errCode;
       }
     
       public void setErrCode(String errCode) {
    @@ -104,7 +105,7 @@ public abstract class WxPayBaseResult {
       }
     
       public String getErrCodeDes() {
    -    return errCodeDes;
    +    return this.errCodeDes;
       }
     
       public void setErrCodeDes(String errCodeDes) {
    @@ -112,7 +113,7 @@ public abstract class WxPayBaseResult {
       }
     
       public String getAppid() {
    -    return appid;
    +    return this.appid;
       }
     
       public void setAppid(String appid) {
    @@ -120,7 +121,7 @@ public abstract class WxPayBaseResult {
       }
     
       public String getMchId() {
    -    return mchId;
    +    return this.mchId;
       }
     
       public void setMchId(String mchId) {
    @@ -128,7 +129,7 @@ public abstract class WxPayBaseResult {
       }
     
       public String getNonceStr() {
    -    return nonceStr;
    +    return this.nonceStr;
       }
     
       public void setNonceStr(String nonceStr) {
    @@ -136,7 +137,7 @@ public abstract class WxPayBaseResult {
       }
     
       public String getSign() {
    -    return sign;
    +    return this.sign;
       }
     
       public void setSign(String sign) {
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/result/WxPayOrderQueryResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/result/WxPayOrderQueryResult.java
    index 679c70c9..17b3a412 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/result/WxPayOrderQueryResult.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/result/WxPayOrderQueryResult.java
    @@ -1,10 +1,10 @@
     package me.chanjar.weixin.mp.bean.pay.result;
     
    +import java.util.List;
    +
     import com.google.common.collect.Lists;
     import com.thoughtworks.xstream.annotations.XStreamAlias;
     
    -import java.util.List;
    -
     /**
      * 
      *  查询订单 返回结果对象
    @@ -221,6 +221,31 @@ public class WxPayOrderQueryResult extends WxPayBaseResult {
           this.couponId = couponId;
           this.couponFee = couponFee;
         }
    +
    +    public String getCouponType() {
    +      return this.couponType;
    +    }
    +
    +    public void setCouponType(String couponType) {
    +      this.couponType = couponType;
    +    }
    +
    +    public String getCouponId() {
    +      return this.couponId;
    +    }
    +
    +    public void setCouponId(String couponId) {
    +      this.couponId = couponId;
    +    }
    +
    +    public Integer getCouponFee() {
    +      return this.couponFee;
    +    }
    +
    +    public void setCouponFee(Integer couponFee) {
    +      this.couponFee = couponFee;
    +    }
    +
       }
     
       /**
    @@ -284,7 +309,7 @@ public class WxPayOrderQueryResult extends WxPayBaseResult {
       private String tradeStateDesc;
     
       public String getDeviceInfo() {
    -    return deviceInfo;
    +    return this.deviceInfo;
       }
     
       public void setDeviceInfo(String deviceInfo) {
    @@ -292,7 +317,7 @@ public class WxPayOrderQueryResult extends WxPayBaseResult {
       }
     
       public String getOpenid() {
    -    return openid;
    +    return this.openid;
       }
     
       public void setOpenid(String openid) {
    @@ -300,7 +325,7 @@ public class WxPayOrderQueryResult extends WxPayBaseResult {
       }
     
       public String getIsSubscribe() {
    -    return isSubscribe;
    +    return this.isSubscribe;
       }
     
       public void setIsSubscribe(String isSubscribe) {
    @@ -308,7 +333,7 @@ public class WxPayOrderQueryResult extends WxPayBaseResult {
       }
     
       public String getTradeType() {
    -    return tradeType;
    +    return this.tradeType;
       }
     
       public void setTradeType(String tradeType) {
    @@ -316,7 +341,7 @@ public class WxPayOrderQueryResult extends WxPayBaseResult {
       }
     
       public String getTradeState() {
    -    return tradeState;
    +    return this.tradeState;
       }
     
       public void setTradeState(String tradeState) {
    @@ -324,7 +349,7 @@ public class WxPayOrderQueryResult extends WxPayBaseResult {
       }
     
       public String getBankType() {
    -    return bankType;
    +    return this.bankType;
       }
     
       public void setBankType(String bankType) {
    @@ -332,7 +357,7 @@ public class WxPayOrderQueryResult extends WxPayBaseResult {
       }
     
       public Integer getTotalFee() {
    -    return totalFee;
    +    return this.totalFee;
       }
     
       public void setTotalFee(Integer totalFee) {
    @@ -340,7 +365,7 @@ public class WxPayOrderQueryResult extends WxPayBaseResult {
       }
     
       public Integer getSettlementTotalFee() {
    -    return settlementTotalFee;
    +    return this.settlementTotalFee;
       }
     
       public void setSettlementTotalFee(Integer settlementTotalFee) {
    @@ -348,7 +373,7 @@ public class WxPayOrderQueryResult extends WxPayBaseResult {
       }
     
       public String getFeeType() {
    -    return feeType;
    +    return this.feeType;
       }
     
       public void setFeeType(String feeType) {
    @@ -356,7 +381,7 @@ public class WxPayOrderQueryResult extends WxPayBaseResult {
       }
     
       public Integer getCashFee() {
    -    return cashFee;
    +    return this.cashFee;
       }
     
       public void setCashFee(Integer cashFee) {
    @@ -364,7 +389,7 @@ public class WxPayOrderQueryResult extends WxPayBaseResult {
       }
     
       public String getCashFeeType() {
    -    return cashFeeType;
    +    return this.cashFeeType;
       }
     
       public void setCashFeeType(String cashFeeType) {
    @@ -372,7 +397,7 @@ public class WxPayOrderQueryResult extends WxPayBaseResult {
       }
     
       public Integer getCouponFee() {
    -    return couponFee;
    +    return this.couponFee;
       }
     
       public void setCouponFee(Integer couponFee) {
    @@ -380,7 +405,7 @@ public class WxPayOrderQueryResult extends WxPayBaseResult {
       }
     
       public Integer getCouponCount() {
    -    return couponCount;
    +    return this.couponCount;
       }
     
       public void setCouponCount(Integer couponCount) {
    @@ -388,7 +413,7 @@ public class WxPayOrderQueryResult extends WxPayBaseResult {
       }
     
       public List getCoupons() {
    -    return coupons;
    +    return this.coupons;
       }
     
       public void setCoupons(List coupons) {
    @@ -396,7 +421,7 @@ public class WxPayOrderQueryResult extends WxPayBaseResult {
       }
     
       public String getTransactionId() {
    -    return transactionId;
    +    return this.transactionId;
       }
     
       public void setTransactionId(String transactionId) {
    @@ -404,7 +429,7 @@ public class WxPayOrderQueryResult extends WxPayBaseResult {
       }
     
       public String getOutTradeNo() {
    -    return outTradeNo;
    +    return this.outTradeNo;
       }
     
       public void setOutTradeNo(String outTradeNo) {
    @@ -412,7 +437,7 @@ public class WxPayOrderQueryResult extends WxPayBaseResult {
       }
     
       public String getAttach() {
    -    return attach;
    +    return this.attach;
       }
     
       public void setAttach(String attach) {
    @@ -420,7 +445,7 @@ public class WxPayOrderQueryResult extends WxPayBaseResult {
       }
     
       public String getTimeEnd() {
    -    return timeEnd;
    +    return this.timeEnd;
       }
     
       public void setTimeEnd(String timeEnd) {
    @@ -428,7 +453,7 @@ public class WxPayOrderQueryResult extends WxPayBaseResult {
       }
     
       public String getTradeStateDesc() {
    -    return tradeStateDesc;
    +    return this.tradeStateDesc;
       }
     
       public void setTradeStateDesc(String tradeStateDesc) {
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/result/WxPayRefundResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/result/WxPayRefundResult.java
    index 5be68d94..d00e2db5 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/result/WxPayRefundResult.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/result/WxPayRefundResult.java
    @@ -1,9 +1,9 @@
     package me.chanjar.weixin.mp.bean.pay.result;
     
    -import com.thoughtworks.xstream.annotations.XStreamAlias;
    -
     import java.io.Serializable;
     
    +import com.thoughtworks.xstream.annotations.XStreamAlias;
    +
     /**
      * 
      * 微信支付-申请退款返回结果
    @@ -58,22 +58,6 @@ public class WxPayRefundResult extends WxPayBaseResult implements Serializable{
       @XStreamAlias("coupon_refund_id")
       private String couponRefundId;
     
    -  public String getReturnCode() {
    -    return this.returnCode;
    -  }
    -
    -  public void setReturnCode(String returnCode) {
    -    this.returnCode = returnCode;
    -  }
    -
    -  public String getReturnMsg() {
    -    return this.returnMsg;
    -  }
    -
    -  public void setReturnMsg(String returnMsg) {
    -    this.returnMsg = returnMsg;
    -  }
    -
       public String getDeviceInfo() {
         return this.deviceInfo;
       }
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/result/WxPaySendRedpackResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/result/WxPaySendRedpackResult.java
    index d53fb693..8fe009bc 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/result/WxPaySendRedpackResult.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/result/WxPaySendRedpackResult.java
    @@ -1,9 +1,9 @@
     package me.chanjar.weixin.mp.bean.pay.result;
     
    -import com.thoughtworks.xstream.annotations.XStreamAlias;
    -
     import java.io.Serializable;
     
    +import com.thoughtworks.xstream.annotations.XStreamAlias;
    +
     /**
      * 向微信用户个人发现金红包返回结果
      * https://pay.weixin.qq.com/wiki/doc/api/cash_coupon.php?chapter=13_5
    @@ -33,7 +33,7 @@ public class WxPaySendRedpackResult extends WxPayBaseResult implements Serializa
       private String sendListid;
     
       public String getMchBillno() {
    -    return mchBillno;
    +    return this.mchBillno;
       }
     
       public void setMchBillno(String mchBillno) {
    @@ -41,7 +41,7 @@ public class WxPaySendRedpackResult extends WxPayBaseResult implements Serializa
       }
     
       public String getWxappid() {
    -    return wxappid;
    +    return this.wxappid;
       }
     
       public void setWxappid(String wxappid) {
    @@ -49,7 +49,7 @@ public class WxPaySendRedpackResult extends WxPayBaseResult implements Serializa
       }
     
       public String getReOpenid() {
    -    return reOpenid;
    +    return this.reOpenid;
       }
     
       public void setReOpenid(String reOpenid) {
    @@ -57,7 +57,7 @@ public class WxPaySendRedpackResult extends WxPayBaseResult implements Serializa
       }
     
       public int getTotalAmount() {
    -    return totalAmount;
    +    return this.totalAmount;
       }
     
       public void setTotalAmount(int totalAmount) {
    @@ -65,7 +65,7 @@ public class WxPaySendRedpackResult extends WxPayBaseResult implements Serializa
       }
     
       public String getSendTime() {
    -    return sendTime;
    +    return this.sendTime;
       }
     
       public void setSendTime(String sendTime) {
    @@ -73,7 +73,7 @@ public class WxPaySendRedpackResult extends WxPayBaseResult implements Serializa
       }
     
       public String getSendListid() {
    -    return sendListid;
    +    return this.sendListid;
       }
     
       public void setSendListid(String sendListid) {
    
    From 11452e6de09dfd41a8861df8946dfb3ec608e8e5 Mon Sep 17 00:00:00 2001
    From: Binary Wang 
    Date: Tue, 25 Oct 2016 14:32:29 +0800
    Subject: [PATCH 52/83] =?UTF-8?q?=E6=B8=85=E7=90=86=E4=BB=A3=E7=A0=81?=
    MIME-Version: 1.0
    Content-Type: text/plain; charset=UTF-8
    Content-Transfer-Encoding: 8bit
    
    ---
     .../mp/bean/pay/result/WxEntPayQueryResult.java | 17 -----------------
     .../weixin/mp/bean/template/WxMpTemplate.java   | 12 ++++++------
     .../weixin/mp/demo/WxMpEndpointServlet.java     |  3 +--
     .../weixin/mp/demo/WxMpOAuth2Servlet.java       |  3 +--
     4 files changed, 8 insertions(+), 27 deletions(-)
    
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/result/WxEntPayQueryResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/result/WxEntPayQueryResult.java
    index d74c0b41..8ffbeff2 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/result/WxEntPayQueryResult.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/result/WxEntPayQueryResult.java
    @@ -10,7 +10,6 @@ import com.thoughtworks.xstream.annotations.XStreamAlias;
     @XStreamAlias("xml")
     public class WxEntPayQueryResult extends WxPayBaseResult {
     
    -  //############以下字段在return_code 和result_code都为SUCCESS的时候有返回##############
       /**
        * 商户订单号
        */
    @@ -65,22 +64,6 @@ public class WxEntPayQueryResult extends WxPayBaseResult {
       @XStreamAlias("desc")
       private String desc;
     
    -  public String getReturnCode() {
    -    return this.returnCode;
    -  }
    -
    -  public void setReturnCode(String returnCode) {
    -    this.returnCode = returnCode;
    -  }
    -
    -  public String getReturnMsg() {
    -    return this.returnMsg;
    -  }
    -
    -  public void setReturnMsg(String returnMsg) {
    -    this.returnMsg = returnMsg;
    -  }
    -
       public String getPartnerTradeNo() {
         return this.partnerTradeNo;
       }
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/template/WxMpTemplate.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/template/WxMpTemplate.java
    index ffa2711f..0b3a1e61 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/template/WxMpTemplate.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/template/WxMpTemplate.java
    @@ -76,7 +76,7 @@ public class WxMpTemplate {
       private String example;
     
       public String getTemplateId() {
    -    return templateId;
    +    return this.templateId;
       }
     
       public void setTemplateId(String templateId) {
    @@ -84,7 +84,7 @@ public class WxMpTemplate {
       }
     
       public String getTitle() {
    -    return title;
    +    return this.title;
       }
     
       public void setTitle(String title) {
    @@ -92,7 +92,7 @@ public class WxMpTemplate {
       }
     
       public String getPrimaryIndustry() {
    -    return primaryIndustry;
    +    return this.primaryIndustry;
       }
     
       public void setPrimaryIndustry(String primaryIndustry) {
    @@ -100,7 +100,7 @@ public class WxMpTemplate {
       }
     
       public String getDeputyIndustry() {
    -    return deputyIndustry;
    +    return this.deputyIndustry;
       }
     
       public void setDeputyIndustry(String deputyIndustry) {
    @@ -108,7 +108,7 @@ public class WxMpTemplate {
       }
     
       public String getContent() {
    -    return content;
    +    return this.content;
       }
     
       public void setContent(String content) {
    @@ -116,7 +116,7 @@ public class WxMpTemplate {
       }
     
       public String getExample() {
    -    return example;
    +    return this.example;
       }
     
       public void setExample(String example) {
    diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/WxMpEndpointServlet.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/WxMpEndpointServlet.java
    index d052af6c..63052f8b 100644
    --- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/WxMpEndpointServlet.java
    +++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/WxMpEndpointServlet.java
    @@ -2,7 +2,6 @@ package me.chanjar.weixin.mp.demo;
     
     import java.io.IOException;
     
    -import javax.servlet.ServletException;
     import javax.servlet.http.HttpServlet;
     import javax.servlet.http.HttpServletRequest;
     import javax.servlet.http.HttpServletResponse;
    @@ -33,7 +32,7 @@ public class WxMpEndpointServlet extends HttpServlet {
     
       @Override
       protected void service(HttpServletRequest request, HttpServletResponse response)
    -      throws ServletException, IOException {
    +      throws IOException {
     
         response.setContentType("text/html;charset=utf-8");
         response.setStatus(HttpServletResponse.SC_OK);
    diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/WxMpOAuth2Servlet.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/WxMpOAuth2Servlet.java
    index 4008e1fb..8eeb9052 100644
    --- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/WxMpOAuth2Servlet.java
    +++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/WxMpOAuth2Servlet.java
    @@ -2,7 +2,6 @@ package me.chanjar.weixin.mp.demo;
     
     import java.io.IOException;
     
    -import javax.servlet.ServletException;
     import javax.servlet.http.HttpServlet;
     import javax.servlet.http.HttpServletRequest;
     import javax.servlet.http.HttpServletResponse;
    @@ -23,7 +22,7 @@ public class WxMpOAuth2Servlet extends HttpServlet {
     
       @Override
       protected void service(HttpServletRequest request, HttpServletResponse response)
    -      throws ServletException, IOException {
    +      throws IOException {
     
         response.setContentType("text/html;charset=utf-8");
         response.setStatus(HttpServletResponse.SC_OK);
    
    From b23b76457cf8741592ae9f1e03940d5f5a4b36c5 Mon Sep 17 00:00:00 2001
    From: Binary Wang 
    Date: Tue, 25 Oct 2016 15:04:58 +0800
    Subject: [PATCH 53/83] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=AF=B9=E5=AE=A2?=
     =?UTF-8?q?=E6=9C=8D=E6=B6=88=E6=81=AF=E5=8F=91=E9=80=81=EF=BC=88=E7=82=B9?=
     =?UTF-8?q?=E5=87=BB=E8=B7=B3=E8=BD=AC=E5=88=B0=E5=9B=BE=E6=96=87=E6=B6=88?=
     =?UTF-8?q?=E6=81=AF=E9=A1=B5=E9=9D=A2=EF=BC=89=20=E5=9B=BE=E6=96=87?=
     =?UTF-8?q?=E6=B6=88=E6=81=AF=E7=9A=84=E6=94=AF=E6=8C=81=20#67?=
    MIME-Version: 1.0
    Content-Type: text/plain; charset=UTF-8
    Content-Transfer-Encoding: 8bit
    
    ---
     .../chanjar/weixin/common/api/WxConsts.java   |  19 +-
     .../weixin/mp/bean/WxMpMaterialNews.java      |  14 +-
     .../mp/bean/custombuilder/MpNewsBuilder.java  |  33 ++++
     .../weixin/mp/bean/kefu/WxMpKefuMessage.java  | 173 +++++++++++-------
     .../util/json/WxMpKefuMessageGsonAdapter.java |   6 +
     .../mp/api/impl/WxMpKefuServiceImplTest.java  |  41 +++--
     .../api/impl/WxMpMaterialServiceImplTest.java |  60 +++---
     7 files changed, 216 insertions(+), 130 deletions(-)
     create mode 100644 weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/custombuilder/MpNewsBuilder.java
    
    diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/api/WxConsts.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/api/WxConsts.java
    index b3122863..3bfd1175 100644
    --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/api/WxConsts.java
    +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/api/WxConsts.java
    @@ -23,14 +23,15 @@ public class WxConsts {
       ///////////////////////
       // 主动发送消息(即客服消息)的消息类型
       ///////////////////////
    -  public static final String CUSTOM_MSG_TEXT = "text";
    -  public static final String CUSTOM_MSG_IMAGE = "image";
    -  public static final String CUSTOM_MSG_VOICE = "voice";
    -  public static final String CUSTOM_MSG_VIDEO = "video";
    -  public static final String CUSTOM_MSG_MUSIC = "music";
    -  public static final String CUSTOM_MSG_NEWS = "news";
    -  public static final String CUSTOM_MSG_FILE = "file";
    -  public static final String CUSTOM_MSG_WXCARD = "wxcard";
    +  public static final String CUSTOM_MSG_TEXT = "text";//文本消息
    +  public static final String CUSTOM_MSG_IMAGE = "image";//图片消息
    +  public static final String CUSTOM_MSG_VOICE = "voice";//语音消息
    +  public static final String CUSTOM_MSG_VIDEO = "video";//视频消息
    +  public static final String CUSTOM_MSG_MUSIC = "music";//音乐消息
    +  public static final String CUSTOM_MSG_NEWS = "news";//图文消息(点击跳转到外链)
    +  public static final String CUSTOM_MSG_MPNEWS = "mpnews";//图文消息(点击跳转到图文消息页面)
    +  public static final String CUSTOM_MSG_FILE = "file";//发送文件(CP专用)
    +  public static final String CUSTOM_MSG_WXCARD = "wxcard";//卡券消息
       public static final String CUSTOM_MSG_TRANSFER_CUSTOMER_SERVICE = "transfer_customer_service";
       public static final String CUSTOM_MSG_SAFE_NO = "0";
       public static final String CUSTOM_MSG_SAFE_YES = "1";
    @@ -193,7 +194,7 @@ public class WxConsts {
        * 弹出授权页面,可通过openid拿到昵称、性别、所在地。并且,即使在未关注的情况下,只要用户授权,也能获取其信息
        */
       public static final String OAUTH2_SCOPE_USER_INFO = "snsapi_userinfo";
    -  
    +
       /**
        * 网页应用登录授权作用域 snsapi_login
        */
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpMaterialNews.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpMaterialNews.java
    index df40f6c3..fc7c983c 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpMaterialNews.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpMaterialNews.java
    @@ -1,17 +1,16 @@
     package me.chanjar.weixin.mp.bean;
     
     import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
    +import org.apache.commons.lang3.builder.ToStringBuilder;
    +import org.apache.commons.lang3.builder.ToStringStyle;
     
     import java.io.Serializable;
     import java.util.ArrayList;
     import java.util.List;
     
     public class WxMpMaterialNews implements Serializable {
    -
    -  /**
    -   * 
    -   */
       private static final long serialVersionUID = -3283203652013494976L;
    +
       private List articles = new ArrayList<>();
     
       public List getArticles() {
    @@ -81,7 +80,6 @@ public class WxMpMaterialNews implements Serializable {
     
         /**
          * 点击图文消息跳转链接
    -     * @return
         */
         private String url;
     
    @@ -159,14 +157,12 @@ public class WxMpMaterialNews implements Serializable {
     
         @Override
         public String toString() {
    -      return "WxMpMassNewsArticle [" + "thumbMediaId=" + this.thumbMediaId + "thumbUrl=" + this.thumbUrl + ", author=" + this.author + ", title=" + this.title +
    -          ", contentSourceUrl=" + this.contentSourceUrl + ", content=" + this.content + ", digest=" + this.digest +
    -          ", showCoverPic=" + this.showCoverPic +", url=" + this.url + "]";
    +      return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
         }
       }
     
       @Override
       public String toString() {
    -    return "WxMpMaterialNews [" + "articles=" + this.articles + "]";
    +    return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
       }
     }
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/custombuilder/MpNewsBuilder.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/custombuilder/MpNewsBuilder.java
    new file mode 100644
    index 00000000..4ab90dce
    --- /dev/null
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/custombuilder/MpNewsBuilder.java
    @@ -0,0 +1,33 @@
    +package me.chanjar.weixin.mp.bean.custombuilder;
    +
    +import me.chanjar.weixin.common.api.WxConsts;
    +import me.chanjar.weixin.mp.bean.kefu.WxMpKefuMessage;
    +
    +/**
    + * 图文消息builder
    + * 
    + * 用法:
    + * WxMpKefuMessage m = WxMpKefuMessage.NEWS().mediaId("xxxxx").toUser(...).build();
    + * 
    + * @author Binary Wang + * + */ +public final class MpNewsBuilder extends BaseBuilder { + private String mediaId; + + public MpNewsBuilder() { + this.msgType = WxConsts.CUSTOM_MSG_MPNEWS; + } + + public MpNewsBuilder mediaId(String mediaId) { + this.mediaId = mediaId; + return this; + } + + @Override + public WxMpKefuMessage build() { + WxMpKefuMessage m = super.build(); + m.setMpNewsMediaId(this.mediaId); + return m; + } +} diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/kefu/WxMpKefuMessage.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/kefu/WxMpKefuMessage.java index 7963f53e..36c2525c 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/kefu/WxMpKefuMessage.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/kefu/WxMpKefuMessage.java @@ -1,16 +1,23 @@ package me.chanjar.weixin.mp.bean.kefu; -import me.chanjar.weixin.mp.bean.custombuilder.*; -import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; - import java.io.Serializable; import java.util.ArrayList; import java.util.List; +import me.chanjar.weixin.mp.bean.custombuilder.ImageBuilder; +import me.chanjar.weixin.mp.bean.custombuilder.MpNewsBuilder; +import me.chanjar.weixin.mp.bean.custombuilder.MusicBuilder; +import me.chanjar.weixin.mp.bean.custombuilder.NewsBuilder; +import me.chanjar.weixin.mp.bean.custombuilder.TextBuilder; +import me.chanjar.weixin.mp.bean.custombuilder.VideoBuilder; +import me.chanjar.weixin.mp.bean.custombuilder.VoiceBuilder; +import me.chanjar.weixin.mp.bean.custombuilder.WxCardBuilder; +import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; + /** * 客服消息 - * @author chanjarster * + * @author chanjarster */ public class WxMpKefuMessage implements Serializable { private static final long serialVersionUID = -9196732086954365246L; @@ -26,18 +33,85 @@ public class WxMpKefuMessage implements Serializable { private String hqMusicUrl; private String kfAccount; private String cardId; + private String mpNewsMediaId; private List articles = new ArrayList<>(); + /** + * 获得文本消息builder + */ + public static TextBuilder TEXT() { + return new TextBuilder(); + } + + /** + * 获得图片消息builder + */ + public static ImageBuilder IMAGE() { + return new ImageBuilder(); + } + + /** + * 获得语音消息builder + */ + public static VoiceBuilder VOICE() { + return new VoiceBuilder(); + } + + /** + * 获得视频消息builder + */ + public static VideoBuilder VIDEO() { + return new VideoBuilder(); + } + + /** + * 获得音乐消息builder + */ + public static MusicBuilder MUSIC() { + return new MusicBuilder(); + } + + /** + * 获得图文消息(点击跳转到外链)builder + */ + public static NewsBuilder NEWS() { + return new NewsBuilder(); + } + + /** + * 获得图文消息(点击跳转到图文消息页面)builder + */ + public static MpNewsBuilder MPNEWS() { + return new MpNewsBuilder(); + } + + /** + * 获得卡券消息builder + */ + public static WxCardBuilder WXCARD() { + return new WxCardBuilder(); + } + public String getToUser() { return this.toUser; } + public void setToUser(String toUser) { this.toUser = toUser; } + public String getMsgType() { return this.msgType; } + public String getMpNewsMediaId() { + return this.mpNewsMediaId; + } + + public void setMpNewsMediaId(String mpNewsMediaId) { + this.mpNewsMediaId = mpNewsMediaId; + } + /** *
        * 请使用
    @@ -47,52 +121,68 @@ public class WxMpKefuMessage implements Serializable {
        * {@link me.chanjar.weixin.common.api.WxConsts#CUSTOM_MSG_MUSIC}
        * {@link me.chanjar.weixin.common.api.WxConsts#CUSTOM_MSG_VIDEO}
        * {@link me.chanjar.weixin.common.api.WxConsts#CUSTOM_MSG_NEWS}
    +   * {@link me.chanjar.weixin.common.api.WxConsts#CUSTOM_MSG_MPNEWS}
        * {@link me.chanjar.weixin.common.api.WxConsts#CUSTOM_MSG_WXCARD}
        * 
    + * * @param msgType */ public void setMsgType(String msgType) { this.msgType = msgType; } + public String getContent() { return this.content; } + public void setContent(String content) { this.content = content; } + public String getMediaId() { return this.mediaId; } + public void setMediaId(String mediaId) { this.mediaId = mediaId; } + public String getThumbMediaId() { return this.thumbMediaId; } + public void setThumbMediaId(String thumbMediaId) { this.thumbMediaId = thumbMediaId; } + public String getTitle() { return this.title; } + public void setTitle(String title) { this.title = title; } + public String getDescription() { return this.description; } + public void setDescription(String description) { this.description = description; } + public String getMusicUrl() { return this.musicUrl; } + public void setMusicUrl(String musicUrl) { this.musicUrl = musicUrl; } + public String getHqMusicUrl() { return this.hqMusicUrl; } + public void setHqMusicUrl(String hqMusicUrl) { this.hqMusicUrl = hqMusicUrl; } @@ -108,6 +198,7 @@ public class WxMpKefuMessage implements Serializable { public List getArticles() { return this.articles; } + public void setArticles(List articles) { this.articles = articles; } @@ -116,8 +207,15 @@ public class WxMpKefuMessage implements Serializable { return WxMpGsonBuilder.INSTANCE.create().toJson(this); } - public static class WxArticle { + public String getKfAccount() { + return this.kfAccount; + } + public void setKfAccount(String kfAccount) { + this.kfAccount = kfAccount; + } + + public static class WxArticle { private String title; private String description; private String url; @@ -126,85 +224,34 @@ public class WxMpKefuMessage implements Serializable { public String getTitle() { return this.title; } + public void setTitle(String title) { this.title = title; } + public String getDescription() { return this.description; } + public void setDescription(String description) { this.description = description; } + public String getUrl() { return this.url; } + public void setUrl(String url) { this.url = url; } + public String getPicUrl() { return this.picUrl; } + public void setPicUrl(String picUrl) { this.picUrl = picUrl; } } - - /** - * 获得文本消息builder - */ - public static TextBuilder TEXT() { - return new TextBuilder(); - } - - /** - * 获得图片消息builder - */ - public static ImageBuilder IMAGE() { - return new ImageBuilder(); - } - - /** - * 获得语音消息builder - */ - public static VoiceBuilder VOICE() { - return new VoiceBuilder(); - } - - /** - * 获得视频消息builder - */ - public static VideoBuilder VIDEO() { - return new VideoBuilder(); - } - - /** - * 获得音乐消息builder - */ - public static MusicBuilder MUSIC() { - return new MusicBuilder(); - } - - /** - * 获得图文消息builder - */ - public static NewsBuilder NEWS() { - return new NewsBuilder(); - } - - - /** - * 获得卡券消息builder - */ - public static WxCardBuilder WXCARD() { - return new WxCardBuilder(); - } - - public String getKfAccount() { - return this.kfAccount; - } - - public void setKfAccount(String kfAccount) { - this.kfAccount = kfAccount; - } } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpKefuMessageGsonAdapter.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpKefuMessageGsonAdapter.java index 5b310cb0..abab87a1 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpKefuMessageGsonAdapter.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpKefuMessageGsonAdapter.java @@ -75,6 +75,12 @@ public class WxMpKefuMessageGsonAdapter implements JsonSerializer mediaIdsToDownload = new ArrayList<>(); + @Test(dataProvider="mediaFiles") public void testUploadMedia(String mediaType, String fileType, String fileName) throws WxErrorException, IOException { try(InputStream inputStream = ClassLoader.getSystemResourceAsStream(fileName)){ From 4aae0c62d17ca704c77a989d043dcbf5233da881 Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Tue, 25 Oct 2016 16:52:37 +0800 Subject: [PATCH 54/83] =?UTF-8?q?=E4=BF=AE=E6=94=B9pom=E6=96=87=E4=BB=B6?= =?UTF-8?q?=EF=BC=8C=E5=A2=9E=E5=8A=A0=E8=B4=A1=E7=8C=AE=E8=80=85=E4=BF=A1?= =?UTF-8?q?=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/pom.xml b/pom.xml index 7418974e..82e0c3e4 100644 --- a/pom.xml +++ b/pom.xml @@ -34,6 +34,11 @@ gaigeshen@qq.com https://github.com/gaigeshen + + Liu Mingbo + liumingbo2008@gmail.com + https://github.com/FirenzesEagle + From 903a69d24f22eb8fc3ee668905f6f37ad92bb3a1 Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Tue, 25 Oct 2016 17:34:46 +0800 Subject: [PATCH 55/83] =?UTF-8?q?=E4=BF=AE=E6=94=B9pom=E6=96=87=E4=BB=B6?= =?UTF-8?q?=EF=BC=8C=E5=A2=9E=E5=8A=A0=E8=B4=A1=E7=8C=AE=E8=80=85=E4=BF=A1?= =?UTF-8?q?=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/pom.xml b/pom.xml index 82e0c3e4..662facf4 100644 --- a/pom.xml +++ b/pom.xml @@ -39,6 +39,11 @@ liumingbo2008@gmail.com https://github.com/FirenzesEagle + + kakotor + kakotor@gmail.com + https://github.com/kakotor + From 438355296ab080f34c16aad13e0390e7111a0ea3 Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Tue, 25 Oct 2016 17:35:44 +0800 Subject: [PATCH 56/83] =?UTF-8?q?=E4=BF=AE=E6=94=B9pom=E6=96=87=E4=BB=B6?= =?UTF-8?q?=EF=BC=8C=E5=A2=9E=E5=8A=A0=E8=B4=A1=E7=8C=AE=E8=80=85=E4=BF=A1?= =?UTF-8?q?=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/pom.xml b/pom.xml index 662facf4..76d454ed 100644 --- a/pom.xml +++ b/pom.xml @@ -44,6 +44,11 @@ kakotor@gmail.com https://github.com/kakotor + + xiong + zhaoxiong.tan@gmail.com + https://github.com/ZhaoxiongTan + From fbefe7f78d8f3b9c9f91b449a0a187b40e92fa3d Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Wed, 26 Oct 2016 10:10:35 +0800 Subject: [PATCH 57/83] =?UTF-8?q?=E4=BF=AE=E6=94=B9pom=E6=96=87=E4=BB=B6?= =?UTF-8?q?=EF=BC=8C=E5=A2=9E=E5=8A=A0=E8=B4=A1=E7=8C=AE=E8=80=85=E4=BF=A1?= =?UTF-8?q?=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/pom.xml b/pom.xml index 76d454ed..9a7464af 100644 --- a/pom.xml +++ b/pom.xml @@ -49,6 +49,11 @@ zhaoxiong.tan@gmail.com https://github.com/ZhaoxiongTan + + LiuJunGuang + aimilin@yeah.net + https://github.com/aimilin6688 + From cb1249fbd7d95a20ef13e93049a3c19dda7a0bb5 Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Wed, 26 Oct 2016 11:54:28 +0800 Subject: [PATCH 58/83] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E8=A2=AB=E8=AF=AF?= =?UTF-8?q?=E7=A7=BB=E9=99=A4=E7=9A=84getJSSDKCallbackData=E6=96=B9?= =?UTF-8?q?=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../me/chanjar/weixin/mp/api/WxMpPayService.java | 8 ++++++++ .../weixin/mp/api/impl/WxMpPayServiceImpl.java | 13 +++++++++++++ 2 files changed, 21 insertions(+) diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpPayService.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpPayService.java index 411c2abf..8d624e95 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpPayService.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpPayService.java @@ -1,6 +1,7 @@ package me.chanjar.weixin.mp.api; import me.chanjar.weixin.common.exception.WxErrorException; +import me.chanjar.weixin.mp.bean.pay.WxPayJsSDKCallback; import me.chanjar.weixin.mp.bean.pay.request.WxEntPayRequest; import me.chanjar.weixin.mp.bean.pay.request.WxPayRefundRequest; import me.chanjar.weixin.mp.bean.pay.request.WxPaySendRedpackRequest; @@ -63,6 +64,13 @@ public interface WxMpPayService { */ WxPayRefundResult refund(WxPayRefundRequest request, File keyFile) throws WxErrorException; + /** + * 读取支付结果通知 + * 详见http://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_7 + * + */ + WxPayJsSDKCallback getJSSDKCallbackData(String xmlData) throws WxErrorException; + /** *
        * 计算Map键值对是否和签名相符,
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImpl.java
    index 3b3b7510..2fc8e798 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImpl.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImpl.java
    @@ -7,6 +7,7 @@ import me.chanjar.weixin.common.util.BeanUtils;
     import me.chanjar.weixin.common.util.xml.XStreamInitializer;
     import me.chanjar.weixin.mp.api.WxMpPayService;
     import me.chanjar.weixin.mp.api.WxMpService;
    +import me.chanjar.weixin.mp.bean.pay.WxPayJsSDKCallback;
     import me.chanjar.weixin.mp.bean.pay.request.*;
     import me.chanjar.weixin.mp.bean.pay.result.*;
     import org.apache.commons.codec.digest.DigestUtils;
    @@ -96,6 +97,18 @@ public class WxMpPayServiceImpl implements WxMpPayService {
         }
       }
     
    +  @Override
    +  public WxPayJsSDKCallback getJSSDKCallbackData(String xmlData) throws WxErrorException {
    +    try {
    +      XStream xstream = XStreamInitializer.getInstance();
    +      xstream.alias("xml", WxPayJsSDKCallback.class);
    +      return (WxPayJsSDKCallback) xstream.fromXML(xmlData);
    +    } catch (Exception e) {
    +      e.printStackTrace();
    +      throw new WxErrorException(WxError.newBuilder().setErrorMsg("发生异常" + e.getMessage()).build());
    +    }
    +  }
    +
       @Override
       public boolean checkJSSDKCallbackDataSignature(Map kvm,
           String signature) {
    
    From 5d63b1ece2bfabd3ab931320a7b0cabbcef0b8a1 Mon Sep 17 00:00:00 2001
    From: ben 
    Date: Wed, 26 Oct 2016 12:24:28 +0800
    Subject: [PATCH 59/83] =?UTF-8?q?=E6=B7=BB=E5=8A=A0httpclient=E9=85=8D?=
     =?UTF-8?q?=E7=BD=AE=E5=8F=82=E6=95=B0=E7=9A=84set=E6=96=B9=E6=B3=95?=
     =?UTF-8?q?=E5=8F=8A=E8=AF=B4=E6=98=8E?=
    MIME-Version: 1.0
    Content-Type: text/plain; charset=UTF-8
    Content-Transfer-Encoding: 8bit
    
    ---
     .../http/DefaultApacheHttpClientBuilder.java  | 86 ++++++++++++++++++-
     1 file changed, 82 insertions(+), 4 deletions(-)
    
    diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/DefaultApacheHttpClientBuilder.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/DefaultApacheHttpClientBuilder.java
    index cb4e571f..12b3cbde 100644
    --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/DefaultApacheHttpClientBuilder.java
    +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/DefaultApacheHttpClientBuilder.java
    @@ -1,8 +1,6 @@
     package me.chanjar.weixin.common.util.http;
     
    -import java.io.IOException;
    -import java.util.concurrent.TimeUnit;
    -
    +import me.chanjar.weixin.common.util.StringUtils;
     import org.apache.http.annotation.NotThreadSafe;
     import org.apache.http.auth.AuthScope;
     import org.apache.http.auth.UsernamePasswordCredentials;
    @@ -22,8 +20,11 @@ import org.apache.http.impl.client.HttpClientBuilder;
     import org.apache.http.impl.client.HttpClients;
     import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
     import org.apache.http.protocol.HttpContext;
    +import org.slf4j.Logger;
    +import org.slf4j.LoggerFactory;
     
    -import me.chanjar.weixin.common.util.StringUtils;
    +import java.io.IOException;
    +import java.util.concurrent.TimeUnit;
     
     /**
      * httpclient 连接管理器
    @@ -31,6 +32,7 @@ import me.chanjar.weixin.common.util.StringUtils;
      */
     @NotThreadSafe
     public class DefaultApacheHttpClientBuilder implements ApacheHttpClientBuilder {
    +  protected final Logger log = LoggerFactory.getLogger(DefaultApacheHttpClientBuilder.class);
       private int connectionRequestTimeout = 3000;
       private int connectionTimeout = 5000;
       private int soTimeout = 5000;
    @@ -98,6 +100,82 @@ public class DefaultApacheHttpClientBuilder implements ApacheHttpClientBuilder {
         return this;
       }
     
    +  /**
    +   * 获取链接的超时时间设置,默认3000ms
    +   * 

    + * 设置为零时不超时,一直等待. + * 设置为负数是使用系统默认设置(非上述的3000ms的默认值,而是httpclient的默认设置). + *

    + * @param connectionRequestTimeout 获取链接的超时时间设置(单位毫秒),默认3000ms + */ + public void setConnectionRequestTimeout(int connectionRequestTimeout) { + this.connectionRequestTimeout = connectionRequestTimeout; + } + + /** + * 建立链接的超时时间,默认为5000ms.由于是在链接池获取链接,此设置应该并不起什么作用 + *

    + * 设置为零时不超时,一直等待. + * 设置为负数是使用系统默认设置(非上述的5000ms的默认值,而是httpclient的默认设置). + *

    + * @param connectionTimeout 建立链接的超时时间设置(单位毫秒),默认5000ms + */ + public void setConnectionTimeout(int connectionTimeout) { + this.connectionTimeout = connectionTimeout; + } + + /** + * 默认NIO的socket超时设置,默认5000ms. + * @see java.net.SocketOptions#SO_TIMEOUT + * @param soTimeout 默认NIO的socket超时设置,默认5000ms. + */ + public void setSoTimeout(int soTimeout) { + this.soTimeout = soTimeout; + } + + /** + * 空闲链接的超时时间,默认60000ms. + *

    + * 超时的链接将在下一次空闲链接检查是被销毁 + *

    + * @param idleConnTimeout 空闲链接的超时时间,默认60000ms. + */ + public void setIdleConnTimeout(int idleConnTimeout) { + this.idleConnTimeout = idleConnTimeout; + } + + /** + * 检查空间链接的间隔周期,默认60000ms. + * @param checkWaitTime 检查空间链接的间隔周期,默认60000ms. + */ + public void setCheckWaitTime(int checkWaitTime) { + this.checkWaitTime = checkWaitTime; + } + + /** + * 每路的最大链接数,默认10 + * @param maxConnPerHost 每路的最大链接数,默认10 + */ + public void setMaxConnPerHost(int maxConnPerHost) { + this.maxConnPerHost = maxConnPerHost; + } + + /** + * 最大总连接数,默认50 + * @param maxTotalConn 最大总连接数,默认50 + */ + public void setMaxTotalConn(int maxTotalConn) { + this.maxTotalConn = maxTotalConn; + } + + /** + * 自定义httpclient的User Agent + * @param userAgent User Agent + */ + public void setUserAgent(String userAgent) { + this.userAgent = userAgent; + } + public IdleConnectionMonitorThread getIdleConnectionMonitorThread() { return this.idleConnectionMonitorThread; } From 3d013c134cc9bfa412dad99e2271bc0c6a18f1c4 Mon Sep 17 00:00:00 2001 From: ben Date: Wed, 26 Oct 2016 13:41:26 +0800 Subject: [PATCH 60/83] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=B0=86prepare?= =?UTF-8?q?=E6=96=B9=E6=B3=95=E7=A7=BB=E5=8A=A8=E5=88=B0=E6=9E=84=E9=80=A0?= =?UTF-8?q?=E6=96=B9=E6=B3=95=E4=B8=AD=E5=AF=BC=E8=87=B4=E4=BB=A3=E7=90=86?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=E8=AE=BE=E7=BD=AE=E6=97=A0=E6=95=88=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98,=E5=B0=86prepare=E6=96=B9=E6=B3=95=E6=94=B9?= =?UTF-8?q?=E4=B8=BA=E5=90=8C=E6=AD=A5=E6=89=A7=E8=A1=8C,=E9=98=B2?= =?UTF-8?q?=E6=AD=A2=E8=A2=AB=E5=A4=9A=E6=AC=A1=E8=B0=83=E7=94=A8.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../http/DefaultApacheHttpClientBuilder.java | 27 ++++++++++++++----- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/DefaultApacheHttpClientBuilder.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/DefaultApacheHttpClientBuilder.java index 12b3cbde..54bd5b68 100644 --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/DefaultApacheHttpClientBuilder.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/DefaultApacheHttpClientBuilder.java @@ -25,14 +25,17 @@ import org.slf4j.LoggerFactory; import java.io.IOException; import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicBoolean; /** * httpclient 连接管理器 + * * @author kakotor */ @NotThreadSafe public class DefaultApacheHttpClientBuilder implements ApacheHttpClientBuilder { protected final Logger log = LoggerFactory.getLogger(DefaultApacheHttpClientBuilder.class); + private final AtomicBoolean prepared = new AtomicBoolean(false); private int connectionRequestTimeout = 3000; private int connectionTimeout = 5000; private int soTimeout = 5000; @@ -49,21 +52,17 @@ public class DefaultApacheHttpClientBuilder implements ApacheHttpClientBuilder { }; private SSLConnectionSocketFactory sslConnectionSocketFactory = SSLConnectionSocketFactory.getSocketFactory(); private PlainConnectionSocketFactory plainConnectionSocketFactory = PlainConnectionSocketFactory.getSocketFactory(); - private String httpProxyHost; private int httpProxyPort; private String httpProxyUsername; private String httpProxyPassword; - /** * 闲置连接监控线程 */ private IdleConnectionMonitorThread idleConnectionMonitorThread; - private HttpClientBuilder httpClientBuilder; private DefaultApacheHttpClientBuilder() { - prepare(); } public static DefaultApacheHttpClientBuilder get() { @@ -106,6 +105,7 @@ public class DefaultApacheHttpClientBuilder implements ApacheHttpClientBuilder { * 设置为零时不超时,一直等待. * 设置为负数是使用系统默认设置(非上述的3000ms的默认值,而是httpclient的默认设置). *

    + * * @param connectionRequestTimeout 获取链接的超时时间设置(单位毫秒),默认3000ms */ public void setConnectionRequestTimeout(int connectionRequestTimeout) { @@ -118,6 +118,7 @@ public class DefaultApacheHttpClientBuilder implements ApacheHttpClientBuilder { * 设置为零时不超时,一直等待. * 设置为负数是使用系统默认设置(非上述的5000ms的默认值,而是httpclient的默认设置). *

    + * * @param connectionTimeout 建立链接的超时时间设置(单位毫秒),默认5000ms */ public void setConnectionTimeout(int connectionTimeout) { @@ -126,8 +127,9 @@ public class DefaultApacheHttpClientBuilder implements ApacheHttpClientBuilder { /** * 默认NIO的socket超时设置,默认5000ms. - * @see java.net.SocketOptions#SO_TIMEOUT + * * @param soTimeout 默认NIO的socket超时设置,默认5000ms. + * @see java.net.SocketOptions#SO_TIMEOUT */ public void setSoTimeout(int soTimeout) { this.soTimeout = soTimeout; @@ -138,6 +140,7 @@ public class DefaultApacheHttpClientBuilder implements ApacheHttpClientBuilder { *

    * 超时的链接将在下一次空闲链接检查是被销毁 *

    + * * @param idleConnTimeout 空闲链接的超时时间,默认60000ms. */ public void setIdleConnTimeout(int idleConnTimeout) { @@ -146,6 +149,7 @@ public class DefaultApacheHttpClientBuilder implements ApacheHttpClientBuilder { /** * 检查空间链接的间隔周期,默认60000ms. + * * @param checkWaitTime 检查空间链接的间隔周期,默认60000ms. */ public void setCheckWaitTime(int checkWaitTime) { @@ -154,6 +158,7 @@ public class DefaultApacheHttpClientBuilder implements ApacheHttpClientBuilder { /** * 每路的最大链接数,默认10 + * * @param maxConnPerHost 每路的最大链接数,默认10 */ public void setMaxConnPerHost(int maxConnPerHost) { @@ -162,6 +167,7 @@ public class DefaultApacheHttpClientBuilder implements ApacheHttpClientBuilder { /** * 最大总连接数,默认50 + * * @param maxTotalConn 最大总连接数,默认50 */ public void setMaxTotalConn(int maxTotalConn) { @@ -170,6 +176,7 @@ public class DefaultApacheHttpClientBuilder implements ApacheHttpClientBuilder { /** * 自定义httpclient的User Agent + * * @param userAgent User Agent */ public void setUserAgent(String userAgent) { @@ -180,7 +187,10 @@ public class DefaultApacheHttpClientBuilder implements ApacheHttpClientBuilder { return this.idleConnectionMonitorThread; } - private void prepare() { + private synchronized void prepare() { + if(prepared.get()){ + return; + } Registry registry = RegistryBuilder.create() .register("http", this.plainConnectionSocketFactory) .register("https", this.sslConnectionSocketFactory) @@ -227,11 +237,14 @@ public class DefaultApacheHttpClientBuilder implements ApacheHttpClientBuilder { if (StringUtils.isNotBlank(this.userAgent)) { this.httpClientBuilder.setUserAgent(this.userAgent); } - + prepared.set(true); } @Override public CloseableHttpClient build() { + if(!prepared.get()){ + prepare(); + } return this.httpClientBuilder.build(); } From ba6b7dafecf8a59e9dd4ed870424a5a684b5dfc9 Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Wed, 26 Oct 2016 15:13:55 +0800 Subject: [PATCH 61/83] =?UTF-8?q?=E7=B4=A0=E6=9D=90=E7=9B=B8=E5=85=B3?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E8=A1=A5=E5=85=85=E5=AE=8C=E5=96=84javadoc?= =?UTF-8?q?=E6=B3=A8=E9=87=8A=EF=BC=8C=E5=B9=B6=E9=87=8D=E6=9E=84=E5=8C=85?= =?UTF-8?q?=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../weixin/mp/api/WxMpKefuService.java | 1 + .../weixin/mp/api/WxMpMaterialService.java | 181 +++++++++++------- .../mp/api/impl/WxMpMaterialServiceImpl.java | 17 +- .../WxMediaImgUploadResult.java | 4 +- .../mp/bean/{ => material}/WxMpMaterial.java | 2 +- .../WxMpMaterialArticleUpdate.java | 4 +- .../WxMpMaterialCountResult.java | 12 +- .../WxMpMaterialFileBatchGetResult.java | 13 +- .../bean/{ => material}/WxMpMaterialNews.java | 2 +- .../WxMpMaterialNewsBatchGetResult.java | 14 +- .../WxMpMaterialUploadResult.java | 4 +- .../WxMpMaterialVideoInfoResult.java | 4 +- .../http/MaterialNewsInfoRequestExecutor.java | 2 +- .../http/MaterialUploadRequestExecutor.java | 8 +- .../MaterialVideoInfoRequestExecutor.java | 2 +- .../http/MediaImgUploadRequestExecutor.java | 2 +- .../WxMediaImgUploadResultGsonAdapter.java | 2 +- .../weixin/mp/util/json/WxMpGsonBuilder.java | 16 +- .../WxMpMaterialArticleUpdateGsonAdapter.java | 4 +- .../json/WxMpMaterialCountResultAdapter.java | 2 +- .../WxMpMaterialFileBatchGetGsonAdapter.java | 2 +- ...MpMaterialFileBatchGetGsonItemAdapter.java | 2 +- .../WxMpMaterialNewsArticleGsonAdapter.java | 2 +- .../WxMpMaterialNewsBatchGetGsonAdapter.java | 2 +- ...MpMaterialNewsBatchGetGsonItemAdapter.java | 4 +- .../json/WxMpMaterialNewsGsonAdapter.java | 2 +- .../json/WxMpMaterialUploadResultAdapter.java | 2 +- .../WxMpMaterialVideoInfoResultAdapter.java | 2 +- .../api/impl/WxMpMaterialServiceImplTest.java | 8 +- 29 files changed, 187 insertions(+), 135 deletions(-) rename weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/{result => material}/WxMediaImgUploadResult.java (91%) rename weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/{ => material}/WxMpMaterial.java (97%) rename weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/{ => material}/WxMpMaterialArticleUpdate.java (95%) rename weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/{result => material}/WxMpMaterialCountResult.java (78%) rename weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/{result => material}/WxMpMaterialFileBatchGetResult.java (81%) rename weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/{ => material}/WxMpMaterialNews.java (98%) rename weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/{result => material}/WxMpMaterialNewsBatchGetResult.java (79%) rename weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/{result => material}/WxMpMaterialUploadResult.java (94%) rename weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/{result => material}/WxMpMaterialVideoInfoResult.java (95%) diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpKefuService.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpKefuService.java index 5bad7da2..f57c9630 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpKefuService.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpKefuService.java @@ -22,6 +22,7 @@ public interface WxMpKefuService { *
        * 发送客服消息
        * 详情请见: 发送客服消息
    +   * 接口url格式:https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=ACCESS_TOKEN
        * 
    */ boolean sendKefuMessage(WxMpKefuMessage message) throws WxErrorException; diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMaterialService.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMaterialService.java index 48a6f610..8c867c5f 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMaterialService.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMaterialService.java @@ -2,11 +2,12 @@ package me.chanjar.weixin.mp.api; import me.chanjar.weixin.common.bean.result.WxMediaUploadResult; import me.chanjar.weixin.common.exception.WxErrorException; -import me.chanjar.weixin.mp.bean.*; -import me.chanjar.weixin.mp.bean.result.*; +import me.chanjar.weixin.mp.bean.material.WxMpMaterial; +import me.chanjar.weixin.mp.bean.material.WxMpMaterialArticleUpdate; +import me.chanjar.weixin.mp.bean.material.WxMpMaterialNews; +import me.chanjar.weixin.mp.bean.material.*; import java.io.File; -import java.io.IOException; import java.io.InputStream; /** @@ -20,21 +21,58 @@ import java.io.InputStream; public interface WxMpMaterialService { /** + *
        * 新增临时素材
    -   *
    -   * @param mediaType
    -   * @param file
    +   * 公众号经常有需要用到一些临时性的多媒体素材的场景,例如在使用接口特别是发送消息时,对多媒体文件、多媒体消息的获取和调用等操作,是通过media_id来进行的。
    +   * 素材管理接口对所有认证的订阅号和服务号开放。通过本接口,公众号可以新增临时素材(即上传临时多媒体文件)。
    +   * 请注意:
    +   *  1、对于临时素材,每个素材(media_id)会在开发者上传或粉丝发送到微信服务器3天后自动删除(所以用户发送给开发者的素材,若开发者需要,应尽快下载到本地),以节省服务器资源。
    +   *  2、media_id是可复用的。
    +   *  3、素材的格式大小等要求与公众平台官网一致。具体是,图片大小不超过2M,支持png/jpeg/jpg/gif格式,语音大小不超过5M,长度不超过60秒,支持mp3/amr格式
    +   *  4、需使用https调用本接口。
    +   *  本接口即为原“上传多媒体文件”接口。
    +   *  注意事项:
    +   *    上传的临时多媒体文件有格式和大小限制,如下:
    +   *    图片(image): 2M,支持PNG\JPEG\JPG\GIF格式
    +   *    语音(voice):2M,播放长度不超过60s,支持AMR\MP3格式
    +   *    视频(video):10MB,支持MP4格式
    +   *    缩略图(thumb):64KB,支持JPG格式
    +   *媒体文件在后台保存时间为3天,即3天后media_id失效。
    +   * 详情请见: 新增临时素材
    +   * 接口url格式:https://api.weixin.qq.com/cgi-bin/media/upload?access_token=ACCESS_TOKEN&type=TYPE
    +   * 
    + * @param mediaType 媒体类型, 请看{@link me.chanjar.weixin.common.api.WxConsts} + * @param file 文件对象 * @throws WxErrorException * @see #mediaUpload(String, String, InputStream) */ WxMediaUploadResult mediaUpload(String mediaType, File file) throws WxErrorException; + /** + *
    +   * 新增临时素材
    +   * 本接口即为原“上传多媒体文件”接口。
    +   *
    +   * 详情请见: 新增临时素材
    +   * 接口url格式:https://api.weixin.qq.com/cgi-bin/media/upload?access_token=ACCESS_TOKEN&type=TYPE
    +   * 
    + * + * @param mediaType 媒体类型, 请看{@link me.chanjar.weixin.common.api.WxConsts} + * @param fileType 文件类型,请看{@link me.chanjar.weixin.common.api.WxConsts} + * @param inputStream 输入流 + * @throws WxErrorException + * @see #mediaUpload(java.lang.String, java.io.File) + */ + WxMediaUploadResult mediaUpload(String mediaType, String fileType, InputStream inputStream) throws WxErrorException; + /** *
        * 获取临时素材
    +   * 公众号可以使用本接口获取临时素材(即下载临时的多媒体文件)。请注意,视频文件不支持https下载,调用该接口需http协议。
        * 本接口即为原“下载多媒体文件”接口。
        * 根据微信文档,视频文件下载不了,会返回null
    -   * 详情请见: 获取临时素材
    +   * 详情请见: 获取临时素材
    +   * 接口url格式:https://api.weixin.qq.com/cgi-bin/media/get?access_token=ACCESS_TOKEN&media_id=MEDIA_ID
        * 
    * * @param media_id @@ -46,10 +84,12 @@ public interface WxMpMaterialService { /** *
        * 上传图文消息内的图片获取URL
    -   * 详情请见:http://mp.weixin.qq.com/wiki/15/40b6865b893947b764e2de8e4a1fb55f.html#.E4.B8.8A.E4.BC.A0.E5.9B.BE.E6.96.87.E6.B6.88.E6.81.AF.E5.86.85.E7.9A.84.E5.9B.BE.E7.89.87.E8.8E.B7.E5.8F.96URL.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
    +   * 请注意,本接口所上传的图片不占用公众号的素材库中图片数量的5000个的限制。图片仅支持jpg/png格式,大小必须在1MB以下。
    +   * 详情请见: 新增永久素材
    +   * 接口url格式:https://api.weixin.qq.com/cgi-bin/media/uploadimg?access_token=ACCESS_TOKEN
        * 
    * - * @param file + * @param file 上传的文件对象 * @return WxMediaImgUploadResult 返回图片url * @throws WxErrorException */ @@ -57,114 +97,123 @@ public interface WxMpMaterialService { /** *
    -   * 新增临时素材
    -   * 本接口即为原“上传多媒体文件”接口。
    -   *
    -   * 上传的多媒体文件有格式和大小限制,如下:
    -   *   图片(image): 1M,支持JPG格式
    -   *   语音(voice):2M,播放长度不超过60s,支持AMR\MP3格式
    -   *   视频(video):10MB,支持MP4格式
    -   *   缩略图(thumb):64KB,支持JPG格式
    -   *
    -   * 详情请见: 新增临时素材
    -   * 
    - * - * @param mediaType 媒体类型, 请看{@link me.chanjar.weixin.common.api.WxConsts} - * @param fileType 文件类型,请看{@link me.chanjar.weixin.common.api.WxConsts} - * @param inputStream 输入流 - * @throws WxErrorException - */ - WxMediaUploadResult mediaUpload(String mediaType, String fileType, InputStream inputStream) throws WxErrorException, IOException; - - /** - *
    -   * 上传非图文永久素材
    -   *
    -   * 上传的多媒体文件有格式和大小限制,如下:
    -   *   图片(image): 图片大小不超过2M,支持bmp/png/jpeg/jpg/gif格式
    -   *   语音(voice):语音大小不超过5M,长度不超过60秒,支持mp3/wma/wav/amr格式
    -   *   视频(video):在上传视频素材时需要POST另一个表单,id为description,包含素材的描述信息,内容格式为JSON
    -   *   缩略图(thumb):文档未说明
    -   *
    -   * 详情请见: http://mp.weixin.qq.com/wiki/14/7e6c03263063f4813141c3e17dd4350a.html
    +   * 新增非图文永久素材
    +   * 通过POST表单来调用接口,表单id为media,包含需要上传的素材内容,有filename、filelength、content-type等信息。请注意:图片素材将进入公众平台官网素材管理模块中的默认分组。
    +   * 新增永久视频素材需特别注意:
    +   * 在上传视频素材时需要POST另一个表单,id为description,包含素材的描述信息,内容格式为JSON,格式如下:
    +   * {   "title":VIDEO_TITLE,   "introduction":INTRODUCTION   }
    +   * 详情请见: 新增永久素材
    +   * 接口url格式:https://api.weixin.qq.com/cgi-bin/material/add_material?access_token=ACCESS_TOKEN&type=TYPE
    +   *
    +   * 除了3天就会失效的临时素材外,开发者有时需要永久保存一些素材,届时就可以通过本接口新增永久素材。
    +   永久图片素材新增后,将带有URL返回给开发者,开发者可以在腾讯系域名内使用(腾讯系域名外使用,图片将被屏蔽)。
    +   请注意:
    +   1、新增的永久素材也可以在公众平台官网素材管理模块中看到
    +   2、永久素材的数量是有上限的,请谨慎新增。图文消息素材和图片素材的上限为5000,其他类型为1000
    +   3、素材的格式大小等要求与公众平台官网一致。具体是,图片大小不超过2M,支持bmp/png/jpeg/jpg/gif格式,语音大小不超过5M,长度不超过60秒,支持mp3/wma/wav/amr格式
    +   4、调用该接口需https协议
        * 
    * * @param mediaType 媒体类型, 请看{@link me.chanjar.weixin.common.api.WxConsts} - * @param material 上传的素材, 请看{@link me.chanjar.weixin.mp.bean.WxMpMaterial} + * @param material 上传的素材, 请看{@link WxMpMaterial} */ WxMpMaterialUploadResult materialFileUpload(String mediaType, WxMpMaterial material) throws WxErrorException; /** *
    -   * 上传永久图文素材
    -   *
    -   * 详情请见: http://mp.weixin.qq.com/wiki/14/7e6c03263063f4813141c3e17dd4350a.html
    +   * 新增永久图文素材
    +   *
    +   * 详情请见: 新增永久素材
    +   * 接口url格式:https://api.weixin.qq.com/cgi-bin/material/add_news?access_token=ACCESS_TOKEN
    +   *
    +   * 除了3天就会失效的临时素材外,开发者有时需要永久保存一些素材,届时就可以通过本接口新增永久素材。
    +   永久图片素材新增后,将带有URL返回给开发者,开发者可以在腾讯系域名内使用(腾讯系域名外使用,图片将被屏蔽)。
    +   请注意:
    +   1、新增的永久素材也可以在公众平台官网素材管理模块中看到
    +   2、永久素材的数量是有上限的,请谨慎新增。图文消息素材和图片素材的上限为5000,其他类型为1000
    +   3、素材的格式大小等要求与公众平台官网一致。具体是,图片大小不超过2M,支持bmp/png/jpeg/jpg/gif格式,语音大小不超过5M,长度不超过60秒,支持mp3/wma/wav/amr格式
    +   4、调用该接口需https协议
        * 
    * - * @param news 上传的图文消息, 请看{@link me.chanjar.weixin.mp.bean.WxMpMaterialNews} + * @param news 上传的图文消息, 请看{@link WxMpMaterialNews} */ WxMpMaterialUploadResult materialNewsUpload(WxMpMaterialNews news) throws WxErrorException; /** *
    -   * 下载声音或者图片永久素材
    +   * 获取声音或者图片永久素材
        *
    -   * 详情请见: http://mp.weixin.qq.com/wiki/4/b3546879f07623cb30df9ca0e420a5d0.html
    +   * 详情请见: 获取永久素材
    +   * 接口url格式:https://api.weixin.qq.com/cgi-bin/material/get_material?access_token=ACCESS_TOKEN
        * 
    * - * @param media_id 永久素材的id + * @param mediaId 永久素材的id */ - InputStream materialImageOrVoiceDownload(String media_id) throws WxErrorException; + InputStream materialImageOrVoiceDownload(String mediaId) throws WxErrorException; /** *
        * 获取视频永久素材的信息和下载地址
        *
    -   * 详情请见: http://mp.weixin.qq.com/wiki/4/b3546879f07623cb30df9ca0e420a5d0.html
    +   * 详情请见: 获取永久素材
    +   * 接口url格式:https://api.weixin.qq.com/cgi-bin/material/get_material?access_token=ACCESS_TOKEN
        * 
    * - * @param media_id 永久素材的id + * @param mediaId 永久素材的id */ - WxMpMaterialVideoInfoResult materialVideoInfo(String media_id) throws WxErrorException; + WxMpMaterialVideoInfoResult materialVideoInfo(String mediaId) throws WxErrorException; /** *
        * 获取图文永久素材的信息
        *
    -   * 详情请见: http://mp.weixin.qq.com/wiki/4/b3546879f07623cb30df9ca0e420a5d0.html
    +   * 详情请见: 获取永久素材
    +   * 接口url格式:https://api.weixin.qq.com/cgi-bin/material/get_material?access_token=ACCESS_TOKEN
        * 
    * - * @param media_id 永久素材的id + * @param mediaId 永久素材的id */ - WxMpMaterialNews materialNewsInfo(String media_id) throws WxErrorException; + WxMpMaterialNews materialNewsInfo(String mediaId) throws WxErrorException; /** *
    -   * 更新图文永久素材
    +   * 修改永久图文素材
        *
    -   * 详情请见: http://mp.weixin.qq.com/wiki/4/19a59cba020d506e767360ca1be29450.html
    +   * 详情请见: 修改永久图文素材
    +   * 接口url格式:https://api.weixin.qq.com/cgi-bin/material/update_news?access_token=ACCESS_TOKEN
        * 
    * - * @param wxMpMaterialArticleUpdate 用来更新图文素材的bean, 请看{@link me.chanjar.weixin.mp.bean.WxMpMaterialArticleUpdate} + * @param wxMpMaterialArticleUpdate 用来更新图文素材的bean, 请看{@link WxMpMaterialArticleUpdate} */ boolean materialNewsUpdate(WxMpMaterialArticleUpdate wxMpMaterialArticleUpdate) throws WxErrorException; /** *
        * 删除永久素材
    -   *
    -   * 详情请见: http://mp.weixin.qq.com/wiki/5/e66f61c303db51a6c0f90f46b15af5f5.html
    +   * 在新增了永久素材后,开发者可以根据本接口来删除不再需要的永久素材,节省空间。
    +   * 请注意:
    +   *  1、请谨慎操作本接口,因为它可以删除公众号在公众平台官网素材管理模块中新建的图文消息、语音、视频等素材(但需要先通过获取素材列表来获知素材的media_id)
    +   *  2、临时素材无法通过本接口删除
    +   *  3、调用该接口需https协议
    +   * 详情请见: 删除永久素材
    +   * 接口url格式:https://api.weixin.qq.com/cgi-bin/material/del_material?access_token=ACCESS_TOKEN
        * 
    * - * @param media_id 永久素材的id + * @param mediaId 永久素材的id */ - boolean materialDelete(String media_id) throws WxErrorException; + boolean materialDelete(String mediaId) throws WxErrorException; /** *
        * 获取各类素材总数
    -   *
    -   * 详情请见: http://mp.weixin.qq.com/wiki/16/8cc64f8c189674b421bee3ed403993b8.html
    +   * 开发者可以根据本接口来获取永久素材的列表,需要时也可保存到本地。
    +   * 请注意:
    +   *  1.永久素材的总数,也会计算公众平台官网素材管理中的素材
    +   *  2.图片和图文消息素材(包括单图文和多图文)的总数上限为5000,其他素材的总数上限为1000
    +   *  3.调用该接口需https协议
    +   *
    +   * 详情请见: 获取素材总数
    +   * 接口url格式:https://api.weixin.qq.com/cgi-bin/material/get_materialcount?access_token=ACCESS_TOKEN
        * 
    */ WxMpMaterialCountResult materialCount() throws WxErrorException; @@ -173,7 +222,8 @@ public interface WxMpMaterialService { *
        * 分页获取图文素材列表
        *
    -   * 详情请见: http://mp.weixin.qq.com/wiki/12/2108cd7aafff7f388f41f37efa710204.html
    +   * 详情请见: 获取素材列表
    +   * 接口url格式:https://api.weixin.qq.com/cgi-bin/material/batchget_material?access_token=ACCESS_TOKEN
        * 
    * * @param offset 从全部素材的该偏移位置开始返回,0表示从第一个素材 返回 @@ -185,7 +235,8 @@ public interface WxMpMaterialService { *
        * 分页获取其他媒体素材列表
        *
    -   * 详情请见: http://mp.weixin.qq.com/wiki/12/2108cd7aafff7f388f41f37efa710204.html
    +   * 详情请见: 获取素材列表
    +   * 接口url格式:https://api.weixin.qq.com/cgi-bin/material/batchget_material?access_token=ACCESS_TOKEN
        * 
    * * @param type 媒体类型, 请看{@link me.chanjar.weixin.common.api.WxConsts} diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpMaterialServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpMaterialServiceImpl.java index 310bbe78..af9fa54c 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpMaterialServiceImpl.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpMaterialServiceImpl.java @@ -10,10 +10,10 @@ import me.chanjar.weixin.common.util.http.MediaUploadRequestExecutor; import me.chanjar.weixin.common.util.json.WxGsonBuilder; import me.chanjar.weixin.mp.api.WxMpMaterialService; import me.chanjar.weixin.mp.api.WxMpService; -import me.chanjar.weixin.mp.bean.WxMpMaterial; -import me.chanjar.weixin.mp.bean.WxMpMaterialArticleUpdate; -import me.chanjar.weixin.mp.bean.WxMpMaterialNews; -import me.chanjar.weixin.mp.bean.result.*; +import me.chanjar.weixin.mp.bean.material.WxMpMaterial; +import me.chanjar.weixin.mp.bean.material.WxMpMaterialArticleUpdate; +import me.chanjar.weixin.mp.bean.material.WxMpMaterialNews; +import me.chanjar.weixin.mp.bean.material.*; import me.chanjar.weixin.mp.util.http.*; import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; @@ -37,8 +37,13 @@ public class WxMpMaterialServiceImpl implements WxMpMaterialService { } @Override - public WxMediaUploadResult mediaUpload(String mediaType, String fileType, InputStream inputStream) throws WxErrorException, IOException { - return this.mediaUpload(mediaType, FileUtils.createTmpFile(inputStream, UUID.randomUUID().toString(), fileType)); + public WxMediaUploadResult mediaUpload(String mediaType, String fileType, InputStream inputStream) throws WxErrorException { + try { + return this.mediaUpload(mediaType, FileUtils.createTmpFile(inputStream, UUID.randomUUID().toString(), fileType)); + } catch (IOException e) { + e.printStackTrace(); + throw new WxErrorException(WxError.newBuilder().setErrorMsg(e.getMessage()).build()); + } } @Override diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMediaImgUploadResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/material/WxMediaImgUploadResult.java similarity index 91% rename from weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMediaImgUploadResult.java rename to weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/material/WxMediaImgUploadResult.java index 58ff57a3..387a791a 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMediaImgUploadResult.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/material/WxMediaImgUploadResult.java @@ -1,4 +1,4 @@ -package me.chanjar.weixin.mp.bean.result; +package me.chanjar.weixin.mp.bean.material; import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; @@ -9,7 +9,7 @@ import java.io.Serializable; */ public class WxMediaImgUploadResult implements Serializable { /** - * + * */ private static final long serialVersionUID = 1996392453428768829L; private String url; diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpMaterial.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/material/WxMpMaterial.java similarity index 97% rename from weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpMaterial.java rename to weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/material/WxMpMaterial.java index 058d9034..8725510a 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpMaterial.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/material/WxMpMaterial.java @@ -1,4 +1,4 @@ -package me.chanjar.weixin.mp.bean; +package me.chanjar.weixin.mp.bean.material; import java.io.File; import java.util.HashMap; diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpMaterialArticleUpdate.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/material/WxMpMaterialArticleUpdate.java similarity index 95% rename from weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpMaterialArticleUpdate.java rename to weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/material/WxMpMaterialArticleUpdate.java index f8ee265e..371b7e0d 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpMaterialArticleUpdate.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/material/WxMpMaterialArticleUpdate.java @@ -1,4 +1,4 @@ -package me.chanjar.weixin.mp.bean; +package me.chanjar.weixin.mp.bean.material; import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; @@ -7,7 +7,7 @@ import java.io.Serializable; public class WxMpMaterialArticleUpdate implements Serializable { /** - * + * */ private static final long serialVersionUID = -7611963949517780270L; private String mediaId; diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpMaterialCountResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/material/WxMpMaterialCountResult.java similarity index 78% rename from weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpMaterialCountResult.java rename to weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/material/WxMpMaterialCountResult.java index 94e20d50..02f256bd 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpMaterialCountResult.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/material/WxMpMaterialCountResult.java @@ -1,12 +1,11 @@ -package me.chanjar.weixin.mp.bean.result; +package me.chanjar.weixin.mp.bean.material; + +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; import java.io.Serializable; public class WxMpMaterialCountResult implements Serializable { - - /** - * - */ private static final long serialVersionUID = -5568772662085874138L; private int voiceCount; private int videoCount; @@ -47,8 +46,7 @@ public class WxMpMaterialCountResult implements Serializable { @Override public String toString() { - return "WxMpMaterialCountResult [" + "voiceCount=" + this.voiceCount + ", videoCount=" + this.videoCount - + ", imageCount=" + this.imageCount + ", newsCount=" + this.newsCount + "]"; + return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE); } } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpMaterialFileBatchGetResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/material/WxMpMaterialFileBatchGetResult.java similarity index 81% rename from weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpMaterialFileBatchGetResult.java rename to weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/material/WxMpMaterialFileBatchGetResult.java index 40eaecc1..2858c9e1 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpMaterialFileBatchGetResult.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/material/WxMpMaterialFileBatchGetResult.java @@ -1,14 +1,13 @@ -package me.chanjar.weixin.mp.bean.result; +package me.chanjar.weixin.mp.bean.material; + +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; import java.io.Serializable; import java.util.Date; import java.util.List; public class WxMpMaterialFileBatchGetResult implements Serializable { - - /** - * - */ private static final long serialVersionUID = -560388368297267884L; private int totalCount; private int itemCount; @@ -40,7 +39,7 @@ public class WxMpMaterialFileBatchGetResult implements Serializable { @Override public String toString() { - return "WxMpMaterialFileBatchGetResult [" + "totalCount=" + this.totalCount + ", itemCount=" + this.itemCount + ", items=" + this.items + "]"; + return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE); } public static class WxMaterialFileBatchGetNewsItem { @@ -83,7 +82,7 @@ public class WxMpMaterialFileBatchGetResult implements Serializable { @Override public String toString() { - return "WxMaterialFileBatchGetNewsItem [" + "mediaId=" + this.mediaId + ", updateTime=" + this.updateTime + ", name=" + this.name + ", url=" + this.url + "]"; + return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE); } } } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpMaterialNews.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/material/WxMpMaterialNews.java similarity index 98% rename from weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpMaterialNews.java rename to weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/material/WxMpMaterialNews.java index fc7c983c..03d241f4 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpMaterialNews.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/material/WxMpMaterialNews.java @@ -1,4 +1,4 @@ -package me.chanjar.weixin.mp.bean; +package me.chanjar.weixin.mp.bean.material; import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; import org.apache.commons.lang3.builder.ToStringBuilder; diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpMaterialNewsBatchGetResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/material/WxMpMaterialNewsBatchGetResult.java similarity index 79% rename from weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpMaterialNewsBatchGetResult.java rename to weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/material/WxMpMaterialNewsBatchGetResult.java index 48563244..629234b6 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpMaterialNewsBatchGetResult.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/material/WxMpMaterialNewsBatchGetResult.java @@ -1,17 +1,15 @@ -package me.chanjar.weixin.mp.bean.result; +package me.chanjar.weixin.mp.bean.material; -import me.chanjar.weixin.mp.bean.WxMpMaterialNews; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; import java.io.Serializable; import java.util.Date; import java.util.List; public class WxMpMaterialNewsBatchGetResult implements Serializable { - - /** - * - */ private static final long serialVersionUID = -1617952797921001666L; + private int totalCount; private int itemCount; private List items; @@ -42,7 +40,7 @@ public class WxMpMaterialNewsBatchGetResult implements Serializable { @Override public String toString() { - return "WxMpMaterialNewsBatchGetResult [" + "totalCount=" + this.totalCount + ", itemCount=" + this.itemCount + ", items=" + this.items + "]"; + return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE); } public static class WxMaterialNewsBatchGetNewsItem { @@ -76,7 +74,7 @@ public class WxMpMaterialNewsBatchGetResult implements Serializable { @Override public String toString() { - return "WxMaterialNewsBatchGetNewsItem [" + "mediaId=" + this.mediaId + ", updateTime=" + this.updateTime + ", content=" + this.content + "]"; + return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE); } } } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpMaterialUploadResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/material/WxMpMaterialUploadResult.java similarity index 94% rename from weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpMaterialUploadResult.java rename to weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/material/WxMpMaterialUploadResult.java index cb9cecd1..2b3a1e57 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpMaterialUploadResult.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/material/WxMpMaterialUploadResult.java @@ -1,4 +1,4 @@ -package me.chanjar.weixin.mp.bean.result; +package me.chanjar.weixin.mp.bean.material; import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; @@ -7,7 +7,7 @@ import java.io.Serializable; public class WxMpMaterialUploadResult implements Serializable { /** - * + * */ private static final long serialVersionUID = -128818731449449537L; private String mediaId; diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpMaterialVideoInfoResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/material/WxMpMaterialVideoInfoResult.java similarity index 95% rename from weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpMaterialVideoInfoResult.java rename to weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/material/WxMpMaterialVideoInfoResult.java index 456544d1..06b85b7e 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpMaterialVideoInfoResult.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/material/WxMpMaterialVideoInfoResult.java @@ -1,4 +1,4 @@ -package me.chanjar.weixin.mp.bean.result; +package me.chanjar.weixin.mp.bean.material; import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; @@ -7,7 +7,7 @@ import java.io.Serializable; public class WxMpMaterialVideoInfoResult implements Serializable { /** - * + * */ private static final long serialVersionUID = 1269131745333792202L; private String title; diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/http/MaterialNewsInfoRequestExecutor.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/http/MaterialNewsInfoRequestExecutor.java index 7a0719db..f61602ab 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/http/MaterialNewsInfoRequestExecutor.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/http/MaterialNewsInfoRequestExecutor.java @@ -5,7 +5,7 @@ import me.chanjar.weixin.common.exception.WxErrorException; import me.chanjar.weixin.common.util.http.RequestExecutor; import me.chanjar.weixin.common.util.http.Utf8ResponseHandler; import me.chanjar.weixin.common.util.json.WxGsonBuilder; -import me.chanjar.weixin.mp.bean.WxMpMaterialNews; +import me.chanjar.weixin.mp.bean.material.WxMpMaterialNews; import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; import org.apache.http.HttpHost; import org.apache.http.client.config.RequestConfig; diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/http/MaterialUploadRequestExecutor.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/http/MaterialUploadRequestExecutor.java index b7f05506..b06c34a6 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/http/MaterialUploadRequestExecutor.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/http/MaterialUploadRequestExecutor.java @@ -5,8 +5,8 @@ import me.chanjar.weixin.common.exception.WxErrorException; import me.chanjar.weixin.common.util.http.RequestExecutor; import me.chanjar.weixin.common.util.http.Utf8ResponseHandler; import me.chanjar.weixin.common.util.json.WxGsonBuilder; -import me.chanjar.weixin.mp.bean.WxMpMaterial; -import me.chanjar.weixin.mp.bean.result.WxMpMaterialUploadResult; +import me.chanjar.weixin.mp.bean.material.WxMpMaterial; +import me.chanjar.weixin.mp.bean.material.WxMpMaterialUploadResult; import org.apache.http.HttpHost; import org.apache.http.client.config.RequestConfig; import org.apache.http.client.methods.CloseableHttpResponse; @@ -37,7 +37,7 @@ public class MaterialUploadRequestExecutor implements RequestExecutor Date: Wed, 26 Oct 2016 15:29:57 +0800 Subject: [PATCH 62/83] =?UTF-8?q?=E9=87=8D=E6=9E=84bean=E5=92=8Cbuilder?= =?UTF-8?q?=E7=9A=84=E5=8C=85=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/util/crypto/WxCryptUtil.java | 600 +++++++++--------- .../common/util/crypto/WxCryptUtilTest.java | 206 +++--- .../weixin/mp/api/WxMpMessageHandler.java | 4 +- .../weixin/mp/api/WxMpMessageInterceptor.java | 2 +- .../weixin/mp/api/WxMpMessageMatcher.java | 2 +- .../weixin/mp/api/WxMpMessageRouter.java | 460 +++++++------- .../weixin/mp/api/WxMpMessageRouterRule.java | 4 +- .../weixin/mp/bean/kefu/WxMpKefuMessage.java | 16 +- .../mp/bean/{ => message}/WxMpXmlMessage.java | 22 +- .../{ => message}/WxMpXmlOutImageMessage.java | 4 +- .../bean/{ => message}/WxMpXmlOutMessage.java | 20 +- .../{ => message}/WxMpXmlOutMusicMessage.java | 18 +- .../{ => message}/WxMpXmlOutNewsMessage.java | 20 +- .../{ => message}/WxMpXmlOutTextMessage.java | 10 +- .../WxMpXmlOutTransferKefuMessage.java | 2 +- .../{ => message}/WxMpXmlOutVideoMessage.java | 10 +- .../{ => message}/WxMpXmlOutVoiceMessage.java | 4 +- .../kefu}/BaseBuilder.java | 2 +- .../kefu}/ImageBuilder.java | 2 +- .../kefu}/MpNewsBuilder.java | 2 +- .../kefu}/MusicBuilder.java | 2 +- .../kefu}/NewsBuilder.java | 2 +- .../kefu}/TextBuilder.java | 2 +- .../kefu}/VideoBuilder.java | 2 +- .../kefu}/VoiceBuilder.java | 2 +- .../kefu}/WxCardBuilder.java | 2 +- .../outxml}/BaseBuilder.java | 16 +- .../outxml}/ImageBuilder.java | 6 +- .../outxml}/MusicBuilder.java | 6 +- .../outxml}/NewsBuilder.java | 10 +- .../outxml}/TextBuilder.java | 4 +- .../TransferCustomerServiceBuilder.java | 4 +- .../outxml}/VideoBuilder.java | 8 +- .../outxml}/VoiceBuilder.java | 8 +- .../mp/util/xml/XStreamTransformer.java | 18 +- .../weixin/mp/api/WxMpMessageRouterTest.java | 34 +- .../{ => message}/WxMpXmlMessageTest.java | 2 +- .../WxMpXmlOutImageMessageTest.java | 10 +- .../WxMpXmlOutMusicMessageTest.java} | 12 +- .../WxMpXmlOutNewsMessageTest.java} | 14 +- .../WxMpXmlOutTextMessageTest.java} | 14 +- .../WxMpXmlOutTransferKefuMessageTest.java | 2 +- .../WxMpXmlOutVideoMessageTest.java} | 12 +- .../WxMpXmlOutVoiceMessageTest.java} | 12 +- .../mp/demo/DemoGuessNumberHandler.java | 4 +- .../weixin/mp/demo/DemoImageHandler.java | 6 +- .../weixin/mp/demo/DemoLogHandler.java | 4 +- .../weixin/mp/demo/DemoOAuth2Handler.java | 4 +- .../weixin/mp/demo/DemoTextHandler.java | 6 +- .../weixin/mp/demo/WxMpEndpointServlet.java | 4 +- weixin-java-mp/src/test/resources/testng.xml | 14 +- 51 files changed, 827 insertions(+), 829 deletions(-) rename weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/{ => message}/WxMpXmlMessage.java (99%) rename weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/{ => message}/WxMpXmlOutImageMessage.java (93%) rename weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/{ => message}/WxMpXmlOutMessage.java (96%) rename weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/{ => message}/WxMpXmlOutMusicMessage.java (97%) rename weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/{ => message}/WxMpXmlOutNewsMessage.java (96%) rename weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/{ => message}/WxMpXmlOutTextMessage.java (93%) rename weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/{ => message}/WxMpXmlOutTransferKefuMessage.java (96%) rename weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/{ => message}/WxMpXmlOutVideoMessage.java (97%) rename weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/{ => message}/WxMpXmlOutVoiceMessage.java (93%) rename weixin-java-mp/src/main/java/me/chanjar/weixin/mp/{bean/custombuilder => builder/kefu}/BaseBuilder.java (88%) rename weixin-java-mp/src/main/java/me/chanjar/weixin/mp/{bean/custombuilder => builder/kefu}/ImageBuilder.java (93%) rename weixin-java-mp/src/main/java/me/chanjar/weixin/mp/{bean/custombuilder => builder/kefu}/MpNewsBuilder.java (93%) rename weixin-java-mp/src/main/java/me/chanjar/weixin/mp/{bean/custombuilder => builder/kefu}/MusicBuilder.java (97%) rename weixin-java-mp/src/main/java/me/chanjar/weixin/mp/{bean/custombuilder => builder/kefu}/NewsBuilder.java (94%) rename weixin-java-mp/src/main/java/me/chanjar/weixin/mp/{bean/custombuilder => builder/kefu}/TextBuilder.java (93%) rename weixin-java-mp/src/main/java/me/chanjar/weixin/mp/{bean/custombuilder => builder/kefu}/VideoBuilder.java (96%) rename weixin-java-mp/src/main/java/me/chanjar/weixin/mp/{bean/custombuilder => builder/kefu}/VoiceBuilder.java (93%) rename weixin-java-mp/src/main/java/me/chanjar/weixin/mp/{bean/custombuilder => builder/kefu}/WxCardBuilder.java (93%) rename weixin-java-mp/src/main/java/me/chanjar/weixin/mp/{bean/outxmlbuilder => builder/outxml}/BaseBuilder.java (83%) rename weixin-java-mp/src/main/java/me/chanjar/weixin/mp/{bean/outxmlbuilder => builder/outxml}/ImageBuilder.java (80%) rename weixin-java-mp/src/main/java/me/chanjar/weixin/mp/{bean/outxmlbuilder => builder/outxml}/MusicBuilder.java (91%) rename weixin-java-mp/src/main/java/me/chanjar/weixin/mp/{bean/outxmlbuilder => builder/outxml}/NewsBuilder.java (84%) rename weixin-java-mp/src/main/java/me/chanjar/weixin/mp/{bean/outxmlbuilder => builder/outxml}/TextBuilder.java (80%) rename weixin-java-mp/src/main/java/me/chanjar/weixin/mp/{bean/outxmlbuilder => builder/outxml}/TransferCustomerServiceBuilder.java (88%) rename weixin-java-mp/src/main/java/me/chanjar/weixin/mp/{bean/outxmlbuilder => builder/outxml}/VideoBuilder.java (87%) rename weixin-java-mp/src/main/java/me/chanjar/weixin/mp/{bean/outxmlbuilder => builder/outxml}/VoiceBuilder.java (80%) rename weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/{ => message}/WxMpXmlMessageTest.java (99%) rename weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/{ => message}/WxMpXmlOutImageMessageTest.java (96%) rename weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/{WxXmlOutMusicMessageTest.java => message/WxMpXmlOutMusicMessageTest.java} (94%) rename weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/{WxXmlOutNewsMessageTest.java => message/WxMpXmlOutNewsMessageTest.java} (95%) rename weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/{WxXmlOutTextMessageTest.java => message/WxMpXmlOutTextMessageTest.java} (90%) rename weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/{ => message}/WxMpXmlOutTransferKefuMessageTest.java (98%) rename weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/{WxXmlOutVideoMessageTest.java => message/WxMpXmlOutVideoMessageTest.java} (92%) rename weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/{WxXmlOutVoiceMessageTest.java => message/WxMpXmlOutVoiceMessageTest.java} (90%) diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/crypto/WxCryptUtil.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/crypto/WxCryptUtil.java index fead486e..a809fe3b 100755 --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/crypto/WxCryptUtil.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/crypto/WxCryptUtil.java @@ -1,300 +1,300 @@ -/** - * 对公众平台发送给公众账号的消息加解密示例代码. - * - * @copyright Copyright (c) 1998-2014 Tencent Inc. - *

    - * 针对org.apache.commons.codec.binary.Base64, - * 需要导入架包commons-codec-1.9(或commons-codec-1.8等其他版本) - * 官方下载地址:http://commons.apache.org/proper/commons-codec/download_codec.cgi - */ - -// ------------------------------------------------------------------------ - -/** - * 针对org.apache.commons.codec.binary.Base64, - * 需要导入架包commons-codec-1.9(或commons-codec-1.8等其他版本) - * 官方下载地址:http://commons.apache.org/proper/commons-codec/download_codec.cgi - */ -package me.chanjar.weixin.common.util.crypto; - -import java.io.StringReader; -import java.nio.charset.Charset; -import java.util.Arrays; -import java.util.Random; - -import javax.crypto.Cipher; -import javax.crypto.spec.IvParameterSpec; -import javax.crypto.spec.SecretKeySpec; -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; -import javax.xml.parsers.ParserConfigurationException; - -import org.apache.commons.codec.binary.Base64; -import org.w3c.dom.Document; -import org.w3c.dom.Element; -import org.xml.sax.InputSource; - -public class WxCryptUtil { - - private static final Base64 base64 = new Base64(); - private static final Charset CHARSET = Charset.forName("utf-8"); - - private static final ThreadLocal builderLocal = new ThreadLocal() { - @Override - protected DocumentBuilder initialValue() { - try { - return DocumentBuilderFactory.newInstance().newDocumentBuilder(); - } catch (ParserConfigurationException exc) { - throw new IllegalArgumentException(exc); - } - } - }; - - protected byte[] aesKey; - protected String token; - protected String appidOrCorpid; - - public WxCryptUtil() { - super(); - } - - /** - * 构造函数 - * - * @param token 公众平台上,开发者设置的token - * @param encodingAesKey 公众平台上,开发者设置的EncodingAESKey - * @param appidOrCorpid 公众平台appid/corpid - */ - public WxCryptUtil(String token, String encodingAesKey, - String appidOrCorpid) { - this.token = token; - this.appidOrCorpid = appidOrCorpid; - this.aesKey = Base64.decodeBase64(encodingAesKey + "="); - } - - static String extractEncryptPart(String xml) { - try { - DocumentBuilder db = builderLocal.get(); - Document document = db.parse(new InputSource(new StringReader(xml))); - - Element root = document.getDocumentElement(); - return root.getElementsByTagName("Encrypt").item(0).getTextContent(); - } catch (Exception e) { - throw new RuntimeException(e); - } - } - - /** - * 将公众平台回复用户的消息加密打包. - *

      - *
    1. 对要发送的消息进行AES-CBC加密
    2. - *
    3. 生成安全签名
    4. - *
    5. 将消息密文和安全签名打包成xml格式
    6. - *
    - * - * @param plainText 公众平台待回复用户的消息,xml格式的字符串 - * @return 加密后的可以直接回复用户的密文,包括msg_signature, timestamp, nonce, encrypt的xml格式的字符串 - */ - public String encrypt(String plainText) { - // 加密 - String encryptedXml = encrypt(genRandomStr(), plainText); - - // 生成安全签名 - String timeStamp = Long.toString(System.currentTimeMillis() / 1000l); - String nonce = genRandomStr(); - - String signature = SHA1.gen(this.token, timeStamp, nonce, encryptedXml); - String result = generateXml(encryptedXml, signature, timeStamp, nonce); - return result; - } - - /** - * 对明文进行加密. - * - * @param plainText 需要加密的明文 - * @return 加密后base64编码的字符串 - */ - protected String encrypt(String randomStr, String plainText) { - ByteGroup byteCollector = new ByteGroup(); - byte[] randomStringBytes = randomStr.getBytes(CHARSET); - byte[] plainTextBytes = plainText.getBytes(CHARSET); - byte[] bytesOfSizeInNetworkOrder = number2BytesInNetworkOrder( - plainTextBytes.length); - byte[] appIdBytes = this.appidOrCorpid.getBytes(CHARSET); - - // randomStr + networkBytesOrder + text + appid - byteCollector.addBytes(randomStringBytes); - byteCollector.addBytes(bytesOfSizeInNetworkOrder); - byteCollector.addBytes(plainTextBytes); - byteCollector.addBytes(appIdBytes); - - // ... + pad: 使用自定义的填充方式对明文进行补位填充 - byte[] padBytes = PKCS7Encoder.encode(byteCollector.size()); - byteCollector.addBytes(padBytes); - - // 获得最终的字节流, 未加密 - byte[] unencrypted = byteCollector.toBytes(); - - try { - // 设置加密模式为AES的CBC模式 - Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding"); - SecretKeySpec keySpec = new SecretKeySpec(this.aesKey, "AES"); - IvParameterSpec iv = new IvParameterSpec(this.aesKey, 0, 16); - cipher.init(Cipher.ENCRYPT_MODE, keySpec, iv); - - // 加密 - byte[] encrypted = cipher.doFinal(unencrypted); - - // 使用BASE64对加密后的字符串进行编码 - String base64Encrypted = base64.encodeToString(encrypted); - - return base64Encrypted; - } catch (Exception e) { - throw new RuntimeException(e); - } - } - - /** - * 检验消息的真实性,并且获取解密后的明文. - *
      - *
    1. 利用收到的密文生成安全签名,进行签名验证
    2. - *
    3. 若验证通过,则提取xml中的加密消息
    4. - *
    5. 对消息进行解密
    6. - *
    - * - * @param msgSignature 签名串,对应URL参数的msg_signature - * @param timeStamp 时间戳,对应URL参数的timestamp - * @param nonce 随机串,对应URL参数的nonce - * @param encryptedXml 密文,对应POST请求的数据 - * @return 解密后的原文 - */ - public String decrypt(String msgSignature, String timeStamp, String nonce, - String encryptedXml) { - // 密钥,公众账号的app corpSecret - // 提取密文 - String cipherText = extractEncryptPart(encryptedXml); - - // 验证安全签名 - String signature = SHA1.gen(this.token, timeStamp, nonce, cipherText); - if (!signature.equals(msgSignature)) { - throw new RuntimeException("加密消息签名校验失败"); - } - - // 解密 - String result = decrypt(cipherText); - return result; - } - - /** - * 对密文进行解密. - * - * @param cipherText 需要解密的密文 - * @return 解密得到的明文 - */ - public String decrypt(String cipherText) { - byte[] original; - try { - // 设置解密模式为AES的CBC模式 - Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding"); - SecretKeySpec key_spec = new SecretKeySpec(this.aesKey, "AES"); - IvParameterSpec iv = new IvParameterSpec( - Arrays.copyOfRange(this.aesKey, 0, 16)); - cipher.init(Cipher.DECRYPT_MODE, key_spec, iv); - - // 使用BASE64对密文进行解码 - byte[] encrypted = Base64.decodeBase64(cipherText); - - // 解密 - original = cipher.doFinal(encrypted); - } catch (Exception e) { - throw new RuntimeException(e); - } - - String xmlContent, from_appid; - try { - // 去除补位字符 - byte[] bytes = PKCS7Encoder.decode(original); - - // 分离16位随机字符串,网络字节序和AppId - byte[] networkOrder = Arrays.copyOfRange(bytes, 16, 20); - - int xmlLength = bytesNetworkOrder2Number(networkOrder); - - xmlContent = new String(Arrays.copyOfRange(bytes, 20, 20 + xmlLength), - CHARSET); - from_appid = new String( - Arrays.copyOfRange(bytes, 20 + xmlLength, bytes.length), CHARSET); - } catch (Exception e) { - throw new RuntimeException(e); - } - - // appid不相同的情况 - if (!from_appid.equals(this.appidOrCorpid)) { - throw new RuntimeException("AppID不正确"); - } - - return xmlContent; - - } - - /** - * 将一个数字转换成生成4个字节的网络字节序bytes数组 - * - * @param number - */ - private static byte[] number2BytesInNetworkOrder(int number) { - byte[] orderBytes = new byte[4]; - orderBytes[3] = (byte) (number & 0xFF); - orderBytes[2] = (byte) (number >> 8 & 0xFF); - orderBytes[1] = (byte) (number >> 16 & 0xFF); - orderBytes[0] = (byte) (number >> 24 & 0xFF); - return orderBytes; - } - - /** - * 4个字节的网络字节序bytes数组还原成一个数字 - * - * @param bytesInNetworkOrder - */ - private static int bytesNetworkOrder2Number(byte[] bytesInNetworkOrder) { - int sourceNumber = 0; - for (int i = 0; i < 4; i++) { - sourceNumber <<= 8; - sourceNumber |= bytesInNetworkOrder[i] & 0xff; - } - return sourceNumber; - } - - /** - * 随机生成16位字符串 - */ - private static String genRandomStr() { - String base = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; - Random random = new Random(); - StringBuffer sb = new StringBuffer(); - for (int i = 0; i < 16; i++) { - int number = random.nextInt(base.length()); - sb.append(base.charAt(number)); - } - return sb.toString(); - } - - /** - * 生成xml消息 - * - * @param encrypt 加密后的消息密文 - * @param signature 安全签名 - * @param timestamp 时间戳 - * @param nonce 随机字符串 - * @return 生成的xml字符串 - */ - private static String generateXml(String encrypt, String signature, - String timestamp, String nonce) { - String format = "\n" + "\n" - + "\n" - + "%3$s\n" + "\n" - + ""; - return String.format(format, encrypt, signature, timestamp, nonce); - } - -} +/** + * 对公众平台发送给公众账号的消息加解密示例代码. + * + * @copyright Copyright (c) 1998-2014 Tencent Inc. + *

    + * 针对org.apache.commons.codec.binary.Base64, + * 需要导入架包commons-codec-1.9(或commons-codec-1.8等其他版本) + * 官方下载地址:http://commons.apache.org/proper/commons-codec/download_codec.cgi + */ + +// ------------------------------------------------------------------------ + +/** + * 针对org.apache.commons.codec.binary.Base64, + * 需要导入架包commons-codec-1.9(或commons-codec-1.8等其他版本) + * 官方下载地址:http://commons.apache.org/proper/commons-codec/download_codec.cgi + */ +package me.chanjar.weixin.common.util.crypto; + +import java.io.StringReader; +import java.nio.charset.Charset; +import java.util.Arrays; +import java.util.Random; + +import javax.crypto.Cipher; +import javax.crypto.spec.IvParameterSpec; +import javax.crypto.spec.SecretKeySpec; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; + +import org.apache.commons.codec.binary.Base64; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.xml.sax.InputSource; + +public class WxCryptUtil { + + private static final Base64 base64 = new Base64(); + private static final Charset CHARSET = Charset.forName("utf-8"); + + private static final ThreadLocal builderLocal = new ThreadLocal() { + @Override + protected DocumentBuilder initialValue() { + try { + return DocumentBuilderFactory.newInstance().newDocumentBuilder(); + } catch (ParserConfigurationException exc) { + throw new IllegalArgumentException(exc); + } + } + }; + + protected byte[] aesKey; + protected String token; + protected String appidOrCorpid; + + public WxCryptUtil() { + super(); + } + + /** + * 构造函数 + * + * @param token 公众平台上,开发者设置的token + * @param encodingAesKey 公众平台上,开发者设置的EncodingAESKey + * @param appidOrCorpid 公众平台appid/corpid + */ + public WxCryptUtil(String token, String encodingAesKey, + String appidOrCorpid) { + this.token = token; + this.appidOrCorpid = appidOrCorpid; + this.aesKey = Base64.decodeBase64(encodingAesKey + "="); + } + + static String extractEncryptPart(String xml) { + try { + DocumentBuilder db = builderLocal.get(); + Document document = db.parse(new InputSource(new StringReader(xml))); + + Element root = document.getDocumentElement(); + return root.getElementsByTagName("Encrypt").item(0).getTextContent(); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + /** + * 将公众平台回复用户的消息加密打包. + *

      + *
    1. 对要发送的消息进行AES-CBC加密
    2. + *
    3. 生成安全签名
    4. + *
    5. 将消息密文和安全签名打包成xml格式
    6. + *
    + * + * @param plainText 公众平台待回复用户的消息,xml格式的字符串 + * @return 加密后的可以直接回复用户的密文,包括msg_signature, timestamp, nonce, encrypt的xml格式的字符串 + */ + public String encrypt(String plainText) { + // 加密 + String encryptedXml = encrypt(genRandomStr(), plainText); + + // 生成安全签名 + String timeStamp = Long.toString(System.currentTimeMillis() / 1000l); + String nonce = genRandomStr(); + + String signature = SHA1.gen(this.token, timeStamp, nonce, encryptedXml); + String result = generateXml(encryptedXml, signature, timeStamp, nonce); + return result; + } + + /** + * 对明文进行加密. + * + * @param plainText 需要加密的明文 + * @return 加密后base64编码的字符串 + */ + protected String encrypt(String randomStr, String plainText) { + ByteGroup byteCollector = new ByteGroup(); + byte[] randomStringBytes = randomStr.getBytes(CHARSET); + byte[] plainTextBytes = plainText.getBytes(CHARSET); + byte[] bytesOfSizeInNetworkOrder = number2BytesInNetworkOrder( + plainTextBytes.length); + byte[] appIdBytes = this.appidOrCorpid.getBytes(CHARSET); + + // randomStr + networkBytesOrder + text + appid + byteCollector.addBytes(randomStringBytes); + byteCollector.addBytes(bytesOfSizeInNetworkOrder); + byteCollector.addBytes(plainTextBytes); + byteCollector.addBytes(appIdBytes); + + // ... + pad: 使用自定义的填充方式对明文进行补位填充 + byte[] padBytes = PKCS7Encoder.encode(byteCollector.size()); + byteCollector.addBytes(padBytes); + + // 获得最终的字节流, 未加密 + byte[] unencrypted = byteCollector.toBytes(); + + try { + // 设置加密模式为AES的CBC模式 + Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding"); + SecretKeySpec keySpec = new SecretKeySpec(this.aesKey, "AES"); + IvParameterSpec iv = new IvParameterSpec(this.aesKey, 0, 16); + cipher.init(Cipher.ENCRYPT_MODE, keySpec, iv); + + // 加密 + byte[] encrypted = cipher.doFinal(unencrypted); + + // 使用BASE64对加密后的字符串进行编码 + String base64Encrypted = base64.encodeToString(encrypted); + + return base64Encrypted; + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + /** + * 检验消息的真实性,并且获取解密后的明文. + *
      + *
    1. 利用收到的密文生成安全签名,进行签名验证
    2. + *
    3. 若验证通过,则提取xml中的加密消息
    4. + *
    5. 对消息进行解密
    6. + *
    + * + * @param msgSignature 签名串,对应URL参数的msg_signature + * @param timeStamp 时间戳,对应URL参数的timestamp + * @param nonce 随机串,对应URL参数的nonce + * @param encryptedXml 密文,对应POST请求的数据 + * @return 解密后的原文 + */ + public String decrypt(String msgSignature, String timeStamp, String nonce, + String encryptedXml) { + // 密钥,公众账号的app corpSecret + // 提取密文 + String cipherText = extractEncryptPart(encryptedXml); + + // 验证安全签名 + String signature = SHA1.gen(this.token, timeStamp, nonce, cipherText); + if (!signature.equals(msgSignature)) { + throw new RuntimeException("加密消息签名校验失败"); + } + + // 解密 + String result = decrypt(cipherText); + return result; + } + + /** + * 对密文进行解密. + * + * @param cipherText 需要解密的密文 + * @return 解密得到的明文 + */ + public String decrypt(String cipherText) { + byte[] original; + try { + // 设置解密模式为AES的CBC模式 + Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding"); + SecretKeySpec key_spec = new SecretKeySpec(this.aesKey, "AES"); + IvParameterSpec iv = new IvParameterSpec( + Arrays.copyOfRange(this.aesKey, 0, 16)); + cipher.init(Cipher.DECRYPT_MODE, key_spec, iv); + + // 使用BASE64对密文进行解码 + byte[] encrypted = Base64.decodeBase64(cipherText); + + // 解密 + original = cipher.doFinal(encrypted); + } catch (Exception e) { + throw new RuntimeException(e); + } + + String xmlContent, from_appid; + try { + // 去除补位字符 + byte[] bytes = PKCS7Encoder.decode(original); + + // 分离16位随机字符串,网络字节序和AppId + byte[] networkOrder = Arrays.copyOfRange(bytes, 16, 20); + + int xmlLength = bytesNetworkOrder2Number(networkOrder); + + xmlContent = new String(Arrays.copyOfRange(bytes, 20, 20 + xmlLength), + CHARSET); + from_appid = new String( + Arrays.copyOfRange(bytes, 20 + xmlLength, bytes.length), CHARSET); + } catch (Exception e) { + throw new RuntimeException(e); + } + + // appid不相同的情况 + if (!from_appid.equals(this.appidOrCorpid)) { + throw new RuntimeException("AppID不正确"); + } + + return xmlContent; + + } + + /** + * 将一个数字转换成生成4个字节的网络字节序bytes数组 + * + * @param number + */ + private static byte[] number2BytesInNetworkOrder(int number) { + byte[] orderBytes = new byte[4]; + orderBytes[3] = (byte) (number & 0xFF); + orderBytes[2] = (byte) (number >> 8 & 0xFF); + orderBytes[1] = (byte) (number >> 16 & 0xFF); + orderBytes[0] = (byte) (number >> 24 & 0xFF); + return orderBytes; + } + + /** + * 4个字节的网络字节序bytes数组还原成一个数字 + * + * @param bytesInNetworkOrder + */ + private static int bytesNetworkOrder2Number(byte[] bytesInNetworkOrder) { + int sourceNumber = 0; + for (int i = 0; i < 4; i++) { + sourceNumber <<= 8; + sourceNumber |= bytesInNetworkOrder[i] & 0xff; + } + return sourceNumber; + } + + /** + * 随机生成16位字符串 + */ + private static String genRandomStr() { + String base = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; + Random random = new Random(); + StringBuffer sb = new StringBuffer(); + for (int i = 0; i < 16; i++) { + int number = random.nextInt(base.length()); + sb.append(base.charAt(number)); + } + return sb.toString(); + } + + /** + * 生成xml消息 + * + * @param encrypt 加密后的消息密文 + * @param signature 安全签名 + * @param timestamp 时间戳 + * @param nonce 随机字符串 + * @return 生成的xml字符串 + */ + private static String generateXml(String encrypt, String signature, + String timestamp, String nonce) { + String format = "\n" + "\n" + + "\n" + + "%3$s\n" + "\n" + + ""; + return String.format(format, encrypt, signature, timestamp, nonce); + } + +} diff --git a/weixin-java-common/src/test/java/me/chanjar/weixin/common/util/crypto/WxCryptUtilTest.java b/weixin-java-common/src/test/java/me/chanjar/weixin/common/util/crypto/WxCryptUtilTest.java index e7692165..91095a20 100755 --- a/weixin-java-common/src/test/java/me/chanjar/weixin/common/util/crypto/WxCryptUtilTest.java +++ b/weixin-java-common/src/test/java/me/chanjar/weixin/common/util/crypto/WxCryptUtilTest.java @@ -1,103 +1,103 @@ -package me.chanjar.weixin.common.util.crypto; - -import org.testng.annotations.Test; -import org.w3c.dom.Document; -import org.w3c.dom.Element; -import org.w3c.dom.NodeList; -import org.xml.sax.InputSource; -import org.xml.sax.SAXException; - -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; -import javax.xml.parsers.ParserConfigurationException; -import java.io.IOException; -import java.io.StringReader; - -import static org.testng.Assert.assertEquals; -import static org.testng.Assert.fail; - -@Test -public class WxCryptUtilTest { - String encodingAesKey = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFG"; - String token = "pamtest"; - String timestamp = "1409304348"; - String nonce = "xxxxxx"; - String appId = "wxb11529c136998cb6"; - String randomStr = "aaaabbbbccccdddd"; - - String xmlFormat = ""; - String replyMsg = "我是中文abcd123"; - - String afterAesEncrypt = "jn1L23DB+6ELqJ+6bruv21Y6MD7KeIfP82D6gU39rmkgczbWwt5+3bnyg5K55bgVtVzd832WzZGMhkP72vVOfg=="; - - String replyMsg2 = "1407743423"; - String afterAesEncrypt2 = "jn1L23DB+6ELqJ+6bruv23M2GmYfkv0xBh2h+XTBOKVKcgDFHle6gqcZ1cZrk3e1qjPQ1F4RsLWzQRG9udbKWesxlkupqcEcW7ZQweImX9+wLMa0GaUzpkycA8+IamDBxn5loLgZpnS7fVAbExOkK5DYHBmv5tptA9tklE/fTIILHR8HLXa5nQvFb3tYPKAlHF3rtTeayNf0QuM+UW/wM9enGIDIJHF7CLHiDNAYxr+r+OrJCmPQyTy8cVWlu9iSvOHPT/77bZqJucQHQ04sq7KZI27OcqpQNSto2OdHCoTccjggX5Z9Mma0nMJBU+jLKJ38YB1fBIz+vBzsYjrTmFQ44YfeEuZ+xRTQwr92vhA9OxchWVINGC50qE/6lmkwWTwGX9wtQpsJKhP+oS7rvTY8+VdzETdfakjkwQ5/Xka042OlUb1/slTwo4RscuQ+RdxSGvDahxAJ6+EAjLt9d8igHngxIbf6YyqqROxuxqIeIch3CssH/LqRs+iAcILvApYZckqmA7FNERspKA5f8GoJ9sv8xmGvZ9Yrf57cExWtnX8aCMMaBropU/1k+hKP5LVdzbWCG0hGwx/dQudYR/eXp3P0XxjlFiy+9DMlaFExWUZQDajPkdPrEeOwofJb"; - - public void testNormal() throws ParserConfigurationException, SAXException, IOException { - WxCryptUtil pc = new WxCryptUtil(this.token, this.encodingAesKey, this.appId); - String encryptedXml = pc.encrypt(this.replyMsg); - - System.out.println(encryptedXml); - - DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); - DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder(); - Document document = documentBuilder.parse(new InputSource(new StringReader(encryptedXml))); - - Element root = document.getDocumentElement(); - String cipherText = root.getElementsByTagName("Encrypt").item(0).getTextContent(); - System.out.println(cipherText); - - String msgSignature = root.getElementsByTagName("MsgSignature").item(0).getTextContent(); - System.out.println(msgSignature); - - String timestamp = root.getElementsByTagName("TimeStamp").item(0).getTextContent(); - System.out.println(timestamp); - - String nonce = root.getElementsByTagName("Nonce").item(0).getTextContent(); - System.out.println(nonce); - - String messageText = String.format(this.xmlFormat, cipherText); - System.out.println(messageText); - - // 第三方收到企业号平台发送的消息 - String plainMessage = pc.decrypt(cipherText); - System.out.println(plainMessage); - - assertEquals(plainMessage, this.replyMsg); - } - - public void testAesEncrypt() { - WxCryptUtil pc = new WxCryptUtil(this.token, this.encodingAesKey, this.appId); - assertEquals(pc.encrypt(this.randomStr, this.replyMsg), this.afterAesEncrypt); - } - - public void testAesEncrypt2() { - WxCryptUtil pc = new WxCryptUtil(this.token, this.encodingAesKey, this.appId); - assertEquals(pc.encrypt(this.randomStr, this.replyMsg2), this.afterAesEncrypt2); - } - - public void testValidateSignatureError() throws ParserConfigurationException, SAXException, - IOException { - try { - WxCryptUtil pc = new WxCryptUtil(this.token, this.encodingAesKey, this.appId); - String afterEncrpt = pc.encrypt(this.replyMsg); - DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); - DocumentBuilder db = dbf.newDocumentBuilder(); - StringReader sr = new StringReader(afterEncrpt); - InputSource is = new InputSource(sr); - Document document = db.parse(is); - - Element root = document.getDocumentElement(); - NodeList nodelist1 = root.getElementsByTagName("Encrypt"); - - String encrypt = nodelist1.item(0).getTextContent(); - String fromXML = String.format(this.xmlFormat, encrypt); - pc.decrypt("12345", this.timestamp, this.nonce, fromXML); // 这里签名错误 - } catch (RuntimeException e) { - assertEquals(e.getMessage(), "加密消息签名校验失败"); - return; - } - fail("错误流程不抛出异常???"); - } - -} +package me.chanjar.weixin.common.util.crypto; + +import org.testng.annotations.Test; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.NodeList; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; +import java.io.IOException; +import java.io.StringReader; + +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.fail; + +@Test +public class WxCryptUtilTest { + String encodingAesKey = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFG"; + String token = "pamtest"; + String timestamp = "1409304348"; + String nonce = "xxxxxx"; + String appId = "wxb11529c136998cb6"; + String randomStr = "aaaabbbbccccdddd"; + + String xmlFormat = ""; + String replyMsg = "我是中文abcd123"; + + String afterAesEncrypt = "jn1L23DB+6ELqJ+6bruv21Y6MD7KeIfP82D6gU39rmkgczbWwt5+3bnyg5K55bgVtVzd832WzZGMhkP72vVOfg=="; + + String replyMsg2 = "1407743423"; + String afterAesEncrypt2 = "jn1L23DB+6ELqJ+6bruv23M2GmYfkv0xBh2h+XTBOKVKcgDFHle6gqcZ1cZrk3e1qjPQ1F4RsLWzQRG9udbKWesxlkupqcEcW7ZQweImX9+wLMa0GaUzpkycA8+IamDBxn5loLgZpnS7fVAbExOkK5DYHBmv5tptA9tklE/fTIILHR8HLXa5nQvFb3tYPKAlHF3rtTeayNf0QuM+UW/wM9enGIDIJHF7CLHiDNAYxr+r+OrJCmPQyTy8cVWlu9iSvOHPT/77bZqJucQHQ04sq7KZI27OcqpQNSto2OdHCoTccjggX5Z9Mma0nMJBU+jLKJ38YB1fBIz+vBzsYjrTmFQ44YfeEuZ+xRTQwr92vhA9OxchWVINGC50qE/6lmkwWTwGX9wtQpsJKhP+oS7rvTY8+VdzETdfakjkwQ5/Xka042OlUb1/slTwo4RscuQ+RdxSGvDahxAJ6+EAjLt9d8igHngxIbf6YyqqROxuxqIeIch3CssH/LqRs+iAcILvApYZckqmA7FNERspKA5f8GoJ9sv8xmGvZ9Yrf57cExWtnX8aCMMaBropU/1k+hKP5LVdzbWCG0hGwx/dQudYR/eXp3P0XxjlFiy+9DMlaFExWUZQDajPkdPrEeOwofJb"; + + public void testNormal() throws ParserConfigurationException, SAXException, IOException { + WxCryptUtil pc = new WxCryptUtil(this.token, this.encodingAesKey, this.appId); + String encryptedXml = pc.encrypt(this.replyMsg); + + System.out.println(encryptedXml); + + DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); + DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder(); + Document document = documentBuilder.parse(new InputSource(new StringReader(encryptedXml))); + + Element root = document.getDocumentElement(); + String cipherText = root.getElementsByTagName("Encrypt").item(0).getTextContent(); + System.out.println(cipherText); + + String msgSignature = root.getElementsByTagName("MsgSignature").item(0).getTextContent(); + System.out.println(msgSignature); + + String timestamp = root.getElementsByTagName("TimeStamp").item(0).getTextContent(); + System.out.println(timestamp); + + String nonce = root.getElementsByTagName("Nonce").item(0).getTextContent(); + System.out.println(nonce); + + String messageText = String.format(this.xmlFormat, cipherText); + System.out.println(messageText); + + // 第三方收到企业号平台发送的消息 + String plainMessage = pc.decrypt(cipherText); + System.out.println(plainMessage); + + assertEquals(plainMessage, this.replyMsg); + } + + public void testAesEncrypt() { + WxCryptUtil pc = new WxCryptUtil(this.token, this.encodingAesKey, this.appId); + assertEquals(pc.encrypt(this.randomStr, this.replyMsg), this.afterAesEncrypt); + } + + public void testAesEncrypt2() { + WxCryptUtil pc = new WxCryptUtil(this.token, this.encodingAesKey, this.appId); + assertEquals(pc.encrypt(this.randomStr, this.replyMsg2), this.afterAesEncrypt2); + } + + public void testValidateSignatureError() throws ParserConfigurationException, SAXException, + IOException { + try { + WxCryptUtil pc = new WxCryptUtil(this.token, this.encodingAesKey, this.appId); + String afterEncrpt = pc.encrypt(this.replyMsg); + DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); + DocumentBuilder db = dbf.newDocumentBuilder(); + StringReader sr = new StringReader(afterEncrpt); + InputSource is = new InputSource(sr); + Document document = db.parse(is); + + Element root = document.getDocumentElement(); + NodeList nodelist1 = root.getElementsByTagName("Encrypt"); + + String encrypt = nodelist1.item(0).getTextContent(); + String fromXML = String.format(this.xmlFormat, encrypt); + pc.decrypt("12345", this.timestamp, this.nonce, fromXML); // 这里签名错误 + } catch (RuntimeException e) { + assertEquals(e.getMessage(), "加密消息签名校验失败"); + return; + } + fail("错误流程不抛出异常???"); + } + +} diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMessageHandler.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMessageHandler.java index dae2a238..5a336bc8 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMessageHandler.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMessageHandler.java @@ -2,8 +2,8 @@ package me.chanjar.weixin.mp.api; import me.chanjar.weixin.common.exception.WxErrorException; import me.chanjar.weixin.common.session.WxSessionManager; -import me.chanjar.weixin.mp.bean.WxMpXmlMessage; -import me.chanjar.weixin.mp.bean.WxMpXmlOutMessage; +import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage; +import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage; import java.util.Map; diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMessageInterceptor.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMessageInterceptor.java index 3fcd6d95..15223895 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMessageInterceptor.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMessageInterceptor.java @@ -2,7 +2,7 @@ package me.chanjar.weixin.mp.api; import me.chanjar.weixin.common.exception.WxErrorException; import me.chanjar.weixin.common.session.WxSessionManager; -import me.chanjar.weixin.mp.bean.WxMpXmlMessage; +import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage; import java.util.Map; diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMessageMatcher.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMessageMatcher.java index 68798ae2..812992c9 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMessageMatcher.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMessageMatcher.java @@ -1,6 +1,6 @@ package me.chanjar.weixin.mp.api; -import me.chanjar.weixin.mp.bean.WxMpXmlMessage; +import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage; /** * 消息匹配器,用在消息路由的时候 diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMessageRouter.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMessageRouter.java index 7db50e79..24dc4451 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMessageRouter.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMessageRouter.java @@ -1,230 +1,230 @@ -package me.chanjar.weixin.mp.api; - -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.Future; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import me.chanjar.weixin.common.api.WxErrorExceptionHandler; -import me.chanjar.weixin.common.api.WxMessageDuplicateChecker; -import me.chanjar.weixin.common.api.WxMessageInMemoryDuplicateChecker; -import me.chanjar.weixin.common.session.InternalSession; -import me.chanjar.weixin.common.session.InternalSessionManager; -import me.chanjar.weixin.common.session.StandardSessionManager; -import me.chanjar.weixin.common.session.WxSessionManager; -import me.chanjar.weixin.common.util.LogExceptionHandler; -import me.chanjar.weixin.mp.bean.WxMpXmlMessage; -import me.chanjar.weixin.mp.bean.WxMpXmlOutMessage; - -/** - *
    - * 微信消息路由器,通过代码化的配置,把来自微信的消息交给handler处理
    - * 
    - * 说明:
    - * 1. 配置路由规则时要按照从细到粗的原则,否则可能消息可能会被提前处理
    - * 2. 默认情况下消息只会被处理一次,除非使用 {@link WxMpMessageRouterRule#next()}
    - * 3. 规则的结束必须用{@link WxMpMessageRouterRule#end()}或者{@link WxMpMessageRouterRule#next()},否则不会生效
    - * 
    - * 使用方法:
    - * WxMpMessageRouter router = new WxMpMessageRouter();
    - * router
    - *   .rule()
    - *       .msgType("MSG_TYPE").event("EVENT").eventKey("EVENT_KEY").content("CONTENT")
    - *       .interceptor(interceptor, ...).handler(handler, ...)
    - *   .end()
    - *   .rule()
    - *       // 另外一个匹配规则
    - *   .end()
    - * ;
    - * 
    - * // 将WxXmlMessage交给消息路由器
    - * router.route(message);
    - * 
    - * 
    - * @author Daniel Qian - * - */ -public class WxMpMessageRouter { - - protected final Logger log = LoggerFactory.getLogger(WxMpMessageRouter.class); - - private static final int DEFAULT_THREAD_POOL_SIZE = 100; - - private final List rules = new ArrayList<>(); - - private final WxMpService wxMpService; - - private ExecutorService executorService; - - private WxMessageDuplicateChecker messageDuplicateChecker; - - private WxSessionManager sessionManager; - - private WxErrorExceptionHandler exceptionHandler; - - public WxMpMessageRouter(WxMpService wxMpService) { - this.wxMpService = wxMpService; - this.executorService = Executors.newFixedThreadPool(DEFAULT_THREAD_POOL_SIZE); - this.messageDuplicateChecker = new WxMessageInMemoryDuplicateChecker(); - this.sessionManager = new StandardSessionManager(); - this.exceptionHandler = new LogExceptionHandler(); - } - - /** - *
    -   * 设置自定义的 {@link ExecutorService}
    -   * 如果不调用该方法,默认使用 Executors.newFixedThreadPool(100)
    -   * 
    - * @param executorService - */ - public void setExecutorService(ExecutorService executorService) { - this.executorService = executorService; - } - - /** - *
    -   * 设置自定义的 {@link me.chanjar.weixin.common.api.WxMessageDuplicateChecker}
    -   * 如果不调用该方法,默认使用 {@link me.chanjar.weixin.common.api.WxMessageInMemoryDuplicateChecker}
    -   * 
    - * @param messageDuplicateChecker - */ - public void setMessageDuplicateChecker(WxMessageDuplicateChecker messageDuplicateChecker) { - this.messageDuplicateChecker = messageDuplicateChecker; - } - - /** - *
    -   * 设置自定义的{@link me.chanjar.weixin.common.session.WxSessionManager}
    -   * 如果不调用该方法,默认使用 {@link me.chanjar.weixin.common.session.StandardSessionManager}
    -   * 
    - * @param sessionManager - */ - public void setSessionManager(WxSessionManager sessionManager) { - this.sessionManager = sessionManager; - } - - /** - *
    -   * 设置自定义的{@link me.chanjar.weixin.common.api.WxErrorExceptionHandler}
    -   * 如果不调用该方法,默认使用 {@link me.chanjar.weixin.common.util.LogExceptionHandler}
    -   * 
    - * @param exceptionHandler - */ - public void setExceptionHandler(WxErrorExceptionHandler exceptionHandler) { - this.exceptionHandler = exceptionHandler; - } - - List getRules() { - return this.rules; - } - - /** - * 开始一个新的Route规则 - */ - public WxMpMessageRouterRule rule() { - return new WxMpMessageRouterRule(this); - } - - /** - * 处理微信消息 - * @param wxMessage - */ - public WxMpXmlOutMessage route(final WxMpXmlMessage wxMessage) { - if (isDuplicateMessage(wxMessage)) { - // 如果是重复消息,那么就不做处理 - return null; - } - - final List matchRules = new ArrayList<>(); - // 收集匹配的规则 - for (final WxMpMessageRouterRule rule : this.rules) { - if (rule.test(wxMessage)) { - matchRules.add(rule); - if(!rule.isReEnter()) { - break; - } - } - } - - if (matchRules.size() == 0) { - return null; - } - - WxMpXmlOutMessage res = null; - final List> futures = new ArrayList<>(); - for (final WxMpMessageRouterRule rule : matchRules) { - // 返回最后一个非异步的rule的执行结果 - if(rule.isAsync()) { - futures.add( - this.executorService.submit(new Runnable() { - @Override - public void run() { - rule.service(wxMessage, WxMpMessageRouter.this.wxMpService, WxMpMessageRouter.this.sessionManager, WxMpMessageRouter.this.exceptionHandler); - } - }) - ); - } else { - res = rule.service(wxMessage, this.wxMpService, this.sessionManager, this.exceptionHandler); - // 在同步操作结束,session访问结束 - this.log.debug("End session access: async=false, sessionId={}", wxMessage.getFromUser()); - sessionEndAccess(wxMessage); - } - } - - if (futures.size() > 0) { - this.executorService.submit(new Runnable() { - @Override - public void run() { - for (Future future : futures) { - try { - future.get(); - WxMpMessageRouter.this.log.debug("End session access: async=true, sessionId={}", wxMessage.getFromUser()); - // 异步操作结束,session访问结束 - sessionEndAccess(wxMessage); - } catch (InterruptedException e) { - WxMpMessageRouter.this.log.error("Error happened when wait task finish", e); - } catch (ExecutionException e) { - WxMpMessageRouter.this.log.error("Error happened when wait task finish", e); - } - } - } - }); - } - return res; - } - - protected boolean isDuplicateMessage(WxMpXmlMessage wxMessage) { - - StringBuffer messageId = new StringBuffer(); - if (wxMessage.getMsgId() == null) { - messageId.append(wxMessage.getCreateTime()) - .append("-").append(wxMessage.getFromUser()) - .append("-").append(wxMessage.getEventKey() == null ? "" : wxMessage.getEventKey()) - .append("-").append(wxMessage.getEvent() == null ? "" : wxMessage.getEvent()) - ; - } else { - messageId.append(wxMessage.getMsgId()); - } - - return this.messageDuplicateChecker.isDuplicate(messageId.toString()); - - } - - /** - * 对session的访问结束 - * @param wxMessage - */ - protected void sessionEndAccess(WxMpXmlMessage wxMessage) { - - InternalSession session = ((InternalSessionManager)this.sessionManager).findSession(wxMessage.getFromUser()); - if (session != null) { - session.endAccess(); - } - - } -} +package me.chanjar.weixin.mp.api; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import me.chanjar.weixin.common.api.WxErrorExceptionHandler; +import me.chanjar.weixin.common.api.WxMessageDuplicateChecker; +import me.chanjar.weixin.common.api.WxMessageInMemoryDuplicateChecker; +import me.chanjar.weixin.common.session.InternalSession; +import me.chanjar.weixin.common.session.InternalSessionManager; +import me.chanjar.weixin.common.session.StandardSessionManager; +import me.chanjar.weixin.common.session.WxSessionManager; +import me.chanjar.weixin.common.util.LogExceptionHandler; +import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage; +import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage; + +/** + *
    + * 微信消息路由器,通过代码化的配置,把来自微信的消息交给handler处理
    + *
    + * 说明:
    + * 1. 配置路由规则时要按照从细到粗的原则,否则可能消息可能会被提前处理
    + * 2. 默认情况下消息只会被处理一次,除非使用 {@link WxMpMessageRouterRule#next()}
    + * 3. 规则的结束必须用{@link WxMpMessageRouterRule#end()}或者{@link WxMpMessageRouterRule#next()},否则不会生效
    + *
    + * 使用方法:
    + * WxMpMessageRouter router = new WxMpMessageRouter();
    + * router
    + *   .rule()
    + *       .msgType("MSG_TYPE").event("EVENT").eventKey("EVENT_KEY").content("CONTENT")
    + *       .interceptor(interceptor, ...).handler(handler, ...)
    + *   .end()
    + *   .rule()
    + *       // 另外一个匹配规则
    + *   .end()
    + * ;
    + *
    + * // 将WxXmlMessage交给消息路由器
    + * router.route(message);
    + *
    + * 
    + * @author Daniel Qian + * + */ +public class WxMpMessageRouter { + + protected final Logger log = LoggerFactory.getLogger(WxMpMessageRouter.class); + + private static final int DEFAULT_THREAD_POOL_SIZE = 100; + + private final List rules = new ArrayList<>(); + + private final WxMpService wxMpService; + + private ExecutorService executorService; + + private WxMessageDuplicateChecker messageDuplicateChecker; + + private WxSessionManager sessionManager; + + private WxErrorExceptionHandler exceptionHandler; + + public WxMpMessageRouter(WxMpService wxMpService) { + this.wxMpService = wxMpService; + this.executorService = Executors.newFixedThreadPool(DEFAULT_THREAD_POOL_SIZE); + this.messageDuplicateChecker = new WxMessageInMemoryDuplicateChecker(); + this.sessionManager = new StandardSessionManager(); + this.exceptionHandler = new LogExceptionHandler(); + } + + /** + *
    +   * 设置自定义的 {@link ExecutorService}
    +   * 如果不调用该方法,默认使用 Executors.newFixedThreadPool(100)
    +   * 
    + * @param executorService + */ + public void setExecutorService(ExecutorService executorService) { + this.executorService = executorService; + } + + /** + *
    +   * 设置自定义的 {@link me.chanjar.weixin.common.api.WxMessageDuplicateChecker}
    +   * 如果不调用该方法,默认使用 {@link me.chanjar.weixin.common.api.WxMessageInMemoryDuplicateChecker}
    +   * 
    + * @param messageDuplicateChecker + */ + public void setMessageDuplicateChecker(WxMessageDuplicateChecker messageDuplicateChecker) { + this.messageDuplicateChecker = messageDuplicateChecker; + } + + /** + *
    +   * 设置自定义的{@link me.chanjar.weixin.common.session.WxSessionManager}
    +   * 如果不调用该方法,默认使用 {@link me.chanjar.weixin.common.session.StandardSessionManager}
    +   * 
    + * @param sessionManager + */ + public void setSessionManager(WxSessionManager sessionManager) { + this.sessionManager = sessionManager; + } + + /** + *
    +   * 设置自定义的{@link me.chanjar.weixin.common.api.WxErrorExceptionHandler}
    +   * 如果不调用该方法,默认使用 {@link me.chanjar.weixin.common.util.LogExceptionHandler}
    +   * 
    + * @param exceptionHandler + */ + public void setExceptionHandler(WxErrorExceptionHandler exceptionHandler) { + this.exceptionHandler = exceptionHandler; + } + + List getRules() { + return this.rules; + } + + /** + * 开始一个新的Route规则 + */ + public WxMpMessageRouterRule rule() { + return new WxMpMessageRouterRule(this); + } + + /** + * 处理微信消息 + * @param wxMessage + */ + public WxMpXmlOutMessage route(final WxMpXmlMessage wxMessage) { + if (isDuplicateMessage(wxMessage)) { + // 如果是重复消息,那么就不做处理 + return null; + } + + final List matchRules = new ArrayList<>(); + // 收集匹配的规则 + for (final WxMpMessageRouterRule rule : this.rules) { + if (rule.test(wxMessage)) { + matchRules.add(rule); + if(!rule.isReEnter()) { + break; + } + } + } + + if (matchRules.size() == 0) { + return null; + } + + WxMpXmlOutMessage res = null; + final List> futures = new ArrayList<>(); + for (final WxMpMessageRouterRule rule : matchRules) { + // 返回最后一个非异步的rule的执行结果 + if(rule.isAsync()) { + futures.add( + this.executorService.submit(new Runnable() { + @Override + public void run() { + rule.service(wxMessage, WxMpMessageRouter.this.wxMpService, WxMpMessageRouter.this.sessionManager, WxMpMessageRouter.this.exceptionHandler); + } + }) + ); + } else { + res = rule.service(wxMessage, this.wxMpService, this.sessionManager, this.exceptionHandler); + // 在同步操作结束,session访问结束 + this.log.debug("End session access: async=false, sessionId={}", wxMessage.getFromUser()); + sessionEndAccess(wxMessage); + } + } + + if (futures.size() > 0) { + this.executorService.submit(new Runnable() { + @Override + public void run() { + for (Future future : futures) { + try { + future.get(); + WxMpMessageRouter.this.log.debug("End session access: async=true, sessionId={}", wxMessage.getFromUser()); + // 异步操作结束,session访问结束 + sessionEndAccess(wxMessage); + } catch (InterruptedException e) { + WxMpMessageRouter.this.log.error("Error happened when wait task finish", e); + } catch (ExecutionException e) { + WxMpMessageRouter.this.log.error("Error happened when wait task finish", e); + } + } + } + }); + } + return res; + } + + protected boolean isDuplicateMessage(WxMpXmlMessage wxMessage) { + + StringBuffer messageId = new StringBuffer(); + if (wxMessage.getMsgId() == null) { + messageId.append(wxMessage.getCreateTime()) + .append("-").append(wxMessage.getFromUser()) + .append("-").append(wxMessage.getEventKey() == null ? "" : wxMessage.getEventKey()) + .append("-").append(wxMessage.getEvent() == null ? "" : wxMessage.getEvent()) + ; + } else { + messageId.append(wxMessage.getMsgId()); + } + + return this.messageDuplicateChecker.isDuplicate(messageId.toString()); + + } + + /** + * 对session的访问结束 + * @param wxMessage + */ + protected void sessionEndAccess(WxMpXmlMessage wxMessage) { + + InternalSession session = ((InternalSessionManager)this.sessionManager).findSession(wxMessage.getFromUser()); + if (session != null) { + session.endAccess(); + } + + } +} diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMessageRouterRule.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMessageRouterRule.java index 317303b8..6859b7d7 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMessageRouterRule.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMessageRouterRule.java @@ -3,8 +3,8 @@ package me.chanjar.weixin.mp.api; import me.chanjar.weixin.common.exception.WxErrorException; import me.chanjar.weixin.common.session.WxSessionManager; import me.chanjar.weixin.common.api.WxErrorExceptionHandler; -import me.chanjar.weixin.mp.bean.WxMpXmlMessage; -import me.chanjar.weixin.mp.bean.WxMpXmlOutMessage; +import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage; +import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage; import java.util.ArrayList; import java.util.HashMap; diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/kefu/WxMpKefuMessage.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/kefu/WxMpKefuMessage.java index 36c2525c..228351fd 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/kefu/WxMpKefuMessage.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/kefu/WxMpKefuMessage.java @@ -4,14 +4,14 @@ import java.io.Serializable; import java.util.ArrayList; import java.util.List; -import me.chanjar.weixin.mp.bean.custombuilder.ImageBuilder; -import me.chanjar.weixin.mp.bean.custombuilder.MpNewsBuilder; -import me.chanjar.weixin.mp.bean.custombuilder.MusicBuilder; -import me.chanjar.weixin.mp.bean.custombuilder.NewsBuilder; -import me.chanjar.weixin.mp.bean.custombuilder.TextBuilder; -import me.chanjar.weixin.mp.bean.custombuilder.VideoBuilder; -import me.chanjar.weixin.mp.bean.custombuilder.VoiceBuilder; -import me.chanjar.weixin.mp.bean.custombuilder.WxCardBuilder; +import me.chanjar.weixin.mp.builder.kefu.ImageBuilder; +import me.chanjar.weixin.mp.builder.kefu.MpNewsBuilder; +import me.chanjar.weixin.mp.builder.kefu.MusicBuilder; +import me.chanjar.weixin.mp.builder.kefu.NewsBuilder; +import me.chanjar.weixin.mp.builder.kefu.TextBuilder; +import me.chanjar.weixin.mp.builder.kefu.VideoBuilder; +import me.chanjar.weixin.mp.builder.kefu.VoiceBuilder; +import me.chanjar.weixin.mp.builder.kefu.WxCardBuilder; import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; /** diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlMessage.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/message/WxMpXmlMessage.java similarity index 99% rename from weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlMessage.java rename to weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/message/WxMpXmlMessage.java index 864b0d98..baca6698 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlMessage.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/message/WxMpXmlMessage.java @@ -1,22 +1,20 @@ -package me.chanjar.weixin.mp.bean; - -import java.io.IOException; -import java.io.InputStream; -import java.io.Serializable; -import java.util.ArrayList; -import java.util.List; - -import org.apache.commons.io.IOUtils; -import org.apache.commons.lang3.builder.ToStringBuilder; -import org.apache.commons.lang3.builder.ToStringStyle; +package me.chanjar.weixin.mp.bean.message; import com.thoughtworks.xstream.annotations.XStreamAlias; import com.thoughtworks.xstream.annotations.XStreamConverter; - import me.chanjar.weixin.common.util.xml.XStreamCDataConverter; import me.chanjar.weixin.mp.api.WxMpConfigStorage; import me.chanjar.weixin.mp.util.crypto.WxMpCryptUtil; import me.chanjar.weixin.mp.util.xml.XStreamTransformer; +import org.apache.commons.io.IOUtils; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; + +import java.io.IOException; +import java.io.InputStream; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; /** *
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlOutImageMessage.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/message/WxMpXmlOutImageMessage.java
    similarity index 93%
    rename from weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlOutImageMessage.java
    rename to weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/message/WxMpXmlOutImageMessage.java
    index 18204a51..62852ca8 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlOutImageMessage.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/message/WxMpXmlOutImageMessage.java
    @@ -1,4 +1,4 @@
    -package me.chanjar.weixin.mp.bean;
    +package me.chanjar.weixin.mp.bean.message;
     
     import com.thoughtworks.xstream.annotations.XStreamAlias;
     import com.thoughtworks.xstream.annotations.XStreamConverter;
    @@ -9,7 +9,7 @@ import me.chanjar.weixin.common.util.xml.XStreamMediaIdConverter;
     public class WxMpXmlOutImageMessage extends WxMpXmlOutMessage {
     
       /**
    -   * 
    +   *
        */
       private static final long serialVersionUID = -2684778597067990723L;
       @XStreamAlias("Image")
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlOutMessage.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/message/WxMpXmlOutMessage.java
    similarity index 96%
    rename from weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlOutMessage.java
    rename to weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/message/WxMpXmlOutMessage.java
    index 2eb6818b..5b8b81e5 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlOutMessage.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/message/WxMpXmlOutMessage.java
    @@ -1,10 +1,10 @@
    -package me.chanjar.weixin.mp.bean;
    +package me.chanjar.weixin.mp.bean.message;
     
     import com.thoughtworks.xstream.annotations.XStreamAlias;
     import com.thoughtworks.xstream.annotations.XStreamConverter;
     import me.chanjar.weixin.common.util.xml.XStreamCDataConverter;
     import me.chanjar.weixin.mp.api.WxMpConfigStorage;
    -import me.chanjar.weixin.mp.bean.outxmlbuilder.*;
    +import me.chanjar.weixin.mp.builder.outxml.*;
     import me.chanjar.weixin.mp.util.crypto.WxMpCryptUtil;
     import me.chanjar.weixin.mp.util.xml.XStreamTransformer;
     
    @@ -18,14 +18,14 @@ public abstract class WxMpXmlOutMessage implements Serializable {
       @XStreamAlias("ToUserName")
       @XStreamConverter(value=XStreamCDataConverter.class)
       protected String toUserName;
    -  
    +
       @XStreamAlias("FromUserName")
       @XStreamConverter(value=XStreamCDataConverter.class)
       protected String fromUserName;
    -  
    +
       @XStreamAlias("CreateTime")
       protected Long createTime;
    -  
    +
       @XStreamAlias("MsgType")
       @XStreamConverter(value=XStreamCDataConverter.class)
       protected String msgType;
    @@ -61,7 +61,7 @@ public abstract class WxMpXmlOutMessage implements Serializable {
       public void setMsgType(String msgType) {
         this.msgType = msgType;
       }
    -  
    +
       public String toXml() {
         return XStreamTransformer.toXml((Class) this.getClass(), this);
       }
    @@ -95,28 +95,28 @@ public abstract class WxMpXmlOutMessage implements Serializable {
       public static VoiceBuilder VOICE() {
         return new VoiceBuilder();
       }
    -  
    +
       /**
        * 获得视频消息builder
        */
       public static VideoBuilder VIDEO() {
         return new VideoBuilder();
       }
    -  
    +
       /**
        * 获得音乐消息builder
        */
       public static MusicBuilder MUSIC() {
         return new MusicBuilder();
       }
    -  
    +
       /**
        * 获得图文消息builder
        */
       public static NewsBuilder NEWS() {
         return new NewsBuilder();
       }
    -  
    +
       /**
        * 获得客服消息builder
        */
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlOutMusicMessage.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/message/WxMpXmlOutMusicMessage.java
    similarity index 97%
    rename from weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlOutMusicMessage.java
    rename to weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/message/WxMpXmlOutMusicMessage.java
    index ec71167c..a5b48619 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlOutMusicMessage.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/message/WxMpXmlOutMusicMessage.java
    @@ -1,4 +1,4 @@
    -package me.chanjar.weixin.mp.bean;
    +package me.chanjar.weixin.mp.bean.message;
     
     import com.thoughtworks.xstream.annotations.XStreamAlias;
     import com.thoughtworks.xstream.annotations.XStreamConverter;
    @@ -9,7 +9,7 @@ import me.chanjar.weixin.common.util.xml.XStreamCDataConverter;
     public class WxMpXmlOutMusicMessage extends WxMpXmlOutMessage {
     
       /**
    -   * 
    +   *
        */
       private static final long serialVersionUID = -4159937804975448945L;
       @XStreamAlias("Music")
    @@ -34,7 +34,7 @@ public class WxMpXmlOutMusicMessage extends WxMpXmlOutMessage {
       public void setDescription(String description) {
         this.music.setDescription(description);
       }
    -  
    +
       public String getThumbMediaId() {
         return this.music.getThumbMediaId();
       }
    @@ -58,10 +58,10 @@ public class WxMpXmlOutMusicMessage extends WxMpXmlOutMessage {
       public void setHqMusicUrl(String hqMusicUrl) {
         this.music.setHqMusicUrl(hqMusicUrl);
       }
    -  
    +
       @XStreamAlias("Music")
       public static class Music {
    -    
    +
         @XStreamAlias("Title")
         @XStreamConverter(value=XStreamCDataConverter.class)
         private String title;
    @@ -73,15 +73,15 @@ public class WxMpXmlOutMusicMessage extends WxMpXmlOutMessage {
         @XStreamAlias("ThumbMediaId")
         @XStreamConverter(value=XStreamCDataConverter.class)
         private String thumbMediaId;
    -    
    +
         @XStreamAlias("MusicUrl")
         @XStreamConverter(value=XStreamCDataConverter.class)
         private String musicUrl;
    -    
    +
         @XStreamAlias("HQMusicUrl")
         @XStreamConverter(value=XStreamCDataConverter.class)
         private String hqMusicUrl;
    -    
    +
         public String getTitle() {
           return this.title;
         }
    @@ -121,7 +121,7 @@ public class WxMpXmlOutMusicMessage extends WxMpXmlOutMessage {
         public void setHqMusicUrl(String hqMusicUrl) {
           this.hqMusicUrl = hqMusicUrl;
         }
    -    
    +
       }
     
     }
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlOutNewsMessage.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/message/WxMpXmlOutNewsMessage.java
    similarity index 96%
    rename from weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlOutNewsMessage.java
    rename to weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/message/WxMpXmlOutNewsMessage.java
    index 170023a3..413a6d7c 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlOutNewsMessage.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/message/WxMpXmlOutNewsMessage.java
    @@ -1,4 +1,4 @@
    -package me.chanjar.weixin.mp.bean;
    +package me.chanjar.weixin.mp.bean.message;
     
     import com.thoughtworks.xstream.annotations.XStreamAlias;
     import com.thoughtworks.xstream.annotations.XStreamConverter;
    @@ -12,16 +12,16 @@ import java.util.List;
     public class WxMpXmlOutNewsMessage extends WxMpXmlOutMessage {
     
       /**
    -   * 
    +   *
        */
       private static final long serialVersionUID = -4604402850905714772L;
     
       @XStreamAlias("ArticleCount")
       protected int articleCount;
    -  
    +
       @XStreamAlias("Articles")
       protected final List articles = new ArrayList<>();
    -  
    +
       public WxMpXmlOutNewsMessage() {
         this.msgType = WxConsts.XML_MSG_NEWS;
       }
    @@ -34,15 +34,15 @@ public class WxMpXmlOutNewsMessage extends WxMpXmlOutMessage {
         this.articles.add(item);
         this.articleCount = this.articles.size();
       }
    -  
    +
       public List getArticles() {
         return this.articles;
       }
    -  
    -  
    +
    +
       @XStreamAlias("item")
       public static class Item {
    -    
    +
         @XStreamAlias("Title")
         @XStreamConverter(value=XStreamCDataConverter.class)
         private String Title;
    @@ -54,11 +54,11 @@ public class WxMpXmlOutNewsMessage extends WxMpXmlOutMessage {
         @XStreamAlias("PicUrl")
         @XStreamConverter(value=XStreamCDataConverter.class)
         private String PicUrl;
    -    
    +
         @XStreamAlias("Url")
         @XStreamConverter(value=XStreamCDataConverter.class)
         private String Url;
    -    
    +
         public String getTitle() {
           return this.Title;
         }
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlOutTextMessage.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/message/WxMpXmlOutTextMessage.java
    similarity index 93%
    rename from weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlOutTextMessage.java
    rename to weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/message/WxMpXmlOutTextMessage.java
    index 4c439a7c..0719b1ed 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlOutTextMessage.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/message/WxMpXmlOutTextMessage.java
    @@ -1,4 +1,4 @@
    -package me.chanjar.weixin.mp.bean;
    +package me.chanjar.weixin.mp.bean.message;
     
     import com.thoughtworks.xstream.annotations.XStreamAlias;
     import com.thoughtworks.xstream.annotations.XStreamConverter;
    @@ -7,9 +7,9 @@ import me.chanjar.weixin.common.util.xml.XStreamCDataConverter;
     
     @XStreamAlias("xml")
     public class WxMpXmlOutTextMessage extends WxMpXmlOutMessage {
    -  
    +
       /**
    -   * 
    +   *
        */
       private static final long serialVersionUID = -3972786455288763361L;
       @XStreamAlias("Content")
    @@ -19,7 +19,7 @@ public class WxMpXmlOutTextMessage extends WxMpXmlOutMessage {
       public WxMpXmlOutTextMessage() {
         this.msgType = WxConsts.XML_MSG_TEXT;
       }
    -  
    +
       public String getContent() {
         return this.content;
       }
    @@ -28,5 +28,5 @@ public class WxMpXmlOutTextMessage extends WxMpXmlOutMessage {
         this.content = content;
       }
     
    -  
    +
     }
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlOutTransferKefuMessage.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/message/WxMpXmlOutTransferKefuMessage.java
    similarity index 96%
    rename from weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlOutTransferKefuMessage.java
    rename to weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/message/WxMpXmlOutTransferKefuMessage.java
    index 3022e70d..b0eece70 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlOutTransferKefuMessage.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/message/WxMpXmlOutTransferKefuMessage.java
    @@ -1,4 +1,4 @@
    -package me.chanjar.weixin.mp.bean;
    +package me.chanjar.weixin.mp.bean.message;
     
     import com.thoughtworks.xstream.annotations.XStreamAlias;
     import com.thoughtworks.xstream.annotations.XStreamConverter;
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlOutVideoMessage.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/message/WxMpXmlOutVideoMessage.java
    similarity index 97%
    rename from weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlOutVideoMessage.java
    rename to weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/message/WxMpXmlOutVideoMessage.java
    index a8f751cf..3c042f6d 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlOutVideoMessage.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/message/WxMpXmlOutVideoMessage.java
    @@ -1,4 +1,4 @@
    -package me.chanjar.weixin.mp.bean;
    +package me.chanjar.weixin.mp.bean.message;
     
     import com.thoughtworks.xstream.annotations.XStreamAlias;
     import com.thoughtworks.xstream.annotations.XStreamConverter;
    @@ -9,7 +9,7 @@ import me.chanjar.weixin.common.util.xml.XStreamCDataConverter;
     public class WxMpXmlOutVideoMessage extends WxMpXmlOutMessage {
     
       /**
    -   * 
    +   *
        */
       private static final long serialVersionUID = 1745902309380113978L;
       @XStreamAlias("Video")
    @@ -42,11 +42,11 @@ public class WxMpXmlOutVideoMessage extends WxMpXmlOutMessage {
       public void setDescription(String description) {
         this.video.setDescription(description);
       }
    -  
    +
     
       @XStreamAlias("Video")
         public static class Video {
    -    
    +
         @XStreamAlias("MediaId")
         @XStreamConverter(value=XStreamCDataConverter.class)
         private String mediaId;
    @@ -82,7 +82,7 @@ public class WxMpXmlOutVideoMessage extends WxMpXmlOutMessage {
         public void setDescription(String description) {
           this.description = description;
         }
    -    
    +
       }
     
     }
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlOutVoiceMessage.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/message/WxMpXmlOutVoiceMessage.java
    similarity index 93%
    rename from weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlOutVoiceMessage.java
    rename to weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/message/WxMpXmlOutVoiceMessage.java
    index a47766dc..ec354ddf 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlOutVoiceMessage.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/message/WxMpXmlOutVoiceMessage.java
    @@ -1,4 +1,4 @@
    -package me.chanjar.weixin.mp.bean;
    +package me.chanjar.weixin.mp.bean.message;
     
     import com.thoughtworks.xstream.annotations.XStreamAlias;
     import com.thoughtworks.xstream.annotations.XStreamConverter;
    @@ -9,7 +9,7 @@ import me.chanjar.weixin.common.util.xml.XStreamMediaIdConverter;
     public class WxMpXmlOutVoiceMessage extends WxMpXmlOutMessage {
     
       /**
    -   * 
    +   *
        */
       private static final long serialVersionUID = 240367390249860551L;
       @XStreamAlias("Voice")
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/custombuilder/BaseBuilder.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/builder/kefu/BaseBuilder.java
    similarity index 88%
    rename from weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/custombuilder/BaseBuilder.java
    rename to weixin-java-mp/src/main/java/me/chanjar/weixin/mp/builder/kefu/BaseBuilder.java
    index 911e3f62..c5285d6f 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/custombuilder/BaseBuilder.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/builder/kefu/BaseBuilder.java
    @@ -1,4 +1,4 @@
    -package me.chanjar.weixin.mp.bean.custombuilder;
    +package me.chanjar.weixin.mp.builder.kefu;
     
     import me.chanjar.weixin.mp.bean.kefu.WxMpKefuMessage;
     
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/custombuilder/ImageBuilder.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/builder/kefu/ImageBuilder.java
    similarity index 93%
    rename from weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/custombuilder/ImageBuilder.java
    rename to weixin-java-mp/src/main/java/me/chanjar/weixin/mp/builder/kefu/ImageBuilder.java
    index 85855d25..9533f5b3 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/custombuilder/ImageBuilder.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/builder/kefu/ImageBuilder.java
    @@ -1,4 +1,4 @@
    -package me.chanjar.weixin.mp.bean.custombuilder;
    +package me.chanjar.weixin.mp.builder.kefu;
     
     import me.chanjar.weixin.common.api.WxConsts;
     import me.chanjar.weixin.mp.bean.kefu.WxMpKefuMessage;
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/custombuilder/MpNewsBuilder.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/builder/kefu/MpNewsBuilder.java
    similarity index 93%
    rename from weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/custombuilder/MpNewsBuilder.java
    rename to weixin-java-mp/src/main/java/me/chanjar/weixin/mp/builder/kefu/MpNewsBuilder.java
    index 4ab90dce..615802b3 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/custombuilder/MpNewsBuilder.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/builder/kefu/MpNewsBuilder.java
    @@ -1,4 +1,4 @@
    -package me.chanjar.weixin.mp.bean.custombuilder;
    +package me.chanjar.weixin.mp.builder.kefu;
     
     import me.chanjar.weixin.common.api.WxConsts;
     import me.chanjar.weixin.mp.bean.kefu.WxMpKefuMessage;
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/custombuilder/MusicBuilder.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/builder/kefu/MusicBuilder.java
    similarity index 97%
    rename from weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/custombuilder/MusicBuilder.java
    rename to weixin-java-mp/src/main/java/me/chanjar/weixin/mp/builder/kefu/MusicBuilder.java
    index 3555f7a9..8d23bacd 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/custombuilder/MusicBuilder.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/builder/kefu/MusicBuilder.java
    @@ -1,4 +1,4 @@
    -package me.chanjar.weixin.mp.bean.custombuilder;
    +package me.chanjar.weixin.mp.builder.kefu;
     
     import me.chanjar.weixin.common.api.WxConsts;
     import me.chanjar.weixin.mp.bean.kefu.WxMpKefuMessage;
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/custombuilder/NewsBuilder.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/builder/kefu/NewsBuilder.java
    similarity index 94%
    rename from weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/custombuilder/NewsBuilder.java
    rename to weixin-java-mp/src/main/java/me/chanjar/weixin/mp/builder/kefu/NewsBuilder.java
    index d909eb7d..900babb5 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/custombuilder/NewsBuilder.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/builder/kefu/NewsBuilder.java
    @@ -1,4 +1,4 @@
    -package me.chanjar.weixin.mp.bean.custombuilder;
    +package me.chanjar.weixin.mp.builder.kefu;
     
     import me.chanjar.weixin.common.api.WxConsts;
     import me.chanjar.weixin.mp.bean.kefu.WxMpKefuMessage;
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/custombuilder/TextBuilder.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/builder/kefu/TextBuilder.java
    similarity index 93%
    rename from weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/custombuilder/TextBuilder.java
    rename to weixin-java-mp/src/main/java/me/chanjar/weixin/mp/builder/kefu/TextBuilder.java
    index 770675f5..9e5f9384 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/custombuilder/TextBuilder.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/builder/kefu/TextBuilder.java
    @@ -1,4 +1,4 @@
    -package me.chanjar.weixin.mp.bean.custombuilder;
    +package me.chanjar.weixin.mp.builder.kefu;
     
     import me.chanjar.weixin.common.api.WxConsts;
     import me.chanjar.weixin.mp.bean.kefu.WxMpKefuMessage;
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/custombuilder/VideoBuilder.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/builder/kefu/VideoBuilder.java
    similarity index 96%
    rename from weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/custombuilder/VideoBuilder.java
    rename to weixin-java-mp/src/main/java/me/chanjar/weixin/mp/builder/kefu/VideoBuilder.java
    index f9740e2f..13ade68c 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/custombuilder/VideoBuilder.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/builder/kefu/VideoBuilder.java
    @@ -1,4 +1,4 @@
    -package me.chanjar.weixin.mp.bean.custombuilder;
    +package me.chanjar.weixin.mp.builder.kefu;
     
     import me.chanjar.weixin.common.api.WxConsts;
     import me.chanjar.weixin.mp.bean.kefu.WxMpKefuMessage;
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/custombuilder/VoiceBuilder.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/builder/kefu/VoiceBuilder.java
    similarity index 93%
    rename from weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/custombuilder/VoiceBuilder.java
    rename to weixin-java-mp/src/main/java/me/chanjar/weixin/mp/builder/kefu/VoiceBuilder.java
    index 7686a56d..c9cb32b2 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/custombuilder/VoiceBuilder.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/builder/kefu/VoiceBuilder.java
    @@ -1,4 +1,4 @@
    -package me.chanjar.weixin.mp.bean.custombuilder;
    +package me.chanjar.weixin.mp.builder.kefu;
     
     import me.chanjar.weixin.common.api.WxConsts;
     import me.chanjar.weixin.mp.bean.kefu.WxMpKefuMessage;
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/custombuilder/WxCardBuilder.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/builder/kefu/WxCardBuilder.java
    similarity index 93%
    rename from weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/custombuilder/WxCardBuilder.java
    rename to weixin-java-mp/src/main/java/me/chanjar/weixin/mp/builder/kefu/WxCardBuilder.java
    index fb5e81c2..e600df6c 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/custombuilder/WxCardBuilder.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/builder/kefu/WxCardBuilder.java
    @@ -1,4 +1,4 @@
    -package me.chanjar.weixin.mp.bean.custombuilder;
    +package me.chanjar.weixin.mp.builder.kefu;
     
     import me.chanjar.weixin.common.api.WxConsts;
     import me.chanjar.weixin.mp.bean.kefu.WxMpKefuMessage;
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/outxmlbuilder/BaseBuilder.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/builder/outxml/BaseBuilder.java
    similarity index 83%
    rename from weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/outxmlbuilder/BaseBuilder.java
    rename to weixin-java-mp/src/main/java/me/chanjar/weixin/mp/builder/outxml/BaseBuilder.java
    index 77db2617..e594565c 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/outxmlbuilder/BaseBuilder.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/builder/outxml/BaseBuilder.java
    @@ -1,29 +1,29 @@
    -package me.chanjar.weixin.mp.bean.outxmlbuilder;
    +package me.chanjar.weixin.mp.builder.outxml;
     
    -import me.chanjar.weixin.mp.bean.WxMpXmlOutMessage;
    +import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage;
     
     public abstract class BaseBuilder {
    -  
    +
       protected String toUserName;
    -  
    +
       protected String fromUserName;
    -  
    +
       public BuilderType toUser(String touser) {
         this.toUserName = touser;
         return (BuilderType) this;
       }
    -  
    +
       public BuilderType fromUser(String fromusername) {
         this.fromUserName = fromusername;
         return (BuilderType) this;
       }
     
       public abstract ValueType build();
    -  
    +
       public void setCommon(WxMpXmlOutMessage m) {
         m.setToUserName(this.toUserName);
         m.setFromUserName(this.fromUserName);
         m.setCreateTime(System.currentTimeMillis() / 1000l);
       }
    -  
    +
     }
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/outxmlbuilder/ImageBuilder.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/builder/outxml/ImageBuilder.java
    similarity index 80%
    rename from weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/outxmlbuilder/ImageBuilder.java
    rename to weixin-java-mp/src/main/java/me/chanjar/weixin/mp/builder/outxml/ImageBuilder.java
    index ee265bf3..0bf441bf 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/outxmlbuilder/ImageBuilder.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/builder/outxml/ImageBuilder.java
    @@ -1,6 +1,6 @@
    -package me.chanjar.weixin.mp.bean.outxmlbuilder;
    +package me.chanjar.weixin.mp.builder.outxml;
     
    -import me.chanjar.weixin.mp.bean.WxMpXmlOutImageMessage;
    +import me.chanjar.weixin.mp.bean.message.WxMpXmlOutImageMessage;
     
     /**
      * 图片消息builder
    @@ -22,5 +22,5 @@ public final class ImageBuilder extends BaseBuilder {
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/outxmlbuilder/NewsBuilder.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/builder/outxml/NewsBuilder.java
    similarity index 84%
    rename from weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/outxmlbuilder/NewsBuilder.java
    rename to weixin-java-mp/src/main/java/me/chanjar/weixin/mp/builder/outxml/NewsBuilder.java
    index 1014c452..1936c5f5 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/outxmlbuilder/NewsBuilder.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/builder/outxml/NewsBuilder.java
    @@ -1,6 +1,6 @@
    -package me.chanjar.weixin.mp.bean.outxmlbuilder;
    +package me.chanjar.weixin.mp.builder.outxml;
     
    -import me.chanjar.weixin.mp.bean.WxMpXmlOutNewsMessage;
    +import me.chanjar.weixin.mp.bean.message.WxMpXmlOutNewsMessage;
     
     import java.util.ArrayList;
     import java.util.List;
    @@ -12,12 +12,12 @@ import java.util.List;
     public final class NewsBuilder extends BaseBuilder {
     
       protected final List articles = new ArrayList<>();
    -  
    +
       public NewsBuilder addArticle(WxMpXmlOutNewsMessage.Item item) {
         this.articles.add(item);
         return this;
       }
    -  
    +
       @Override
       public WxMpXmlOutNewsMessage build() {
         WxMpXmlOutNewsMessage m = new WxMpXmlOutNewsMessage();
    @@ -27,5 +27,5 @@ public final class NewsBuilder extends BaseBuilder"
             + ""
    @@ -23,7 +23,7 @@ public class WxMpXmlOutImageMessageTest {
         System.out.println(m.toXml());
         Assert.assertEquals(m.toXml().replaceAll("\\s", ""), expected.replaceAll("\\s", ""));
       }
    -  
    +
       public void testBuild() {
         WxMpXmlOutImageMessage m = WxMpXmlOutMessage.IMAGE().mediaId("ddfefesfsdfef").fromUser("from").toUser("to").build();
         String expected = ""
    @@ -38,11 +38,11 @@ public class WxMpXmlOutImageMessageTest {
                   m
                     .toXml()
                     .replaceAll("\\s", "")
    -                .replaceAll(".*?", ""), 
    +                .replaceAll(".*?", ""),
                   expected
                     .replaceAll("\\s", "")
                     .replaceAll(".*?", "")
                   );
    -    
    +
       }
     }
    diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/WxXmlOutMusicMessageTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/message/WxMpXmlOutMusicMessageTest.java
    similarity index 94%
    rename from weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/WxXmlOutMusicMessageTest.java
    rename to weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/message/WxMpXmlOutMusicMessageTest.java
    index 4397a677..3e7a96f0 100644
    --- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/WxXmlOutMusicMessageTest.java
    +++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/message/WxMpXmlOutMusicMessageTest.java
    @@ -1,10 +1,10 @@
    -package me.chanjar.weixin.mp.bean;
    +package me.chanjar.weixin.mp.bean.message;
     
     import org.testng.Assert;
     import org.testng.annotations.Test;
     
     @Test
    -public class WxXmlOutMusicMessageTest {
    +public class WxMpXmlOutMusicMessageTest {
     
       public void test() {
         WxMpXmlOutMusicMessage m = new WxMpXmlOutMusicMessage();
    @@ -16,7 +16,7 @@ public class WxXmlOutMusicMessageTest {
         m.setCreateTime(1122l);
         m.setFromUserName("fromUser");
         m.setToUserName("toUser");
    -    
    +
         String expected = ""
             + ""
             + ""
    @@ -33,7 +33,7 @@ public class WxXmlOutMusicMessageTest {
         System.out.println(m.toXml());
         Assert.assertEquals(m.toXml().replaceAll("\\s", ""), expected.replaceAll("\\s", ""));
       }
    -  
    +
       public void testBuild() {
         WxMpXmlOutMusicMessage m = WxMpXmlOutMessage.MUSIC()
               .fromUser("fromUser")
    @@ -62,11 +62,11 @@ public class WxXmlOutMusicMessageTest {
             m
             .toXml()
             .replaceAll("\\s", "")
    -        .replaceAll(".*?", ""), 
    +        .replaceAll(".*?", ""),
             expected
             .replaceAll("\\s", "")
             .replaceAll(".*?", "")
             );
       }
    -  
    +
     }
    diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/WxXmlOutNewsMessageTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/message/WxMpXmlOutNewsMessageTest.java
    similarity index 95%
    rename from weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/WxXmlOutNewsMessageTest.java
    rename to weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/message/WxMpXmlOutNewsMessageTest.java
    index 5e2da0b0..60d8571a 100644
    --- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/WxXmlOutNewsMessageTest.java
    +++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/message/WxMpXmlOutNewsMessageTest.java
    @@ -1,17 +1,17 @@
    -package me.chanjar.weixin.mp.bean;
    +package me.chanjar.weixin.mp.bean.message;
     
     import org.testng.Assert;
     import org.testng.annotations.Test;
     
     @Test
    -public class WxXmlOutNewsMessageTest {
    +public class WxMpXmlOutNewsMessageTest {
     
       public void test() {
         WxMpXmlOutNewsMessage m = new WxMpXmlOutNewsMessage();
         m.setCreateTime(1122l);
         m.setFromUserName("fromUser");
         m.setToUserName("toUser");
    -    
    +
         WxMpXmlOutNewsMessage.Item item = new WxMpXmlOutNewsMessage.Item();
         item.setDescription("description");
         item.setPicUrl("picUrl");
    @@ -43,14 +43,14 @@ public class WxXmlOutNewsMessageTest {
         System.out.println(m.toXml());
         Assert.assertEquals(m.toXml().replaceAll("\\s", ""), expected.replaceAll("\\s", ""));
       }
    -  
    +
       public void testBuild() {
         WxMpXmlOutNewsMessage.Item item = new WxMpXmlOutNewsMessage.Item();
         item.setDescription("description");
         item.setPicUrl("picUrl");
         item.setTitle("title");
         item.setUrl("url");
    -    
    +
         WxMpXmlOutNewsMessage m = WxMpXmlOutMessage.NEWS()
               .fromUser("fromUser")
               .toUser("toUser")
    @@ -83,11 +83,11 @@ public class WxXmlOutNewsMessageTest {
             m
             .toXml()
             .replaceAll("\\s", "")
    -        .replaceAll(".*?", ""), 
    +        .replaceAll(".*?", ""),
             expected
             .replaceAll("\\s", "")
             .replaceAll(".*?", "")
             );
       }
    -  
    +
     }
    diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/WxXmlOutTextMessageTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/message/WxMpXmlOutTextMessageTest.java
    similarity index 90%
    rename from weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/WxXmlOutTextMessageTest.java
    rename to weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/message/WxMpXmlOutTextMessageTest.java
    index 2a752051..56658967 100644
    --- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/WxXmlOutTextMessageTest.java
    +++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/message/WxMpXmlOutTextMessageTest.java
    @@ -1,10 +1,10 @@
    -package me.chanjar.weixin.mp.bean;
    +package me.chanjar.weixin.mp.bean.message;
     
     import org.testng.Assert;
     import org.testng.annotations.Test;
     
     @Test
    -public class WxXmlOutTextMessageTest {
    +public class WxMpXmlOutTextMessageTest {
     
       public void test() {
         WxMpXmlOutTextMessage m = new WxMpXmlOutTextMessage();
    @@ -12,7 +12,7 @@ public class WxXmlOutTextMessageTest {
         m.setCreateTime(1122l);
         m.setFromUserName("from");
         m.setToUserName("to");
    -    
    +
         String expected = ""
             + ""
             + ""
    @@ -23,7 +23,7 @@ public class WxXmlOutTextMessageTest {
         System.out.println(m.toXml());
         Assert.assertEquals(m.toXml().replaceAll("\\s", ""), expected.replaceAll("\\s", ""));
       }
    -  
    +
       public void testBuild() {
         WxMpXmlOutTextMessage m = WxMpXmlOutMessage.TEXT().content("content").fromUser("from").toUser("to").build();
         String expected = ""
    @@ -38,13 +38,13 @@ public class WxXmlOutTextMessageTest {
             m
             .toXml()
             .replaceAll("\\s", "")
    -        .replaceAll(".*?", ""), 
    +        .replaceAll(".*?", ""),
             expected
             .replaceAll("\\s", "")
             .replaceAll(".*?", "")
             );
    -    
    +
       }
    -  
    +
     
     }
    diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/WxMpXmlOutTransferKefuMessageTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/message/WxMpXmlOutTransferKefuMessageTest.java
    similarity index 98%
    rename from weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/WxMpXmlOutTransferKefuMessageTest.java
    rename to weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/message/WxMpXmlOutTransferKefuMessageTest.java
    index ad167738..222f563f 100644
    --- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/WxMpXmlOutTransferKefuMessageTest.java
    +++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/message/WxMpXmlOutTransferKefuMessageTest.java
    @@ -1,4 +1,4 @@
    -package me.chanjar.weixin.mp.bean;
    +package me.chanjar.weixin.mp.bean.message;
     
     import org.testng.Assert;
     import org.testng.annotations.Test;
    diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/WxXmlOutVideoMessageTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/message/WxMpXmlOutVideoMessageTest.java
    similarity index 92%
    rename from weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/WxXmlOutVideoMessageTest.java
    rename to weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/message/WxMpXmlOutVideoMessageTest.java
    index 19fbe62a..0c53b28a 100644
    --- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/WxXmlOutVideoMessageTest.java
    +++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/message/WxMpXmlOutVideoMessageTest.java
    @@ -1,10 +1,10 @@
    -package me.chanjar.weixin.mp.bean;
    +package me.chanjar.weixin.mp.bean.message;
     
     import org.testng.Assert;
     import org.testng.annotations.Test;
     
     @Test
    -public class WxXmlOutVideoMessageTest {
    +public class WxMpXmlOutVideoMessageTest {
     
       public void test() {
         WxMpXmlOutVideoMessage m = new WxMpXmlOutVideoMessage();
    @@ -14,7 +14,7 @@ public class WxXmlOutVideoMessageTest {
         m.setCreateTime(1122l);
         m.setFromUserName("fromUser");
         m.setToUserName("toUser");
    -    
    +
         String expected = ""
             + ""
             + ""
    @@ -29,7 +29,7 @@ public class WxXmlOutVideoMessageTest {
         System.out.println(m.toXml());
         Assert.assertEquals(m.toXml().replaceAll("\\s", ""), expected.replaceAll("\\s", ""));
       }
    -  
    +
       public void testBuild() {
         WxMpXmlOutVideoMessage m = WxMpXmlOutMessage.VIDEO()
               .mediaId("media_id")
    @@ -54,11 +54,11 @@ public class WxXmlOutVideoMessageTest {
             m
             .toXml()
             .replaceAll("\\s", "")
    -        .replaceAll(".*?", ""), 
    +        .replaceAll(".*?", ""),
             expected
             .replaceAll("\\s", "")
             .replaceAll(".*?", "")
             );
       }
    -  
    +
     }
    diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/WxXmlOutVoiceMessageTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/message/WxMpXmlOutVoiceMessageTest.java
    similarity index 90%
    rename from weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/WxXmlOutVoiceMessageTest.java
    rename to weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/message/WxMpXmlOutVoiceMessageTest.java
    index 0eb848cd..34314390 100644
    --- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/WxXmlOutVoiceMessageTest.java
    +++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/message/WxMpXmlOutVoiceMessageTest.java
    @@ -1,10 +1,10 @@
    -package me.chanjar.weixin.mp.bean;
    +package me.chanjar.weixin.mp.bean.message;
     
     import org.testng.Assert;
     import org.testng.annotations.Test;
     
     @Test
    -public class WxXmlOutVoiceMessageTest {
    +public class WxMpXmlOutVoiceMessageTest {
     
       public void test() {
         WxMpXmlOutVoiceMessage m = new WxMpXmlOutVoiceMessage();
    @@ -12,7 +12,7 @@ public class WxXmlOutVoiceMessageTest {
         m.setCreateTime(1122l);
         m.setFromUserName("from");
         m.setToUserName("to");
    -    
    +
         String expected = ""
             + ""
             + ""
    @@ -23,7 +23,7 @@ public class WxXmlOutVoiceMessageTest {
         System.out.println(m.toXml());
         Assert.assertEquals(m.toXml().replaceAll("\\s", ""), expected.replaceAll("\\s", ""));
       }
    -  
    +
       public void testBuild() {
         WxMpXmlOutVoiceMessage m = WxMpXmlOutMessage.VOICE().mediaId("ddfefesfsdfef").fromUser("from").toUser("to").build();
         String expected = ""
    @@ -38,11 +38,11 @@ public class WxXmlOutVoiceMessageTest {
             m
             .toXml()
             .replaceAll("\\s", "")
    -        .replaceAll(".*?", ""), 
    +        .replaceAll(".*?", ""),
             expected
             .replaceAll("\\s", "")
             .replaceAll(".*?", "")
             );
       }
    -  
    +
     }
    diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/DemoGuessNumberHandler.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/DemoGuessNumberHandler.java
    index 604531b1..69636d0b 100644
    --- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/DemoGuessNumberHandler.java
    +++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/DemoGuessNumberHandler.java
    @@ -11,8 +11,8 @@ import me.chanjar.weixin.mp.api.WxMpMessageHandler;
     import me.chanjar.weixin.mp.api.WxMpMessageMatcher;
     import me.chanjar.weixin.mp.api.WxMpService;
     import me.chanjar.weixin.mp.bean.kefu.WxMpKefuMessage;
    -import me.chanjar.weixin.mp.bean.WxMpXmlMessage;
    -import me.chanjar.weixin.mp.bean.WxMpXmlOutMessage;
    +import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage;
    +import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage;
     
     public class DemoGuessNumberHandler implements WxMpMessageHandler, WxMpMessageMatcher {
     
    diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/DemoImageHandler.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/DemoImageHandler.java
    index cd733210..3d07437b 100644
    --- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/DemoImageHandler.java
    +++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/DemoImageHandler.java
    @@ -6,9 +6,9 @@ import me.chanjar.weixin.common.exception.WxErrorException;
     import me.chanjar.weixin.common.session.WxSessionManager;
     import me.chanjar.weixin.mp.api.WxMpMessageHandler;
     import me.chanjar.weixin.mp.api.WxMpService;
    -import me.chanjar.weixin.mp.bean.WxMpXmlMessage;
    -import me.chanjar.weixin.mp.bean.WxMpXmlOutImageMessage;
    -import me.chanjar.weixin.mp.bean.WxMpXmlOutMessage;
    +import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage;
    +import me.chanjar.weixin.mp.bean.message.WxMpXmlOutImageMessage;
    +import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage;
     
     import java.io.IOException;
     import java.util.Map;
    diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/DemoLogHandler.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/DemoLogHandler.java
    index 5245bc03..8e38b3f7 100644
    --- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/DemoLogHandler.java
    +++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/DemoLogHandler.java
    @@ -3,8 +3,8 @@ package me.chanjar.weixin.mp.demo;
     import me.chanjar.weixin.common.session.WxSessionManager;
     import me.chanjar.weixin.mp.api.WxMpMessageHandler;
     import me.chanjar.weixin.mp.api.WxMpService;
    -import me.chanjar.weixin.mp.bean.WxMpXmlMessage;
    -import me.chanjar.weixin.mp.bean.WxMpXmlOutMessage;
    +import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage;
    +import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage;
     
     import java.util.Map;
     
    diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/DemoOAuth2Handler.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/DemoOAuth2Handler.java
    index 5dc5437d..82046452 100644
    --- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/DemoOAuth2Handler.java
    +++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/DemoOAuth2Handler.java
    @@ -4,8 +4,8 @@ import me.chanjar.weixin.common.api.WxConsts;
     import me.chanjar.weixin.common.session.WxSessionManager;
     import me.chanjar.weixin.mp.api.WxMpMessageHandler;
     import me.chanjar.weixin.mp.api.WxMpService;
    -import me.chanjar.weixin.mp.bean.WxMpXmlMessage;
    -import me.chanjar.weixin.mp.bean.WxMpXmlOutMessage;
    +import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage;
    +import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage;
     
     import java.util.Map;
     
    diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/DemoTextHandler.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/DemoTextHandler.java
    index 9ee15a28..5934eff2 100644
    --- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/DemoTextHandler.java
    +++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/DemoTextHandler.java
    @@ -3,9 +3,9 @@ package me.chanjar.weixin.mp.demo;
     import me.chanjar.weixin.common.session.WxSessionManager;
     import me.chanjar.weixin.mp.api.WxMpMessageHandler;
     import me.chanjar.weixin.mp.api.WxMpService;
    -import me.chanjar.weixin.mp.bean.WxMpXmlMessage;
    -import me.chanjar.weixin.mp.bean.WxMpXmlOutMessage;
    -import me.chanjar.weixin.mp.bean.WxMpXmlOutTextMessage;
    +import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage;
    +import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage;
    +import me.chanjar.weixin.mp.bean.message.WxMpXmlOutTextMessage;
     
     import java.util.Map;
     
    diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/WxMpEndpointServlet.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/WxMpEndpointServlet.java
    index 63052f8b..c560f397 100644
    --- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/WxMpEndpointServlet.java
    +++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/WxMpEndpointServlet.java
    @@ -10,8 +10,8 @@ import me.chanjar.weixin.common.util.StringUtils;
     import me.chanjar.weixin.mp.api.WxMpConfigStorage;
     import me.chanjar.weixin.mp.api.WxMpMessageRouter;
     import me.chanjar.weixin.mp.api.WxMpService;
    -import me.chanjar.weixin.mp.bean.WxMpXmlMessage;
    -import me.chanjar.weixin.mp.bean.WxMpXmlOutMessage;
    +import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage;
    +import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage;
     
     /**
      * @author Daniel Qian
    diff --git a/weixin-java-mp/src/test/resources/testng.xml b/weixin-java-mp/src/test/resources/testng.xml
    index addf7be4..d1499983 100644
    --- a/weixin-java-mp/src/test/resources/testng.xml
    +++ b/weixin-java-mp/src/test/resources/testng.xml
    @@ -18,13 +18,13 @@
     	
     		
     			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    +			
    +			
    +			
    +			
    +			
    +			
    +			
     		
     	
     
    
    From 8cbe2076673a84cdb6252c87fa10a1af04e7b2b8 Mon Sep 17 00:00:00 2001
    From: Binary Wang 
    Date: Wed, 26 Oct 2016 15:33:37 +0800
    Subject: [PATCH 63/83] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E7=B4=A0=E6=9D=90?=
     =?UTF-8?q?=E4=BB=A3=E7=A0=81=E8=B0=83=E6=95=B4=E5=90=8E=E7=9A=84=E4=BB=A3?=
     =?UTF-8?q?=E7=A0=81?=
    MIME-Version: 1.0
    Content-Type: text/plain; charset=UTF-8
    Content-Transfer-Encoding: 8bit
    
    ---
     .../test/java/me/chanjar/weixin/mp/demo/DemoImageHandler.java | 4 +---
     1 file changed, 1 insertion(+), 3 deletions(-)
    
    diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/DemoImageHandler.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/DemoImageHandler.java
    index 3d07437b..82163a18 100644
    --- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/DemoImageHandler.java
    +++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/DemoImageHandler.java
    @@ -10,7 +10,6 @@ import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage;
     import me.chanjar.weixin.mp.bean.message.WxMpXmlOutImageMessage;
     import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage;
     
    -import java.io.IOException;
     import java.util.Map;
     
     public class DemoImageHandler implements WxMpMessageHandler {
    @@ -30,9 +29,8 @@ public class DemoImageHandler implements WxMpMessageHandler {
           return m;
         } catch (WxErrorException e) {
           e.printStackTrace();
    -    } catch (IOException e) {
    -      e.printStackTrace();
         }
    +    
         return null;
       }
     }
    
    From e89d009ae0b33a640aaefbb57320b52dec9a80bd Mon Sep 17 00:00:00 2001
    From: Binary Wang 
    Date: Thu, 27 Oct 2016 11:46:59 +0800
    Subject: [PATCH 64/83] =?UTF-8?q?=E7=A7=BB=E9=99=A4jodd=20#58?=
    MIME-Version: 1.0
    Content-Type: text/plain; charset=UTF-8
    Content-Transfer-Encoding: 8bit
    
    ---
     build.gradle                                  |  1 -
     pom.xml                                       |  6 --
     .../util/http/JoddGetRequestExecutor.java     | 55 -------------------
     .../util/http/JoddPostRequestExecutor.java    | 49 -----------------
     .../weixin/mp/demo/DemoImageHandler.java      |  2 +-
     5 files changed, 1 insertion(+), 112 deletions(-)
     delete mode 100644 weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/JoddGetRequestExecutor.java
     delete mode 100644 weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/JoddPostRequestExecutor.java
    
    diff --git a/build.gradle b/build.gradle
    index defc5a25..f89cf196 100644
    --- a/build.gradle
    +++ b/build.gradle
    @@ -21,7 +21,6 @@ subprojects {
       dependencies {
         compile group: 'org.slf4j', name: 'slf4j-api', version:'1.7.10'
         compile group: 'org.apache.httpcomponents', name: 'httpmime', version:'4.5'
    -    compile group: 'org.jodd', name: 'jodd-http', version:'3.6.7'
         compile group: 'com.google.code.gson', name: 'gson', version:'2.7'
         compile group: 'com.google.guava', name: 'guava', version:'19.0'
         compile group: 'commons-codec', name: 'commons-codec', version:'1.10'
    diff --git a/pom.xml b/pom.xml
    index 9a7464af..22c6efe6 100644
    --- a/pom.xml
    +++ b/pom.xml
    @@ -76,7 +76,6 @@
         4.5
         1.7.10
         1.1.2
    -    3.6.7
         2.9.0
         2.7
         19.0
    @@ -104,11 +103,6 @@
           httpmime
           ${httpclient.version}
         
    -    
    -      org.jodd
    -      jodd-http
    -      ${jodd-http.version}
    -    
         
           com.google.code.gson
           gson
    diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/JoddGetRequestExecutor.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/JoddGetRequestExecutor.java
    deleted file mode 100644
    index 34f20779..00000000
    --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/JoddGetRequestExecutor.java
    +++ /dev/null
    @@ -1,55 +0,0 @@
    -package me.chanjar.weixin.common.util.http;
    -
    -import org.apache.http.HttpHost;
    -import org.apache.http.impl.client.CloseableHttpClient;
    -
    -import jodd.http.HttpRequest;
    -import jodd.http.HttpResponse;
    -import jodd.http.ProxyInfo;
    -import jodd.http.net.SocketHttpConnectionProvider;
    -import me.chanjar.weixin.common.bean.result.WxError;
    -import me.chanjar.weixin.common.exception.WxErrorException;
    -
    -/**
    - * 简单的GET请求执行器,请求的参数是String, 返回的结果也是String
    - *
    - * @author Daniel Qian
    - */
    -public class JoddGetRequestExecutor implements RequestExecutor {
    -
    -  @Override
    -  public String execute(CloseableHttpClient httpclient, HttpHost httpProxy, String uri,
    -      String queryParam) throws WxErrorException {
    -    if (queryParam != null) {
    -      if (uri.indexOf('?') == -1) {
    -        uri += '?';
    -      }
    -      uri += uri.endsWith("?") ? queryParam : '&' + queryParam;
    -    }
    -
    -    SocketHttpConnectionProvider provider = new SocketHttpConnectionProvider();
    -
    -    if (httpProxy != null) {
    -      ProxyInfo proxyInfoObj = new ProxyInfo(
    -              ProxyInfo.ProxyType.HTTP,
    -              httpProxy.getHostName(),
    -              httpProxy.getPort(), "", "");
    -      provider.useProxy(proxyInfoObj);
    -    }
    -
    -    HttpRequest request = HttpRequest.get(uri);
    -    request.method("GET");
    -    request.charset("UTF-8");
    -
    -    HttpResponse response = request.open(provider).send();
    -    response.charset("UTF-8");
    -    String result = response.bodyText();
    -
    -    WxError error = WxError.fromJson(result);
    -    if (error.getErrorCode() != 0) {
    -      throw new WxErrorException(error);
    -    }
    -    return result;
    -  }
    -
    -}
    diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/JoddPostRequestExecutor.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/JoddPostRequestExecutor.java
    deleted file mode 100644
    index 757db665..00000000
    --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/JoddPostRequestExecutor.java
    +++ /dev/null
    @@ -1,49 +0,0 @@
    -package me.chanjar.weixin.common.util.http;
    -
    -import org.apache.http.HttpHost;
    -import org.apache.http.impl.client.CloseableHttpClient;
    -
    -import jodd.http.HttpRequest;
    -import jodd.http.HttpResponse;
    -import jodd.http.ProxyInfo;
    -import jodd.http.net.SocketHttpConnectionProvider;
    -import me.chanjar.weixin.common.bean.result.WxError;
    -import me.chanjar.weixin.common.exception.WxErrorException;
    -
    -/**
    - * 简单的POST请求执行器,请求的参数是String, 返回的结果也是String
    - *
    - * @author Edison Guo
    - */
    -public class JoddPostRequestExecutor implements RequestExecutor {
    -
    -  @Override
    -  public String execute(CloseableHttpClient httpclient, HttpHost httpProxy, String uri,
    -      String postEntity) throws WxErrorException {
    -    SocketHttpConnectionProvider provider = new SocketHttpConnectionProvider();
    -
    -    if (httpProxy != null) {
    -      ProxyInfo proxyInfoObj = new ProxyInfo(
    -              ProxyInfo.ProxyType.HTTP,
    -              httpProxy.getAddress().getHostAddress(),
    -              httpProxy.getPort(), "", "");
    -      provider.useProxy(proxyInfoObj);
    -    }
    -
    -    HttpRequest request = HttpRequest.get(uri);
    -    request.method("POST");
    -    request.charset("UTF-8");
    -    request.bodyText(postEntity);
    -
    -    HttpResponse response = request.open(provider).send();
    -    response.charset("UTF-8");
    -    String result = response.bodyText();
    -
    -    WxError error = WxError.fromJson(result);
    -    if (error.getErrorCode() != 0) {
    -      throw new WxErrorException(error);
    -    }
    -    return result;
    -  }
    -
    -}
    diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/DemoImageHandler.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/DemoImageHandler.java
    index 82163a18..145a0130 100644
    --- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/DemoImageHandler.java
    +++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/DemoImageHandler.java
    @@ -30,7 +30,7 @@ public class DemoImageHandler implements WxMpMessageHandler {
         } catch (WxErrorException e) {
           e.printStackTrace();
         }
    -    
    +
         return null;
       }
     }
    
    From ed17c2aa3961099383b620103e860706bb527536 Mon Sep 17 00:00:00 2001
    From: Binary Wang 
    Date: Thu, 27 Oct 2016 11:56:46 +0800
    Subject: [PATCH 65/83] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=A0=B9=E6=8D=AEopeni?=
     =?UTF-8?q?d=E8=8E=B7=E5=8F=96=E7=94=A8=E6=88=B7=E4=BF=A1=E6=81=AF?=
     =?UTF-8?q?=E7=9A=84=E9=87=8D=E8=BD=BD=E6=96=B9=E6=B3=95=EF=BC=8C=E4=B8=8D?=
     =?UTF-8?q?=E6=8C=87=E5=AE=9A=E8=AF=AD=E8=A8=80=EF=BC=8C=E9=BB=98=E8=AE=A4?=
     =?UTF-8?q?=E4=BD=BF=E7=94=A8zh=5FCN?=
    MIME-Version: 1.0
    Content-Type: text/plain; charset=UTF-8
    Content-Transfer-Encoding: 8bit
    
    ---
     .../chanjar/weixin/mp/api/WxMpUserService.java | 18 +++++++++++++++---
     .../mp/api/impl/WxMpUserServiceImpl.java       | 10 +++++++---
     2 files changed, 22 insertions(+), 6 deletions(-)
    
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpUserService.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpUserService.java
    index f46ca634..f45fea1d 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpUserService.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpUserService.java
    @@ -1,12 +1,12 @@
     package me.chanjar.weixin.mp.api;
     
    -import java.util.List;
    -
     import me.chanjar.weixin.common.exception.WxErrorException;
     import me.chanjar.weixin.mp.bean.WxMpUserQuery;
     import me.chanjar.weixin.mp.bean.result.WxMpUser;
     import me.chanjar.weixin.mp.bean.result.WxMpUserList;
     
    +import java.util.List;
    +
     /**
      * 用户管理相关操作接口
      *
    @@ -25,10 +25,22 @@ public interface WxMpUserService {
        */
       void userUpdateRemark(String openid, String remark) throws WxErrorException;
     
    +  /**
    +   * 
    +   * 获取用户基本信息(语言为默认的zh_CN 简体)
    +   * 详情请见: http://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140839&token=&lang=zh_CN
    +   * http请求方式: GET https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN
    +   * 
    + * + * @param openid 用户openid + */ + WxMpUser userInfo(String openid) throws WxErrorException; + /** *
        * 获取用户基本信息
    -   * 详情请见: http://mp.weixin.qq.com/wiki/index.php?title=获取用户基本信息
    +   * 详情请见: http://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140839&token=&lang=zh_CN
    +   * http请求方式: GET https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN
        * 
    * * @param openid 用户openid diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpUserServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpUserServiceImpl.java index 9267407c..c796cbd3 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpUserServiceImpl.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpUserServiceImpl.java @@ -1,9 +1,6 @@ package me.chanjar.weixin.mp.api.impl; -import java.util.List; - import com.google.gson.JsonObject; - import me.chanjar.weixin.common.exception.WxErrorException; import me.chanjar.weixin.mp.api.WxMpService; import me.chanjar.weixin.mp.api.WxMpUserService; @@ -11,6 +8,8 @@ import me.chanjar.weixin.mp.bean.WxMpUserQuery; import me.chanjar.weixin.mp.bean.result.WxMpUser; import me.chanjar.weixin.mp.bean.result.WxMpUserList; +import java.util.List; + /** * Created by Binary Wang on 2016/7/21. */ @@ -31,6 +30,11 @@ public class WxMpUserServiceImpl implements WxMpUserService { this.wxMpService.post(url, json.toString()); } + @Override + public WxMpUser userInfo(String openid) throws WxErrorException { + return this.userInfo(openid, null); + } + @Override public WxMpUser userInfo(String openid, String lang) throws WxErrorException { String url = API_URL_PREFIX + "/info"; From d30ac7427bf1f43ad8c19afca3a7d4c0a6cac969 Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Thu, 27 Oct 2016 13:40:59 +0800 Subject: [PATCH 66/83] =?UTF-8?q?=E7=A7=BB=E9=99=A4jodd-http=20for=20osgi?= =?UTF-8?q?=20#58?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- weixin-java-osgi/pom.xml | 5 ----- 1 file changed, 5 deletions(-) diff --git a/weixin-java-osgi/pom.xml b/weixin-java-osgi/pom.xml index 381ec5f9..0405d85b 100644 --- a/weixin-java-osgi/pom.xml +++ b/weixin-java-osgi/pom.xml @@ -15,11 +15,6 @@ 微信公众号Java SDK OSGI - - org.jodd - jodd-bean - ${jodd-http.version} - org.apache.servicemix.bundles org.apache.servicemix.bundles.xmlpull From a210b859320fab67468c5694e2f4ee00fa5eefde Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Thu, 27 Oct 2016 15:29:53 +0800 Subject: [PATCH 67/83] =?UTF-8?q?=E5=BE=AE=E4=BF=A1=E6=B6=88=E6=81=AF?= =?UTF-8?q?=E9=87=8C=E5=A2=9E=E5=8A=A0=E7=BC=BA=E5=B0=91=E7=9A=84MenuId?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../weixin/mp/bean/message/WxMpXmlMessage.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/message/WxMpXmlMessage.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/message/WxMpXmlMessage.java index baca6698..856233fa 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/message/WxMpXmlMessage.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/message/WxMpXmlMessage.java @@ -54,6 +54,9 @@ public class WxMpXmlMessage implements Serializable { @XStreamConverter(value = XStreamCDataConverter.class) private String content; + @XStreamAlias("MenuId") + private Long menuId; + @XStreamAlias("MsgId") private Long msgId; @@ -685,6 +688,14 @@ public class WxMpXmlMessage implements Serializable { this.sendLocationInfo = sendLocationInfo; } + public Long getMenuId() { + return this.menuId; + } + + public void setMenuId(Long menuId) { + this.menuId = menuId; + } + public String getKfAccount() { return this.kfAccount; } From aa35c7487befa1ce66176d88757a95ff5e7634d7 Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Thu, 27 Oct 2016 15:57:54 +0800 Subject: [PATCH 68/83] =?UTF-8?q?=E8=B0=83=E6=95=B4=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E4=BD=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../me/chanjar/weixin/mp/api/WxMpService.java | 24 +++++++++++-------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpService.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpService.java index e77b60d9..01ec5b13 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpService.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpService.java @@ -113,6 +113,20 @@ public interface WxMpService { */ WxMpMassSendResult massOpenIdsMessageSend(WxMpMassOpenIdsMessage message) throws WxErrorException; + /** + *
    +   * 群发消息预览接口
    +   * 开发者可通过该接口发送消息给指定用户,在手机端查看消息的样式和排版。为了满足第三方平台开发者的需求,在保留对openID预览能力的同时,增加了对指定微信号发送预览的能力,但该能力每日调用次数有限制(100次),请勿滥用。
    +   * 接口调用请求说明
    +   *  http请求方式: POST
    +   *  https://api.weixin.qq.com/cgi-bin/message/mass/preview?access_token=ACCESS_TOKEN
    +   * 详情请见:http://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140549&token=&lang=zh_CN
    +   * 
    + * + * @return wxMpMassSendResult + */ + WxMpMassSendResult massMessagePreview(WxMpMassPreviewMessage wxMpMassPreviewMessage) throws Exception; + /** *
        * 长链接转短链接接口
    @@ -235,16 +249,6 @@ public interface WxMpService {
        */
       void setMaxRetryTimes(int maxRetryTimes);
     
    -  /**
    -   * 
    -   * 预览接口
    -   * 详情请见:http://mp.weixin.qq.com/wiki/15/40b6865b893947b764e2de8e4a1fb55f.html#.E9.A2.84.E8.A7.88.E6.8E.A5.E5.8F.A3.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
    -   * 
    - * - * @return wxMpMassSendResult - */ - WxMpMassSendResult massMessagePreview(WxMpMassPreviewMessage wxMpMassPreviewMessage) throws Exception; - /** * 获取WxMpConfigStorage 对象 * From ffa8ccdf39205ff2dca438ac1092e385cd2cc706 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Binary=EF=BC=88=E7=8F=AD=E7=BA=B3=E7=9D=BF=EF=BC=89?= Date: Thu, 27 Oct 2016 18:09:35 +0800 Subject: [PATCH 69/83] Update README.md --- README.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 96b2bcd8..ba790a61 100644 --- a/README.md +++ b/README.md @@ -11,12 +11,13 @@ =========== ## 开发交流方式及注意事项: -1. QQ群:343954419(因群人数限制即将爆满,故开启付费加群方式并不定期清理不活跃人群,感谢理解) [![Join QQ Group](http://pub.idqqimg.com/wpa/images/group.png)](http://jq.qq.com/?_wv=1027&k=40lRskK) +1. QQ群:343954419 [![Join QQ Group](http://pub.idqqimg.com/wpa/images/group.png)](http://jq.qq.com/?_wv=1027&k=40lRskK) 1. 微信群: 因微信群已达到100人限制,故如有想加入微信群的,请入QQ群后联系管理员,提供微信号以便邀请加入; 1. 新手提问前,请先阅读此文章:http://t.cn/RV93MRB 1. 寻求帮助时需贴代码或大长串异常信息的,请利用http://paste.ubuntu.com 1. 有功能需求或由于微信官方接口调整导致的代码问题,可以直接提出issue,便于讨论追踪问题; 1. 详细开发文档请看 [Wiki](https://github.com/wechat-group/weixin-java-tools/wiki),部分文档可能未能及时更新,如有发现,可以及时上报或者自行修改。 +1. 微信公众号官方文档入口地址:http://mp.weixin.qq.com/wiki, (注意,从网上搜到的文档有的虽然地址前面跟这个一样,但明显左侧菜单不一致,是旧的文档,注意不要看错了文档)。 =========== @@ -68,8 +69,9 @@ compile 'com.github.binarywang:weixin-java-cp:2.2.0' * https://git.coding.net/binarywang/weixin-java-tools.git =========== -## 目前可参考的Demo项目有两个(目前都是公众号的,风格不同,欢迎提供更多的demo供新手参考): +## 目前可参考的Demo项目有三个(目前都是公众号的,风格不同,欢迎提供更多的demo供新手参考): 1. https://github.com/wechat-group/weixin-mp-demo +1. https://github.com/wechat-group/weixin-mp-demo-springboot 1. https://github.com/wechat-group/weixin-java-tools-springmvc =========== From b9ea8dc43b9a243f89d1ccdab0bc17a231f53247 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Binary=EF=BC=88=E7=8F=AD=E7=BA=B3=E7=9D=BF=EF=BC=89?= Date: Thu, 27 Oct 2016 18:10:59 +0800 Subject: [PATCH 70/83] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ba790a61..223ce24c 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ 1. 寻求帮助时需贴代码或大长串异常信息的,请利用http://paste.ubuntu.com 1. 有功能需求或由于微信官方接口调整导致的代码问题,可以直接提出issue,便于讨论追踪问题; 1. 详细开发文档请看 [Wiki](https://github.com/wechat-group/weixin-java-tools/wiki),部分文档可能未能及时更新,如有发现,可以及时上报或者自行修改。 -1. 微信公众号官方文档入口地址:http://mp.weixin.qq.com/wiki, (注意,从网上搜到的文档有的虽然地址前面跟这个一样,但明显左侧菜单不一致,是旧的文档,注意不要看错了文档)。 +1. 微信公众号官方文档入口地址:http://mp.weixin.qq.com/wiki (注意,从网上搜到的文档有的虽然地址前面跟这个一样,但明显左侧菜单不一致,是旧的文档,注意不要看错了文档)。 =========== From ecba1ecf90caf59c773c5e20244ce52a7b3f6bf6 Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Thu, 27 Oct 2016 18:24:08 +0800 Subject: [PATCH 71/83] =?UTF-8?q?=E4=BF=AE=E6=AD=A3UserService=E7=9A=84jav?= =?UTF-8?q?adoc?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../weixin/mp/api/WxMpUserService.java | 29 ++++++++++++++----- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpUserService.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpUserService.java index f45fea1d..96499128 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpUserService.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpUserService.java @@ -16,8 +16,10 @@ public interface WxMpUserService { /** *
    -   * 设置用户备注名接口
    -   * 详情请见: http://mp.weixin.qq.com/wiki/index.php?title=设置用户备注名接口
    +   * 设置用户备注名
    +   * 详情请见: http://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140838&token=&lang=zh_CN
    +   * http请求方式: POST(请使用https协议)
    +   * 接口地址:https://api.weixin.qq.com/cgi-bin/user/info/updateremark?access_token=ACCESS_TOKEN
        * 
    * * @param openid 用户openid @@ -29,7 +31,8 @@ public interface WxMpUserService { *
        * 获取用户基本信息(语言为默认的zh_CN 简体)
        * 详情请见: http://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140839&token=&lang=zh_CN
    -   * http请求方式: GET https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN
    +   * http请求方式: GET
    +   * 接口地址:https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN
        * 
    * * @param openid 用户openid @@ -40,7 +43,8 @@ public interface WxMpUserService { *
        * 获取用户基本信息
        * 详情请见: http://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140839&token=&lang=zh_CN
    -   * http请求方式: GET https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN
    +   * http请求方式: GET
    +   * 接口地址:https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN
        * 
    * * @param openid 用户openid @@ -51,7 +55,10 @@ public interface WxMpUserService { /** *
        * 获取用户基本信息列表
    -   * 详情请见: http://mp.weixin.qq.com/wiki/index.php?title=批量获取用户基本信息
    +   * 开发者可通过该接口来批量获取用户基本信息。最多支持一次拉取100条。
    +   * 详情请见: http://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140839&token=&lang=zh_CN
    +   * http请求方式: POST
    +   * 接口地址:https://api.weixin.qq.com/cgi-bin/user/info/batchget?access_token=ACCESS_TOKEN
        * 
    * * @param openids 用户openid列表 @@ -61,7 +68,10 @@ public interface WxMpUserService { /** *
        * 获取用户基本信息列表
    -   * 详情请见: http://mp.weixin.qq.com/wiki/index.php?title=批量获取用户基本信息
    +   * 开发者可通过该接口来批量获取用户基本信息。最多支持一次拉取100条。
    +   * 详情请见: http://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140839&token=&lang=zh_CN
    +   * http请求方式: POST
    +   * 接口地址:https://api.weixin.qq.com/cgi-bin/user/info/batchget?access_token=ACCESS_TOKEN
        * 
    * * @param userQuery 详细查询参数 @@ -70,8 +80,11 @@ public interface WxMpUserService { /** *
    -   * 获取关注者列表
    -   * 详情请见: http://mp.weixin.qq.com/wiki/index.php?title=获取关注者列表
    +   * 获取用户列表
    +   * 公众号可通过本接口来获取帐号的关注者列表,关注者列表由一串OpenID(加密后的微信号,每个用户对每个公众号的OpenID是唯一的)组成。一次拉取调用最多拉取10000个关注者的OpenID,可以通过多次拉取的方式来满足需求。
    +   * 详情请见: http://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140840&token=&lang=zh_CN
    +   * http请求方式: GET(请使用https协议)
    +   * 接口地址:https://api.weixin.qq.com/cgi-bin/user/get?access_token=ACCESS_TOKEN&next_openid=NEXT_OPENID
        * 
    * * @param nextOpenid 可选,第一个拉取的OPENID,null为从头开始拉取 From 4959966222edfff188e4b512bcb42a3f8a60b17f Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Thu, 27 Oct 2016 18:42:41 +0800 Subject: [PATCH 72/83] =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E5=BE=AE=E4=BF=A1?= =?UTF-8?q?=E6=94=AF=E4=BB=98=E5=85=B3=E9=97=AD=E8=AE=A2=E5=8D=95=E7=9A=84?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=20#54?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../chanjar/weixin/mp/api/WxMpPayService.java | 17 +++++++++ .../mp/api/impl/WxMpPayServiceImpl.java | 34 ++++++++++++++++++ .../pay/request/WxPayOrderCloseRequest.java | 36 +++++++++++++++++++ .../pay/result/WxPayOrderCloseResult.java | 28 +++++++++++++++ .../mp/api/impl/WxMpPayServiceImplTest.java | 9 +++++ 5 files changed, 124 insertions(+) create mode 100644 weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/request/WxPayOrderCloseRequest.java create mode 100644 weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/result/WxPayOrderCloseResult.java diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpPayService.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpPayService.java index 8d624e95..2fcd4cb9 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpPayService.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpPayService.java @@ -2,6 +2,7 @@ package me.chanjar.weixin.mp.api; import me.chanjar.weixin.common.exception.WxErrorException; import me.chanjar.weixin.mp.bean.pay.WxPayJsSDKCallback; +import me.chanjar.weixin.mp.bean.pay.result.WxPayOrderCloseResult; import me.chanjar.weixin.mp.bean.pay.request.WxEntPayRequest; import me.chanjar.weixin.mp.bean.pay.request.WxPayRefundRequest; import me.chanjar.weixin.mp.bean.pay.request.WxPaySendRedpackRequest; @@ -35,6 +36,22 @@ public interface WxMpPayService { */ WxPayOrderQueryResult queryOrder(String transactionId, String outTradeNo) throws WxErrorException; + /** + *
    +   * 关闭订单
    +   * 应用场景
    +   * 以下情况需要调用关单接口:
    +   * 1. 商户订单支付失败需要生成新单号重新发起支付,要对原订单号调用关单,避免重复支付;
    +   * 2. 系统下单后,用户支付超时,系统退出不再受理,避免用户继续,请调用关单接口。
    +   * 注意:订单生成后不能马上调用关单接口,最短调用时间间隔为5分钟。
    +   * 接口地址:https://api.mch.weixin.qq.com/pay/closeorder
    +   * 是否需要证书:   不需要。
    +   * 
    + * @param outTradeNo 商户系统内部的订单号,当没提供transaction_id时需要传这个。 + * @throws WxErrorException + */ + WxPayOrderCloseResult closeOrder(String outTradeNo) throws WxErrorException; + /** * 统一下单(详见http://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1) * 在发起微信支付前,需要调用统一下单接口,获取"预支付交易会话标识" diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImpl.java index 2fc8e798..79acad73 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImpl.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImpl.java @@ -8,6 +8,7 @@ import me.chanjar.weixin.common.util.xml.XStreamInitializer; import me.chanjar.weixin.mp.api.WxMpPayService; import me.chanjar.weixin.mp.api.WxMpService; import me.chanjar.weixin.mp.bean.pay.WxPayJsSDKCallback; +import me.chanjar.weixin.mp.bean.pay.result.WxPayOrderCloseResult; import me.chanjar.weixin.mp.bean.pay.request.*; import me.chanjar.weixin.mp.bean.pay.result.*; import org.apache.commons.codec.digest.DigestUtils; @@ -210,6 +211,39 @@ public class WxMpPayServiceImpl implements WxMpPayService { return result; } + @Override + public WxPayOrderCloseResult closeOrder(String outTradeNo) throws WxErrorException { + if (StringUtils.isBlank(outTradeNo)) { + throw new IllegalArgumentException("out_trade_no 不能为空"); + } + + XStream xstream = XStreamInitializer.getInstance(); + xstream.processAnnotations(WxPayOrderCloseRequest.class); + xstream.processAnnotations(WxPayOrderCloseResult.class); + + WxPayOrderCloseRequest request = new WxPayOrderCloseRequest(); + request.setOutTradeNo(StringUtils.trimToNull(outTradeNo)); + request.setAppid(this.wxMpService.getWxMpConfigStorage().getAppId()); + request.setMchId(this.wxMpService.getWxMpConfigStorage().getPartnerId()); + request.setNonceStr(System.currentTimeMillis() + ""); + + String sign = this.createSign(BeanUtils.xmlBean2Map(request), + this.wxMpService.getWxMpConfigStorage().getPartnerKey()); + request.setSign(sign); + + String url = PAY_BASE_URL + "/pay/closeorder"; + + String responseContent = this.wxMpService.post(url, xstream.toXML(request)); + WxPayOrderCloseResult result = (WxPayOrderCloseResult) xstream.fromXML(responseContent); + if ("FAIL".equals(result.getResultCode())) { + throw new WxErrorException(WxError.newBuilder() + .setErrorMsg(result.getErrCode() + ":" + result.getErrCodeDes()) + .build()); + } + + return result; + } + @Override public WxPayUnifiedOrderResult unifiedOrder(WxPayUnifiedOrderRequest request) throws WxErrorException { diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/request/WxPayOrderCloseRequest.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/request/WxPayOrderCloseRequest.java new file mode 100644 index 00000000..8f26750f --- /dev/null +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/request/WxPayOrderCloseRequest.java @@ -0,0 +1,36 @@ +package me.chanjar.weixin.mp.bean.pay.request; + +import com.thoughtworks.xstream.annotations.XStreamAlias; + +/** + *
    + *  关闭订单请求对象类
    + * Created by Binary Wang on 2016-10-27.
    + * @author binarywang(Binary Wang)
    + * 
    + */ +@XStreamAlias("xml") +public class WxPayOrderCloseRequest extends WxPayBaseRequest{ + + /** + *
    +   * 商户订单号
    +   * out_trade_no
    +   * 二选一
    +   * String(32)
    +   * 20150806125346
    +   * 商户系统内部的订单号,当没提供transaction_id时需要传这个。
    +   * 
    + */ + @XStreamAlias("out_trade_no") + private String outTradeNo; + + public String getOutTradeNo() { + return this.outTradeNo; + } + + public void setOutTradeNo(String outTradeNo) { + this.outTradeNo = outTradeNo; + } + +} diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/result/WxPayOrderCloseResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/result/WxPayOrderCloseResult.java new file mode 100644 index 00000000..ccfa07bf --- /dev/null +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/result/WxPayOrderCloseResult.java @@ -0,0 +1,28 @@ +package me.chanjar.weixin.mp.bean.pay.result; + +import com.thoughtworks.xstream.annotations.XStreamAlias; + +/** + *
    + * 关闭订单结果对象类
    + * Created by Binary Wang on 2016-10-27.
    + * @author binarywang(Binary Wang)
    + * 
    + */ +@XStreamAlias("xml") +public class WxPayOrderCloseResult extends WxPayBaseResult { + + /** + * 业务结果描述 + */ + @XStreamAlias("result_msg") + private String resultMsg; + + public String getResultMsg() { + return this.resultMsg; + } + + public void setResultMsg(String resultMsg) { + this.resultMsg = resultMsg; + } +} diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImplTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImplTest.java index 0f946dc3..e2febcdb 100644 --- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImplTest.java +++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImplTest.java @@ -87,6 +87,15 @@ public class WxMpPayServiceImplTest { System.err.println(this.wxService.getPayService().queryOrder(null, "11111")); } + /** + * Test method for {@link me.chanjar.weixin.mp.api.impl.WxMpPayServiceImpl#closeOrder(String)} . + * @throws WxErrorException + */ + @Test + public final void testCloseOrder() throws WxErrorException { + System.err.println(this.wxService.getPayService().closeOrder("11212121")); + } + /** * Test method for {@link me.chanjar.weixin.mp.api.impl.WxMpPayServiceImpl#entPay(WxEntPayRequest, File)}. * @throws WxErrorException From b84a2ec7772f2aac28a19f7e535ae1132f5ac6cb Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Thu, 27 Oct 2016 19:40:07 +0800 Subject: [PATCH 73/83] =?UTF-8?q?=E5=BC=95=E5=85=A5=E8=87=AA=E5=AE=9A?= =?UTF-8?q?=E4=B9=89ToString=E5=B7=A5=E5=85=B7=E7=B1=BB=E5=92=8C=E6=96=B9?= =?UTF-8?q?=E6=B3=95=EF=BC=8C=E4=BE=BF=E4=BA=8E=E6=9F=A5=E7=9C=8B=E9=83=A8?= =?UTF-8?q?=E5=88=86bean=E5=AF=B9=E8=B1=A1=E5=80=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/bean/WxCardApiSignature.java | 7 +- .../weixin/common/bean/menu/WxMenuButton.java | 12 +-- .../weixin/common/bean/menu/WxMenuRule.java | 7 +- .../weixin/common/util/StringUtils.java | 98 ------------------- .../weixin/common/util/ToStringUtils.java | 61 ++++++++++++ .../http/DefaultApacheHttpClientBuilder.java | 2 +- .../http/MediaDownloadRequestExecutor.java | 2 +- .../weixin/common/util/http/URIUtil.java | 3 +- .../cp/api/WxCpInMemoryConfigStorage.java | 10 +- .../mp/api/WxMpInMemoryConfigStorage.java | 13 +-- .../me/chanjar/weixin/mp/bean/WxMpCard.java | 10 +- .../chanjar/weixin/mp/bean/WxMpMassNews.java | 9 +- .../mp/bean/WxMpMassPreviewMessage.java | 3 - .../datacube/WxDataCubeArticleResult.java | 9 +- .../bean/datacube/WxDataCubeBaseResult.java | 5 +- .../bean/datacube/WxDataCubeUserCumulate.java | 15 ++- .../bean/datacube/WxDataCubeUserSummary.java | 15 ++- .../kefu/request/WxMpKfSessionRequest.java | 15 ++- .../mp/bean/kefu/result/WxMpKfInfo.java | 10 +- .../mp/bean/kefu/result/WxMpKfList.java | 17 ++-- .../mp/bean/kefu/result/WxMpKfMsgList.java | 5 +- .../mp/bean/kefu/result/WxMpKfMsgRecord.java | 7 +- .../mp/bean/kefu/result/WxMpKfOnlineList.java | 15 ++- .../mp/bean/kefu/result/WxMpKfSession.java | 10 +- .../kefu/result/WxMpKfSessionGetResult.java | 13 +-- .../bean/kefu/result/WxMpKfSessionList.java | 13 +-- .../result/WxMpKfSessionWaitCaseList.java | 13 +-- .../material/WxMpMaterialCountResult.java | 5 +- .../WxMpMaterialFileBatchGetResult.java | 7 +- .../mp/bean/material/WxMpMaterialNews.java | 7 +- .../WxMpMaterialNewsBatchGetResult.java | 7 +- .../mp/bean/message/WxMpXmlMessage.java | 14 ++- .../mp/bean/pay/WxPayJsSDKCallback.java | 18 +--- .../pay/request/WxEntPayQueryRequest.java | 7 +- .../mp/bean/pay/request/WxEntPayRequest.java | 6 +- .../mp/bean/pay/request/WxPayBaseRequest.java | 6 +- .../mp/bean/pay/result/WxPayBaseResult.java | 6 +- .../weixin/mp/bean/result/WxMpCardResult.java | 7 +- .../weixin/mp/bean/result/WxMpUser.java | 15 ++- .../mp/bean/store/WxMpStoreBaseInfo.java | 5 +- .../weixin/mp/bean/store/WxMpStoreInfo.java | 6 +- .../mp/bean/store/WxMpStoreListResult.java | 11 +-- .../weixin/mp/bean/tag/WxTagListUser.java | 13 +-- .../chanjar/weixin/mp/bean/tag/WxUserTag.java | 11 +-- .../weixin/mp/bean/template/WxMpTemplate.java | 13 +-- .../bean/template/WxMpTemplateIndustry.java | 7 +- .../TransferCustomerServiceBuilder.java | 2 +- .../weixin/mp/api/WxMpBaseAPITest.java | 2 +- .../weixin/mp/demo/WxMpEndpointServlet.java | 13 ++- 49 files changed, 228 insertions(+), 359 deletions(-) delete mode 100644 weixin-java-common/src/main/java/me/chanjar/weixin/common/util/StringUtils.java create mode 100644 weixin-java-common/src/main/java/me/chanjar/weixin/common/util/ToStringUtils.java diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/WxCardApiSignature.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/WxCardApiSignature.java index f50b72f2..df272318 100644 --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/WxCardApiSignature.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/WxCardApiSignature.java @@ -1,9 +1,8 @@ package me.chanjar.weixin.common.bean; -import java.io.Serializable; +import me.chanjar.weixin.common.util.ToStringUtils; -import org.apache.commons.lang3.builder.ToStringBuilder; -import org.apache.commons.lang3.builder.ToStringStyle; +import java.io.Serializable; /** * 卡券Api签名 @@ -35,7 +34,7 @@ public class WxCardApiSignature implements Serializable { @Override public String toString() { - return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE); + return ToStringUtils.toSimpleString(this); } public String getAppId() { diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/menu/WxMenuButton.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/menu/WxMenuButton.java index 1fe8bb90..02efac31 100644 --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/menu/WxMenuButton.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/menu/WxMenuButton.java @@ -1,11 +1,10 @@ package me.chanjar.weixin.common.bean.menu; +import me.chanjar.weixin.common.util.ToStringUtils; + import java.util.ArrayList; import java.util.List; -import org.apache.commons.lang3.builder.ToStringBuilder; -import org.apache.commons.lang3.builder.ToStringStyle; - public class WxMenuButton { private String type; @@ -18,10 +17,9 @@ public class WxMenuButton { @Override public String toString() { - return ToStringBuilder.reflectionToString(this, - ToStringStyle.MULTI_LINE_STYLE); + return ToStringUtils.toSimpleString(this); } - + public String getType() { return this.type; } @@ -69,4 +67,4 @@ public class WxMenuButton { public void setMediaId(String mediaId) { this.mediaId = mediaId; } -} \ No newline at end of file +} diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/menu/WxMenuRule.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/menu/WxMenuRule.java index ca6fdd24..714466f2 100644 --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/menu/WxMenuRule.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/menu/WxMenuRule.java @@ -1,7 +1,6 @@ package me.chanjar.weixin.common.bean.menu; -import org.apache.commons.lang3.builder.ToStringBuilder; -import org.apache.commons.lang3.builder.ToStringStyle; +import me.chanjar.weixin.common.util.ToStringUtils; public class WxMenuRule { private String tagId; @@ -70,6 +69,6 @@ public class WxMenuRule { @Override public String toString() { - return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE); + return ToStringUtils.toSimpleString(this); } -} \ No newline at end of file +} diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/StringUtils.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/StringUtils.java deleted file mode 100644 index 49acaeea..00000000 --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/StringUtils.java +++ /dev/null @@ -1,98 +0,0 @@ -package me.chanjar.weixin.common.util; - -/** - * copy from apache-commons-lang3 - */ -public class StringUtils { - - /** - *

    Checks if a CharSequence is whitespace, empty ("") or null.

    - *

    - *

    -   * StringUtils.isBlank(null)      = true
    -   * StringUtils.isBlank("")        = true
    -   * StringUtils.isBlank(" ")       = true
    -   * StringUtils.isBlank("bob")     = false
    -   * StringUtils.isBlank("  bob  ") = false
    -   * 
    - * - * @param cs the CharSequence to check, may be null - * @return {@code true} if the CharSequence is null, empty or whitespace - * @since 3.0 Changed signature from isBlank(String) to isBlank(CharSequence) - */ - public static boolean isBlank(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; - } - - /** - *

    Checks if a CharSequence is not empty (""), not null and not whitespace only.

    - *

    - *

    -   * StringUtils.isNotBlank(null)      = false
    -   * StringUtils.isNotBlank("")        = false
    -   * StringUtils.isNotBlank(" ")       = false
    -   * StringUtils.isNotBlank("bob")     = true
    -   * StringUtils.isNotBlank("  bob  ") = true
    -   * 
    - * - * @param cs the CharSequence to check, may be null - * @return {@code true} if the CharSequence is - * not empty and not null and not whitespace - * @since 3.0 Changed signature from isNotBlank(String) to isNotBlank(CharSequence) - */ - public static boolean isNotBlank(CharSequence cs) { - return !StringUtils.isBlank(cs); - } - - /** - *

    Checks if a CharSequence is empty ("") or null.

    - *

    - *

    -   * StringUtils.isEmpty(null)      = true
    -   * StringUtils.isEmpty("")        = true
    -   * StringUtils.isEmpty(" ")       = false
    -   * StringUtils.isEmpty("bob")     = false
    -   * StringUtils.isEmpty("  bob  ") = false
    -   * 
    - *

    - *

    NOTE: This method changed in Lang version 2.0. - * It no longer trims the CharSequence. - * That functionality is available in isBlank().

    - * - * @param cs the CharSequence to check, may be null - * @return {@code true} if the CharSequence is empty or null - * @since 3.0 Changed signature from isEmpty(String) to isEmpty(CharSequence) - */ - public static boolean isEmpty(CharSequence cs) { - return cs == null || cs.length() == 0; - } - - /** - *

    Checks if a CharSequence is not empty ("") and not null.

    - *

    - *

    -   * StringUtils.isNotEmpty(null)      = false
    -   * StringUtils.isNotEmpty("")        = false
    -   * StringUtils.isNotEmpty(" ")       = true
    -   * StringUtils.isNotEmpty("bob")     = true
    -   * StringUtils.isNotEmpty("  bob  ") = true
    -   * 
    - * - * @param cs the CharSequence to check, may be null - * @return {@code true} if the CharSequence is not empty and not null - * @since 3.0 Changed signature from isNotEmpty(String) to isNotEmpty(CharSequence) - */ - public static boolean isNotEmpty(CharSequence cs) { - return !StringUtils.isEmpty(cs); - } - -} diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/ToStringUtils.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/ToStringUtils.java new file mode 100644 index 00000000..0fa38391 --- /dev/null +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/ToStringUtils.java @@ -0,0 +1,61 @@ +package me.chanjar.weixin.common.util; + +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; + +/** + *
    + * 自定义的ToString方法,用于产生去掉空值属性的字符串
    + * Created by Binary Wang on 2016-10-27.
    + * @author binarywang(Binary Wang)
    + * 
    + */ +public class ToStringUtils { + public static final ToStringStyle THE_STYLE = new SimpleMultiLineToStringStyle(); + private static class SimpleMultiLineToStringStyle extends ToStringStyle { + private static final long serialVersionUID = 4645306494220335355L; + private static final String LINE_SEPARATOR = "\n"; + private static final String NULL_TEXT = ""; + + public SimpleMultiLineToStringStyle() { + super(); + this.setContentStart("["); + this.setFieldSeparator(LINE_SEPARATOR + " "); + this.setFieldSeparatorAtStart(true); + this.setContentEnd(LINE_SEPARATOR + "]"); + this.setNullText(NULL_TEXT); + this.setUseShortClassName(true); + this.setUseIdentityHashCode(false); + } + } + + /** + * 用于产生去掉空值属性并以换行符分割各属性键值的toString字符串 + * @param obj + */ + public static String toSimpleString(Object obj) { + String toStringResult = ToStringBuilder.reflectionToString(obj, THE_STYLE); + String[] split = toStringResult.split(SimpleMultiLineToStringStyle.LINE_SEPARATOR); + StringBuilder result = new StringBuilder(); + for (String string : split) { + if (string.endsWith(SimpleMultiLineToStringStyle.NULL_TEXT)) { + continue; + } + + result.append(string + SimpleMultiLineToStringStyle.LINE_SEPARATOR); + } + + if (result.length() == 0) { + return ""; + } + + //如果没有非空的属性,就输出 + if (StringUtils.countMatches(result, SimpleMultiLineToStringStyle.LINE_SEPARATOR) == 2) { + return result.toString().split(SimpleMultiLineToStringStyle.LINE_SEPARATOR)[0] + + "]"; + } + + return result.deleteCharAt(result.length() - 1).toString(); + } +} diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/DefaultApacheHttpClientBuilder.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/DefaultApacheHttpClientBuilder.java index 54bd5b68..030fe98f 100644 --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/DefaultApacheHttpClientBuilder.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/DefaultApacheHttpClientBuilder.java @@ -1,6 +1,6 @@ package me.chanjar.weixin.common.util.http; -import me.chanjar.weixin.common.util.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.http.annotation.NotThreadSafe; import org.apache.http.auth.AuthScope; import org.apache.http.auth.UsernamePasswordCredentials; diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/MediaDownloadRequestExecutor.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/MediaDownloadRequestExecutor.java index c81658e2..57024f50 100644 --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/MediaDownloadRequestExecutor.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/MediaDownloadRequestExecutor.java @@ -2,8 +2,8 @@ package me.chanjar.weixin.common.util.http; import me.chanjar.weixin.common.bean.result.WxError; import me.chanjar.weixin.common.exception.WxErrorException; -import me.chanjar.weixin.common.util.StringUtils; import me.chanjar.weixin.common.util.fs.FileUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.http.Header; import org.apache.http.HttpHost; import org.apache.http.client.config.RequestConfig; diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/URIUtil.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/URIUtil.java index 9448f2d1..7e42aba7 100644 --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/URIUtil.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/URIUtil.java @@ -1,6 +1,7 @@ package me.chanjar.weixin.common.util.http; -import me.chanjar.weixin.common.util.StringUtils; + +import org.apache.commons.lang3.StringUtils; import java.io.UnsupportedEncodingException; diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpInMemoryConfigStorage.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpInMemoryConfigStorage.java index 8914da53..fb7bacff 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpInMemoryConfigStorage.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpInMemoryConfigStorage.java @@ -1,13 +1,11 @@ package me.chanjar.weixin.cp.api; -import java.io.File; - -import org.apache.commons.lang3.builder.ToStringBuilder; -import org.apache.commons.lang3.builder.ToStringStyle; - import me.chanjar.weixin.common.bean.WxAccessToken; +import me.chanjar.weixin.common.util.ToStringUtils; import me.chanjar.weixin.common.util.http.ApacheHttpClientBuilder; +import java.io.File; + /** * 基于内存的微信配置provider,在实际生产环境中应该将这些配置持久化 * @@ -203,7 +201,7 @@ public class WxCpInMemoryConfigStorage implements WxCpConfigStorage { @Override public String toString() { - return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE); + return ToStringUtils.toSimpleString(this); } @Override diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpInMemoryConfigStorage.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpInMemoryConfigStorage.java index 784cfddc..e75b78da 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpInMemoryConfigStorage.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpInMemoryConfigStorage.java @@ -1,13 +1,10 @@ package me.chanjar.weixin.mp.api; import me.chanjar.weixin.common.bean.WxAccessToken; +import me.chanjar.weixin.common.util.ToStringUtils; import me.chanjar.weixin.common.util.http.ApacheHttpClientBuilder; import javax.net.ssl.SSLContext; - -import org.apache.commons.lang3.builder.ToStringBuilder; -import org.apache.commons.lang3.builder.ToStringStyle; - import java.io.File; /** @@ -43,7 +40,7 @@ public class WxMpInMemoryConfigStorage implements WxMpConfigStorage { * 临时文件目录 */ protected volatile File tmpDirFile; - + protected volatile SSLContext sslContext; protected volatile ApacheHttpClientBuilder apacheHttpClientBuilder; @@ -62,7 +59,7 @@ public class WxMpInMemoryConfigStorage implements WxMpConfigStorage { public synchronized void updateAccessToken(WxAccessToken accessToken) { updateAccessToken(accessToken.getAccessToken(), accessToken.getExpiresIn()); } - + @Override public synchronized void updateAccessToken(String accessToken, int expiresInSeconds) { this.accessToken = accessToken; @@ -229,7 +226,7 @@ public class WxMpInMemoryConfigStorage implements WxMpConfigStorage { @Override public String toString() { - return ToStringBuilder.reflectionToString(this,ToStringStyle.MULTI_LINE_STYLE); + return ToStringUtils.toSimpleString(this); } @Override @@ -263,7 +260,7 @@ public class WxMpInMemoryConfigStorage implements WxMpConfigStorage { public SSLContext getSSLContext() { return this.sslContext; } - + public void setSSLContext(SSLContext context) { this.sslContext = context; } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpCard.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpCard.java index 7bb4330f..bc50ce05 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpCard.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpCard.java @@ -1,6 +1,8 @@ package me.chanjar.weixin.mp.bean; +import me.chanjar.weixin.common.util.ToStringUtils; + /** * 微信卡券 * @@ -61,12 +63,6 @@ public class WxMpCard { @Override public String toString() { - return "WxMpCard{" + - "cardId='" + this.cardId + '\'' + - ", beginTime=" + this.beginTime + - ", endTime=" + this.endTime + - ", userCardStatus='" + this.userCardStatus + '\'' + - ", canConsume=" + this.canConsume + - '}'; + return ToStringUtils.toSimpleString(this); } } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpMassNews.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpMassNews.java index 4b059ea8..3e65fcde 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpMassNews.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpMassNews.java @@ -1,5 +1,6 @@ package me.chanjar.weixin.mp.bean; +import me.chanjar.weixin.common.util.ToStringUtils; import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; import java.io.Serializable; @@ -14,7 +15,7 @@ import java.util.List; public class WxMpMassNews implements Serializable { /** - * + * */ private static final long serialVersionUID = 565937155013581016L; private List articles = new ArrayList<>(); @@ -137,14 +138,12 @@ public class WxMpMassNews implements Serializable { @Override public String toString() { - return "WxMpMassNewsArticle [" + "thumbMediaId=" + this.thumbMediaId + ", author=" + this.author + ", title=" + this.title + - ", contentSourceUrl=" + this.contentSourceUrl + ", content=" + this.content + ", digest=" + this.digest + - ", showCoverPic=" + this.showCoverPic + "]"; + return ToStringUtils.toSimpleString(this); } } @Override public String toString() { - return "WxMpMassNews [" + "articles=" + this.articles + "]"; + return ToStringUtils.toSimpleString(this); } } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpMassPreviewMessage.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpMassPreviewMessage.java index 78e699e9..b49ffc38 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpMassPreviewMessage.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpMassPreviewMessage.java @@ -8,9 +8,6 @@ import java.io.Serializable; * @author miller */ public class WxMpMassPreviewMessage implements Serializable { - /** - * - */ private static final long serialVersionUID = 9095211638358424020L; private String toWxUsername; private String msgType; diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeArticleResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeArticleResult.java index d763543e..35cae74d 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeArticleResult.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeArticleResult.java @@ -1,13 +1,12 @@ package me.chanjar.weixin.mp.bean.datacube; -import java.util.List; - import com.google.gson.JsonParser; import com.google.gson.annotations.SerializedName; import com.google.gson.reflect.TypeToken; - import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; +import java.util.List; + /** * 图文分析数据接口返回结果对象 * @author binarywang(Binary Wang) @@ -26,7 +25,9 @@ public class WxDataCubeArticleResult extends WxDataCubeBaseResult { /** * msgid - * 请注意:这里的msgid实际上是由msgid(图文消息id,这也就是群发接口调用后返回的msg_data_id)和index(消息次序索引)组成, 例如12003_3, 其中12003是msgid,即一次群发的消息的id; 3为index,假设该次群发的图文消息共5个文章(因为可能为多图文),3表示5个中的第3个 + * 请注意:这里的msgid实际上是由msgid(图文消息id,这也就是群发接口调用后返回的msg_data_id) + * 和index(消息次序索引)组成, 例如12003_3, 其中12003是msgid,即一次群发的消息的id; 3为index, + * 假设该次群发的图文消息共5个文章(因为可能为多图文),3表示5个中的第3个 */ @SerializedName("msgid") private String msgId; diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeBaseResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeBaseResult.java index f3999fa2..a9415d9f 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeBaseResult.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeBaseResult.java @@ -1,8 +1,7 @@ package me.chanjar.weixin.mp.bean.datacube; import com.google.gson.annotations.SerializedName; -import org.apache.commons.lang3.builder.ToStringBuilder; -import org.apache.commons.lang3.builder.ToStringStyle; +import me.chanjar.weixin.common.util.ToStringUtils; /** * 统计接口的共用属性类 @@ -12,7 +11,7 @@ import org.apache.commons.lang3.builder.ToStringStyle; public class WxDataCubeBaseResult { @Override public String toString() { - return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE); + return ToStringUtils.toSimpleString(this); } /** diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeUserCumulate.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeUserCumulate.java index e764f244..40e35ded 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeUserCumulate.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeUserCumulate.java @@ -1,17 +1,14 @@ package me.chanjar.weixin.mp.bean.datacube; -import java.io.Serializable; -import java.util.Date; -import java.util.List; - -import org.apache.commons.lang3.builder.ToStringBuilder; -import org.apache.commons.lang3.builder.ToStringStyle; - import com.google.gson.JsonParser; import com.google.gson.reflect.TypeToken; - +import me.chanjar.weixin.common.util.ToStringUtils; import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + /** *
      * 累计用户数据接口的返回JSON数据包
    @@ -46,7 +43,7 @@ public class WxDataCubeUserCumulate implements Serializable {
     
       @Override
       public String toString() {
    -    return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
    +    return ToStringUtils.toSimpleString(this);
       }
     
       public static List fromJson(String json) {
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeUserSummary.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeUserSummary.java
    index 54eb0d4a..8f478885 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeUserSummary.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeUserSummary.java
    @@ -1,17 +1,14 @@
     package me.chanjar.weixin.mp.bean.datacube;
     
    -import java.io.Serializable;
    -import java.util.Date;
    -import java.util.List;
    -
    -import org.apache.commons.lang3.builder.ToStringBuilder;
    -import org.apache.commons.lang3.builder.ToStringStyle;
    -
     import com.google.gson.JsonParser;
     import com.google.gson.reflect.TypeToken;
    -
    +import me.chanjar.weixin.common.util.ToStringUtils;
     import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
     
    +import java.io.Serializable;
    +import java.util.Date;
    +import java.util.List;
    +
     /**
      * 
      * 用户增减数据接口的返回JSON数据包
    @@ -65,7 +62,7 @@ public class WxDataCubeUserSummary implements Serializable {
     
       @Override
       public String toString() {
    -    return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
    +    return ToStringUtils.toSimpleString(this);
       }
     
       public static List fromJson(String json) {
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/kefu/request/WxMpKfSessionRequest.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/kefu/request/WxMpKfSessionRequest.java
    index 420c0d62..ac59e323 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/kefu/request/WxMpKfSessionRequest.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/kefu/request/WxMpKfSessionRequest.java
    @@ -1,14 +1,11 @@
     package me.chanjar.weixin.mp.bean.kefu.request;
     
    -import java.io.Serializable;
    -
    -import org.apache.commons.lang3.builder.ToStringBuilder;
    -import org.apache.commons.lang3.builder.ToStringStyle;
    -
     import com.google.gson.annotations.SerializedName;
    -
    +import me.chanjar.weixin.common.util.ToStringUtils;
     import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
     
    +import java.io.Serializable;
    +
     public class WxMpKfSessionRequest implements Serializable {
       private static final long serialVersionUID = -5451863610674856927L;
     
    @@ -17,7 +14,7 @@ public class WxMpKfSessionRequest implements Serializable {
        */
       @SerializedName("kf_account")
       private String kfAccount;
    -  
    +
       /**
        * openid 客户openid
        */
    @@ -31,9 +28,9 @@ public class WxMpKfSessionRequest implements Serializable {
     
       @Override
       public String toString() {
    -    return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
    +    return ToStringUtils.toSimpleString(this);
       }
    -  
    +
       public String toJson() {
         return WxMpGsonBuilder.INSTANCE.create().toJson(this);
       }
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/kefu/result/WxMpKfInfo.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/kefu/result/WxMpKfInfo.java
    index bcb811bc..868bf519 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/kefu/result/WxMpKfInfo.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/kefu/result/WxMpKfInfo.java
    @@ -1,12 +1,10 @@
     package me.chanjar.weixin.mp.bean.kefu.result;
     
    -import java.io.Serializable;
    -
    -import org.apache.commons.lang3.builder.ToStringBuilder;
    -import org.apache.commons.lang3.builder.ToStringStyle;
    -
     import com.google.gson.annotations.Expose;
     import com.google.gson.annotations.SerializedName;
    +import me.chanjar.weixin.common.util.ToStringUtils;
    +
    +import java.io.Serializable;
     
     /**
      * 客服基本信息以及客服在线状态信息
    @@ -127,7 +125,7 @@ public class WxMpKfInfo implements Serializable {
     
       @Override
       public String toString() {
    -    return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
    +    return ToStringUtils.toSimpleString(this);
       }
     
       public String getWxAccount() {
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/kefu/result/WxMpKfList.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/kefu/result/WxMpKfList.java
    index 3465073a..9ec9eeff 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/kefu/result/WxMpKfList.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/kefu/result/WxMpKfList.java
    @@ -1,15 +1,12 @@
     package me.chanjar.weixin.mp.bean.kefu.result;
     
    -import java.util.List;
    -
    -import org.apache.commons.lang3.builder.ToStringBuilder;
    -import org.apache.commons.lang3.builder.ToStringStyle;
    -
     import com.google.gson.annotations.SerializedName;
    -
    +import me.chanjar.weixin.common.util.ToStringUtils;
     import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
    +
    +import java.util.List;
     /**
    - * 
    + *
      * @author Binary Wang
      *
      */
    @@ -19,7 +16,7 @@ public class WxMpKfList {
     
       @Override
       public String toString() {
    -    return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
    +    return ToStringUtils.toSimpleString(this);
       }
     
       public List getKfList() {
    @@ -28,8 +25,8 @@ public class WxMpKfList {
     
       public void setKfList(List kfList) {
         this.kfList = kfList;
    -  }  
    -  
    +  }
    +
       public static WxMpKfList fromJson(String json) {
         return WxMpGsonBuilder.INSTANCE.create().fromJson(json, WxMpKfList.class);
       }
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/kefu/result/WxMpKfMsgList.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/kefu/result/WxMpKfMsgList.java
    index cfcbba92..7c04acb3 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/kefu/result/WxMpKfMsgList.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/kefu/result/WxMpKfMsgList.java
    @@ -1,9 +1,8 @@
     package me.chanjar.weixin.mp.bean.kefu.result;
     
     import com.google.gson.annotations.SerializedName;
    +import me.chanjar.weixin.common.util.ToStringUtils;
     import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
    -import org.apache.commons.lang3.builder.ToStringBuilder;
    -import org.apache.commons.lang3.builder.ToStringStyle;
     
     import java.util.List;
     
    @@ -46,7 +45,7 @@ public class WxMpKfMsgList {
     
       @Override
       public String toString() {
    -    return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
    +    return ToStringUtils.toSimpleString(this);
       }
     
       public static WxMpKfMsgList fromJson(String responseContent) {
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/kefu/result/WxMpKfMsgRecord.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/kefu/result/WxMpKfMsgRecord.java
    index 14b26567..0ed9c0b2 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/kefu/result/WxMpKfMsgRecord.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/kefu/result/WxMpKfMsgRecord.java
    @@ -1,9 +1,7 @@
     package me.chanjar.weixin.mp.bean.kefu.result;
     
    -import org.apache.commons.lang3.builder.ToStringBuilder;
    -import org.apache.commons.lang3.builder.ToStringStyle;
    -
     import com.google.gson.annotations.SerializedName;
    +import me.chanjar.weixin.common.util.ToStringUtils;
     
     /**
      * Created by Binary Wang on 2016/7/18.
    @@ -41,8 +39,9 @@ public class WxMpKfMsgRecord {
     
       @Override
       public String toString() {
    -    return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
    +    return ToStringUtils.toSimpleString(this);
       }
    +
       public String getWorker() {
         return this.worker;
       }
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/kefu/result/WxMpKfOnlineList.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/kefu/result/WxMpKfOnlineList.java
    index 1cc674c9..97500095 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/kefu/result/WxMpKfOnlineList.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/kefu/result/WxMpKfOnlineList.java
    @@ -1,15 +1,12 @@
     package me.chanjar.weixin.mp.bean.kefu.result;
     
    -import java.util.List;
    -
    -import org.apache.commons.lang3.builder.ToStringBuilder;
    -import org.apache.commons.lang3.builder.ToStringStyle;
    -
     import com.google.gson.annotations.SerializedName;
    -
    +import me.chanjar.weixin.common.util.ToStringUtils;
     import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
    +
    +import java.util.List;
     /**
    - * 
    + *
      * @author Binary Wang
      *
      */
    @@ -19,9 +16,9 @@ public class WxMpKfOnlineList {
     
       @Override
       public String toString() {
    -    return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
    +    return ToStringUtils.toSimpleString(this);
       }
    -  
    +
       public List getKfOnlineList() {
         return this.kfOnlineList;
       }
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/kefu/result/WxMpKfSession.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/kefu/result/WxMpKfSession.java
    index 8a9ef842..da29b4ae 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/kefu/result/WxMpKfSession.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/kefu/result/WxMpKfSession.java
    @@ -1,12 +1,10 @@
     package me.chanjar.weixin.mp.bean.kefu.result;
     
    -import org.apache.commons.lang3.builder.ToStringBuilder;
    -import org.apache.commons.lang3.builder.ToStringStyle;
    -
     import com.google.gson.annotations.SerializedName;
    +import me.chanjar.weixin.common.util.ToStringUtils;
     
     /**
    - * 
    + *
      * @author Binary Wang
      *
      */
    @@ -39,9 +37,9 @@ public class WxMpKfSession {
     
       @Override
       public String toString() {
    -    return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
    +    return ToStringUtils.toSimpleString(this);
       }
    -  
    +
       public String getKfAccount() {
         return this.kfAccount;
       }
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/kefu/result/WxMpKfSessionGetResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/kefu/result/WxMpKfSessionGetResult.java
    index eb78f3b6..2eb73143 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/kefu/result/WxMpKfSessionGetResult.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/kefu/result/WxMpKfSessionGetResult.java
    @@ -1,14 +1,11 @@
     package me.chanjar.weixin.mp.bean.kefu.result;
     
    -import org.apache.commons.lang3.builder.ToStringBuilder;
    -import org.apache.commons.lang3.builder.ToStringStyle;
    -
     import com.google.gson.annotations.SerializedName;
    -
    +import me.chanjar.weixin.common.util.ToStringUtils;
     import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
     
     /**
    - * 
    + *
      * @author Binary Wang
      *
      */
    @@ -27,13 +24,13 @@ public class WxMpKfSessionGetResult {
     
       @Override
       public String toString() {
    -    return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
    +    return ToStringUtils.toSimpleString(this);
       }
    -  
    +
       public static WxMpKfSessionGetResult fromJson(String json) {
         return WxMpGsonBuilder.INSTANCE.create().fromJson(json, WxMpKfSessionGetResult.class);
       }
    -  
    +
       public String getKfAccount() {
         return this.kfAccount;
       }
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/kefu/result/WxMpKfSessionList.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/kefu/result/WxMpKfSessionList.java
    index 8bcac0e4..a9a0640e 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/kefu/result/WxMpKfSessionList.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/kefu/result/WxMpKfSessionList.java
    @@ -1,16 +1,13 @@
     package me.chanjar.weixin.mp.bean.kefu.result;
     
    -import java.util.List;
    -
    -import org.apache.commons.lang3.builder.ToStringBuilder;
    -import org.apache.commons.lang3.builder.ToStringStyle;
    -
     import com.google.gson.annotations.SerializedName;
    -
    +import me.chanjar.weixin.common.util.ToStringUtils;
     import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
     
    +import java.util.List;
    +
     /**
    - * 
    + *
      * @author Binary Wang
      *
      */
    @@ -23,7 +20,7 @@ public class WxMpKfSessionList {
     
       @Override
       public String toString() {
    -    return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
    +    return ToStringUtils.toSimpleString(this);
       }
     
       public static WxMpKfSessionList fromJson(String json) {
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/kefu/result/WxMpKfSessionWaitCaseList.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/kefu/result/WxMpKfSessionWaitCaseList.java
    index 7e876901..22bcc4da 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/kefu/result/WxMpKfSessionWaitCaseList.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/kefu/result/WxMpKfSessionWaitCaseList.java
    @@ -1,16 +1,13 @@
     package me.chanjar.weixin.mp.bean.kefu.result;
     
    -import java.util.List;
    -
    -import org.apache.commons.lang3.builder.ToStringBuilder;
    -import org.apache.commons.lang3.builder.ToStringStyle;
    -
     import com.google.gson.annotations.SerializedName;
    -
    +import me.chanjar.weixin.common.util.ToStringUtils;
     import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
     
    +import java.util.List;
    +
     /**
    - * 
    + *
      * @author Binary Wang
      *
      */
    @@ -29,7 +26,7 @@ public class WxMpKfSessionWaitCaseList {
     
       @Override
       public String toString() {
    -    return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
    +    return ToStringUtils.toSimpleString(this);
       }
     
       public static WxMpKfSessionWaitCaseList fromJson(String json) {
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/material/WxMpMaterialCountResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/material/WxMpMaterialCountResult.java
    index 02f256bd..6dd74889 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/material/WxMpMaterialCountResult.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/material/WxMpMaterialCountResult.java
    @@ -1,7 +1,6 @@
     package me.chanjar.weixin.mp.bean.material;
     
    -import org.apache.commons.lang3.builder.ToStringBuilder;
    -import org.apache.commons.lang3.builder.ToStringStyle;
    +import me.chanjar.weixin.common.util.ToStringUtils;
     
     import java.io.Serializable;
     
    @@ -46,7 +45,7 @@ public class WxMpMaterialCountResult implements Serializable {
     
       @Override
       public String toString() {
    -    return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
    +    return ToStringUtils.toSimpleString(this);
       }
     }
     
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/material/WxMpMaterialFileBatchGetResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/material/WxMpMaterialFileBatchGetResult.java
    index 2858c9e1..5df9f454 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/material/WxMpMaterialFileBatchGetResult.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/material/WxMpMaterialFileBatchGetResult.java
    @@ -1,7 +1,6 @@
     package me.chanjar.weixin.mp.bean.material;
     
    -import org.apache.commons.lang3.builder.ToStringBuilder;
    -import org.apache.commons.lang3.builder.ToStringStyle;
    +import me.chanjar.weixin.common.util.ToStringUtils;
     
     import java.io.Serializable;
     import java.util.Date;
    @@ -39,7 +38,7 @@ public class WxMpMaterialFileBatchGetResult implements Serializable {
     
       @Override
       public String toString() {
    -    return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
    +    return ToStringUtils.toSimpleString(this);
       }
     
       public static class WxMaterialFileBatchGetNewsItem {
    @@ -82,7 +81,7 @@ public class WxMpMaterialFileBatchGetResult implements Serializable {
     
         @Override
         public String toString() {
    -      return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
    +      return ToStringUtils.toSimpleString(this);
         }
       }
     }
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/material/WxMpMaterialNews.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/material/WxMpMaterialNews.java
    index 03d241f4..70b11fbf 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/material/WxMpMaterialNews.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/material/WxMpMaterialNews.java
    @@ -1,8 +1,7 @@
     package me.chanjar.weixin.mp.bean.material;
     
    +import me.chanjar.weixin.common.util.ToStringUtils;
     import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
    -import org.apache.commons.lang3.builder.ToStringBuilder;
    -import org.apache.commons.lang3.builder.ToStringStyle;
     
     import java.io.Serializable;
     import java.util.ArrayList;
    @@ -157,12 +156,12 @@ public class WxMpMaterialNews implements Serializable {
     
         @Override
         public String toString() {
    -      return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
    +      return ToStringUtils.toSimpleString(this);
         }
       }
     
       @Override
       public String toString() {
    -    return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
    +    return ToStringUtils.toSimpleString(this);
       }
     }
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/material/WxMpMaterialNewsBatchGetResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/material/WxMpMaterialNewsBatchGetResult.java
    index 629234b6..03f0a6d8 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/material/WxMpMaterialNewsBatchGetResult.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/material/WxMpMaterialNewsBatchGetResult.java
    @@ -1,7 +1,6 @@
     package me.chanjar.weixin.mp.bean.material;
     
    -import org.apache.commons.lang3.builder.ToStringBuilder;
    -import org.apache.commons.lang3.builder.ToStringStyle;
    +import me.chanjar.weixin.common.util.ToStringUtils;
     
     import java.io.Serializable;
     import java.util.Date;
    @@ -40,7 +39,7 @@ public class WxMpMaterialNewsBatchGetResult implements Serializable {
     
       @Override
       public String toString() {
    -    return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
    +    return ToStringUtils.toSimpleString(this);
       }
     
       public static class WxMaterialNewsBatchGetNewsItem {
    @@ -74,7 +73,7 @@ public class WxMpMaterialNewsBatchGetResult implements Serializable {
     
         @Override
         public String toString() {
    -      return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
    +      return ToStringUtils.toSimpleString(this);
         }
       }
     }
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/message/WxMpXmlMessage.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/message/WxMpXmlMessage.java
    index 856233fa..732c0d54 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/message/WxMpXmlMessage.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/message/WxMpXmlMessage.java
    @@ -2,13 +2,12 @@ package me.chanjar.weixin.mp.bean.message;
     
     import com.thoughtworks.xstream.annotations.XStreamAlias;
     import com.thoughtworks.xstream.annotations.XStreamConverter;
    +import me.chanjar.weixin.common.util.ToStringUtils;
     import me.chanjar.weixin.common.util.xml.XStreamCDataConverter;
     import me.chanjar.weixin.mp.api.WxMpConfigStorage;
     import me.chanjar.weixin.mp.util.crypto.WxMpCryptUtil;
     import me.chanjar.weixin.mp.util.xml.XStreamTransformer;
     import org.apache.commons.io.IOUtils;
    -import org.apache.commons.lang3.builder.ToStringBuilder;
    -import org.apache.commons.lang3.builder.ToStringStyle;
     
     import java.io.IOException;
     import java.io.InputStream;
    @@ -724,7 +723,7 @@ public class WxMpXmlMessage implements Serializable {
       public static class ScanCodeInfo {
         @Override
         public String toString() {
    -      return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
    +      return ToStringUtils.toSimpleString(this);
         }
     
         @XStreamAlias("ScanType")
    @@ -764,7 +763,7 @@ public class WxMpXmlMessage implements Serializable {
       public static class SendPicsInfo {
         @Override
         public String toString() {
    -      return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
    +      return ToStringUtils.toSimpleString(this);
         }
     
         @XStreamAlias("Count")
    @@ -789,8 +788,7 @@ public class WxMpXmlMessage implements Serializable {
         public static class Item {
           @Override
           public String toString() {
    -        return ToStringBuilder.reflectionToString(this,
    -            ToStringStyle.MULTI_LINE_STYLE);
    +        return ToStringUtils.toSimpleString(this);
           }
     
           @XStreamAlias("PicMd5Sum")
    @@ -832,7 +830,7 @@ public class WxMpXmlMessage implements Serializable {
     
         @Override
         public String toString() {
    -      return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
    +      return ToStringUtils.toSimpleString(this);
         }
     
         public String getLocationX() {
    @@ -878,6 +876,6 @@ public class WxMpXmlMessage implements Serializable {
     
       @Override
       public String toString() {
    -    return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
    +    return ToStringUtils.toSimpleString(this);
       }
     }
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxPayJsSDKCallback.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxPayJsSDKCallback.java
    index 742f5e18..07a3fe16 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxPayJsSDKCallback.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxPayJsSDKCallback.java
    @@ -1,5 +1,7 @@
     package me.chanjar.weixin.mp.bean.pay;
     
    +import me.chanjar.weixin.common.util.ToStringUtils;
    +
     import java.io.Serializable;
     
     /**
    @@ -259,21 +261,7 @@ public class WxPayJsSDKCallback implements Serializable {
     
       @Override
       public String toString() {
    -    return "WxPayJsSDKCallback [return_code=" + this.return_code + ", return_msg="
    -      + this.return_msg + ", appid=" + this.appid + ", mch_id=" + this.mch_id
    -      + ", device_info=" + this.device_info + ", nonce_str=" + this.nonce_str
    -      + ", sign=" + this.sign + ", result_code=" + this.result_code
    -      + ", err_code=" + this.err_code + ", err_code_des=" + this.err_code_des
    -      + ", openid=" + this.openid + ", is_subscribe=" + this.is_subscribe
    -      + ", trade_type=" + this.trade_type + ", bank_type=" + this.bank_type
    -      + ", total_fee=" + this.total_fee + ", fee_type=" + this.fee_type
    -      + ", cash_fee=" + this.cash_fee + ", cash_fee_type=" + this.cash_fee_type
    -      + ", coupon_fee=" + this.coupon_fee + ", coupon_count="
    -      + this.coupon_count + ", coupon_batch_id_$n=" + this.coupon_batch_id_$n
    -      + ", coupon_id_$n=" + this.coupon_id_$n + ", coupon_fee_$n="
    -      + this.coupon_fee_$n + ", transaction_id=" + this.transaction_id
    -      + ", out_trade_no=" + this.out_trade_no + ", attach=" + this.attach
    -      + ", time_end=" + this.time_end + "]";
    +    return ToStringUtils.toSimpleString(this);
       }
     
     }
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/request/WxEntPayQueryRequest.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/request/WxEntPayQueryRequest.java
    index 499e111d..5982d3ee 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/request/WxEntPayQueryRequest.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/request/WxEntPayQueryRequest.java
    @@ -1,11 +1,8 @@
     package me.chanjar.weixin.mp.bean.pay.request;
     
    -import org.apache.commons.lang3.builder.ToStringBuilder;
    -import org.apache.commons.lang3.builder.ToStringStyle;
    -
     import com.thoughtworks.xstream.annotations.XStreamAlias;
    -
     import me.chanjar.weixin.common.annotation.Required;
    +import me.chanjar.weixin.common.util.ToStringUtils;
     
     /**
      * 
    @@ -71,7 +68,7 @@ public class WxEntPayQueryRequest extends WxPayBaseRequest {
     
       @Override
       public String toString() {
    -    return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
    +    return ToStringUtils.toSimpleString(this);
       }
     
     }
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/request/WxEntPayRequest.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/request/WxEntPayRequest.java
    index 196ef95f..ef6e8d0a 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/request/WxEntPayRequest.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/request/WxEntPayRequest.java
    @@ -1,9 +1,7 @@
     package me.chanjar.weixin.mp.bean.pay.request;
     
    -import org.apache.commons.lang3.builder.ToStringBuilder;
    -import org.apache.commons.lang3.builder.ToStringStyle;
    -
     import com.thoughtworks.xstream.annotations.XStreamAlias;
    +import me.chanjar.weixin.common.util.ToStringUtils;
     
     /**
      * 
    @@ -278,7 +276,7 @@ public class WxEntPayRequest {
     
       @Override
       public String toString() {
    -    return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
    +    return ToStringUtils.toSimpleString(this);
       }
     
     }
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/request/WxPayBaseRequest.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/request/WxPayBaseRequest.java
    index aabbdfd1..341c3b2e 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/request/WxPayBaseRequest.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/request/WxPayBaseRequest.java
    @@ -1,9 +1,7 @@
     package me.chanjar.weixin.mp.bean.pay.request;
     
    -import org.apache.commons.lang3.builder.ToStringBuilder;
    -import org.apache.commons.lang3.builder.ToStringStyle;
    -
     import com.thoughtworks.xstream.annotations.XStreamAlias;
    +import me.chanjar.weixin.common.util.ToStringUtils;
     
     /**
      * 
    @@ -103,6 +101,6 @@ public abstract class WxPayBaseRequest {
     
       @Override
       public String toString() {
    -    return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
    +    return ToStringUtils.toSimpleString(this);
       }
     }
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/result/WxPayBaseResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/result/WxPayBaseResult.java
    index 79f8dbb5..64310138 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/result/WxPayBaseResult.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/result/WxPayBaseResult.java
    @@ -1,9 +1,7 @@
     package me.chanjar.weixin.mp.bean.pay.result;
     
    -import org.apache.commons.lang3.builder.ToStringBuilder;
    -import org.apache.commons.lang3.builder.ToStringStyle;
    -
     import com.thoughtworks.xstream.annotations.XStreamAlias;
    +import me.chanjar.weixin.common.util.ToStringUtils;
     
     /**
      * 
    @@ -15,7 +13,7 @@ import com.thoughtworks.xstream.annotations.XStreamAlias;
     public abstract class WxPayBaseResult {
       @Override
       public String toString() {
    -    return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
    +    return ToStringUtils.toSimpleString(this);
       }
     
       /**
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpCardResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpCardResult.java
    index 7a711ba1..b39d2fed 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpCardResult.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpCardResult.java
    @@ -1,8 +1,7 @@
     package me.chanjar.weixin.mp.bean.result;
     
    +import me.chanjar.weixin.common.util.ToStringUtils;
     import me.chanjar.weixin.mp.bean.WxMpCard;
    -import org.apache.commons.lang3.builder.ToStringBuilder;
    -import org.apache.commons.lang3.builder.ToStringStyle;
     
     import java.io.Serializable;
     
    @@ -15,7 +14,7 @@ import java.io.Serializable;
     public class WxMpCardResult implements Serializable {
     
       /**
    -   * 
    +   *
        */
       private static final long serialVersionUID = -7950878428289035637L;
     
    @@ -65,7 +64,7 @@ public class WxMpCardResult implements Serializable {
     
       @Override
       public String toString() {
    -    return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
    +    return ToStringUtils.toSimpleString(this);
       }
     
       public String getUserCardStatus() {
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpUser.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpUser.java
    index e3e894cb..8d7090fd 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpUser.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpUser.java
    @@ -1,18 +1,15 @@
     package me.chanjar.weixin.mp.bean.result;
     
    -import java.io.Serializable;
    -import java.lang.reflect.Type;
    -import java.util.List;
    -
    -import org.apache.commons.lang3.builder.ToStringBuilder;
    -import org.apache.commons.lang3.builder.ToStringStyle;
    -
     import com.google.gson.Gson;
     import com.google.gson.JsonObject;
     import com.google.gson.reflect.TypeToken;
    -
    +import me.chanjar.weixin.common.util.ToStringUtils;
     import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
     
    +import java.io.Serializable;
    +import java.lang.reflect.Type;
    +import java.util.List;
    +
     /**
      * 微信用户信息
      * @author chanjarster
    @@ -175,7 +172,7 @@ public class WxMpUser implements Serializable {
     
       @Override
       public String toString() {
    -    return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
    +    return ToStringUtils.toSimpleString(this);
       }
     
     }
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/store/WxMpStoreBaseInfo.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/store/WxMpStoreBaseInfo.java
    index 409e41c3..91d52d2e 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/store/WxMpStoreBaseInfo.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/store/WxMpStoreBaseInfo.java
    @@ -4,9 +4,8 @@ import com.google.gson.JsonElement;
     import com.google.gson.JsonObject;
     import com.google.gson.annotations.SerializedName;
     import me.chanjar.weixin.common.annotation.Required;
    +import me.chanjar.weixin.common.util.ToStringUtils;
     import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
    -import org.apache.commons.lang3.builder.ToStringBuilder;
    -import org.apache.commons.lang3.builder.ToStringStyle;
     
     import java.math.BigDecimal;
     import java.util.List;
    @@ -19,7 +18,7 @@ import java.util.List;
     public class WxMpStoreBaseInfo {
       @Override
       public String toString() {
    -    return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
    +    return ToStringUtils.toSimpleString(this);
       }
     
       public static WxMpStoreBaseInfo fromJson(String json) {
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/store/WxMpStoreInfo.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/store/WxMpStoreInfo.java
    index 9d07eb03..1450bc3c 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/store/WxMpStoreInfo.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/store/WxMpStoreInfo.java
    @@ -1,14 +1,12 @@
     package me.chanjar.weixin.mp.bean.store;
     
    -import org.apache.commons.lang3.builder.ToStringBuilder;
    -import org.apache.commons.lang3.builder.ToStringStyle;
    -
     import com.google.gson.annotations.SerializedName;
    +import me.chanjar.weixin.common.util.ToStringUtils;
     
     public class WxMpStoreInfo {
       @Override
       public String toString() {
    -    return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
    +    return ToStringUtils.toSimpleString(this);
       }
     
       @SerializedName("base_info")
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/store/WxMpStoreListResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/store/WxMpStoreListResult.java
    index f16c1534..f9cc3fbe 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/store/WxMpStoreListResult.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/store/WxMpStoreListResult.java
    @@ -1,14 +1,11 @@
     package me.chanjar.weixin.mp.bean.store;
     
    -import java.util.List;
    -
    -import org.apache.commons.lang3.builder.ToStringBuilder;
    -import org.apache.commons.lang3.builder.ToStringStyle;
    -
     import com.google.gson.annotations.SerializedName;
    -
    +import me.chanjar.weixin.common.util.ToStringUtils;
     import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
     
    +import java.util.List;
    +
     /**
      * 门店列表结果类
      * @author binarywang(Binary Wang)
    @@ -18,7 +15,7 @@ import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
     public class WxMpStoreListResult {
       @Override
       public String toString() {
    -    return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
    +    return ToStringUtils.toSimpleString(this);
       }
     
       public static WxMpStoreListResult fromJson(String json) {
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/tag/WxTagListUser.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/tag/WxTagListUser.java
    index 47ed067a..e1307be7 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/tag/WxTagListUser.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/tag/WxTagListUser.java
    @@ -1,14 +1,11 @@
     package me.chanjar.weixin.mp.bean.tag;
     
    -import java.util.List;
    -
    -import org.apache.commons.lang3.builder.ToStringBuilder;
    -import org.apache.commons.lang3.builder.ToStringStyle;
    -
     import com.google.gson.annotations.SerializedName;
    -
    +import me.chanjar.weixin.common.util.ToStringUtils;
     import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
     
    +import java.util.List;
    +
     /**
      * 获取标签下粉丝列表的结果对象
      * @author binarywang(Binary Wang)
    @@ -26,7 +23,7 @@ public class WxTagListUser {
     
       @Override
       public String toString() {
    -    return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
    +    return ToStringUtils.toSimpleString(this);
       }
     
       /**
    @@ -74,7 +71,7 @@ public class WxTagListUser {
       public static class WxTagListUserData {
         @Override
         public String toString() {
    -      return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
    +      return ToStringUtils.toSimpleString(this);
         }
     
         /**
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/tag/WxUserTag.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/tag/WxUserTag.java
    index 67b443a4..6554c261 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/tag/WxUserTag.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/tag/WxUserTag.java
    @@ -1,15 +1,12 @@
     package me.chanjar.weixin.mp.bean.tag;
     
    -import java.util.List;
    -
    -import org.apache.commons.lang3.builder.ToStringBuilder;
    -import org.apache.commons.lang3.builder.ToStringStyle;
    -
     import com.google.gson.JsonParser;
     import com.google.gson.reflect.TypeToken;
    -
    +import me.chanjar.weixin.common.util.ToStringUtils;
     import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
     
    +import java.util.List;
    +
     /**
      * 用户标签对象
      * @author binarywang(Binary Wang)
    @@ -73,6 +70,6 @@ public class WxUserTag {
     
       @Override
       public String toString() {
    -    return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
    +    return ToStringUtils.toSimpleString(this);
       }
     }
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/template/WxMpTemplate.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/template/WxMpTemplate.java
    index 0b3a1e61..368284f2 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/template/WxMpTemplate.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/template/WxMpTemplate.java
    @@ -1,16 +1,13 @@
     package me.chanjar.weixin.mp.bean.template;
     
    -import java.util.List;
    -
    -import org.apache.commons.lang3.builder.ToStringBuilder;
    -import org.apache.commons.lang3.builder.ToStringStyle;
    -
     import com.google.gson.JsonParser;
     import com.google.gson.annotations.SerializedName;
     import com.google.gson.reflect.TypeToken;
    -
    +import me.chanjar.weixin.common.util.ToStringUtils;
     import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
     
    +import java.util.List;
    +
     /**
      * 
      * 模板列表信息
    @@ -30,9 +27,9 @@ public class WxMpTemplate {
     
       @Override
       public String toString() {
    -    return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
    +    return ToStringUtils.toSimpleString(this);
       }
    -  
    +
       /**
        * template_id
        * 模板ID
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/template/WxMpTemplateIndustry.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/template/WxMpTemplateIndustry.java
    index b0f689a4..6d0db1ab 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/template/WxMpTemplateIndustry.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/template/WxMpTemplateIndustry.java
    @@ -1,9 +1,8 @@
     package me.chanjar.weixin.mp.bean.template;
     
     
    +import me.chanjar.weixin.common.util.ToStringUtils;
     import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
    -import org.apache.commons.lang3.builder.ToStringBuilder;
    -import org.apache.commons.lang3.builder.ToStringStyle;
     
     import java.io.Serializable;
     
    @@ -48,7 +47,7 @@ public class WxMpTemplateIndustry implements Serializable {
     
         @Override
         public String toString() {
    -      return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
    +      return ToStringUtils.toSimpleString(this);
         }
     
         public String getId() {
    @@ -78,7 +77,7 @@ public class WxMpTemplateIndustry implements Serializable {
     
       @Override
       public String toString() {
    -    return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
    +    return ToStringUtils.toSimpleString(this);
       }
     
       public static WxMpTemplateIndustry fromJson(String json) {
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/builder/outxml/TransferCustomerServiceBuilder.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/builder/outxml/TransferCustomerServiceBuilder.java
    index 8fca3c03..f025c7a8 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/builder/outxml/TransferCustomerServiceBuilder.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/builder/outxml/TransferCustomerServiceBuilder.java
    @@ -1,7 +1,7 @@
     package me.chanjar.weixin.mp.builder.outxml;
     
    -import me.chanjar.weixin.common.util.StringUtils;
     import me.chanjar.weixin.mp.bean.message.WxMpXmlOutTransferKefuMessage;
    +import org.apache.commons.lang3.StringUtils;
     
     /**
      * 客服消息builder
    diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxMpBaseAPITest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxMpBaseAPITest.java
    index 7caaee50..7f5bdf80 100644
    --- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxMpBaseAPITest.java
    +++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxMpBaseAPITest.java
    @@ -2,8 +2,8 @@ package me.chanjar.weixin.mp.api;
     
     import com.google.inject.Inject;
     import me.chanjar.weixin.common.exception.WxErrorException;
    -import me.chanjar.weixin.common.util.StringUtils;
     import me.chanjar.weixin.mp.api.impl.WxMpServiceImpl;
    +import org.apache.commons.lang3.StringUtils;
     import org.testng.Assert;
     import org.testng.annotations.Guice;
     import org.testng.annotations.Test;
    diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/WxMpEndpointServlet.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/WxMpEndpointServlet.java
    index c560f397..4a6fd85b 100644
    --- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/WxMpEndpointServlet.java
    +++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/WxMpEndpointServlet.java
    @@ -1,17 +1,16 @@
     package me.chanjar.weixin.mp.demo;
     
    -import java.io.IOException;
    -
    -import javax.servlet.http.HttpServlet;
    -import javax.servlet.http.HttpServletRequest;
    -import javax.servlet.http.HttpServletResponse;
    -
    -import me.chanjar.weixin.common.util.StringUtils;
     import me.chanjar.weixin.mp.api.WxMpConfigStorage;
     import me.chanjar.weixin.mp.api.WxMpMessageRouter;
     import me.chanjar.weixin.mp.api.WxMpService;
     import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage;
     import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage;
    +import org.apache.commons.lang3.StringUtils;
    +
    +import javax.servlet.http.HttpServlet;
    +import javax.servlet.http.HttpServletRequest;
    +import javax.servlet.http.HttpServletResponse;
    +import java.io.IOException;
     
     /**
      * @author Daniel Qian
    
    From 866155d581b8d0134ae18fa4a26bedc4161d8585 Mon Sep 17 00:00:00 2001
    From: Binary Wang 
    Date: Thu, 27 Oct 2016 19:43:10 +0800
    Subject: [PATCH 74/83] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E9=83=A8=E5=88=86?=
     =?UTF-8?q?=E4=BB=A3=E7=A0=81=EF=BC=8C=E4=BD=BF=E7=94=A8apache=20commons?=
     =?UTF-8?q?=E9=87=8C=E7=8E=B0=E6=88=90=E7=9A=84=E5=B7=A5=E5=85=B7=E6=96=B9?=
     =?UTF-8?q?=E6=B3=95?=
    MIME-Version: 1.0
    Content-Type: text/plain; charset=UTF-8
    Content-Transfer-Encoding: 8bit
    
    ---
     .../me/chanjar/weixin/cp/api/WxCpServiceImpl.java   |  2 +-
     .../weixin/cp/util/json/WxCpMessageGsonAdapter.java |  2 +-
     .../me/chanjar/weixin/cp/api/WxCpBaseAPITest.java   |  8 +++-----
     .../chanjar/weixin/cp/demo/WxCpEndpointServlet.java | 13 ++++++-------
     4 files changed, 11 insertions(+), 14 deletions(-)
    
    diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpServiceImpl.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpServiceImpl.java
    index da95cab0..b044b468 100644
    --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpServiceImpl.java
    +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpServiceImpl.java
    @@ -12,7 +12,6 @@ import me.chanjar.weixin.common.session.StandardSessionManager;
     import me.chanjar.weixin.common.session.WxSession;
     import me.chanjar.weixin.common.session.WxSessionManager;
     import me.chanjar.weixin.common.util.RandomUtils;
    -import me.chanjar.weixin.common.util.StringUtils;
     import me.chanjar.weixin.common.util.crypto.SHA1;
     import me.chanjar.weixin.common.util.fs.FileUtils;
     import me.chanjar.weixin.common.util.http.*;
    @@ -22,6 +21,7 @@ import me.chanjar.weixin.cp.bean.WxCpMessage;
     import me.chanjar.weixin.cp.bean.WxCpTag;
     import me.chanjar.weixin.cp.bean.WxCpUser;
     import me.chanjar.weixin.cp.util.json.WxCpGsonBuilder;
    +import org.apache.commons.lang3.StringUtils;
     import org.apache.http.HttpHost;
     import org.apache.http.client.ClientProtocolException;
     import org.apache.http.client.config.RequestConfig;
    diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/util/json/WxCpMessageGsonAdapter.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/util/json/WxCpMessageGsonAdapter.java
    index 322658c2..7bf09c71 100644
    --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/util/json/WxCpMessageGsonAdapter.java
    +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/util/json/WxCpMessageGsonAdapter.java
    @@ -10,8 +10,8 @@ package me.chanjar.weixin.cp.util.json;
     
     import com.google.gson.*;
     import me.chanjar.weixin.common.api.WxConsts;
    -import me.chanjar.weixin.common.util.StringUtils;
     import me.chanjar.weixin.cp.bean.WxCpMessage;
    +import org.apache.commons.lang3.StringUtils;
     
     import java.lang.reflect.Type;
     
    diff --git a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/WxCpBaseAPITest.java b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/WxCpBaseAPITest.java
    index d2eb2ec6..894bb3b6 100644
    --- a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/WxCpBaseAPITest.java
    +++ b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/WxCpBaseAPITest.java
    @@ -1,14 +1,12 @@
     package me.chanjar.weixin.cp.api;
     
    +import com.google.inject.Inject;
    +import me.chanjar.weixin.common.exception.WxErrorException;
    +import org.apache.commons.lang3.StringUtils;
     import org.testng.Assert;
     import org.testng.annotations.Guice;
     import org.testng.annotations.Test;
     
    -import com.google.inject.Inject;
    -
    -import me.chanjar.weixin.common.exception.WxErrorException;
    -import me.chanjar.weixin.common.util.StringUtils;
    -
     /**
      * 基础API测试
      *
    diff --git a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/demo/WxCpEndpointServlet.java b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/demo/WxCpEndpointServlet.java
    index d59eb3f3..43bf1799 100644
    --- a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/demo/WxCpEndpointServlet.java
    +++ b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/demo/WxCpEndpointServlet.java
    @@ -1,18 +1,17 @@
     package me.chanjar.weixin.cp.demo;
     
    -import java.io.IOException;
    -
    -import javax.servlet.http.HttpServlet;
    -import javax.servlet.http.HttpServletRequest;
    -import javax.servlet.http.HttpServletResponse;
    -
    -import me.chanjar.weixin.common.util.StringUtils;
     import me.chanjar.weixin.cp.api.WxCpConfigStorage;
     import me.chanjar.weixin.cp.api.WxCpMessageRouter;
     import me.chanjar.weixin.cp.api.WxCpService;
     import me.chanjar.weixin.cp.bean.WxCpXmlMessage;
     import me.chanjar.weixin.cp.bean.WxCpXmlOutMessage;
     import me.chanjar.weixin.cp.util.crypto.WxCpCryptUtil;
    +import org.apache.commons.lang3.StringUtils;
    +
    +import javax.servlet.http.HttpServlet;
    +import javax.servlet.http.HttpServletRequest;
    +import javax.servlet.http.HttpServletResponse;
    +import java.io.IOException;
     
     /**
      * @author Daniel Qian
    
    From a0d0cb74801483d4dd82b4c7ce2683ec797f5ba0 Mon Sep 17 00:00:00 2001
    From: Binary Wang 
    Date: Fri, 28 Oct 2016 16:17:43 +0800
    Subject: [PATCH 75/83] =?UTF-8?q?=E6=9B=B4=E6=8D=A2jetty=E7=89=88=E6=9C=AC?=
     =?UTF-8?q?=EF=BC=8C=E8=80=81=E7=89=88=E6=9C=AC=E4=BC=9A=E6=8A=A5=E8=8E=AB?=
     =?UTF-8?q?=E5=90=8D=E5=BC=82=E5=B8=B8=E9=94=99=E8=AF=AF?=
    MIME-Version: 1.0
    Content-Type: text/plain; charset=UTF-8
    Content-Transfer-Encoding: 8bit
    
    ---
     pom.xml | 3 +--
     1 file changed, 1 insertion(+), 2 deletions(-)
    
    diff --git a/pom.xml b/pom.xml
    index 22c6efe6..99e1094d 100644
    --- a/pom.xml
    +++ b/pom.xml
    @@ -82,8 +82,7 @@
         3.5
         2.5
         1.10
    -    9.3.0.M0
    -    9.3.10.v20160621
    +    9.3.0.RC0
       
     
       
    
    From 639206ca1a06b6bff24b18ee15249074fbc8cc6a Mon Sep 17 00:00:00 2001
    From: Binary Wang 
    Date: Sat, 29 Oct 2016 16:45:05 +0800
    Subject: [PATCH 76/83] =?UTF-8?q?=E4=BF=AE=E5=A4=8DBeanUtils=E5=B7=A5?=
     =?UTF-8?q?=E5=85=B7=E7=B1=BB?=
    MIME-Version: 1.0
    Content-Type: text/plain; charset=UTF-8
    Content-Transfer-Encoding: 8bit
    
    ---
     .../java/me/chanjar/weixin/common/util/BeanUtils.java  | 10 ++++++++--
     1 file changed, 8 insertions(+), 2 deletions(-)
    
    diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/BeanUtils.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/BeanUtils.java
    index c73f1600..8935bc32 100644
    --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/BeanUtils.java
    +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/BeanUtils.java
    @@ -8,6 +8,8 @@ import me.chanjar.weixin.common.bean.result.WxError;
     import me.chanjar.weixin.common.exception.WxErrorException;
     
     import java.lang.reflect.Field;
    +import java.util.ArrayList;
    +import java.util.Arrays;
     import java.util.List;
     import java.util.Map;
     
    @@ -28,7 +30,9 @@ public class BeanUtils {
       public static void checkRequiredFields(Object bean) throws WxErrorException {
         List nullFields = Lists.newArrayList();
     
    -    for (Field field : bean.getClass().getDeclaredFields()) {
    +    List fields = new ArrayList<>( Arrays.asList(bean.getClass().getDeclaredFields()));
    +    fields.addAll(Arrays.asList(bean.getClass().getSuperclass().getDeclaredFields()));
    +    for (Field field : fields) {
           try {
             boolean isAccessible = field.isAccessible();
             field.setAccessible(true);
    @@ -55,7 +59,9 @@ public class BeanUtils {
        */
       public static Map xmlBean2Map(Object bean) {
         Map result = Maps.newHashMap();
    -    for (Field field : bean.getClass().getDeclaredFields()) {
    +    List fields = new ArrayList<>( Arrays.asList(bean.getClass().getDeclaredFields()));
    +    fields.addAll(Arrays.asList(bean.getClass().getSuperclass().getDeclaredFields()));
    +    for (Field field : fields) {
           try {
             boolean isAccessible = field.isAccessible();
             field.setAccessible(true);
    
    From 1ceb4bf707ab83cdaa32f17326c2934992df3c49 Mon Sep 17 00:00:00 2001
    From: Binary Wang 
    Date: Sat, 29 Oct 2016 16:59:53 +0800
    Subject: [PATCH 77/83] =?UTF-8?q?=E5=B0=BD=E9=87=8F=E4=BD=BF=E7=94=A8?=
     =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E5=BC=95=E7=94=A8=20use=20interface=20where?=
     =?UTF-8?q?=20possible?=
    MIME-Version: 1.0
    Content-Type: text/plain; charset=UTF-8
    Content-Transfer-Encoding: 8bit
    
    ---
     .../chanjar/weixin/mp/api/ApiTestModule.java  |  4 +--
     .../weixin/mp/api/WxMpBaseAPITest.java        |  3 +-
     .../chanjar/weixin/mp/api/WxMpJsAPITest.java  |  5 ++-
     .../weixin/mp/api/WxMpMassMessageAPITest.java |  3 +-
     .../weixin/mp/api/WxMpMiscAPITest.java        |  3 +-
     .../weixin/mp/api/WxMpShortUrlAPITest.java    |  5 ++-
     .../mp/api/impl/WxMpCardServiceImplTest.java  |  5 +--
     .../api/impl/WxMpDataCubeServiceImplTest.java |  3 +-
     .../mp/api/impl/WxMpKefuServiceImplTest.java  |  3 +-
     .../api/impl/WxMpMaterialServiceImplTest.java |  3 +-
     .../mp/api/impl/WxMpMenuServiceImplTest.java  | 31 ++++++++++---------
     .../mp/api/impl/WxMpPayServiceImplTest.java   |  8 ++---
     .../api/impl/WxMpQrCodeServiceImplTest.java   |  7 +++--
     .../mp/api/impl/WxMpServiceImplTest.java      |  3 +-
     .../mp/api/impl/WxMpStoreServiceImplTest.java |  3 +-
     .../impl/WxMpTemplateMsgServiceImplTest.java  |  3 +-
     .../WxMpUserBlacklistServiceImplTest.java     |  3 +-
     .../mp/api/impl/WxMpUserServiceImplTest.java  |  3 +-
     .../api/impl/WxMpUserTagServiceImplTest.java  |  3 +-
     19 files changed, 52 insertions(+), 49 deletions(-)
    
    diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/ApiTestModule.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/ApiTestModule.java
    index 4ec12cbd..310593c7 100644
    --- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/ApiTestModule.java
    +++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/ApiTestModule.java
    @@ -18,10 +18,10 @@ public class ApiTestModule implements Module {
             .getSystemResourceAsStream("test-config.xml")) {
           WxXmlMpInMemoryConfigStorage config = this
               .fromXml(WxXmlMpInMemoryConfigStorage.class, is1);
    -      WxMpServiceImpl wxService = new WxMpServiceImpl();
    +      WxMpService wxService = new WxMpServiceImpl();
           wxService.setWxMpConfigStorage(config);
     
    -      binder.bind(WxMpServiceImpl.class).toInstance(wxService);
    +      binder.bind(WxMpService.class).toInstance(wxService);
           binder.bind(WxMpConfigStorage.class).toInstance(config);
         } catch (IOException e) {
           e.printStackTrace();
    diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxMpBaseAPITest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxMpBaseAPITest.java
    index 7f5bdf80..b6904eb1 100644
    --- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxMpBaseAPITest.java
    +++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxMpBaseAPITest.java
    @@ -2,7 +2,6 @@ package me.chanjar.weixin.mp.api;
     
     import com.google.inject.Inject;
     import me.chanjar.weixin.common.exception.WxErrorException;
    -import me.chanjar.weixin.mp.api.impl.WxMpServiceImpl;
     import org.apache.commons.lang3.StringUtils;
     import org.testng.Assert;
     import org.testng.annotations.Guice;
    @@ -18,7 +17,7 @@ import org.testng.annotations.Test;
     public class WxMpBaseAPITest {
     
       @Inject
    -  protected WxMpServiceImpl wxService;
    +  protected WxMpService wxService;
     
       public void testRefreshAccessToken() throws WxErrorException {
         WxMpConfigStorage configStorage = this.wxService.getWxMpConfigStorage();
    diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxMpJsAPITest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxMpJsAPITest.java
    index d4c49a0b..54dcdc04 100644
    --- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxMpJsAPITest.java
    +++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxMpJsAPITest.java
    @@ -8,11 +8,10 @@ import com.google.inject.Inject;
     
     import me.chanjar.weixin.common.exception.WxErrorException;
     import me.chanjar.weixin.common.util.crypto.SHA1;
    -import me.chanjar.weixin.mp.api.impl.WxMpServiceImpl;
     
     /**
      * 测试jsapi ticket接口
    - * 
    + *
      * @author chanjarster
      */
     @Test(groups = "jsAPI", dependsOnGroups = "baseAPI")
    @@ -20,7 +19,7 @@ import me.chanjar.weixin.mp.api.impl.WxMpServiceImpl;
     public class WxMpJsAPITest {
     
       @Inject
    -  protected WxMpServiceImpl wxService;
    +  protected WxMpService wxService;
     
     
       public void testJsapiTicket() throws WxErrorException {
    diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxMpMassMessageAPITest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxMpMassMessageAPITest.java
    index e093d575..bab9b7ab 100644
    --- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxMpMassMessageAPITest.java
    +++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxMpMassMessageAPITest.java
    @@ -13,7 +13,6 @@ import com.google.inject.Inject;
     import me.chanjar.weixin.common.api.WxConsts;
     import me.chanjar.weixin.common.bean.result.WxMediaUploadResult;
     import me.chanjar.weixin.common.exception.WxErrorException;
    -import me.chanjar.weixin.mp.api.impl.WxMpServiceImpl;
     import me.chanjar.weixin.mp.bean.WxMpMassNews;
     import me.chanjar.weixin.mp.bean.WxMpMassOpenIdsMessage;
     import me.chanjar.weixin.mp.bean.WxMpMassTagMessage;
    @@ -31,7 +30,7 @@ import me.chanjar.weixin.mp.bean.result.WxMpMassUploadResult;
     public class WxMpMassMessageAPITest {
     
       @Inject
    -  protected WxMpServiceImpl wxService;
    +  protected WxMpService wxService;
     
       @Test
       public void testTextMassOpenIdsMessageSend() throws WxErrorException {
    diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxMpMiscAPITest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxMpMiscAPITest.java
    index de0725ea..656c7162 100644
    --- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxMpMiscAPITest.java
    +++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxMpMiscAPITest.java
    @@ -2,7 +2,6 @@ package me.chanjar.weixin.mp.api;
     
     import com.google.inject.Inject;
     import me.chanjar.weixin.common.exception.WxErrorException;
    -import me.chanjar.weixin.mp.api.impl.WxMpServiceImpl;
     import org.testng.Assert;
     import org.testng.annotations.Guice;
     import org.testng.annotations.Test;
    @@ -19,7 +18,7 @@ import java.util.Arrays;
     public class WxMpMiscAPITest {
     
       @Inject
    -  protected WxMpServiceImpl wxService;
    +  protected WxMpService wxService;
     
       @Test
       public void testGetCallbackIP() throws WxErrorException {
    diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxMpShortUrlAPITest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxMpShortUrlAPITest.java
    index d392d1f5..87cf7406 100644
    --- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxMpShortUrlAPITest.java
    +++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxMpShortUrlAPITest.java
    @@ -2,14 +2,13 @@ package me.chanjar.weixin.mp.api;
     
     import com.google.inject.Inject;
     import me.chanjar.weixin.common.exception.WxErrorException;
    -import me.chanjar.weixin.mp.api.impl.WxMpServiceImpl;
     import org.testng.Assert;
     import org.testng.annotations.Guice;
     import org.testng.annotations.Test;
     
     /**
      * 测试短连接
    - * 
    + *
      * @author chanjarster
      */
     @Test(groups = "shortURLAPI")
    @@ -17,7 +16,7 @@ import org.testng.annotations.Test;
     public class WxMpShortUrlAPITest {
     
       @Inject
    -  protected WxMpServiceImpl wxService;
    +  protected WxMpService wxService;
     
       public void testShortUrl() throws WxErrorException {
         String shortUrl = this.wxService.shortUrl("www.baidu.com");
    diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpCardServiceImplTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpCardServiceImplTest.java
    index b7981dbd..97619223 100644
    --- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpCardServiceImplTest.java
    +++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpCardServiceImplTest.java
    @@ -3,6 +3,7 @@ package me.chanjar.weixin.mp.api.impl;
     import com.google.inject.Inject;
     import me.chanjar.weixin.common.bean.WxCardApiSignature;
     import me.chanjar.weixin.mp.api.ApiTestModule;
    +import me.chanjar.weixin.mp.api.WxMpService;
     import me.chanjar.weixin.mp.bean.result.WxMpCardResult;
     import org.testng.annotations.Guice;
     import org.testng.annotations.Test;
    @@ -19,7 +20,7 @@ import static org.testng.AssertJUnit.assertNotNull;
     public class WxMpCardServiceImplTest {
     
       @Inject
    -  protected WxMpServiceImpl wxService;
    +  protected WxMpService wxService;
       private String cardId = "123";
       private String code = "good";
       private String openid = "abc";
    @@ -90,4 +91,4 @@ public class WxMpCardServiceImplTest {
         System.out.println(result);
       }
     
    -}
    \ No newline at end of file
    +}
    diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpDataCubeServiceImplTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpDataCubeServiceImplTest.java
    index 1111f96a..3e2257a3 100644
    --- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpDataCubeServiceImplTest.java
    +++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpDataCubeServiceImplTest.java
    @@ -4,6 +4,7 @@ import java.text.ParseException;
     import java.util.Date;
     import java.util.List;
     
    +import me.chanjar.weixin.mp.api.WxMpService;
     import org.apache.commons.lang3.time.FastDateFormat;
     import org.testng.Assert;
     import org.testng.annotations.DataProvider;
    @@ -32,7 +33,7 @@ public class WxMpDataCubeServiceImplTest {
           .getInstance("yyyy-MM-dd");
     
       @Inject
    -  protected WxMpServiceImpl wxService;
    +  protected WxMpService wxService;
     
       @DataProvider
       public Object[][] oneDay() throws ParseException {
    diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpKefuServiceImplTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpKefuServiceImplTest.java
    index 224fc994..3150dec3 100644
    --- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpKefuServiceImplTest.java
    +++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpKefuServiceImplTest.java
    @@ -4,6 +4,7 @@ import com.google.inject.Inject;
     import me.chanjar.weixin.common.api.WxConsts;
     import me.chanjar.weixin.common.exception.WxErrorException;
     import me.chanjar.weixin.mp.api.ApiTestModule;
    +import me.chanjar.weixin.mp.api.WxMpService;
     import me.chanjar.weixin.mp.api.WxXmlMpInMemoryConfigStorage;
     import me.chanjar.weixin.mp.bean.kefu.WxMpKefuMessage;
     import me.chanjar.weixin.mp.bean.kefu.request.WxMpKfAccountRequest;
    @@ -27,7 +28,7 @@ import java.util.Date;
     public class WxMpKefuServiceImplTest {
     
       @Inject
    -  protected WxMpServiceImpl wxService;
    +  protected WxMpService wxService;
     
       public void testSendKefuMpNewsMessage() throws WxErrorException {
         WxXmlMpInMemoryConfigStorage configStorage = (WxXmlMpInMemoryConfigStorage) this.wxService
    diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpMaterialServiceImplTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpMaterialServiceImplTest.java
    index 940ada2f..043a49ec 100644
    --- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpMaterialServiceImplTest.java
    +++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpMaterialServiceImplTest.java
    @@ -6,6 +6,7 @@ import me.chanjar.weixin.common.bean.result.WxMediaUploadResult;
     import me.chanjar.weixin.common.exception.WxErrorException;
     import me.chanjar.weixin.common.util.fs.FileUtils;
     import me.chanjar.weixin.mp.api.ApiTestModule;
    +import me.chanjar.weixin.mp.api.WxMpService;
     import me.chanjar.weixin.mp.bean.material.WxMpMaterial;
     import me.chanjar.weixin.mp.bean.material.WxMpMaterialArticleUpdate;
     import me.chanjar.weixin.mp.bean.material.WxMpMaterialNews;
    @@ -32,7 +33,7 @@ import static org.junit.Assert.*;
     @Guice(modules = ApiTestModule.class)
     public class WxMpMaterialServiceImplTest {
       @Inject
    -  protected WxMpServiceImpl wxService;
    +  protected WxMpService wxService;
     
       private Map> mediaIds = new LinkedHashMap<>();
       // 缩略图的id,测试上传图文使用
    diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpMenuServiceImplTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpMenuServiceImplTest.java
    index 1e0b60dd..f31a0e4b 100644
    --- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpMenuServiceImplTest.java
    +++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpMenuServiceImplTest.java
    @@ -1,5 +1,6 @@
     package me.chanjar.weixin.mp.api.impl;
     
    +import me.chanjar.weixin.mp.api.WxMpService;
     import org.testng.Assert;
     import org.testng.annotations.DataProvider;
     import org.testng.annotations.Guice;
    @@ -24,8 +25,8 @@ import me.chanjar.weixin.mp.api.ApiTestModule;
     public class WxMpMenuServiceImplTest {
     
       @Inject
    -  protected WxMpServiceImpl wxService;
    -  
    +  protected WxMpService wxService;
    +
       @Test(dataProvider = "menu")
       public void testCreateMenu(WxMenu wxMenu) throws WxErrorException {
         System.out.println(wxMenu.toJson());
    @@ -82,12 +83,12 @@ public class WxMpMenuServiceImplTest {
         Assert.assertNotNull(wxMenu);
         System.out.println(wxMenu.toJson());
       }
    -  
    +
       @Test(dependsOnMethods = { "testGetMenu"})
       public void testDeleteMenu() throws WxErrorException {
         this.wxService.getMenuService().menuDelete();
       }
    -  
    +
       @DataProvider(name="menu")
       public Object[][] getMenu() {
         WxMenu menu = new WxMenu();
    @@ -95,45 +96,45 @@ public class WxMpMenuServiceImplTest {
         button1.setType(WxConsts.BUTTON_CLICK);
         button1.setName("今日歌曲");
         button1.setKey("V1001_TODAY_MUSIC");
    -    
    +
         WxMenuButton button2 = new WxMenuButton();
         button2.setType(WxConsts.BUTTON_CLICK);
         button2.setName("歌手简介");
         button2.setKey("V1001_TODAY_SINGER");
    -    
    +
         WxMenuButton button3 = new WxMenuButton();
         button3.setName("菜单");
    -    
    +
         menu.getButtons().add(button1);
         menu.getButtons().add(button2);
         menu.getButtons().add(button3);
    -    
    +
         WxMenuButton button31 = new WxMenuButton();
         button31.setType(WxConsts.BUTTON_VIEW);
         button31.setName("搜索");
         button31.setUrl("http://www.soso.com/");
    -    
    +
         WxMenuButton button32 = new WxMenuButton();
         button32.setType(WxConsts.BUTTON_VIEW);
         button32.setName("视频");
         button32.setUrl("http://v.qq.com/");
    -    
    +
         WxMenuButton button33 = new WxMenuButton();
         button33.setType(WxConsts.BUTTON_CLICK);
         button33.setName("赞一下我们");
         button33.setKey("V1001_GOOD");
    -    
    +
         button3.getSubButtons().add(button31);
         button3.getSubButtons().add(button32);
         button3.getSubButtons().add(button33);
    -    
    +
         return new Object[][] {
             new Object[] {
                 menu
             }
         };
    -  
    +
       }
    -  
    -  
    +
    +
     }
    diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImplTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImplTest.java
    index e2febcdb..b4e22f11 100644
    --- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImplTest.java
    +++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImplTest.java
    @@ -3,6 +3,7 @@ package me.chanjar.weixin.mp.api.impl;
     import com.google.inject.Inject;
     import me.chanjar.weixin.common.exception.WxErrorException;
     import me.chanjar.weixin.mp.api.ApiTestModule;
    +import me.chanjar.weixin.mp.api.WxMpService;
     import me.chanjar.weixin.mp.api.WxXmlMpInMemoryConfigStorage;
     import me.chanjar.weixin.mp.bean.pay.request.WxEntPayRequest;
     import me.chanjar.weixin.mp.bean.pay.request.WxPayRefundRequest;
    @@ -26,7 +27,7 @@ import java.io.File;
     public class WxMpPayServiceImplTest {
     
       @Inject
    -  protected WxMpServiceImpl wxService;
    +  protected WxMpService wxService;
     
       @Test
       public void testGetPayInfo() throws Exception {
    @@ -65,7 +66,6 @@ public class WxMpPayServiceImplTest {
     
       /**
        * Test method for {@link me.chanjar.weixin.mp.api.impl.WxMpPayServiceImpl#unifiedOrder(WxPayUnifiedOrderRequest)}.
    -   * @throws WxErrorException
        */
       @Test
       public void testUnifiedOrder() throws WxErrorException {
    @@ -78,7 +78,6 @@ public class WxMpPayServiceImplTest {
     
       /**
        * Test method for {@link me.chanjar.weixin.mp.api.impl.WxMpPayServiceImpl#queryOrder(String, String)} .
    -   * @throws WxErrorException
        */
       @Test
       public final void testQueryOrder() throws WxErrorException {
    @@ -89,7 +88,6 @@ public class WxMpPayServiceImplTest {
     
       /**
        * Test method for {@link me.chanjar.weixin.mp.api.impl.WxMpPayServiceImpl#closeOrder(String)} .
    -   * @throws WxErrorException
        */
       @Test
       public final void testCloseOrder() throws WxErrorException {
    @@ -98,7 +96,6 @@ public class WxMpPayServiceImplTest {
     
       /**
        * Test method for {@link me.chanjar.weixin.mp.api.impl.WxMpPayServiceImpl#entPay(WxEntPayRequest, File)}.
    -   * @throws WxErrorException
        */
       @Test
       public final void testEntPay() throws WxErrorException {
    @@ -109,7 +106,6 @@ public class WxMpPayServiceImplTest {
     
       /**
        * Test method for {@link me.chanjar.weixin.mp.api.impl.WxMpPayServiceImpl#queryEntPay(String, File)}.
    -   * @throws WxErrorException
        */
       @Test
       public final void testQueryEntPay() throws WxErrorException {
    diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpQrCodeServiceImplTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpQrCodeServiceImplTest.java
    index d2ed01da..4c53ac17 100644
    --- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpQrCodeServiceImplTest.java
    +++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpQrCodeServiceImplTest.java
    @@ -3,6 +3,7 @@ package me.chanjar.weixin.mp.api.impl;
     import com.google.inject.Inject;
     import me.chanjar.weixin.common.exception.WxErrorException;
     import me.chanjar.weixin.mp.api.ApiTestModule;
    +import me.chanjar.weixin.mp.api.WxMpService;
     import me.chanjar.weixin.mp.bean.result.WxMpQrCodeTicket;
     import org.testng.Assert;
     import org.testng.annotations.Guice;
    @@ -12,7 +13,7 @@ import java.io.File;
     
     /**
      * 测试用户相关的接口
    - * 
    + *
      * @author chanjarster
      */
     @Test(groups = "qrCodeAPI")
    @@ -20,7 +21,7 @@ import java.io.File;
     public class WxMpQrCodeServiceImplTest {
     
       @Inject
    -  protected WxMpServiceImpl wxService;
    +  protected WxMpService wxService;
     
       public void testQrCodeCreateTmpTicket() throws WxErrorException {
         WxMpQrCodeTicket ticket = this.wxService.getQrcodeService().qrCodeCreateTmpTicket(1, null);
    @@ -44,7 +45,7 @@ public class WxMpQrCodeServiceImplTest {
         Assert.assertNotNull(file);
         System.out.println(file.getAbsolutePath());
       }
    -  
    +
       public void testQrCodePictureUrl() throws WxErrorException {
         WxMpQrCodeTicket ticket = this.wxService.getQrcodeService().qrCodeCreateLastTicket(1);
         String url = this.wxService.getQrcodeService().qrCodePictureUrl(ticket.getTicket());
    diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpServiceImplTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpServiceImplTest.java
    index 49316948..c6b8689f 100644
    --- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpServiceImplTest.java
    +++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpServiceImplTest.java
    @@ -3,6 +3,7 @@ package me.chanjar.weixin.mp.api.impl;
     import com.google.inject.Inject;
     import me.chanjar.weixin.common.api.WxConsts;
     import me.chanjar.weixin.mp.api.ApiTestModule;
    +import me.chanjar.weixin.mp.api.WxMpService;
     import me.chanjar.weixin.mp.api.WxXmlMpInMemoryConfigStorage;
     import org.testng.Assert;
     import org.testng.annotations.Guice;
    @@ -13,7 +14,7 @@ import org.testng.annotations.Test;
     public class WxMpServiceImplTest {
     
       @Inject
    -  private WxMpServiceImpl wxService;
    +  private WxMpService wxService;
     
       @Test
       public void testCheckSignature() {
    diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpStoreServiceImplTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpStoreServiceImplTest.java
    index e610204b..63609293 100644
    --- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpStoreServiceImplTest.java
    +++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpStoreServiceImplTest.java
    @@ -3,6 +3,7 @@ package me.chanjar.weixin.mp.api.impl;
     import com.google.inject.Inject;
     import me.chanjar.weixin.common.exception.WxErrorException;
     import me.chanjar.weixin.mp.api.ApiTestModule;
    +import me.chanjar.weixin.mp.api.WxMpService;
     import me.chanjar.weixin.mp.bean.store.WxMpStoreBaseInfo;
     import me.chanjar.weixin.mp.bean.store.WxMpStoreInfo;
     import me.chanjar.weixin.mp.bean.store.WxMpStoreListResult;
    @@ -23,7 +24,7 @@ import static org.junit.Assert.assertNotNull;
     @Guice(modules = ApiTestModule.class)
     public class WxMpStoreServiceImplTest {
       @Inject
    -  private WxMpServiceImpl wxMpService;
    +  private WxMpService wxMpService;
     
       /**
        * Test method for {@link me.chanjar.weixin.mp.api.impl.WxMpStoreServiceImpl#add(me.chanjar.weixin.mp.bean.store.WxMpStoreBaseInfo)}.
    diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpTemplateMsgServiceImplTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpTemplateMsgServiceImplTest.java
    index d6f479b5..9b50d5df 100644
    --- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpTemplateMsgServiceImplTest.java
    +++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpTemplateMsgServiceImplTest.java
    @@ -3,6 +3,7 @@ package me.chanjar.weixin.mp.api.impl;
     import com.google.inject.Inject;
     import me.chanjar.weixin.common.exception.WxErrorException;
     import me.chanjar.weixin.mp.api.ApiTestModule;
    +import me.chanjar.weixin.mp.api.WxMpService;
     import me.chanjar.weixin.mp.api.WxXmlMpInMemoryConfigStorage;
     import me.chanjar.weixin.mp.bean.template.WxMpTemplate;
     import me.chanjar.weixin.mp.bean.template.WxMpTemplateData;
    @@ -25,7 +26,7 @@ import java.util.List;
     @Guice(modules = ApiTestModule.class)
     public class WxMpTemplateMsgServiceImplTest {
       @Inject
    -  protected WxMpServiceImpl wxService;
    +  protected WxMpService wxService;
     
       @Test(invocationCount = 10, threadPoolSize = 10)
       public void testSendTemplateMsg() throws WxErrorException {
    diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpUserBlacklistServiceImplTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpUserBlacklistServiceImplTest.java
    index aebf6926..2bcc3aea 100644
    --- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpUserBlacklistServiceImplTest.java
    +++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpUserBlacklistServiceImplTest.java
    @@ -1,6 +1,7 @@
     package me.chanjar.weixin.mp.api.impl;
     
     import me.chanjar.weixin.mp.api.ApiTestModule;
    +import me.chanjar.weixin.mp.api.WxMpService;
     import me.chanjar.weixin.mp.api.WxXmlMpInMemoryConfigStorage;
     import me.chanjar.weixin.mp.bean.result.WxMpUserBlacklistGetResult;
     import org.testng.Assert;
    @@ -18,7 +19,7 @@ import java.util.List;
     @Guice(modules = ApiTestModule.class)
     public class WxMpUserBlacklistServiceImplTest {
       @Inject
    -  protected WxMpServiceImpl wxService;
    +  protected WxMpService wxService;
     
       @Test
       public void testGetBlacklist() throws Exception {
    diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpUserServiceImplTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpUserServiceImplTest.java
    index 4242df10..02252800 100644
    --- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpUserServiceImplTest.java
    +++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpUserServiceImplTest.java
    @@ -4,6 +4,7 @@ package me.chanjar.weixin.mp.api.impl;
     import java.util.ArrayList;
     import java.util.List;
     
    +import me.chanjar.weixin.mp.api.WxMpService;
     import org.testng.Assert;
     import org.testng.annotations.BeforeTest;
     import org.testng.annotations.Guice;
    @@ -29,7 +30,7 @@ import me.chanjar.weixin.mp.bean.result.WxMpUserList;
     public class WxMpUserServiceImplTest {
     
       @Inject
    -  private WxMpServiceImpl wxService;
    +  private WxMpService wxService;
     
       private WxXmlMpInMemoryConfigStorage configProvider;
     
    diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpUserTagServiceImplTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpUserTagServiceImplTest.java
    index 2c67ea3f..bca04a06 100644
    --- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpUserTagServiceImplTest.java
    +++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpUserTagServiceImplTest.java
    @@ -2,6 +2,7 @@ package me.chanjar.weixin.mp.api.impl;
     
     import java.util.List;
     
    +import me.chanjar.weixin.mp.api.WxMpService;
     import org.testng.Assert;
     import org.testng.annotations.Guice;
     import org.testng.annotations.Test;
    @@ -22,7 +23,7 @@ import me.chanjar.weixin.mp.bean.tag.WxUserTag;
     @Guice(modules = ApiTestModule.class)
     public class WxMpUserTagServiceImplTest {
       @Inject
    -  protected WxMpServiceImpl wxService;
    +  protected WxMpService wxService;
     
       private Long tagId = 2L;
     
    
    From d88a8d3d8392dcab1937a0372b0c4070f8e2e41c Mon Sep 17 00:00:00 2001
    From: Binary Wang 
    Date: Sat, 29 Oct 2016 17:14:05 +0800
    Subject: [PATCH 78/83] =?UTF-8?q?=E6=8A=BD=E5=8F=96=E8=8E=B7=E5=8F=96?=
     =?UTF-8?q?=E4=BB=A3=E7=90=86=E5=AF=B9=E8=B1=A1=E7=9A=84=E6=96=B9=E6=B3=95?=
     =?UTF-8?q?=E5=88=B0=E6=8E=A5=E5=8F=A3=E4=B8=AD=EF=BC=8C=E6=96=B9=E4=BE=BF?=
     =?UTF-8?q?=E5=BE=AE=E4=BF=A1=E6=94=AF=E4=BB=98=E8=B0=83=E7=94=A8=EF=BC=8C?=
     =?UTF-8?q?=E5=B9=B6=E4=BC=98=E5=8C=96=E9=83=A8=E5=88=86=E4=BB=A3=E7=A0=81?=
    MIME-Version: 1.0
    Content-Type: text/plain; charset=UTF-8
    Content-Transfer-Encoding: 8bit
    
    ---
     .../me/chanjar/weixin/mp/api/WxMpService.java |  6 +++
     .../mp/api/impl/WxMpPayServiceImpl.java       | 40 ++++++++++++++++---
     .../weixin/mp/api/impl/WxMpServiceImpl.java   |  1 +
     3 files changed, 41 insertions(+), 6 deletions(-)
    
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpService.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpService.java
    index 01ec5b13..a74e718d 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpService.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpService.java
    @@ -5,6 +5,7 @@ import me.chanjar.weixin.common.exception.WxErrorException;
     import me.chanjar.weixin.common.util.http.RequestExecutor;
     import me.chanjar.weixin.mp.bean.*;
     import me.chanjar.weixin.mp.bean.result.*;
    +import org.apache.http.HttpHost;
     
     /**
      * 微信API的Service
    @@ -228,6 +229,11 @@ public interface WxMpService {
        */
        T execute(RequestExecutor executor, String uri, E data) throws WxErrorException;
     
    +  /**
    +   * 获取代理对象
    +   */
    +  HttpHost getHttpProxy();
    +
       /**
        * 注入 {@link WxMpConfigStorage} 的实现
        */
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImpl.java
    index 79acad73..9064515d 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImpl.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImpl.java
    @@ -14,6 +14,8 @@ import me.chanjar.weixin.mp.bean.pay.result.*;
     import org.apache.commons.codec.digest.DigestUtils;
     import org.apache.commons.lang3.ArrayUtils;
     import org.apache.commons.lang3.StringUtils;
    +import org.apache.http.Consts;
    +import org.apache.http.client.config.RequestConfig;
     import org.apache.http.client.methods.CloseableHttpResponse;
     import org.apache.http.client.methods.HttpPost;
     import org.apache.http.conn.ssl.DefaultHostnameVerifier;
    @@ -27,6 +29,7 @@ import org.apache.http.util.EntityUtils;
     import javax.net.ssl.SSLContext;
     import java.io.File;
     import java.io.FileInputStream;
    +import java.io.IOException;
     import java.security.KeyStore;
     import java.util.*;
     
    @@ -199,7 +202,7 @@ public class WxMpPayServiceImpl implements WxMpPayService {
     
         String url = PAY_BASE_URL + "/pay/orderquery";
     
    -    String responseContent = this.wxMpService.post(url, xstream.toXML(request));
    +    String responseContent = this.executeRequest(url, xstream.toXML(request));
         WxPayOrderQueryResult result = (WxPayOrderQueryResult) xstream.fromXML(responseContent);
         result.composeCoupons(responseContent);
         if ("FAIL".equals(result.getResultCode())) {
    @@ -233,7 +236,7 @@ public class WxMpPayServiceImpl implements WxMpPayService {
     
         String url = PAY_BASE_URL + "/pay/closeorder";
     
    -    String responseContent = this.wxMpService.post(url, xstream.toXML(request));
    +    String responseContent = this.executeRequest(url, xstream.toXML(request));
         WxPayOrderCloseResult result = (WxPayOrderCloseResult) xstream.fromXML(responseContent);
         if ("FAIL".equals(result.getResultCode())) {
           throw new WxErrorException(WxError.newBuilder()
    @@ -263,7 +266,7 @@ public class WxMpPayServiceImpl implements WxMpPayService {
     
         String url = PAY_BASE_URL + "/pay/unifiedorder";
     
    -    String responseContent = this.wxMpService.post(url, xstream.toXML(request));
    +    String responseContent = this.executeRequest(url, xstream.toXML(request));
         WxPayUnifiedOrderResult result = (WxPayUnifiedOrderResult) xstream
             .fromXML(responseContent);
         if ("FAIL".equals(result.getResultCode())) {
    @@ -377,7 +380,27 @@ public class WxMpPayServiceImpl implements WxMpPayService {
         return result;
       }
     
    +  private String executeRequest( String url, String requestStr) throws WxErrorException {
    +    HttpPost httpPost = new HttpPost(url);
    +    if (this.wxMpService.getHttpProxy() != null) {
    +      httpPost.setConfig(RequestConfig.custom().setProxy(this.wxMpService.getHttpProxy()).build());
    +    }
    +
    +    try (CloseableHttpClient httpclient = HttpClients.custom().build()) {
    +      httpPost.setEntity(new StringEntity(new String(requestStr.getBytes("UTF-8"), "ISO-8859-1")));
    +
    +      try (CloseableHttpResponse response = httpclient.execute(httpPost)) {
    +        return EntityUtils.toString(response.getEntity(), Consts.UTF_8);
    +      }
    +    } catch (IOException e) {
    +      throw new WxErrorException(WxError.newBuilder().setErrorMsg(e.getMessage()).build(), e);
    +    }finally {
    +      httpPost.releaseConnection();
    +    }
    +  }
    +
       private String executeRequestWithKeyFile( String url, File keyFile, String requestStr, String mchId) throws WxErrorException {
    +
         try (FileInputStream inputStream = new FileInputStream(keyFile)) {
           KeyStore keyStore = KeyStore.getInstance("PKCS12");
           keyStore.load(inputStream, mchId.toCharArray());
    @@ -386,13 +409,18 @@ public class WxMpPayServiceImpl implements WxMpPayService {
           SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslcontext, new String[] { "TLSv1" }, null,
               new DefaultHostnameVerifier());
     
    +      HttpPost httpPost = new HttpPost(url);
    +      if (this.wxMpService.getHttpProxy() != null) {
    +        httpPost.setConfig(RequestConfig.custom().setProxy(this.wxMpService.getHttpProxy()).build());
    +      }
    +
           try (CloseableHttpClient httpclient = HttpClients.custom().setSSLSocketFactory(sslsf).build()) {
    -        HttpPost httpPost = new HttpPost(url);
             httpPost.setEntity(new StringEntity(new String(requestStr.getBytes("UTF-8"), "ISO-8859-1")));
    -
             try (CloseableHttpResponse response = httpclient.execute(httpPost)) {
    -          return EntityUtils.toString(response.getEntity());
    +          return EntityUtils.toString(response.getEntity(), Consts.UTF_8);
             }
    +      }finally {
    +        httpPost.releaseConnection();
           }
         } catch (Exception e) {
           throw new WxErrorException(WxError.newBuilder().setErrorMsg(e.getMessage()).build(), e);
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpServiceImpl.java
    index 7b5171f5..84ba693c 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpServiceImpl.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpServiceImpl.java
    @@ -425,6 +425,7 @@ public class WxMpServiceImpl implements WxMpService {
         }
       }
     
    +  @Override
       public HttpHost getHttpProxy() {
         return this.httpProxy;
       }
    
    From 4fa672d46c860daa2e9e4215346539341c23ea6a Mon Sep 17 00:00:00 2001
    From: Binary Wang 
    Date: Sat, 29 Oct 2016 17:25:25 +0800
    Subject: [PATCH 79/83] =?UTF-8?q?=E5=BE=AE=E4=BF=A1=E6=94=AF=E4=BB=98?=
     =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E5=A2=9E=E5=8A=A0=E6=97=A5=E5=BF=97?=
    MIME-Version: 1.0
    Content-Type: text/plain; charset=UTF-8
    Content-Transfer-Encoding: 8bit
    
    ---
     .../weixin/mp/api/impl/WxMpPayServiceImpl.java  | 17 +++++++++++++----
     .../weixin/mp/api/impl/WxMpServiceImpl.java     |  2 +-
     2 files changed, 14 insertions(+), 5 deletions(-)
    
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImpl.java
    index 9064515d..7f628aff 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImpl.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImpl.java
    @@ -25,6 +25,8 @@ import org.apache.http.impl.client.CloseableHttpClient;
     import org.apache.http.impl.client.HttpClients;
     import org.apache.http.ssl.SSLContexts;
     import org.apache.http.util.EntityUtils;
    +import org.slf4j.Logger;
    +import org.slf4j.LoggerFactory;
     
     import javax.net.ssl.SSLContext;
     import java.io.File;
    @@ -40,6 +42,8 @@ import java.util.*;
      */
     public class WxMpPayServiceImpl implements WxMpPayService {
     
    +  protected final Logger log = LoggerFactory.getLogger(this.getClass());
    +
       private static final String PAY_BASE_URL = "https://api.mch.weixin.qq.com";
       private static final String[] TRADE_TYPES = new String[]{"JSAPI","NATIVE", "APP"};
       private static final String[] REFUND_ACCOUNT =  new String[]{"REFUND_SOURCE_RECHARGE_FUNDS",
    @@ -269,7 +273,7 @@ public class WxMpPayServiceImpl implements WxMpPayService {
         String responseContent = this.executeRequest(url, xstream.toXML(request));
         WxPayUnifiedOrderResult result = (WxPayUnifiedOrderResult) xstream
             .fromXML(responseContent);
    -    if ("FAIL".equals(result.getResultCode())) {
    +    if ("FAIL".equals(result.getResultCode()) || "FAIL".equals(result.getReturnCode())) {
           throw new WxErrorException(WxError.newBuilder()
               .setErrorMsg(result.getErrCode() + ":" + result.getErrCodeDes())
               .build());
    @@ -390,9 +394,12 @@ public class WxMpPayServiceImpl implements WxMpPayService {
           httpPost.setEntity(new StringEntity(new String(requestStr.getBytes("UTF-8"), "ISO-8859-1")));
     
           try (CloseableHttpResponse response = httpclient.execute(httpPost)) {
    -        return EntityUtils.toString(response.getEntity(), Consts.UTF_8);
    +        String result = EntityUtils.toString(response.getEntity(), Consts.UTF_8);
    +        this.log.debug("\n[URL]:  {}\n[PARAMS]: {}\n[RESPONSE]: {}",url, requestStr, result);
    +        return result;
           }
         } catch (IOException e) {
    +      this.log.error("\n[URL]:  {}\n[PARAMS]: {}\n[EXCEPTION]: {}", url, requestStr, e.getMessage());
           throw new WxErrorException(WxError.newBuilder().setErrorMsg(e.getMessage()).build(), e);
         }finally {
           httpPost.releaseConnection();
    @@ -400,7 +407,6 @@ public class WxMpPayServiceImpl implements WxMpPayService {
       }
     
       private String executeRequestWithKeyFile( String url, File keyFile, String requestStr, String mchId) throws WxErrorException {
    -
         try (FileInputStream inputStream = new FileInputStream(keyFile)) {
           KeyStore keyStore = KeyStore.getInstance("PKCS12");
           keyStore.load(inputStream, mchId.toCharArray());
    @@ -417,12 +423,15 @@ public class WxMpPayServiceImpl implements WxMpPayService {
           try (CloseableHttpClient httpclient = HttpClients.custom().setSSLSocketFactory(sslsf).build()) {
             httpPost.setEntity(new StringEntity(new String(requestStr.getBytes("UTF-8"), "ISO-8859-1")));
             try (CloseableHttpResponse response = httpclient.execute(httpPost)) {
    -          return EntityUtils.toString(response.getEntity(), Consts.UTF_8);
    +          String result = EntityUtils.toString(response.getEntity(), Consts.UTF_8);
    +          this.log.debug("\n[URL]:  {}\n[PARAMS]: {}\n[RESPONSE]: {}",url, requestStr, result);
    +          return result;
             }
           }finally {
             httpPost.releaseConnection();
           }
         } catch (Exception e) {
    +      this.log.error("\n[URL]:  {}\n[PARAMS]: {}\n[EXCEPTION]: {}", url, requestStr, e.getMessage());
           throw new WxErrorException(WxError.newBuilder().setErrorMsg(e.getMessage()).build(), e);
         }
       }
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpServiceImpl.java
    index 84ba693c..87cf7397 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpServiceImpl.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpServiceImpl.java
    @@ -33,7 +33,7 @@ public class WxMpServiceImpl implements WxMpService {
     
       private static final JsonParser JSON_PARSER = new JsonParser();
     
    -  protected final Logger log = LoggerFactory.getLogger(WxMpServiceImpl.class);
    +  protected final Logger log = LoggerFactory.getLogger(this.getClass());
     
       /**
        * 全局的是否正在刷新access token的锁
    
    From c82b9f06b391534defbacae75c916c803bba979c Mon Sep 17 00:00:00 2001
    From: Binary Wang 
    Date: Sat, 29 Oct 2016 18:49:45 +0800
    Subject: [PATCH 80/83] =?UTF-8?q?=E4=BC=98=E5=8C=96=E9=87=8D=E6=9E=84?=
     =?UTF-8?q?=E5=BE=AE=E4=BF=A1=E6=94=AF=E4=BB=98=E6=8E=A5=E5=8F=A3=E5=AF=B9?=
     =?UTF-8?q?=E7=BB=93=E6=9E=9C=E7=9A=84=E5=BC=82=E5=B8=B8=E9=94=99=E8=AF=AF?=
     =?UTF-8?q?=E8=BE=93=E5=87=BA?=
    MIME-Version: 1.0
    Content-Type: text/plain; charset=UTF-8
    Content-Transfer-Encoding: 8bit
    
    ---
     .../mp/api/impl/WxMpPayServiceImpl.java       | 83 +++++--------------
     1 file changed, 23 insertions(+), 60 deletions(-)
    
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImpl.java
    index 7f628aff..05e98511 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImpl.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImpl.java
    @@ -74,21 +74,20 @@ public class WxMpPayServiceImpl implements WxMpPayService {
     
         String url = PAY_BASE_URL + "/secapi/pay/refund";
         String responseContent = this.executeRequestWithKeyFile(url, keyFile, xstream.toXML(request), partnerId);
    -    WxPayRefundResult wxMpPayRefundResult = (WxPayRefundResult) xstream.fromXML(responseContent);
    -
    -    if (!"SUCCESS".equalsIgnoreCase(wxMpPayRefundResult.getResultCode())
    -        || !"SUCCESS".equalsIgnoreCase(wxMpPayRefundResult.getReturnCode())) {
    -      WxError error = new WxError();
    -      error.setErrorCode(-1);
    -      error.setErrorMsg("return_code:" + wxMpPayRefundResult.getReturnCode()
    -          + ";return_msg:" + wxMpPayRefundResult.getReturnMsg()
    -          + ";result_code:" + wxMpPayRefundResult.getResultCode() + ";err_code"
    -          + wxMpPayRefundResult.getErrCode() + ";err_code_des"
    -          + wxMpPayRefundResult.getErrCodeDes());
    -      throw new WxErrorException(error);
    -    }
    +    WxPayRefundResult result = (WxPayRefundResult) xstream.fromXML(responseContent);
    +    this.checkResult(result);
    +    return result;
    +  }
     
    -    return wxMpPayRefundResult;
    +  private void checkResult(WxPayBaseResult result) throws WxErrorException {
    +    if (!"SUCCESS".equalsIgnoreCase(result.getReturnCode())
    +      || !"SUCCESS".equalsIgnoreCase(result.getResultCode())) {
    +      throw new WxErrorException(WxError.newBuilder().setErrorCode(-1)
    +        .setErrorMsg("返回代码:" + result.getReturnCode() + ", 返回信息: "
    +          + result.getReturnMsg() + ", 结果代码: " + result.getResultCode() + ", 错误代码: "
    +          + result.getErrCode() + ", 错误详情: " + result.getErrCodeDes())
    +        .build());
    +    }
       }
     
       private void checkParameters(WxPayRefundRequest request) throws WxErrorException {
    @@ -147,16 +146,10 @@ public class WxMpPayServiceImpl implements WxMpPayService {
         }
     
         String responseContent = this.executeRequestWithKeyFile(url, keyFile, xstream.toXML(request), mchId);
    -    WxPaySendRedpackResult redpackResult = (WxPaySendRedpackResult) xstream
    +    WxPaySendRedpackResult result = (WxPaySendRedpackResult) xstream
             .fromXML(responseContent);
    -    if ("FAIL".equals(redpackResult.getResultCode())) {
    -      throw new WxErrorException(WxError.newBuilder()
    -          .setErrorMsg(
    -              redpackResult.getErrCode() + ":" + redpackResult.getErrCodeDes())
    -          .build());
    -    }
    -
    -    return redpackResult;
    +    this.checkResult(result);
    +    return result;
       }
     
       /**
    @@ -209,12 +202,7 @@ public class WxMpPayServiceImpl implements WxMpPayService {
         String responseContent = this.executeRequest(url, xstream.toXML(request));
         WxPayOrderQueryResult result = (WxPayOrderQueryResult) xstream.fromXML(responseContent);
         result.composeCoupons(responseContent);
    -    if ("FAIL".equals(result.getResultCode())) {
    -      throw new WxErrorException(WxError.newBuilder()
    -        .setErrorMsg(result.getErrCode() + ":" + result.getErrCodeDes())
    -        .build());
    -    }
    -
    +    this.checkResult(result);
         return result;
       }
     
    @@ -242,11 +230,7 @@ public class WxMpPayServiceImpl implements WxMpPayService {
     
         String responseContent = this.executeRequest(url, xstream.toXML(request));
         WxPayOrderCloseResult result = (WxPayOrderCloseResult) xstream.fromXML(responseContent);
    -    if ("FAIL".equals(result.getResultCode())) {
    -      throw new WxErrorException(WxError.newBuilder()
    -        .setErrorMsg(result.getErrCode() + ":" + result.getErrCodeDes())
    -        .build());
    -    }
    +    this.checkResult(result);
     
         return result;
       }
    @@ -273,12 +257,7 @@ public class WxMpPayServiceImpl implements WxMpPayService {
         String responseContent = this.executeRequest(url, xstream.toXML(request));
         WxPayUnifiedOrderResult result = (WxPayUnifiedOrderResult) xstream
             .fromXML(responseContent);
    -    if ("FAIL".equals(result.getResultCode()) || "FAIL".equals(result.getReturnCode())) {
    -      throw new WxErrorException(WxError.newBuilder()
    -          .setErrorMsg(result.getErrCode() + ":" + result.getErrCodeDes())
    -          .build());
    -    }
    -
    +    this.checkResult(result);
         return result;
       }
     
    @@ -301,16 +280,6 @@ public class WxMpPayServiceImpl implements WxMpPayService {
       @Override
       public Map getPayInfo(WxPayUnifiedOrderRequest request) throws WxErrorException {
         WxPayUnifiedOrderResult unifiedOrderResult = this.unifiedOrder(request);
    -
    -    if (!"SUCCESS".equalsIgnoreCase(unifiedOrderResult.getReturnCode())
    -        || !"SUCCESS".equalsIgnoreCase(unifiedOrderResult.getResultCode())) {
    -      throw new WxErrorException(WxError.newBuilder().setErrorCode(-1)
    -          .setErrorMsg("return_code:" + unifiedOrderResult.getReturnCode() + ";return_msg:"
    -          + unifiedOrderResult.getReturnMsg() + ";result_code:" + unifiedOrderResult.getResultCode() + ";err_code"
    -              + unifiedOrderResult.getErrCode() + ";err_code_des" + unifiedOrderResult.getErrCodeDes())
    -          .build());
    -    }
    -
         String prepayId = unifiedOrderResult.getPrepayId();
         if (StringUtils.isBlank(prepayId)) {
           throw new RuntimeException(String.format("Failed to get prepay id due to error code '%s'(%s).",
    @@ -352,10 +321,7 @@ public class WxMpPayServiceImpl implements WxMpPayService {
     
         String responseContent = this.executeRequestWithKeyFile(url, keyFile, xstream.toXML(request), request.getMchId());
         WxEntPayResult result = (WxEntPayResult) xstream.fromXML(responseContent);
    -    if ("FAIL".equals(result.getResultCode())) {
    -      throw new WxErrorException(
    -        WxError.newBuilder().setErrorMsg(result.getErrCode() + ":" + result.getErrCodeDes()).build());
    -    }
    +    this.checkResult(result);
         return result;
       }
     
    @@ -377,10 +343,7 @@ public class WxMpPayServiceImpl implements WxMpPayService {
     
         String responseContent = this.executeRequestWithKeyFile(url, keyFile, xstream.toXML(request), request.getMchId());
         WxEntPayQueryResult result = (WxEntPayQueryResult) xstream.fromXML(responseContent);
    -    if ("FAIL".equals(result.getResultCode())) {
    -      throw new WxErrorException(
    -        WxError.newBuilder().setErrorMsg(result.getErrCode() + ":" + result.getErrCodeDes()).build());
    -    }
    +    this.checkResult(result);
         return result;
       }
     
    @@ -400,7 +363,7 @@ public class WxMpPayServiceImpl implements WxMpPayService {
           }
         } catch (IOException e) {
           this.log.error("\n[URL]:  {}\n[PARAMS]: {}\n[EXCEPTION]: {}", url, requestStr, e.getMessage());
    -      throw new WxErrorException(WxError.newBuilder().setErrorMsg(e.getMessage()).build(), e);
    +      throw new WxErrorException(WxError.newBuilder().setErrorCode(-1).setErrorMsg(e.getMessage()).build(), e);
         }finally {
           httpPost.releaseConnection();
         }
    @@ -432,7 +395,7 @@ public class WxMpPayServiceImpl implements WxMpPayService {
           }
         } catch (Exception e) {
           this.log.error("\n[URL]:  {}\n[PARAMS]: {}\n[EXCEPTION]: {}", url, requestStr, e.getMessage());
    -      throw new WxErrorException(WxError.newBuilder().setErrorMsg(e.getMessage()).build(), e);
    +      throw new WxErrorException(WxError.newBuilder().setErrorCode(-1).setErrorMsg(e.getMessage()).build(), e);
         }
       }
     
    
    From a9befa5e9267b7a947d2eb5c0097da50c792c249 Mon Sep 17 00:00:00 2001
    From: =?UTF-8?q?Binary=EF=BC=88=E7=8F=AD=E7=BA=B3=E7=9D=BF=EF=BC=89?=
     
    Date: Mon, 31 Oct 2016 15:18:05 +0800
    Subject: [PATCH 81/83] Update WxMpPayServiceImpl.java
    MIME-Version: 1.0
    Content-Type: text/plain; charset=UTF-8
    Content-Transfer-Encoding: 8bit
    
    修复xml解析的问题
    ---
     .../java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImpl.java  | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImpl.java
    index 05e98511..3273cd2b 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImpl.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImpl.java
    @@ -61,8 +61,8 @@ public class WxMpPayServiceImpl implements WxMpPayService {
         checkParameters(request);
     
         XStream xstream = XStreamInitializer.getInstance();
    -    xstream.processAnnotations(WxPayRefundResult.class);
         xstream.processAnnotations(WxPayRefundRequest.class);
    +    xstream.processAnnotations(WxPayRefundResult.class);
     
         request.setAppid(this.wxMpService.getWxMpConfigStorage().getAppId());
         String partnerId = this.wxMpService.getWxMpConfigStorage().getPartnerId();
    
    From a755c418fb9d471cd2e2cc5f11df8f2e46e56055 Mon Sep 17 00:00:00 2001
    From: Binary Wang 
    Date: Mon, 31 Oct 2016 18:43:59 +0800
    Subject: [PATCH 82/83] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E7=89=88=E6=9C=AC?=
     =?UTF-8?q?=E5=8F=B7=EF=BC=8C=E5=87=86=E5=A4=87=E7=94=9F=E6=88=90=E6=96=B0?=
     =?UTF-8?q?=E7=89=88=E6=9C=AC2.3.0?=
    MIME-Version: 1.0
    Content-Type: text/plain; charset=UTF-8
    Content-Transfer-Encoding: 8bit
    
    ---
     pom.xml                    | 2 +-
     weixin-java-common/pom.xml | 2 +-
     weixin-java-cp/pom.xml     | 2 +-
     weixin-java-mp/pom.xml     | 2 +-
     weixin-java-osgi/pom.xml   | 2 +-
     5 files changed, 5 insertions(+), 5 deletions(-)
    
    diff --git a/pom.xml b/pom.xml
    index 99e1094d..4621e60d 100644
    --- a/pom.xml
    +++ b/pom.xml
    @@ -5,7 +5,7 @@
       4.0.0
       com.github.binarywang
       weixin-java-parent
    -  2.3.0-SNAPSHOT
    +  2.3.0
       pom
       WeiXin Java Tools - Parent
       微信公众号、企业号上级POM
    diff --git a/weixin-java-common/pom.xml b/weixin-java-common/pom.xml
    index fec020e7..e5d5d73a 100644
    --- a/weixin-java-common/pom.xml
    +++ b/weixin-java-common/pom.xml
    @@ -6,7 +6,7 @@
       
         com.github.binarywang
         weixin-java-parent
    -    2.3.0-SNAPSHOT
    +    2.3.0
       
     
       weixin-java-common
    diff --git a/weixin-java-cp/pom.xml b/weixin-java-cp/pom.xml
    index f62f4d29..e7fbd255 100644
    --- a/weixin-java-cp/pom.xml
    +++ b/weixin-java-cp/pom.xml
    @@ -6,7 +6,7 @@
         
             com.github.binarywang
             weixin-java-parent
    -        2.3.0-SNAPSHOT
    +        2.3.0
         
     
         weixin-java-cp
    diff --git a/weixin-java-mp/pom.xml b/weixin-java-mp/pom.xml
    index a06184a8..c1b6a136 100644
    --- a/weixin-java-mp/pom.xml
    +++ b/weixin-java-mp/pom.xml
    @@ -6,7 +6,7 @@
         
             com.github.binarywang
             weixin-java-parent
    -        2.3.0-SNAPSHOT
    +        2.3.0
         
         weixin-java-mp
         WeiXin Java Tools - MP
    diff --git a/weixin-java-osgi/pom.xml b/weixin-java-osgi/pom.xml
    index 0405d85b..7f4a5973 100644
    --- a/weixin-java-osgi/pom.xml
    +++ b/weixin-java-osgi/pom.xml
    @@ -6,7 +6,7 @@
       
         com.github.binarywang
         weixin-java-parent
    -    2.3.0-SNAPSHOT
    +    2.3.0
       
     
       weixin-java-osgi
    
    From 9ca195518ab3a560be0e84f94e184415db5a74cb Mon Sep 17 00:00:00 2001
    From: Binary Wang 
    Date: Mon, 31 Oct 2016 18:46:30 +0800
    Subject: [PATCH 83/83] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E7=89=88=E6=9C=AC?=
     =?UTF-8?q?=E5=8F=B7=EF=BC=8C=E5=87=86=E5=A4=87=E7=94=9F=E6=88=90=E6=96=B0?=
     =?UTF-8?q?=E7=89=88=E6=9C=AC2.3.0?=
    MIME-Version: 1.0
    Content-Type: text/plain; charset=UTF-8
    Content-Transfer-Encoding: 8bit
    
    ---
     README.md    | 10 +++++-----
     build.gradle |  2 +-
     2 files changed, 6 insertions(+), 6 deletions(-)
    
    diff --git a/README.md b/README.md
    index 223ce24c..035ec8ad 100644
    --- a/README.md
    +++ b/README.md
    @@ -6,7 +6,7 @@
     1. ***本项目Fork自chanjarster/weixin-java-tools,但由于原项目已停止维护,故单独维护和发布,且发布到maven上的groupId也会不同,详细信息见下文。***
     1. ***自2.0.0版本以来,公众号的接口调整比较大,主要是为了解决主接口类过于庞大不方便管理的问题,将接口实现代码按模块进行拆分。***
     1. 本SDK要求的最低JDK版本是7,为满足少量还在使用JDK6的用户的需求,特意抽出独立的代码分支项目,请参考 https://github.com/binarywang/weixin-java-tools-for-jdk6 ,其他更早的JDK版本则需要自己改造实现;
    -1. 最新更新:2016-09-30 发布2.2.0正式版!
    +1. 最新更新:2016-10-31 发布2.3.0正式版!
     
     ===========
     
    @@ -36,12 +36,12 @@ maven:
     
       com.github.binarywang
       weixin-java-mp
    -  2.2.0
    +  2.3.0
     
     ```
     gradle:
     ```groovy
    -compile 'com.github.binarywang:weixin-java-mp:2.2.0'
    +compile 'com.github.binarywang:weixin-java-mp:2.3.0'
     ```
     
     * 企业号:
    @@ -51,12 +51,12 @@ maven:
     
       com.github.binarywang
       weixin-java-cp
    -  2.2.0
    +  2.3.0
     
     ```
     gradle:
     ```groovy
    -compile 'com.github.binarywang:weixin-java-cp:2.2.0'
    +compile 'com.github.binarywang:weixin-java-cp:2.3.0'
     ```
     
     ===========
    diff --git a/build.gradle b/build.gradle
    index f89cf196..4e454b1a 100644
    --- a/build.gradle
    +++ b/build.gradle
    @@ -2,7 +2,7 @@ allprojects  {
       apply plugin: 'maven'
     
       group = 'com.github.binarywang'
    -  version = '2.2.0'
    +  version = '2.3.0'
     }
     
     subprojects {