From 9d2fb9fe3d7bc0733ae433e722aaa86d69142f6c Mon Sep 17 00:00:00 2001 From: DDLeEHi <569198459@qq.com> Date: Wed, 24 May 2017 10:40:32 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84=E5=BE=AE=E4=BF=A1=E6=94=AF?= =?UTF-8?q?=E4=BB=98=20=E4=B8=8B=E8=BD=BD=E5=AF=B9=E8=B4=A6=E5=8D=95=20?= =?UTF-8?q?=E7=9A=84=E6=8E=A5=E5=8F=A3=20#65?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wxpay/bean/result/WxPayBillBaseResult | 257 ++++++++++++++++++ .../wxpay/bean/result/WxPayBillResult | 86 ++++++ .../wxpay/service/WxPayService.java | 2 +- .../wxpay/service/impl/WxPayServiceImpl.java | 84 +++++- .../service/impl/WxPayServiceImplTest.java | 5 +- 5 files changed, 426 insertions(+), 8 deletions(-) create mode 100644 weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayBillBaseResult 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/WxPayBillBaseResult b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayBillBaseResult new file mode 100644 index 00000000..530d9a22 --- /dev/null +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayBillBaseResult @@ -0,0 +1,257 @@ +package com.github.binarywang.wxpay.bean.result; +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; + /**交易时间*/ + 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; + } + +} 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 00000000..d7b64dcc --- /dev/null +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayBillResult @@ -0,0 +1,86 @@ +package com.github.binarywang.wxpay.bean.result; + +import java.util.List; + +public class WxPayBillResult implements Serializable +{ + /** + * 对账返回对象 + */ + private static final long serialVersionUID = 1L; + + private List wxPayBillBaseResultLst; + /**总交易单数*/ + private String totalRecord; + /**总交易额*/ + private String totalFee; + /**总退款金额*/ + private String totalRefundFee; + /**总代金券或立减优惠退款金额*/ + private String totalCouponFee; + /**手续费总金额 */ + private String totalPoundageFee; + + public List getWxPayBillBaseResultLst() + { + return wxPayBillBaseResultLst; + } + + public void setWxPayBillBaseResultLst(List wxPayBillBaseResultLst) + { + this.wxPayBillBaseResultLst = wxPayBillBaseResultLst; + } + + public String getTotalRecord() + { + return totalRecord; + } + + public void setTotalRecord(String totalRecord) + { + this.totalRecord = totalRecord; + } + + public String getTotalFee() + { + return totalFee; + } + + public void setTotalFee(String totalFee) + { + this.totalFee = totalFee; + } + + public String getTotalRefundFee() + { + return totalRefundFee; + } + + public void setTotalRefundFee(String totalRefundFee) + { + this.totalRefundFee = totalRefundFee; + } + + public String getTotalCouponFee() + { + return totalCouponFee; + } + + public void setTotalCouponFee(String totalCouponFee) + { + this.totalCouponFee = totalCouponFee; + } + + public String getTotalPoundageFee() + { + return totalPoundageFee; + } + + public void setTotalPoundageFee(String totalPoundageFee) + { + this.totalPoundageFee = totalPoundageFee; + } + + + +} 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 c04d7706..999c733e 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 @@ public interface WxPayService { * @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; /** *
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 90778999..9de0790f 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 class WxPayServiceImpl implements WxPayService {
   }
 
   @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 class WxPayServiceImpl implements WxPayService {
     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
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 1ca8d2e6..685337c7 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
@@ -49,8 +49,9 @@ public class WxPayServiceImplTest {
 
   @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);
   }