From 46a8676cf66f1886107e244a94ab77ed12e5042c Mon Sep 17 00:00:00 2001 From: DDLeEHi <569198459@qq.com> Date: Mon, 17 Apr 2017 14:25:12 +0800 Subject: [PATCH 01/14] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E7=AC=AC=E4=B8=89?= =?UTF-8?q?=E6=96=B9=E5=B9=B3=E5=8F=B0SDK=E6=94=AF=E4=BB=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 增加微信SDK支付,预下单流程、参数(除开APPID为绑定APP之后发放的APPID)与公众号相同,预下单成功之后需要二次签名,格式需要严格按要求处理,用于SDK校验,代码注释中有说明 --- .../wxpay/service/impl/WxPayServiceImpl.java | 48 ++++++++++++++----- 1 file changed, 37 insertions(+), 11 deletions(-) diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/WxPayServiceImpl.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/WxPayServiceImpl.java index c26d058392..ad33a2a4b2 100644 --- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/WxPayServiceImpl.java +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/WxPayServiceImpl.java @@ -196,17 +196,43 @@ public Map getPayInfo(WxPayUnifiedOrderRequest request) throws W } Map payInfo = new HashMap<>(); - payInfo.put("appId", getConfig().getAppId()); - // 支付签名时间戳,注意微信jssdk中的所有使用timestamp字段均为小写。 - // 但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符 - payInfo.put("timeStamp", String.valueOf(System.currentTimeMillis() / 1000)); - payInfo.put("nonceStr", String.valueOf(System.currentTimeMillis())); - payInfo.put("package", "prepay_id=" + prepayId); - payInfo.put("signType", "MD5"); - if ("NATIVE".equals(request.getTradeType())) { - payInfo.put("codeUrl", unifiedOrderResult.getCodeURL()); - } - payInfo.put("paySign", SignUtils.createSign(payInfo, this.getConfig().getMchKey())); + if ("NATIVE".equals(request.getTradeType())) + { + payInfo.put("codeUrl", unifiedOrderResult.getCodeURL()); + }//APP支付绑定的是微信开放平台上的账号,APPID为开放平台上绑定APP后发放的参数 + else if ("APP".equals(request.getTradeType())) + { + + String appId = getConfig().getAppId(); + SortedMap configMap = new TreeMap<>(); + // 此map用于参与调起sdk支付的二次签名,格式全小写,timestamp只能是10位,格式固定,切勿修改 + String partnerid = getConfig().getMchId(); + configMap.put("prepayid", prepayId); + configMap.put("partnerid", partnerid); + configMap.put("package", "Sign=WXPay"); + configMap.put("timestamp", String.valueOf(System.currentTimeMillis() / 1000)); + configMap.put("noncestr", String.valueOf(System.currentTimeMillis())); + configMap.put("appid", appId); + // 此map用于客户端与微信服务器交互 + payInfo.put("paySign", SignUtils.createSign(payInfo, this.getConfig().getMchKey())); + payInfo.put("tradeSeqNo", prepayId); + payInfo.put("partnerid", partnerid); + payInfo.put("appid", appId); + payInfo.put("packageValue", "Sign=WXPay"); + payInfo.put("timestamp", String.valueOf(System.currentTimeMillis() / 1000)); + payInfo.put("noncestr", String.valueOf(System.currentTimeMillis())); + } + else if("JSAPI".equals(request.getTradeType())) + { + + payInfo.put("appId", unifiedOrderResult.getAppid()); + // 支付签名时间戳,注意微信jssdk中的所有使用timestamp字段均为小写。但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符 + payInfo.put("timeStamp", String.valueOf(System.currentTimeMillis() / 1000)); + payInfo.put("nonceStr", String.valueOf(System.currentTimeMillis())); + payInfo.put("package", "prepay_id=" + prepayId); + payInfo.put("signType", "MD5"); + payInfo.put("paySign", SignUtils.createSign(payInfo, this.getConfig().getMchKey())); + } return payInfo; } From b30fdab800f499661550663b2b6cac9bb14b0482 Mon Sep 17 00:00:00 2001 From: DDLeEHi <569198459@qq.com> Date: Tue, 18 Apr 2017 09:10:25 +0800 Subject: [PATCH 02/14] =?UTF-8?q?SDK=E7=AC=AC=E4=B8=89=E6=96=B9=E5=B9=B3?= =?UTF-8?q?=E5=8F=B0=E6=94=AF=E4=BB=98=EF=BC=8C=E5=A4=A7=E6=A6=82=E6=8C=89?= =?UTF-8?q?=E7=85=A7=E8=BF=99=E4=B8=AA=E9=A1=B9=E7=9B=AE=E7=9A=84=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E6=A0=BC=E5=BC=8F=E8=B0=83=E6=95=B4=E4=BA=86=E4=B8=80?= =?UTF-8?q?=E4=B8=8B=EF=BC=8C=E6=A0=BC=E5=BC=8F=E8=BF=98=E6=9C=89=E4=B8=8D?= =?UTF-8?q?=E5=90=88=E9=80=82=E4=B9=8B=E5=A4=84=EF=BC=8C=E9=BA=BB=E7=83=A6?= =?UTF-8?q?=E8=B0=83=E6=95=B4=E4=B8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 之前我用的是treemap,忘记导包所以报错,现在用这个项目里的加密方式,用普通的hashmap也行 --- .../wxpay/service/impl/WxPayServiceImpl.java | 68 +++++++++---------- 1 file changed, 31 insertions(+), 37 deletions(-) diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/WxPayServiceImpl.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/WxPayServiceImpl.java index ad33a2a4b2..97a2627192 100644 --- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/WxPayServiceImpl.java +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/WxPayServiceImpl.java @@ -196,43 +196,37 @@ public Map getPayInfo(WxPayUnifiedOrderRequest request) throws W } Map payInfo = new HashMap<>(); - if ("NATIVE".equals(request.getTradeType())) - { - payInfo.put("codeUrl", unifiedOrderResult.getCodeURL()); - }//APP支付绑定的是微信开放平台上的账号,APPID为开放平台上绑定APP后发放的参数 - else if ("APP".equals(request.getTradeType())) - { - - String appId = getConfig().getAppId(); - SortedMap configMap = new TreeMap<>(); - // 此map用于参与调起sdk支付的二次签名,格式全小写,timestamp只能是10位,格式固定,切勿修改 - String partnerid = getConfig().getMchId(); - configMap.put("prepayid", prepayId); - configMap.put("partnerid", partnerid); - configMap.put("package", "Sign=WXPay"); - configMap.put("timestamp", String.valueOf(System.currentTimeMillis() / 1000)); - configMap.put("noncestr", String.valueOf(System.currentTimeMillis())); - configMap.put("appid", appId); - // 此map用于客户端与微信服务器交互 - payInfo.put("paySign", SignUtils.createSign(payInfo, this.getConfig().getMchKey())); - payInfo.put("tradeSeqNo", prepayId); - payInfo.put("partnerid", partnerid); - payInfo.put("appid", appId); - payInfo.put("packageValue", "Sign=WXPay"); - payInfo.put("timestamp", String.valueOf(System.currentTimeMillis() / 1000)); - payInfo.put("noncestr", String.valueOf(System.currentTimeMillis())); - } - else if("JSAPI".equals(request.getTradeType())) - { - - payInfo.put("appId", unifiedOrderResult.getAppid()); - // 支付签名时间戳,注意微信jssdk中的所有使用timestamp字段均为小写。但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符 - payInfo.put("timeStamp", String.valueOf(System.currentTimeMillis() / 1000)); - payInfo.put("nonceStr", String.valueOf(System.currentTimeMillis())); - payInfo.put("package", "prepay_id=" + prepayId); - payInfo.put("signType", "MD5"); - payInfo.put("paySign", SignUtils.createSign(payInfo, this.getConfig().getMchKey())); - } + if ("NATIVE".equals(request.getTradeType())){ + payInfo.put("codeUrl", unifiedOrderResult.getCodeURL()); + }else if ("APP".equals(request.getTradeType())){ + //APP支付绑定的是微信开放平台上的账号,APPID为开放平台上绑定APP后发放的参数 + String appId = getConfig().getAppId(); + Map configMap = new HashMap<>(); + // 此map用于参与调起sdk支付的二次签名,格式全小写,timestamp只能是10位,格式固定,切勿修改 + String partnerid = getConfig().getMchId(); + configMap.put("prepayid", prepayId); + configMap.put("partnerid", partnerid); + configMap.put("package", "Sign=WXPay"); + configMap.put("timestamp", String.valueOf(System.currentTimeMillis() / 1000)); + configMap.put("noncestr", String.valueOf(System.currentTimeMillis())); + configMap.put("appid", appId); + // 此map用于客户端与微信服务器交互 + payInfo.put("paySign", SignUtils.createSign(payInfo, this.getConfig().getMchKey())); + payInfo.put("prepayId", prepayId); + payInfo.put("partnerId", partnerid); + payInfo.put("appId", appId); + payInfo.put("packageValue", "Sign=WXPay"); + payInfo.put("timeStamp", String.valueOf(System.currentTimeMillis() / 1000)); + payInfo.put("nonceStr", String.valueOf(System.currentTimeMillis())); + }else if("JSAPI".equals(request.getTradeType())){ + payInfo.put("appId", unifiedOrderResult.getAppid()); + // 支付签名时间戳,注意微信jssdk中的所有使用timestamp字段均为小写。但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符 + payInfo.put("timeStamp", String.valueOf(System.currentTimeMillis() / 1000)); + payInfo.put("nonceStr", String.valueOf(System.currentTimeMillis())); + payInfo.put("package", "prepay_id=" + prepayId); + payInfo.put("signType", "MD5"); + payInfo.put("paySign", SignUtils.createSign(payInfo, this.getConfig().getMchKey())); + } return payInfo; } From 2356a97c81b8a04deebb3247c62961ee7ff5e364 Mon Sep 17 00:00:00 2001 From: DDLeEHi <569198459@qq.com> Date: Tue, 18 Apr 2017 10:53:19 +0800 Subject: [PATCH 03/14] =?UTF-8?q?SDK=E6=94=AF=E4=BB=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 按照要求修改过格式了 --- .../binarywang/wxpay/service/impl/WxPayServiceImpl.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/WxPayServiceImpl.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/WxPayServiceImpl.java index 97a2627192..5d442df906 100644 --- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/WxPayServiceImpl.java +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/WxPayServiceImpl.java @@ -196,10 +196,11 @@ public Map getPayInfo(WxPayUnifiedOrderRequest request) throws W } Map payInfo = new HashMap<>(); - if ("NATIVE".equals(request.getTradeType())){ + if ("NATIVE".equals(request.getTradeType())) + { payInfo.put("codeUrl", unifiedOrderResult.getCodeURL()); }else if ("APP".equals(request.getTradeType())){ - //APP支付绑定的是微信开放平台上的账号,APPID为开放平台上绑定APP后发放的参数 + // APP支付绑定的是微信开放平台上的账号,APPID为开放平台上绑定APP后发放的参数 String appId = getConfig().getAppId(); Map configMap = new HashMap<>(); // 此map用于参与调起sdk支付的二次签名,格式全小写,timestamp只能是10位,格式固定,切勿修改 @@ -218,7 +219,7 @@ public Map getPayInfo(WxPayUnifiedOrderRequest request) throws W payInfo.put("packageValue", "Sign=WXPay"); payInfo.put("timeStamp", String.valueOf(System.currentTimeMillis() / 1000)); payInfo.put("nonceStr", String.valueOf(System.currentTimeMillis())); - }else if("JSAPI".equals(request.getTradeType())){ + }else if ("JSAPI".equals(request.getTradeType())){ payInfo.put("appId", unifiedOrderResult.getAppid()); // 支付签名时间戳,注意微信jssdk中的所有使用timestamp字段均为小写。但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符 payInfo.put("timeStamp", String.valueOf(System.currentTimeMillis() / 1000)); @@ -226,7 +227,7 @@ public Map getPayInfo(WxPayUnifiedOrderRequest request) throws W payInfo.put("package", "prepay_id=" + prepayId); payInfo.put("signType", "MD5"); payInfo.put("paySign", SignUtils.createSign(payInfo, this.getConfig().getMchKey())); - } + } return payInfo; } From 0cad444b257f61beeb75554f6d17969ffb5cfddb Mon Sep 17 00:00:00 2001 From: DDLeEHi <569198459@qq.com> Date: Wed, 3 May 2017 16:49:34 +0800 Subject: [PATCH 04/14] =?UTF-8?q?=E7=AD=BE=E5=90=8D=E9=94=99=E8=AF=AF?= =?UTF-8?q?=E9=97=AE=E9=A2=98=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 变量命名按照微信支付官网的进行了修改,参数也已修改无误 --- .../github/binarywang/wxpay/service/impl/WxPayServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/WxPayServiceImpl.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/WxPayServiceImpl.java index 5d442df906..ff7f9c33e8 100644 --- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/WxPayServiceImpl.java +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/WxPayServiceImpl.java @@ -212,7 +212,7 @@ public Map getPayInfo(WxPayUnifiedOrderRequest request) throws W configMap.put("noncestr", String.valueOf(System.currentTimeMillis())); configMap.put("appid", appId); // 此map用于客户端与微信服务器交互 - payInfo.put("paySign", SignUtils.createSign(payInfo, this.getConfig().getMchKey())); + payInfo.put("sign", SignUtils.createSign(configMap, this.getConfig().getMchKey())); payInfo.put("prepayId", prepayId); payInfo.put("partnerId", partnerid); payInfo.put("appId", appId); From eb6a6df62763f7d3df924e7042f5b165bcf00448 Mon Sep 17 00:00:00 2001 From: DDLeEHi <569198459@qq.com> Date: Tue, 23 May 2017 15:40:09 +0800 Subject: [PATCH 05/14] =?UTF-8?q?=E5=AF=B9=E8=B4=A6=E5=8D=95=E5=A4=84?= =?UTF-8?q?=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wxpay/service/impl/WxPayServiceImpl.java | 84 +++++++++++++++++-- 1 file changed, 79 insertions(+), 5 deletions(-) diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/WxPayServiceImpl.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/WxPayServiceImpl.java index ed6e2c826f..5f32502835 100644 --- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/WxPayServiceImpl.java +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/WxPayServiceImpl.java @@ -299,7 +299,7 @@ public void report(WxPayReportRequest request) throws WxErrorException { } @Override - public File downloadBill(String billDate, String billType, String tarType, String deviceInfo) throws WxErrorException { + public WxPayBillResult downloadBill(String billDate, String billType, String tarType, String deviceInfo) throws WxErrorException { WxPayDownloadBillRequest request = new WxPayDownloadBillRequest(); request.setBillType(billType); request.setBillDate(billDate); @@ -311,11 +311,85 @@ public File downloadBill(String billDate, String billType, String tarType, Strin String url = this.getPayBaseUrl() + "/pay/downloadbill"; //TODO 返回的内容可能是文件流,也有可能是xml,需要区分对待 String responseContent = this.post(url, request.toXML()); + if (responseContent.startsWith("<")){ + WxPayCommonResult result = WxPayBaseResult.fromXML(responseContent, WxPayCommonResult.class); + result.checkResult(this); + return null; + }else{ + WxPayBillResult wxPayBillResult = billInformationDeal(responseContent); + return wxPayBillResult; + } + } + + private WxPayBillResult billInformationDeal(String responseContent){ + WxPayBillResult wxPayBillResult = new WxPayBillResult(); + + String listStr = ""; + String objStr = ""; + if (responseContent.indexOf("总交易单数") >= 0){ + listStr = responseContent.substring(0, responseContent.indexOf("总交易单数")); + objStr = responseContent.substring(responseContent.indexOf("总交易单数")); + } - WxPayCommonResult result = WxPayBaseResult.fromXML(responseContent, WxPayCommonResult.class); - result.checkResult(this); - //TODO 待实现,暂时无测试帐号,无法调试 - return null; + /* + * 交易时间:2017-04-06 01:00:02 公众账号ID: 商户号: 子商户号:0 设备号:WEB 微信订单号: 商户订单号:2017040519091071873216 用户标识: 交易类型:NATIVE + * 交易状态:REFUND 付款银行:CFT 货币种类:CNY 总金额:0.00 企业红包金额:0.00 微信退款单号: 商户退款单号:20170406010000933 退款金额:0.01 企业红包退款金额:0.00 + * 退款类型:ORIGINAL 退款状态:SUCCESS 商品名称: 商户数据包: 手续费:0.00000 费率 :0.60% + */ + + // 参考以上格式进行取值 + + List wxPayBillBaseResultLst = new LinkedList(); + String newStr = listStr.replaceAll(",", " "); // 去空格 + String[] tempStr = newStr.split("`"); // 数据分组 + String[] t = tempStr[0].split(" ");// 分组标题 + int j = tempStr.length / t.length; // 计算循环次数 + int k = 1; // 纪录数组下标 + for (int i = 0; i < j; i++){ + WxPayBillBaseResult wxPayBillBaseResult = new WxPayBillBaseResult(); + + wxPayBillBaseResult.setTradeTime(tempStr[k]); + wxPayBillBaseResult.setAppId(tempStr[k + 1]); + wxPayBillBaseResult.setMchId(tempStr[k + 2]); + wxPayBillBaseResult.setSubMchId(tempStr[k + 3]); + wxPayBillBaseResult.setDeviceInfo(tempStr[k + 4]); + wxPayBillBaseResult.setTransationId(tempStr[k + 5]); + wxPayBillBaseResult.setOutTradeNo(tempStr[k + 6]); + wxPayBillBaseResult.setOpenId(tempStr[k + 7]); + wxPayBillBaseResult.setTradeType(tempStr[k + 8]); + wxPayBillBaseResult.setTradeState(tempStr[k + 9]); + wxPayBillBaseResult.setBankType(tempStr[k + 10]); + wxPayBillBaseResult.setFeeType(tempStr[k + 11]); + wxPayBillBaseResult.setTotalFee(tempStr[k + 12]); + wxPayBillBaseResult.setCouponFee(tempStr[k + 13]); + wxPayBillBaseResult.setRefundId(tempStr[k + 14]); + wxPayBillBaseResult.setOutRefundNo(tempStr[k + 15]); + wxPayBillBaseResult.setSettlementRefundFee(tempStr[k + 16]); + wxPayBillBaseResult.setCouponRefundFee(tempStr[k + 17]); + wxPayBillBaseResult.setRefundChannel(tempStr[k + 18]); + wxPayBillBaseResult.setRefundState(tempStr[k + 19]); + wxPayBillBaseResult.setBody(tempStr[k + 20]); + wxPayBillBaseResult.setAttach(tempStr[k + 21]); + wxPayBillBaseResult.setPoundage(tempStr[k + 22]); + wxPayBillBaseResult.setPoundageRate(tempStr[k + 23]); + wxPayBillBaseResultLst.add(wxPayBillBaseResult); + k += t.length; + } + /* + * 总交易单数,总交易额,总退款金额,总代金券或立减优惠退款金额,手续费总金额 `2,`0.02,`0.0,`0.0,`0 + */ + + // 参考以上格式进行取值 + + String totalStr = objStr.replaceAll(",", " "); + String[] totalTempStr = totalStr.split("`"); + wxPayBillResult.setTotalRecord(totalTempStr[1]); + wxPayBillResult.setTotalFee(totalTempStr[2]); + wxPayBillResult.setTotalRefundFee(totalTempStr[3]); + wxPayBillResult.setTotalCouponFee(totalTempStr[4]); + wxPayBillResult.setTotalPoundageFee(totalTempStr[5]); + + return wxPayBillResult; } @Override From 82a2d1bb18bfcaeafa89c47ffa6166a8343c5c47 Mon Sep 17 00:00:00 2001 From: DDLeEHi <569198459@qq.com> Date: Tue, 23 May 2017 15:42:14 +0800 Subject: [PATCH 06/14] =?UTF-8?q?=E5=AF=B9=E8=B4=A6=E4=BF=A1=E6=81=AF?= =?UTF-8?q?=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/github/binarywang/wxpay/service/WxPayService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/WxPayService.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/WxPayService.java index e336cd21f3..4b76061e2d 100644 --- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/WxPayService.java +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/WxPayService.java @@ -246,7 +246,7 @@ WxPayRefundQueryResult refundQuery(String transactionId, String outTradeNo, Stri * @param deviceInfo 设备号 device_info 非必传参数,终端设备号 * @return 保存到本地的临时文件 */ - File downloadBill(String billDate, String billType, String tarType, String deviceInfo) throws WxErrorException; + WxPayBillResult downloadBill(String billDate, String billType, String tarType, String deviceInfo) throws WxErrorException; /** *

