@@ -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; | |||
} | |||
} |
@@ -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<WxPayBillBaseResult> wxPayBillBaseResultLst; | |||
/**总交易单数*/ | |||
private String totalRecord; | |||
/**总交易额*/ | |||
private String totalFee; | |||
/**总退款金额*/ | |||
private String totalRefundFee; | |||
/**总代金券或立减优惠退款金额*/ | |||
private String totalCouponFee; | |||
/**手续费总金额 */ | |||
private String totalPoundageFee; | |||
public List<WxPayBillBaseResult> getWxPayBillBaseResultLst() | |||
{ | |||
return wxPayBillBaseResultLst; | |||
} | |||
public void setWxPayBillBaseResultLst(List<WxPayBillBaseResult> 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; | |||
} | |||
} |
@@ -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; | |||
/** | |||
* <pre> | |||
@@ -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<WxPayBillBaseResult> wxPayBillBaseResultLst = new LinkedList<WxPayBillBaseResult>(); | |||
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 | |||
@@ -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); | |||
} | |||