微信支付V3-下载交易账单

众所周知,腾讯的文档是给内部人员看的,官方Demo不够完全,以致新手入门困难,这里通过调用第三方封装接口,将部分流程进行简化

第三方封装官网:https://javen205.gitee.io/ijpay/
微信官方文档:https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_1_8.shtml

此项目的GitHub地址: https://github.com/qingyiyezhou/WechatPayDemo/tree/master

一、Maven引入


<dependency>
    <groupId>com.github.javen205</groupId>
    <artifactId>IJPay-All</artifactId>
    <version>2.7.4</version>
</dependency>

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>2.0.25</version>
</dependency>

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.24</version>
</dependency>

功能:下载交易账单

1.申请交易账单核心方法

    /**
     * 申请交易账单
     *
     * @param billDate 账单日期(仅支持三个月内的账单下载申请)
     * @return 交易账单返参
     */
    public WechatTradeBillDownloadResp tradeBill(String billDate) {
        try {
            if (CharSequenceUtil.isEmpty(billDate)) {
                Calendar calendar = Calendar.getInstance();
                calendar.setTime(new Date());
                calendar.add(Calendar.DATE, -1);
                billDate = DateUtil.format(calendar.getTime(), "YYYY-MM-dd");
            }
            Map<String, String> params = new HashMap<>(12);
            params.put("bill_date", billDate);
            params.put("bill_type", "ALL");
            // 返回格式为.gzip的压缩包账单,不设置默认为数据流
            //params.put("tar_type", "GZIP");

            IJPayHttpResponse result = WxPayApi.v3(
                    RequestMethod.GET,
                    WxDomain.CHINA.getType(),
                    WxApiType.TRADE_BILL.toString(),
                    wechatConfig.getMchId(),
                    wechatConfig.getSerialNo(),
                    null,
                    getPrivateKey(),
                    params
            );
            // 根据证书序列号查询对应的证书来验证签名结果
            checkedSignature(result);

            if (result.getStatus() != 200) {
                throw new RuntimeException("申请交易账单失败," + result.getBody());
            }

            return JSON.parseObject(result.getBody(), WechatTradeBillDownloadResp.class);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

2.下载交易账单核心方法

 /**
     * 下载交易账单
     *
     * @param token token
     * @return 交易账单数据
     */
    public HttpResponse billDownload(String token) throws Exception {
        long timestamp = System.currentTimeMillis() / 1000;
        String authType = "WECHATPAY2-SHA256-RSA2048";
        // 生成随机字符串
        String nonceStr = WxPayKit.generateStr();

        String urlSuffix = WxApiType.BILL_DOWNLOAD.toString().concat("?").concat("token=" + token);

        // 拼接url
        String url = WxDomain.CHINA.getType() + urlSuffix;

        // 构建签名
        String authorization = WxPayKit.buildAuthorization(RequestMethod.GET, urlSuffix,
                wechatConfig.getMchId(), wechatConfig.getSerialNo(),
                getPrivateKey(), "", nonceStr, timestamp, authType);

        Map<String, String> headers = WxPayApi.getHeaders(authorization, wechatConfig.getSerialNo());

        return HttpRequest.get(url).addHeaders(headers).execute();
    }

3.Service调用

public TradeBillDataResp downloadTradeBill(String date) {

        WechatPayV3 wechatPayV3 = new WechatPayV3(wechatConfig);
        // 申请交易账单
        WechatTradeBillDownloadResp wechatTradeBillDownloadResp = wechatPayV3.tradeBill(date);

        // 解析交易账单下载地址,获取token
        String downloadUrl = wechatTradeBillDownloadResp.getDownloadUrl();
        UrlBuilder urlBuilder = UrlBuilder.ofHttp(downloadUrl, CharsetUtil.CHARSET_UTF_8);
        String token = urlBuilder.getQuery().get("token").toString();

        try (
                // 获取交易账单数据流
                HttpResponse httpResponse = wechatPayV3.billDownload(token);
        ) {

            if (httpResponse.getStatus() != 200){
                return null;
            }

            // 异步备份交易账单文件(建议使用线程池,此处简略操作)
            new Thread(() -> {
                File folder = new File(WECHAT_TEMP_PATH);
                if (!folder.exists() && !folder.isDirectory()) {
                    boolean mkdirs = folder.mkdirs();
                    Assert.isTrue(mkdirs, "创建微信交易账单文件夹失败");
                }

                // 文件名
                String targetPath = WECHAT_TEMP_PATH.concat(wechatConfig.getMchId())
                        .concat("All")
                        .concat(date)
                        .concat(".csv");
                IOUtil.backUpFile(httpResponse.bodyStream(), targetPath);
            });

            // 解析数据流
            return parseBody(httpResponse.body());
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
  @GetMapping("/downloadTradeBill")
  TradeBillDataResp downloadTradeBill(@RequestParam String date) {
      return wechatBillService.downloadTradeBill(date);
  }

4.测试

在这里插入图片描述

在这里插入图片描述
最后吐槽一下,微信支付的文档真的烂

您可以使用以下Java代码来下载微信支付账单: ```java SortedMap<Object, Object> parameters = new TreeMap<Object, Object>(); parameters.put("appid", ConfigUtil.APPID); // APPid parameters.put("mch_id", ConfigUtil.MCH_ID); // 商户id parameters.put("nonce_str", PayCommonUtil.CreateNoncestr()); // 下载账单的日期,格式:20140603,当前日期前一天。 String billDate = DateUtil.date2Str(DateUtil.addDay(new Date(), -1), "yyyyMMdd"); parameters.put("bill_date", billDate); parameters.put("bill_type", "ALL"); // bill_type:ALL返回当日所有订单信息,默认值SUCCESS返回当日成功支付的订单。REFUND,返回当日退款订单 String sign = PayCommonUtil.createSign("utf-8", parameters); parameters.put("sign", sign); String reuqestXml = PayCommonUtil.getRequestXml(parameters); String result = CommonUtil.httpsRequest(ConfigUtil.DOWNLOAD_BILL_URL, "POST", reuqestXml); ``` 这段代码使用了微信支付的API接口,其中包括了商户的APPID和商户ID等信息。通过设置参数,您可以指定要下载账单日期和类型。最后,通过发送HTTPS请求来获取账单数据。请确保您已经正确配置了相关的参数和URL。 #### 引用[.reference_title] - *1* *2* *3* [java下载微信账单,实现与微信实收对账和日清日结对账](https://blog.csdn.net/jlq_diligence/article/details/90208650)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值