From 2342c66fd33c9c515d53066ae4356df28dbce6dd Mon Sep 17 00:00:00 2001
From: DDLeEHi <569198459@qq.com>
Date: Tue, 23 May 2017 15:49:44 +0800
Subject: [PATCH 07/14] =?UTF-8?q?=E5=AF=B9=E8=B4=A6=E7=BB=93=E6=9E=9C?=
 =?UTF-8?q?=E5=AE=9E=E4=BD=93?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../wxpay/bean/result/WxPayBillResult         | 263 ++++++++++++++++++
 1 file changed, 263 insertions(+)
 create mode 100644 weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayBillResult

diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayBillResult b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayBillResult
new file mode 100644
index 0000000000..1b21eff597
--- /dev/null
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayBillResult
@@ -0,0 +1,263 @@
+package com.github.binarywang.wxpay.bean.result;
+
+import java.io.Serializable;
+
+public class WxPayBillBaseResult implements Serializable
+{
+
+  /**
+   * 
+   */
+  private static final long serialVersionUID = 1L;
+  /*
+   * 交易时间:2017-04-06 01:00:02 公众账号ID:wx4d37b636d597242f 商户号:1383905002 子商户号:0 设备号:WEB
+   * 微信订单号:4006332001201704055977648276 商户订单号:2017040519091071873216 用户标识:oH0mKxIAQ3Ktoyj3B7iZRRSi2rtU 交易类型:NATIVE
+   * 交易状态:REFUND 付款银行:CFT 货币种类:CNY 总金额:0.00 企业红包金额:0.00 微信退款单号:2006332001201704061002766728 商户退款单号:20170406010000933
+   * 退款金额:0.01 企业红包退款金额:0.00 退款类型:ORIGINAL 退款状态:SUCCESS 商品名称:互联网医院问诊订单 商户数据包: 手续费:0.00000 费率 :0.60%
+   */
+  /**交易时间*/
+  private String tradeTime;
+  /**公众账号ID*/
+  private String appId;
+  /**商户号*/
+  private String mchId;
+  /**子商户号*/
+  private String subMchId;
+  /**设备号*/
+  private String deviceInfo;
+  /**微信订单号*/
+  private String transationId;
+  /**商户订单号*/
+  private String outTradeNo;
+  /**用户标识*/
+  private String openId;
+  /**交易类型*/
+  private String tradeType;
+  /**交易状态*/
+  private String tradeState ;
+  /**付款银行*/
+  private String bankType;
+  /**货币种类*/
+  private String feeType;
+  /**总金额*/
+  private String totalFee;
+  /**企业红包金额*/
+  private String couponFee;
+  /**微信退款单号*/
+  private String refundId;
+  /**商户退款单号*/
+  private String outRefundNo;
+  /**退款金额*/
+  private String settlementRefundFee;
+  /**企业红包退款金额*/
+  private String couponRefundFee;
+  /**退款类型*/
+  private String refundChannel;
+  /**退款状态*/
+  private String refundState;
+  /**商品名称*/
+  private String body;
+  /**商户数据包*/
+  private String attach;
+  /**手续费*/
+  private String poundage;
+  /**费率*/
+  private String poundageRate;
+  public String getTradeTime()
+  {
+    return tradeTime;
+  }
+  public void setTradeTime(String tradeTime)
+  {
+    this.tradeTime = tradeTime;
+  }
+  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 getSubMchId()
+  {
+    return subMchId;
+  }
+  public void setSubMchId(String subMchId)
+  {
+    this.subMchId = subMchId;
+  }
+  public String getDeviceInfo()
+  {
+    return deviceInfo;
+  }
+  public void setDeviceInfo(String deviceInfo)
+  {
+    this.deviceInfo = deviceInfo;
+  }
+  public String getTransationId()
+  {
+    return transationId;
+  }
+  public void setTransationId(String transationId)
+  {
+    this.transationId = transationId;
+  }
+  public String getOutTradeNo()
+  {
+    return outTradeNo;
+  }
+  public void setOutTradeNo(String outTradeNo)
+  {
+    this.outTradeNo = outTradeNo;
+  }
+  public String getOpenId()
+  {
+    return openId;
+  }
+  public void setOpenId(String openId)
+  {
+    this.openId = openId;
+  }
+  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 String getFeeType()
+  {
+    return feeType;
+  }
+  public void setFeeType(String feeType)
+  {
+    this.feeType = feeType;
+  }
+  public String getTotalFee()
+  {
+    return totalFee;
+  }
+  public void setTotalFee(String totalFee)
+  {
+    this.totalFee = totalFee;
+  }
+  public String getCouponFee()
+  {
+    return couponFee;
+  }
+  public void setCouponFee(String couponFee)
+  {
+    this.couponFee = couponFee;
+  }
+  public String getRefundId()
+  {
+    return refundId;
+  }
+  public void setRefundId(String refundId)
+  {
+    this.refundId = refundId;
+  }
+  public String getOutRefundNo()
+  {
+    return outRefundNo;
+  }
+  public void setOutRefundNo(String outRefundNo)
+  {
+    this.outRefundNo = outRefundNo;
+  }
+  public String getSettlementRefundFee()
+  {
+    return settlementRefundFee;
+  }
+  public void setSettlementRefundFee(String settlementRefundFee)
+  {
+    this.settlementRefundFee = settlementRefundFee;
+  }
+  public String getCouponRefundFee()
+  {
+    return couponRefundFee;
+  }
+  public void setCouponRefundFee(String couponRefundFee)
+  {
+    this.couponRefundFee = couponRefundFee;
+  }
+  public String getRefundChannel()
+  {
+    return refundChannel;
+  }
+  public void setRefundChannel(String refundChannel)
+  {
+    this.refundChannel = refundChannel;
+  }
+  public String getRefundState()
+  {
+    return refundState;
+  }
+  public void setRefundState(String refundState)
+  {
+    this.refundState = refundState;
+  }
+  public String getBody()
+  {
+    return body;
+  }
+  public void setBody(String body)
+  {
+    this.body = body;
+  }
+  public String getAttach()
+  {
+    return attach;
+  }
+  public void setAttach(String attach)
+  {
+    this.attach = attach;
+  }
+  public String getPoundage()
+  {
+    return poundage;
+  }
+  public void setPoundage(String poundage)
+  {
+    this.poundage = poundage;
+  }
+  public String getPoundageRate()
+  {
+    return poundageRate;
+  }
+  public void setPoundageRate(String poundageRate)
+  {
+    this.poundageRate = poundageRate;
+  }
+  public static long getSerialversionuid()
+  {
+    return serialVersionUID;
+  }
+  
+}

