本文是基于微信支付V2版本的工具类,如果使用V3的版本请参考官网:https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/pages/api.shtml
因为图方便,所以引入了两个公共的工具包 来处理https 请求 以及 加密,里面也封装了快速替换下面两个依赖的方式
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.3.2</version>
</dependency>
<dependency>
<groupId>com.github.javen205</groupId>
<artifactId>IJPay</artifactId>
<version>1.1.6</version>
</dependency> 工具类
package com.example.wxBill;
import cn.hutool.crypto.digest.MD5;
import com.jpay.ext.kit.PaymentKit;
import com.jpay.ext.kit.StrKit;
import com.jpay.util.HttpUtils;
import org.springframework.util.StringUtils;
import java.util.*;
public class WXBillDownUtils {
public final static String WX_DOWNLOAD_BILL_URL = "https://api.mch.weixin.qq.com/pay/downloadbill";
/**
* 需要替换的部分
*/
public final static String appid = "xxxx";
public final static String mch_id = "xxxx";
public final static String appKey = "xxxx";
public final static String default_characterEncoding = "UTF-8";
/**
* 入口测试
* @param args
*/
public static void main(String[] args) {
catchTradeBill("20201103");
}
public static void catchTradeBill(String yyyyMMdd) {
SortedMap<String, String> parameters = new TreeMap<String, String>();//用来放置各个所需要的参数,自己对应寻找填写。
parameters.put("appid", appid);
//下载对账单的日期,格式:20140603
parameters.put("bill_date", yyyyMMdd);
// bill_type:ALL返回当日所有订单信息,默认值SUCCESS返回当日成功支付的订单。REFUND,返回当日退款订单
parameters.put("bill_type", "ALL");
parameters.put("mch_id", mch_id);
//生成一个随机的nonce_str
parameters.put("nonce_str", UUID.randomUUID().toString().replace("-", ""));
//方式一:方法内部自定义的方法
// parameters.put("sign", createSign(default_characterEncoding, parameters));
// String result = HttpUtils.post(WX_DOWNLOAD_BILL_URL, toXml(parameters));
//这里可以使用工具类里面的 也可以使用我额外添加出来的方法,两个我都自己测试过 没问题
//方式二:使用工具包里面的,为什么要写两个呢,主要是为了部分项目里面已经有Http组件方便改动
parameters.put("sign", PaymentKit.createSign(parameters, appKey));
String result = HttpUtils.post(WX_DOWNLOAD_BILL_URL, PaymentKit.toXml(parameters));
phase(result);
// System.out.println(result);
}
public static String createSign(String characterEncoding, SortedMap<String, String> parameters) {
StringBuffer sb = new StringBuffer();
Set es = parameters.entrySet();
Iterator it = es.iterator();
while (it.hasNext()) {
Map.Entry entry = (Map.Entry) it.next();
String k = (String) entry.getKey();
Object v = entry.getValue();
if (null != v && !"".equals(v) && !"sign".equals(k) && !"key".equals(k)) {
sb.append(k + "=" + v + "&");
}
}
sb.append("key=" + appKey);//此处的key值自己查找帐号
String sign = MD5.create().digestHex(sb.toString(), characterEncoding).toUpperCase();
return sign;
}
public static String toXml(Map<String, String> params) {
StringBuilder xml = new StringBuilder();
xml.append("<xml>");
Iterator var2 = params.entrySet().iterator();
while (var2.hasNext()) {
Map.Entry<String, String> entry = (Map.Entry) var2.next();
String key = (String) entry.getKey();
String value = (String) entry.getValue();
if (!StrKit.isBlank(value)) {
xml.append("<").append(key).append(">");
xml.append((String) entry.getValue());
xml.append("</").append(key).append(">");
}
}
xml.append("</xml>");
return xml.toString();
}
public static void phase(String result) {
if (StringUtils.hasText(result) && !result.contains("error_code")) {
List<WxTradeDetail> wxTradeDetailList = new ArrayList<WxTradeDetail>();
String[] str = result.split("\n");//按行读取数据(*这个尤为重要*)
int len = str.length;
for (int i = 0; i < len; i++) {
String[] tradeDetailArray = str[i].replace("`", "").split(",");
//解析交易数据 第一行是表头
if (i > 0 && i < (len - 2)) {
// 明细行数据[交易时间,公众账号ID,商户号,特约商户号,设备号,微信订单号,商户订单号,用户标识,交易类型,交易状态,付款银行,货币种类,应结订单金额,代金券金额,商品名称,商户数据包,手续费,费率,订单金额,费率备注]
WxTradeDetail entity = new WxTradeDetail();
// wxTradeSummary.setBillDate(billDate);
entity.setTransDate(getArrayValue(tradeDetailArray, 0));// 交易时间
entity.setCommonId(getArrayValue(tradeDetailArray, 1));// 公众账号ID
entity.setBusinessNo(getArrayValue(tradeDetailArray, 2));// 商户号
entity.setChildBusinessNo(getArrayValue(tradeDetailArray, 3));// 特约商户号
entity.setEquipmentNo(getArrayValue(tradeDetailArray, 4));// 设备号
entity.setWxOrderNo(getArrayValue(tradeDetailArray, 5));// 微信订单号
entity.setBusinessOrderNo(getArrayValue(tradeDetailArray, 6));// 商户订单号
entity.setUserIdentity(getArrayValue(tradeDetailArray, 7));// 用户标识
entity.setTransType(getArrayValue(tradeDetailArray, 8));// 交易类型
entity.setTransStatus(getArrayValue(tradeDetailArray, 9));// 交易状态
entity.setPaymentBank(getArrayValue(tradeDetailArray, 10));// 付款银行
entity.setCurrency(getArrayValue(tradeDetailArray, 11)); // 货币种类
entity.setSettleAccounts(getArrayValue(tradeDetailArray, 12)); // 应结订单金额
entity.setCoupon(getArrayValue(tradeDetailArray, 13)); // 代金券金额
entity.setBusinessName(getArrayValue(tradeDetailArray, 14));// 商品名称
entity.setBusinessData(getArrayValue(tradeDetailArray, 15));// 商户数据包
entity.setFee(getArrayValue(tradeDetailArray, 16));// 手续费
entity.setRate(getArrayValue(tradeDetailArray, 17));// 费率
entity.setOrderAmount(getArrayValue(tradeDetailArray, 18));// 订单金额
entity.setRateRemark(getArrayValue(tradeDetailArray, 19));// 费率备注
wxTradeDetailList.add(entity);
}
// 汇总行数据 [总交易单数,应结订单总金额,退款总金额,充值券退款总金额,手续费总金额,订单总金额,申请退款总金额]
if (i > (len - 2)) {
WxTradeSummary wxTradeSummary = new WxTradeSummary();
// wxTradeSummary.setBillDate(billDate);
wxTradeSummary.setTradeCount(getArrayValue(tradeDetailArray, 0));// 总交易单数
wxTradeSummary.setShouldSettleAmount(getArrayValue(tradeDetailArray, 1));// 应结订单总金额
wxTradeSummary.setRefundAmount(getArrayValue(tradeDetailArray, 2));// 退款总金额
wxTradeSummary.setRechargeVoucherAmount(getArrayValue(tradeDetailArray, 3));// 充值券退款总金额
wxTradeSummary.setServiceCharge(getArrayValue(tradeDetailArray, 4));// 手续费总金额
wxTradeSummary.setTotalOrderAmount(getArrayValue(tradeDetailArray, 5));// 订单总金额
wxTradeSummary.setApplyRefundAmount(getArrayValue(tradeDetailArray, 6).replaceAll("\r|\n",""));// 申请退款总金额
System.out.println(wxTradeSummary.toString());
}
}
} else {
System.out.println("###########获取对账数据有误#################");
System.out.println("返回对账数据为:" + result);
}
}
public static String getArrayValue(String[] tradeDetailArray, int index) {
try {
return tradeDetailArray[index];
} catch (Exception e) {
return "";
}
}
}
返回字段的对应类
WxTradeDetail 账单每条交易详细信息
public class WxTradeDetail {
private Integer id; // 自动生成id
private String billDate; // 查询日期
private String transDate;// 交易时间
private String commonId;// 公众账号ID
private String businessNo;// 商户号
private String childBusinessNo;// 子商户号
private String equipmentNo;// 设备号
private String wxOrderNo;// 微信订单号
private String businessOrderNo;// 商户订单号
private String userIdentity;// 用户标识
private String transType;// 交易类型
private String transStatus;// 交易状态
private String paymentBank;// 付款银行
private String currency;// 货币种类
private String settleAccounts;// 应结订单金额
private String coupon;// 代金券金额
private String businessName;// 商品名称
private String businessData;// 商户数据包
private String fee;// 手续费
private String rate;// 费率
private String rateRemark;// 费率备注
private String orderAmount;// 订单金额
。。。省略getter setter toString方法。。。
} WxTradeSummary 账单汇总信息
public class WxTradeSummary {
private Integer id; // 自动生成id
private String billDate; // 查询日期
private String tradeCount;// 总交易单数
private String shouldSettleAmount;// 应结订单总金额
private String refundAmount;// 退款总金额
private String rechargeVoucherAmount;// 充值券退款总金额
private String ServiceCharge;// 手续费总金额
private String totalOrderAmount;// 订单总金额
private String applyRefundAmount;// 申请退款总金额
。。。省略setter 和 getter 同String方法。。。
}
本文标题:微信下载交易账单API工具类
本文链接:https://blog.quwenai.cn/post/2869.html
版权声明:本文不使用任何协议授权,您可以任何形式自由转载或使用。








还没有评论,来说两句吧...