Browse Source

完善微信支付 下载对账单 的接口 #65

master
DDLeEHi 7 years ago
committed by Binary Wang
parent
commit
9d2fb9fe3d
5 changed files with 426 additions and 8 deletions
  1. +257
    -0
      weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayBillBaseResult
  2. +86
    -0
      weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayBillResult
  3. +1
    -1
      weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/WxPayService.java
  4. +79
    -5
      weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/WxPayServiceImpl.java
  5. +3
    -2
      weixin-java-pay/src/test/java/com/github/binarywang/wxpay/service/impl/WxPayServiceImplTest.java

+ 257
- 0
weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayBillBaseResult View File

@@ -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;
}
}

+ 86
- 0
weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayBillResult View File

@@ -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;
}

}

+ 1
- 1
weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/WxPayService.java View File

@@ -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>


+ 79
- 5
weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/WxPayServiceImpl.java View File

@@ -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


+ 3
- 2
weixin-java-pay/src/test/java/com/github/binarywang/wxpay/service/impl/WxPayServiceImplTest.java View File

@@ -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);
}


Loading…
Cancel
Save