From 26c6e31c5adc737800580bddec92297e63dda684 Mon Sep 17 00:00:00 2001
From: DDLeEHi <569198459@qq.com>
Date: Tue, 23 May 2017 15:52:46 +0800
Subject: [PATCH 08/14] =?UTF-8?q?=E5=AF=B9=E8=B4=A6=E7=BB=93=E6=9E=9C?=
 =?UTF-8?q?=E5=AE=9E=E4=BD=93?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../wxpay/bean/result/WxPayBillBaseResult     | 263 ++++++++++++++++++
 1 file changed, 263 insertions(+)
 create mode 100644 weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayBillBaseResult

diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayBillBaseResult b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayBillBaseResult
new file mode 100644
index 0000000000..1b21eff597
--- /dev/null
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayBillBaseResult
@@ -0,0 +1,263 @@
+package com.github.binarywang.wxpay.bean.result;
+
+import java.io.Serializable;
+
+public class WxPayBillBaseResult implements Serializable
+{
+
+  /**
+   * 
+   */
+  private static final long serialVersionUID = 1L;
+  /*
+   * 交易时间:2017-04-06 01:00:02 公众账号ID:wx4d37b636d597242f 商户号:1383905002 子商户号:0 设备号:WEB
+   * 微信订单号:4006332001201704055977648276 商户订单号:2017040519091071873216 用户标识:oH0mKxIAQ3Ktoyj3B7iZRRSi2rtU 交易类型:NATIVE
+   * 交易状态:REFUND 付款银行:CFT 货币种类:CNY 总金额:0.00 企业红包金额:0.00 微信退款单号:2006332001201704061002766728 商户退款单号:20170406010000933
+   * 退款金额:0.01 企业红包退款金额:0.00 退款类型:ORIGINAL 退款状态:SUCCESS 商品名称:互联网医院问诊订单 商户数据包: 手续费:0.00000 费率 :0.60%
+   */
+  /**交易时间*/
+  private String tradeTime;
+  /**公众账号ID*/
+  private String appId;
+  /**商户号*/
+  private String mchId;
+  /**子商户号*/
+  private String subMchId;
+  /**设备号*/
+  private String deviceInfo;
+  /**微信订单号*/
+  private String transationId;
+  /**商户订单号*/
+  private String outTradeNo;
+  /**用户标识*/
+  private String openId;
+  /**交易类型*/
+  private String tradeType;
+  /**交易状态*/
+  private String tradeState ;
+  /**付款银行*/
+  private String bankType;
+  /**货币种类*/
+  private String feeType;
+  /**总金额*/
+  private String totalFee;
+  /**企业红包金额*/
+  private String couponFee;
+  /**微信退款单号*/
+  private String refundId;
+  /**商户退款单号*/
+  private String outRefundNo;
+  /**退款金额*/
+  private String settlementRefundFee;
+  /**企业红包退款金额*/
+  private String couponRefundFee;
+  /**退款类型*/
+  private String refundChannel;
+  /**退款状态*/
+  private String refundState;
+  /**商品名称*/
+  private String body;
+  /**商户数据包*/
+  private String attach;
+  /**手续费*/
+  private String poundage;
+  /**费率*/
+  private String poundageRate;
+  public String getTradeTime()
+  {
+    return tradeTime;
+  }
+  public void setTradeTime(String tradeTime)
+  {
+    this.tradeTime = tradeTime;
+  }
+  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 getSubMchId()
+  {
+    return subMchId;
+  }
+  public void setSubMchId(String subMchId)
+  {
+    this.subMchId = subMchId;
+  }
+  public String getDeviceInfo()
+  {
+    return deviceInfo;
+  }
+  public void setDeviceInfo(String deviceInfo)
+  {
+    this.deviceInfo = deviceInfo;
+  }
+  public String getTransationId()
+  {
+    return transationId;
+  }
+  public void setTransationId(String transationId)
+  {
+    this.transationId = transationId;
+  }
+  public String getOutTradeNo()
+  {
+    return outTradeNo;
+  }
+  public void setOutTradeNo(String outTradeNo)
+  {
+    this.outTradeNo = outTradeNo;
+  }
+  public String getOpenId()
+  {
+    return openId;
+  }
+  public void setOpenId(String openId)
+  {
+    this.openId = openId;
+  }
+  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 String getFeeType()
+  {
+    return feeType;
+  }
+  public void setFeeType(String feeType)
+  {
+    this.feeType = feeType;
+  }
+  public String getTotalFee()
+  {
+    return totalFee;
+  }
+  public void setTotalFee(String totalFee)
+  {
+    this.totalFee = totalFee;
+  }
+  public String getCouponFee()
+  {
+    return couponFee;
+  }
+  public void setCouponFee(String couponFee)
+  {
+    this.couponFee = couponFee;
+  }
+  public String getRefundId()
+  {
+    return refundId;
+  }
+  public void setRefundId(String refundId)
+  {
+    this.refundId = refundId;
+  }
+  public String getOutRefundNo()
+  {
+    return outRefundNo;
+  }
+  public void setOutRefundNo(String outRefundNo)
+  {
+    this.outRefundNo = outRefundNo;
+  }
+  public String getSettlementRefundFee()
+  {
+    return settlementRefundFee;
+  }
+  public void setSettlementRefundFee(String settlementRefundFee)
+  {
+    this.settlementRefundFee = settlementRefundFee;
+  }
+  public String getCouponRefundFee()
+  {
+    return couponRefundFee;
+  }
+  public void setCouponRefundFee(String couponRefundFee)
+  {
+    this.couponRefundFee = couponRefundFee;
+  }
+  public String getRefundChannel()
+  {
+    return refundChannel;
+  }
+  public void setRefundChannel(String refundChannel)
+  {
+    this.refundChannel = refundChannel;
+  }
+  public String getRefundState()
+  {
+    return refundState;
+  }
+  public void setRefundState(String refundState)
+  {
+    this.refundState = refundState;
+  }
+  public String getBody()
+  {
+    return body;
+  }
+  public void setBody(String body)
+  {
+    this.body = body;
+  }
+  public String getAttach()
+  {
+    return attach;
+  }
+  public void setAttach(String attach)
+  {
+    this.attach = attach;
+  }
+  public String getPoundage()
+  {
+    return poundage;
+  }
+  public void setPoundage(String poundage)
+  {
+    this.poundage = poundage;
+  }
+  public String getPoundageRate()
+  {
+    return poundageRate;
+  }
+  public void setPoundageRate(String poundageRate)
+  {
+    this.poundageRate = poundageRate;
+  }
+  public static long getSerialversionuid()
+  {
+    return serialVersionUID;
+  }
+  
+}

