瀏覽代碼

#404 微信支付对账单下载接口增加对非ALL类型的支持

master
Howard Liu 6 年之前
committed by Binary Wang
父節點
當前提交
5db8229a8f
共有 3 個文件被更改,包括 264 次插入18 次删除
  1. +8
    -1
      weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayBillInfo.java
  2. +254
    -7
      weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayBillResult.java
  3. +2
    -10
      weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/BaseWxPayServiceImpl.java

+ 8
- 1
weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayBillInfo.java 查看文件

@@ -131,5 +131,12 @@ public class WxPayBillInfo implements Serializable {
* 费率备注.
*/
private String feeRemark;

/**
* 退款申请时间
*/
private String refundTime;
/**
* 退款成功时间
*/
private String refundSuccessTime;
}

+ 254
- 7
weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayBillResult.java 查看文件

@@ -58,9 +58,36 @@ public class WxPayBillResult implements Serializable {
private String totalAppliedRefundFee;

/**
* 从原始对账单字符串里构造出WxPayBillResult对象.
* 根据账单类型,从原始对账单字符串里构造出WxPayBillResult对象
*
* @param responseContent 原始对账单字符串
* @param billType 账单类型
* @return WxPayBillResult对象
*/
public static WxPayBillResult fromRawBillResultString(String responseContent) {
public static WxPayBillResult fromRawBillResultString(String responseContent, String billType) {
switch (billType) {
case "ALL":{
return fromRawBillResultString(responseContent);
}
case "SUCCESS":{
return fromRawBillResultStringToSuccess(responseContent);
}
case "REFUND" :{
return fromRawBillResultStringToRefund(responseContent);
}
case "RECHARGE_REFUND" :{
return fromRawBillResultStringToRechargeRefund(responseContent);
}
default: {
return null;
}
}
}

/**
* 从原始对账单字符串里构造出WxPayBillResult对象,用于构建当日所有订单信息
*/
private static WxPayBillResult fromRawBillResultString(String responseContent) {
String listStr = "";
String objStr = "";
if (responseContent.contains(TOTAL_DEAL_COUNT)) {
@@ -105,9 +132,6 @@ public class WxPayBillResult implements Serializable {
result.setAttach(tempStr[k + 21].trim());
result.setPoundage(tempStr[k + 22].trim());
result.setPoundageRate(tempStr[k + 23].trim());
result.setTotalAmount(tempStr[k + 24].trim());
result.setAppliedRefundAmount(tempStr[k + 25].trim());
result.setFeeRemark(tempStr[k + 26].trim());
results.add(result);
k += t.length;
}
@@ -125,9 +149,232 @@ public class WxPayBillResult implements Serializable {
billResult.setTotalRefundFee(totalTempStr[3].trim());
billResult.setTotalCouponFee(totalTempStr[4].trim());
billResult.setTotalPoundageFee(totalTempStr[5].trim());
billResult.setTotalAmount(totalTempStr[6].trim());
billResult.setTotalAppliedRefundFee(totalTempStr[7].trim());
return billResult;
}

/**
* 从原始对账单字符串里构造出WxPayBillResult对象,用于构建当日成功支付的订单
*/
private static WxPayBillResult fromRawBillResultStringToSuccess(String responseContent) {
String listStr = "";
String objStr = "";
if (responseContent.contains(TOTAL_DEAL_COUNT)) {
listStr = responseContent.substring(0, responseContent.indexOf(TOTAL_DEAL_COUNT));
objStr = responseContent.substring(responseContent.indexOf(TOTAL_DEAL_COUNT));
}

List<WxPayBillInfo> results = new ArrayList<>();
// 去空格
String newStr = listStr.replaceAll(",", " ");
// 数据分组
String[] tempStr = newStr.split("`");
// 分组标题
String[] t = tempStr[0].split(" ");
// 计算循环次数
int j = tempStr.length / t.length;
// 纪录数组下标
int k = 1;
// 交易时间,公众账号ID,商户号,子商户号,设备号,微信订单号,商户订单号,用户标识,交易类型,交易状态,付款银行,货币种类,总金额,代金券或立减优惠金额,商品名称,商户数据包,手续费,费率
for (int i = 0; i < j; i++) {
WxPayBillInfo result = new WxPayBillInfo();
result.setTradeTime(tempStr[k].trim());
result.setAppId(tempStr[k + 1].trim());
result.setMchId(tempStr[k + 2].trim());
result.setSubMchId(tempStr[k + 3].trim());
result.setDeviceInfo(tempStr[k + 4].trim());
result.setTransactionId(tempStr[k + 5].trim());
result.setOutTradeNo(tempStr[k + 6].trim());
result.setOpenId(tempStr[k + 7].trim());
result.setTradeType(tempStr[k + 8].trim());
result.setTradeState(tempStr[k + 9].trim());
result.setBankType(tempStr[k + 10].trim());
result.setFeeType(tempStr[k + 11].trim());
result.setTotalFee(tempStr[k + 12].trim());
result.setCouponFee(tempStr[k + 13].trim());
result.setBody(tempStr[k + 14].trim());
result.setAttach(tempStr[k + 15].trim());
result.setPoundage(tempStr[k + 16].trim());
result.setPoundageRate(tempStr[k + 17].trim());
results.add(result);
k += t.length;
}

WxPayBillResult billResult = new WxPayBillResult();
billResult.setBillInfoList(results);

/*
* 总交易单数,应结订单总金额,退款总金额,充值券退款总金额,手续费总金额,订单总金额,申请退款总金额 `2,`0.02,`0.0,`0.0,`0
* 参考以上格式进行取值
*/
String[] totalTempStr = objStr.replaceAll(",", " ").split("`");
billResult.setTotalRecord(totalTempStr[1].trim());
billResult.setTotalFee(totalTempStr[2].trim());
billResult.setTotalRefundFee(totalTempStr[3].trim());
billResult.setTotalCouponFee(totalTempStr[4].trim());
billResult.setTotalPoundageFee(totalTempStr[5].trim());
return billResult;
}

/**
* 从原始对账单字符串里构造出WxPayBillResult对象,用于构建当日退款的订单
*/
private static WxPayBillResult fromRawBillResultStringToRefund(String responseContent) {
String listStr = "";
String objStr = "";
if (responseContent.contains(TOTAL_DEAL_COUNT)) {
listStr = responseContent.substring(0, responseContent.indexOf(TOTAL_DEAL_COUNT));
objStr = responseContent.substring(responseContent.indexOf(TOTAL_DEAL_COUNT));
}

List<WxPayBillInfo> results = new ArrayList<>();
// 去空格
String newStr = listStr.replaceAll(",", " ");
// 数据分组
String[] tempStr = newStr.split("`");
// 分组标题
String[] t = tempStr[0].split(" ");
// 计算循环次数
int j = tempStr.length / t.length;
// 纪录数组下标
int k = 1;
// 交易时间,公众账号ID,商户号,子商户号,设备号,微信订单号,商户订单号,用户标识,交易类型,交易状态,付款银行,货币种类,总金额,代金券或立减优惠金额,
// 退款申请时间,退款成功时间,微信退款单号,商户退款单号,退款金额,代金券或立减优惠退款金额,退款类型,退款状态,商品名称,商户数据包,手续费,费率
for (int i = 0; i < j; i++) {
WxPayBillInfo result = new WxPayBillInfo();
result.setTradeTime(tempStr[k].trim());
result.setAppId(tempStr[k + 1].trim());
result.setMchId(tempStr[k + 2].trim());
result.setSubMchId(tempStr[k + 3].trim());
result.setDeviceInfo(tempStr[k + 4].trim());
result.setTransactionId(tempStr[k + 5].trim());
result.setOutTradeNo(tempStr[k + 6].trim());
result.setOpenId(tempStr[k + 7].trim());
result.setTradeType(tempStr[k + 8].trim());
result.setTradeState(tempStr[k + 9].trim());
result.setBankType(tempStr[k + 10].trim());
result.setFeeType(tempStr[k + 11].trim());
result.setTotalFee(tempStr[k + 12].trim());
result.setCouponFee(tempStr[k + 13].trim());
result.setRefundTime(tempStr[k + 14].trim());
result.setRefundSuccessTime(tempStr[k + 15].trim());
result.setRefundId(tempStr[k + 16].trim());
result.setOutRefundNo(tempStr[k + 17].trim());
result.setSettlementRefundFee(tempStr[k + 18].trim());
result.setCouponRefundFee(tempStr[k + 19].trim());
result.setRefundChannel(tempStr[k + 20].trim());
result.setRefundState(tempStr[k + 21].trim());
result.setBody(tempStr[k + 22].trim());
result.setAttach(tempStr[k + 23].trim());
result.setPoundage(tempStr[k + 24].trim());
result.setPoundageRate(tempStr[k + 25].trim());
results.add(result);
k += t.length;
}

WxPayBillResult billResult = new WxPayBillResult();
billResult.setBillInfoList(results);

/*
* 总交易单数,应结订单总金额,退款总金额,充值券退款总金额,手续费总金额,订单总金额,申请退款总金额 `2,`0.02,`0.0,`0.0,`0
* 参考以上格式进行取值
*/
String[] totalTempStr = objStr.replaceAll(",", " ").split("`");
billResult.setTotalRecord(totalTempStr[1].trim());
billResult.setTotalFee(totalTempStr[2].trim());
billResult.setTotalRefundFee(totalTempStr[3].trim());
billResult.setTotalCouponFee(totalTempStr[4].trim());
billResult.setTotalPoundageFee(totalTempStr[5].trim());
billResult.setTotalAmount(get(totalTempStr, 6));
billResult.setTotalAppliedRefundFee(get(totalTempStr, 7));

return billResult;
}

/**
* 从原始对账单字符串里构造出WxPayBillResult对象,用于构建当日充值退款订单
*/
private static WxPayBillResult fromRawBillResultStringToRechargeRefund(String responseContent) {
String listStr = "";
String objStr = "";
if (responseContent.contains(TOTAL_DEAL_COUNT)) {
listStr = responseContent.substring(0, responseContent.indexOf(TOTAL_DEAL_COUNT));
objStr = responseContent.substring(responseContent.indexOf(TOTAL_DEAL_COUNT));
}

List<WxPayBillInfo> results = new ArrayList<>();
// 去空格
String newStr = listStr.replaceAll(",", " ");
// 数据分组
String[] tempStr = newStr.split("`");
// 分组标题
String[] t = tempStr[0].split(" ");
// 计算循环次数
int j = tempStr.length / t.length;
// 纪录数组下标
int k = 1;
// 交易时间,公众账号ID,商户号,子商户号,设备号,微信订单号,商户订单号,用户标识,交易类型,交易状态,付款银行,货币种类,应结订单金额,代金券金额,
// 退款申请时间,退款成功时间,微信退款单号,商户退款单号,退款金额,充值券退款金额,退款类型,退款状态,商品名称,商户数据包,返还手续费,费率,订单金额,申请退款金额
for (int i = 0; i < j; i++) {
WxPayBillInfo result = new WxPayBillInfo();
result.setTradeTime(tempStr[k].trim());
result.setAppId(tempStr[k + 1].trim());
result.setMchId(tempStr[k + 2].trim());
result.setSubMchId(tempStr[k + 3].trim());
result.setDeviceInfo(tempStr[k + 4].trim());
result.setTransactionId(tempStr[k + 5].trim());
result.setOutTradeNo(tempStr[k + 6].trim());
result.setOpenId(tempStr[k + 7].trim());
result.setTradeType(tempStr[k + 8].trim());
result.setTradeState(tempStr[k + 9].trim());
result.setBankType(tempStr[k + 10].trim());
result.setFeeType(tempStr[k + 11].trim());
result.setTotalFee(tempStr[k + 12].trim());
result.setCouponFee(tempStr[k + 13].trim());
result.setRefundTime(tempStr[k + 14].trim());
result.setRefundSuccessTime(tempStr[k + 15].trim());
result.setRefundId(tempStr[k + 16].trim());
result.setOutRefundNo(tempStr[k + 17].trim());
result.setSettlementRefundFee(tempStr[k + 18].trim());
result.setCouponRefundFee(tempStr[k + 19].trim());
result.setRefundChannel(tempStr[k + 20].trim());
result.setRefundState(tempStr[k + 21].trim());
result.setBody(tempStr[k + 22].trim());
result.setAttach(tempStr[k + 23].trim());
result.setPoundage(tempStr[k + 24].trim());
result.setPoundageRate(tempStr[k + 25].trim());
result.setTotalAmount(get(tempStr, k + 26, t.length));
result.setAppliedRefundAmount(get(tempStr, k + 27, t.length));
results.add(result);
k += t.length;
}

WxPayBillResult billResult = new WxPayBillResult();
billResult.setBillInfoList(results);

/*
* 总交易单数,应结订单总金额,退款总金额,充值券退款总金额,手续费总金额,订单总金额,申请退款总金额 `2,`0.02,`0.0,`0.0,`0
* 参考以上格式进行取值
*/
String[] totalTempStr = objStr.replaceAll(",", " ").split("`");
billResult.setTotalRecord(totalTempStr[1].trim());
billResult.setTotalFee(totalTempStr[2].trim());
billResult.setTotalRefundFee(totalTempStr[3].trim());
billResult.setTotalCouponFee(totalTempStr[4].trim());
billResult.setTotalPoundageFee(totalTempStr[5].trim());
billResult.setTotalAmount(get(totalTempStr, 6));
billResult.setTotalAppliedRefundFee(get(totalTempStr, 7));

return billResult;
}

private static String get(String[] array, int idx) {
return get(array, idx, array.length);
}

private static String get(String[] array, int idx, int length) {
if (length > idx) {
return array[idx].trim();
}
return null;
}
}

+ 2
- 10
weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/BaseWxPayServiceImpl.java 查看文件

@@ -505,11 +505,7 @@ public abstract class BaseWxPayServiceImpl implements WxPayService {
}

private WxPayDownloadBillRequest buildDownloadBillRequest(String billDate, String billType, String tarType,
String deviceInfo) throws WxPayException {
if (!BillType.ALL.equals(billType)) {
throw new WxPayException("目前仅支持ALL类型的对账单下载");
}

String deviceInfo) {
WxPayDownloadBillRequest request = new WxPayDownloadBillRequest();
request.setBillType(billType);
request.setBillDate(billDate);
@@ -548,11 +544,7 @@ public abstract class BaseWxPayServiceImpl implements WxPayService {
}

private WxPayBillResult handleBill(String billType, String responseContent) {
if (!BillType.ALL.equals(billType)) {
return null;
}

return WxPayBillResult.fromRawBillResultString(responseContent);
return WxPayBillResult.fromRawBillResultString(responseContent, billType);
}

private String handleGzipBill(String url, String requestStr) {


Loading…
取消
儲存