账单下载

参考官网API

数据解析
数据解析方法实现
/**
 * 解析微信账单字符串数据为对象
 * Ps: 仅支持单天数据
 *
 * @param result 微信账单字符串数据
 * @param date   账单日期 例: 2020-09-07
 * @return list
 * @author zhengshangjin
 * created on 2020-09-08
 */
private List<WxPayBill> wxPayBillAnalysis(String result, String date) {
    List<WxPayBill> billList = new ArrayList<>();

    // 获取第一行列标题(仅演示 提交删除)
    String title = result.substring(0, result.indexOf("`"));
    List<String> titleArr = Arrays.stream(title.split(",")).collect(Collectors.toList());
    System.out.println("表格行标题:" + JsonUtils.toJson(titleArr));

    // 去除表格数据列标题
    result = result.substring(result.indexOf("`"));
    // 去除表格数据底部汇总
    String finalData = result.substring(0, result.indexOf("总")).replaceFirst(date, "").replaceAll("`", "");
    // 通过交易时间分割订单数
    String[] tradeArray = finalData.split(date);
    for (String trade : tradeArray) {
        String[] order = trade.split(",");
      
        // 获取表格行数据(仅演示 提交删除)
        List<String> orderArr = Arrays.stream(trade.split(",")).collect(Collectors.toList());
        System.out.println("表格行数据:" + JsonUtils.toJson(orderArr));

        WxPayBill bill = new WxPayBill();
        bill = bill.attach(order);
        bill.setCreateDate(date + order[0]);
        billList.add(bill);
    }
    return billList;
}
行标题与行数据对比

image-20210908161922947

数据对象TO
/**
 * <p>
 * 微信账单对象
 * 注意:字段顺序为表格顺序
 * </p>
 *
 * @author zhengshangjin
 * @version 1.0.0
 * @since 1.0.0
 * created on 2020-09-08
 */
@Data
public class WxPayBill implements Serializable {

    private static final long serialVersionUID = 1L;
  
    /**
     * [0] 交易时间
     */
    private String createDate;

    /**
     * [1] 公众账号ID
     */
    private String appId;

    /**
     * [2] 商户号
     */
    private String mchId;

    /**
     * [3] 特约商户号、子商户号
     */
    private String subMchId;

    /**
     * [4] 设备号
     */
    private String deviceInfo;

    /**
     * [5] 微信订单号
     */
    private String wxOrderNo;

    /**
     * [6] 商户订单号
     */
    private String mchOrderNo;

    /**
     * [7] 用户标识
     */
    private String openId;

    /**
     * [8] 交易类型
     */
    private String type;

    /**
     * [9] 交易状态
     */
    private String status;

    /**
     * [10] 付款银行
     */
    private String bank;

    /**
     * [11] 货币种类
     */
    private String currency;

    /**
     * [12] 应结订单金额
     */
    private String amount;

    /**
     * [13] 代金券金额
     */
    private String envelopeAmount;

    /**
     * [14] 退款微信订单号
     */
    private String refundWxOrderNo;

    /**
     * [15] 退款商户订单号
     */
    private String refundMchOrderNo;

    /**
     * [16] 退款金额
     */
    private String refundAmount;

    /**
     * [17] 充值券退款金额
     */
    private String refundRechargeAmount;

    /**
     * [18] 退款类型
     */
    private String refundType;

    /**
     * [19] 退款状态
     */
    private String refundStatus;

    /**
     * [20] 商品名称
     */
    private String goodsName;

    /**
     * [21] 商户数据包
     */
    private String packet;

    /**
     * [22] 手续费
     */
    private String poundage;

    /**
     * [23] 费率
     */
    private String rate;

    /**
     * [24] 订单金额
     */
    private String orderAmount;

    /**
     * [25] 申请退款金额
     */
    private String applyRefundAmount;

    /**
     * 数据转换提取
     *
     * @param order 订单数组
     * @return bill
     * @author zhengshangjin
     * created on 2020-09-08
     */
    public WxPayBill attach(String[] order) {
        if (order == null || order.length < 1) {
            return null;
        }
        WxPayBill bill = new WxPayBill();
        bill.setAppId(order[1]);
        bill.setMchId(order[2]);
        bill.setSubMchId(order[3]);
        bill.setDeviceInfo(order[4]);
        bill.setWxOrderNo(order[5]);
        bill.setMchOrderNo(order[6]);
        bill.setOpenId(order[7]);
        bill.setType(order[8]);
        bill.setStatus(order[9]);
        bill.setBank(order[10]);
        bill.setCurrency(order[11]);
        bill.setAmount(order[12]);
        bill.setEnvelopeAmount(order[13]);
        bill.setRefundWxOrderNo(order[14]);
        bill.setRefundMchOrderNo(order[15]);
        bill.setRefundAmount(order[16]);
        bill.setRefundRechargeAmount(order[17]);
        bill.setRefundType(order[18]);
        bill.setRefundStatus(order[19]);
        bill.setGoodsName(order[20]);
        bill.setPacket(order[21]);
        bill.setPoundage(order[22]);
        bill.setRate(order[23]);
        bill.setOrderAmount(order[24]);
        bill.setApplyRefundAmount(order[25]);
        return bill;
    }
}

与自有支付业务订单核对
Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