From 3fcb562aa4397c4a7ac35b668e8ef0a819395fcb Mon Sep 17 00:00:00 2001
From: DDLeEHi <569198459@qq.com>
Date: Tue, 23 May 2017 15:54:53 +0800
Subject: [PATCH 09/14] =?UTF-8?q?=E5=AF=B9=E8=B4=A6=E7=BB=93=E6=9E=9C?=
 =?UTF-8?q?=E5=AE=9E=E4=BD=93?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../wxpay/bean/result/WxPayBillResult         | 274 +++---------------
 1 file changed, 46 insertions(+), 228 deletions(-)

diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayBillResult b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayBillResult
index 1b21eff597..348ed7c7b2 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayBillResult
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayBillResult
@@ -1,263 +1,81 @@
 package com.github.binarywang.wxpay.bean.result;
 
-import java.io.Serializable;
+import java.util.List;
 
-public class WxPayBillBaseResult implements Serializable
+public class WxPayBillResult
 {
-
-  /**
-   * 
-   */
-  private static final long serialVersionUID = 1L;
-  /*
-   * 交易时间:2017-04-06 01:00:02 公众账号ID:wx4d37b636d597242f 商户号:1383905002 子商户号:0 设备号:WEB
-   * 微信订单号:4006332001201704055977648276 商户订单号:2017040519091071873216 用户标识:oH0mKxIAQ3Ktoyj3B7iZRRSi2rtU 交易类型:NATIVE
-   * 交易状态:REFUND 付款银行:CFT 货币种类:CNY 总金额:0.00 企业红包金额:0.00 微信退款单号:2006332001201704061002766728 商户退款单号:20170406010000933
-   * 退款金额:0.01 企业红包退款金额:0.00 退款类型:ORIGINAL 退款状态:SUCCESS 商品名称:互联网医院问诊订单 商户数据包: 手续费:0.00000 费率 :0.60%
-   */
-  /**交易时间*/
-  private String tradeTime;
-  /**公众账号ID*/
-  private String appId;
-  /**商户号*/
-  private String mchId;
-  /**子商户号*/
-  private String subMchId;
-  /**设备号*/
-  private String deviceInfo;
-  /**微信订单号*/
-  private String transationId;
-  /**商户订单号*/
-  private String outTradeNo;
-  /**用户标识*/
-  private String openId;
-  /**交易类型*/
-  private String tradeType;
-  /**交易状态*/
-  private String tradeState ;
-  /**付款银行*/
-  private String bankType;
-  /**货币种类*/
-  private String feeType;
-  /**总金额*/
+  private List wxPayBillBaseResultLst;
+  /**总交易单数*/
+  private String totalRecord;
+  /**总交易额*/
   private String totalFee;
-  /**企业红包金额*/
-  private String couponFee;
-  /**微信退款单号*/
-  private String refundId;
-  /**商户退款单号*/
-  private String outRefundNo;
-  /**退款金额*/
-  private String settlementRefundFee;
-  /**企业红包退款金额*/
-  private String couponRefundFee;
-  /**退款类型*/
-  private String refundChannel;
-  /**退款状态*/
-  private String refundState;
-  /**商品名称*/
-  private String body;
-  /**商户数据包*/
-  private String attach;
-  /**手续费*/
-  private String poundage;
-  /**费率*/
-  private String poundageRate;
-  public String getTradeTime()
-  {
-    return tradeTime;
-  }
-  public void setTradeTime(String tradeTime)
-  {
-    this.tradeTime = tradeTime;
-  }
-  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 getSubMchId()
-  {
-    return subMchId;
-  }
-  public void setSubMchId(String subMchId)
-  {
-    this.subMchId = subMchId;
-  }
-  public String getDeviceInfo()
-  {
-    return deviceInfo;
-  }
-  public void setDeviceInfo(String deviceInfo)
-  {
-    this.deviceInfo = deviceInfo;
-  }
-  public String getTransationId()
-  {
-    return transationId;
-  }
-  public void setTransationId(String transationId)
-  {
-    this.transationId = transationId;
-  }
-  public String getOutTradeNo()
-  {
-    return outTradeNo;
-  }
-  public void setOutTradeNo(String outTradeNo)
-  {
-    this.outTradeNo = outTradeNo;
-  }
-  public String getOpenId()
-  {
-    return openId;
-  }
-  public void setOpenId(String openId)
-  {
-    this.openId = openId;
-  }
-  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()
+  /**总退款金额*/
+  private String totalRefundFee;
+  /**总代金券或立减优惠退款金额*/
+  private String totalCouponFee;
+  /**手续费总金额 */
+  private String totalPoundageFee;
+
+  public List getWxPayBillBaseResultLst()
   {
-    return bankType;
+    return wxPayBillBaseResultLst;
   }
-  public void setBankType(String bankType)
+
+  public void setWxPayBillBaseResultLst(List wxPayBillBaseResultLst)
   {
-    this.bankType = bankType;
+    this.wxPayBillBaseResultLst = wxPayBillBaseResultLst;
   }
-  public String getFeeType()
+
+  public String getTotalRecord()
   {
-    return feeType;
+    return totalRecord;
   }
-  public void setFeeType(String feeType)
+
+  public void setTotalRecord(String totalRecord)
   {
-    this.feeType = feeType;
+    this.totalRecord = totalRecord;
   }
+
   public String getTotalFee()
   {
     return totalFee;
   }
+
   public void setTotalFee(String totalFee)
   {
     this.totalFee = totalFee;
   }
-  public String getCouponFee()
-  {
-    return couponFee;
-  }
-  public void setCouponFee(String couponFee)
-  {
-    this.couponFee = couponFee;
-  }
-  public String getRefundId()
-  {
-    return refundId;
-  }
-  public void setRefundId(String refundId)
-  {
-    this.refundId = refundId;
-  }
-  public String getOutRefundNo()
-  {
-    return outRefundNo;
-  }
-  public void setOutRefundNo(String outRefundNo)
-  {
-    this.outRefundNo = outRefundNo;
-  }
-  public String getSettlementRefundFee()
-  {
-    return settlementRefundFee;
-  }
-  public void setSettlementRefundFee(String settlementRefundFee)
-  {
-    this.settlementRefundFee = settlementRefundFee;
-  }
-  public String getCouponRefundFee()
-  {
-    return couponRefundFee;
-  }
-  public void setCouponRefundFee(String couponRefundFee)
-  {
-    this.couponRefundFee = couponRefundFee;
-  }
-  public String getRefundChannel()
-  {
-    return refundChannel;
-  }
-  public void setRefundChannel(String refundChannel)
-  {
-    this.refundChannel = refundChannel;
-  }
-  public String getRefundState()
-  {
-    return refundState;
-  }
-  public void setRefundState(String refundState)
-  {
-    this.refundState = refundState;
-  }
-  public String getBody()
-  {
-    return body;
-  }
-  public void setBody(String body)
-  {
-    this.body = body;
-  }
-  public String getAttach()
-  {
-    return attach;
-  }
-  public void setAttach(String attach)
+
+  public String getTotalRefundFee()
   {
-    this.attach = attach;
+    return totalRefundFee;
   }
-  public String getPoundage()
+
+  public void setTotalRefundFee(String totalRefundFee)
   {
-    return poundage;
+    this.totalRefundFee = totalRefundFee;
   }
-  public void setPoundage(String poundage)
+
+  public String getTotalCouponFee()
   {
-    this.poundage = poundage;
+    return totalCouponFee;
   }
-  public String getPoundageRate()
+
+  public void setTotalCouponFee(String totalCouponFee)
   {
-    return poundageRate;
+    this.totalCouponFee = totalCouponFee;
   }
-  public void setPoundageRate(String poundageRate)
+
+  public String getTotalPoundageFee()
   {
-    this.poundageRate = poundageRate;
+    return totalPoundageFee;
   }
-  public static long getSerialversionuid()
+
+  public void setTotalPoundageFee(String totalPoundageFee)
   {
-    return serialVersionUID;
+    this.totalPoundageFee = totalPoundageFee;
   }
   
+  
+
 }

