From 5db8229a8f86e0850274573b2527880563e2797c Mon Sep 17 00:00:00 2001 From: Howard Liu Date: Thu, 13 Dec 2018 17:58:18 +0800 Subject: [PATCH] =?UTF-8?q?#404=20=E5=BE=AE=E4=BF=A1=E6=94=AF=E4=BB=98?= =?UTF-8?q?=E5=AF=B9=E8=B4=A6=E5=8D=95=E4=B8=8B=E8=BD=BD=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=AF=B9=E9=9D=9EALL=E7=B1=BB=E5=9E=8B?= =?UTF-8?q?=E7=9A=84=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wxpay/bean/result/WxPayBillInfo.java | 9 +- .../wxpay/bean/result/WxPayBillResult.java | 261 +++++++++++++++++- .../service/impl/BaseWxPayServiceImpl.java | 12 +- 3 files changed, 264 insertions(+), 18 deletions(-) diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayBillInfo.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayBillInfo.java index dbf84ac3..f77d49e7 100644 --- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayBillInfo.java +++ b/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; } diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayBillResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayBillResult.java index 11ab1208..e568a77d 100644 --- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayBillResult.java +++ b/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 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 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 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; + } } diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/BaseWxPayServiceImpl.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/BaseWxPayServiceImpl.java index c6cc0604..f7626319 100644 --- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/BaseWxPayServiceImpl.java +++ b/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) {