From f2e74e02099842cfaa00c3fbc1d934909b692848 Mon Sep 17 00:00:00 2001
From: DDLeEHi <569198459@qq.com>
Date: Tue, 23 May 2017 16:06:10 +0800
Subject: [PATCH 10/14] =?UTF-8?q?=E5=AF=B9=E8=B4=A6=E8=BF=94=E5=9B=9E?=
 =?UTF-8?q?=E5=A4=84=E7=90=86=E5=AF=B9=E5=BA=94=E4=BF=AE=E6=94=B9?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../binarywang/wxpay/service/impl/WxPayServiceImplTest.java  | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/service/impl/WxPayServiceImplTest.java b/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/service/impl/WxPayServiceImplTest.java
index b59bd1eb79..22269f58f7 100644
--- a/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/service/impl/WxPayServiceImplTest.java
+++ b/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/service/impl/WxPayServiceImplTest.java
@@ -50,8 +50,9 @@ public void testGetPayInfo() throws Exception {
 
   @Test
   public void testDownloadBill() throws Exception {
-    File file = this.payService.downloadBill("20170101", "ALL", "GZIP", "1111111");
-    assertNotNull(file);
+    WxPayBillResult wxPayBillResult = this.payService.downloadBill("20170101", "ALL", "GZIP", "1111111");
+    //前一天没有账单记录返回null
+    assertNotNull(wxPayBillResult);
     //必填字段为空时,抛出异常
     this.payService.downloadBill("", "", "", null);
   }

From 74826f4b9c0cf80b378294ce8c5c0ea18007ad84 Mon Sep 17 00:00:00 2001
From: DDLeEHi <569198459@qq.com>
Date: Wed, 24 May 2017 09:43:56 +0800
Subject: [PATCH 11/14] =?UTF-8?q?=E9=80=80=E6=AC=BE=E5=9F=BA=E7=A1=80?=
 =?UTF-8?q?=E5=AE=9E=E4=BD=93=E7=B1=BB?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../wxpay/bean/result/WxPayBillBaseResult         | 15 +++++----------
 1 file changed, 5 insertions(+), 10 deletions(-)

diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayBillBaseResult b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayBillBaseResult
index 1b21eff597..f6ac69a1f1 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayBillBaseResult
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayBillBaseResult
@@ -4,17 +4,12 @@ import java.io.Serializable;
 
 public class WxPayBillBaseResult implements Serializable
 {
-
-  /**
-   * 
-   */
+    /*
+     * 交易时间:2017-04-06 01:00:02 公众账号ID: 商户号: 子商户号:0 设备号:WEB 微信订单号: 商户订单号:2017040519091071873216 用户标识: 交易类型:NATIVE
+     * 交易状态:REFUND 付款银行:CFT 货币种类:CNY 总金额:0.00 企业红包金额:0.00 微信退款单号: 商户退款单号:20170406010000933 退款金额:0.01 企业红包退款金额:0.00
+     * 退款类型:ORIGINAL 退款状态:SUCCESS 商品名称: 商户数据包: 手续费:0.00000 费率 :0.60%
+     */
   private static final long serialVersionUID = 1L;
-  /*
-   * 交易时间:2017-04-06 01:00:02 公众账号ID:wx4d37b636d597242f 商户号:1383905002 子商户号:0 设备号:WEB
-   * 微信订单号:4006332001201704055977648276 商户订单号:2017040519091071873216 用户标识:oH0mKxIAQ3Ktoyj3B7iZRRSi2rtU 交易类型:NATIVE
-   * 交易状态:REFUND 付款银行:CFT 货币种类:CNY 总金额:0.00 企业红包金额:0.00 微信退款单号:2006332001201704061002766728 商户退款单号:20170406010000933
-   * 退款金额:0.01 企业红包退款金额:0.00 退款类型:ORIGINAL 退款状态:SUCCESS 商品名称:互联网医院问诊订单 商户数据包: 手续费:0.00000 费率 :0.60%
-   */
   /**交易时间*/
   private String tradeTime;
   /**公众账号ID*/

From 55ad0f5a057485a0fcce7aef793556866fcb7a97 Mon Sep 17 00:00:00 2001
From: DDLeEHi <569198459@qq.com>
Date: Wed, 24 May 2017 09:47:44 +0800
Subject: [PATCH 12/14] =?UTF-8?q?=E9=80=80=E6=AC=BE=E8=BF=94=E5=9B=9E?=
 =?UTF-8?q?=E5=AF=B9=E8=B1=A1?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../github/binarywang/wxpay/bean/result/WxPayBillResult    | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayBillResult b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayBillResult
index 348ed7c7b2..ca8bf5aca4 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayBillResult
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayBillResult
@@ -2,8 +2,13 @@ package com.github.binarywang.wxpay.bean.result;
 
 import java.util.List;
 
-public class WxPayBillResult
+public class WxPayBillResult implements Serializable
 {
+  /**
+   * 退款返回对象
+   */
+  private static final long serialVersionUID = 1L;
+  
   private List wxPayBillBaseResultLst;
   /**总交易单数*/
   private String totalRecord;

From 1c82e133288a4e3e32f88d0352a739c05dc8dcdf Mon Sep 17 00:00:00 2001
From: DDLeEHi <569198459@qq.com>
Date: Wed, 24 May 2017 09:48:19 +0800
Subject: [PATCH 13/14] =?UTF-8?q?=E5=AF=B9=E8=B4=A6=E8=BF=94=E5=9B=9E?=
 =?UTF-8?q?=E5=AF=B9=E8=B1=A1?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

 - -
---
 .../com/github/binarywang/wxpay/bean/result/WxPayBillResult     | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayBillResult b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayBillResult
index ca8bf5aca4..d7b64dccd5 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayBillResult
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayBillResult
@@ -5,7 +5,7 @@ import java.util.List;
 public class WxPayBillResult implements Serializable
 {
   /**
-   * 退款返回对象
+   * 对账返回对象
    */
   private static final long serialVersionUID = 1L;
   

From fa2ea3093bdd9fad8b220c0cda873a07d635f12f Mon Sep 17 00:00:00 2001
From: DDLeEHi <569198459@qq.com>
Date: Wed, 24 May 2017 09:53:44 +0800
Subject: [PATCH 14/14] =?UTF-8?q?=E5=AF=B9=E8=B4=A6=E5=9F=BA=E7=A1=80?=
 =?UTF-8?q?=E5=AE=9E=E4=BD=93=E7=B1=BB?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

11
---
 .../com/github/binarywang/wxpay/bean/result/WxPayBillBaseResult  | 1 -
 1 file changed, 1 deletion(-)

diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayBillBaseResult b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayBillBaseResult
index f6ac69a1f1..530d9a2295 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayBillBaseResult
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayBillBaseResult
@@ -1,5 +1,4 @@
 package com.github.binarywang.wxpay.bean.result;
-
 import java.io.Serializable;
 
 public class WxPayBillBaseResult implements Serializable