业务示例代码

更新时间:2025.09.04

1. 目标

通过本教程的学习,你应该可以:

2. 业务处理流程

2.1. 申请交易账单并下载账单

微信支付在每日10点后生成昨日交易账单文件,商户可通过接口获取账单下载链接。账单包含交易金额、时间及营销信息,利于订单核对、退款审查及银行到账确认。详细介绍参考:下载账单-产品介绍

1package com.java.downloadbilldemo;
2import com.java.demo.GetTradeBill; // 使用合作伙伴平台申请所有/单个特约商户交易账单接口 https://pay.weixin.qq.com/doc/v3/partner/4013080595
3import static com.java.demo.GetTradeBill.*; // 使用合作伙伴平台申请所有/单个特约商户交易账单接口 https://pay.weixin.qq.com/doc/v3/partner/4013080595
4import com.java.demo.DownloadBill; // 使用合作伙伴平台下载账单接口 https://pay.weixin.qq.com/doc/v3/merchant/4013071238
5import static com.java.demo.DownloadBill.*; // 使用合作伙伴平台下载账单接口 https://pay.weixin.qq.com/doc/v3/partner/4013080597
6import com.java.utils.WXPayUtility; // 引用微信支付工具库,参考:https://pay.weixin.qq.com/doc/v3/partner/4013080597
7
8public class DownloadBillDemo {
9    public static void main(String[] args) {
10        GetTradeBill getTradeBill = new GetTradeBill(
11            "19xxxxxxxx",                    // 商户号,是由微信支付系统生成并分配给每个商户的唯一标识符,商户号获取方式参考 https://pay.weixin.qq.com/doc/v3/partner/4013080340
12            "1DDE55AD98Exxxxxxxxxx",         // 商户API证书序列号,如何获取请参考 https://pay.weixin.qq.com/doc/v3/partner/4013058924
13            "/path/to/apiclient_key.pem",    // 商户API证书私钥文件路径,本地文件路径
14            "PUB_KEY_ID_xxxxxxxxxxxxx",      // 微信支付公钥ID,如何获取请参考 https://pay.weixin.qq.com/doc/v3/partner/4013038589
15            "/path/to/wxp_pub.pem"           // 微信支付公钥文件路径,本地文件路径
16        );
17
18        DownloadBill downloadBill = new DownloadBill(
19            "19xxxxxxxx",                    // 商户号,是由微信支付系统生成并分配给每个商户的唯一标识符,商户号获取方式参考 https://pay.weixin.qq.com/doc/v3/partner/4013080340
20            "1DDE55AD98Exxxxxxxxxx",         // 商户API证书序列号,如何获取请参考 https://pay.weixin.qq.com/doc/v3/partner/4013058924
21            "/path/to/apiclient_key.pem",    // 商户API证书私钥文件路径,本地文件路径
22            "PUB_KEY_ID_xxxxxxxxxxxxx",      // 微信支付公钥ID,如何获取请参考 https://pay.weixin.qq.com/doc/v3/partner/4013038589
23            "/path/to/wxp_pub.pem"           // 微信支付公钥文件路径,本地文件路径
24        );
25        try {
26            GetTradeBillRequest getTradeBillRequest = new GetTradeBillRequest();
27            getTradeBillRequest.billDate = "2025-08-11";  // 期望申请下载的账单日期
28            getTradeBillRequest.billType = BillType.ALL;  // 期望申请下载的账单类型
29            getTradeBillRequest.tarType = GetTradeBill.TarType.GZIP;  // 期望申请下载的账单类型
30
31            QueryBillEntity response = getTradeBill.run(getTradeBillRequest);
32
33            System.out.println("Download URL: " + response.downloadUrl);
34
35            DownloadBillRequest downloadBillRequest = new DownloadBillRequest();
36            downloadBillRequest.downloadUrl = response.downloadUrl;
37            downloadBillRequest.localFilePath = "test.csv";  // 期望下载的账单文件路径
38            downloadBillRequest.tarType = DownloadBill.TarType.valueOf(getTradeBillRequest.tarType.name());
39            downloadBillRequest.expectedHashType = DownloadBill.HashType.valueOf(response.hashType.name());
40            downloadBillRequest.expectedHashValue = response.hashValue;
41
42            downloadBill.run(downloadBillRequest);
43
44            System.out.println("File downloaded successfully! Local file path: " + downloadBillRequest.localFilePath);
45            // TODO: 请求成功,继续业务逻辑
46        } catch (WXPayUtility.ApiException e) {
47            // TODO: 请求失败,根据状态码执行不同的逻辑
48            if (e.getErrorCode().equals("NO_STATEMENT_EXIST")) {
49                // 错误:账单不存在
50                // 解决方式:请检查当前商户号在指定日期内是否有成功的交易或退款
51                // 描述:说明指定日期无账单文件生成。若无交易,则无需重试
52            } else if (e.getErrorCode().equals("STATEMENT_CREATING")) {
53                // 错误:账单正在生成中
54                // 解决方式:请检查当前商户号在指定日期内是否有成功的交易或退款
55                // 描述:说明指定日期账单正在生成中。若无交易,则无需重试;若有交易,则在T+1日上午10点后再重新下载
56            } else if (e.getErrorCode().equals("SYSTEM_ERROR")) {
57                // 错误:系统错误
58                // 解决方式:稍后重试
59                // 描述:微信支付系统失败,系统失败直接立即重试大概率还会是系统失败,建议等1分钟后再重试
60            } else if (e.getErrorCode().equals("FREQUENCY_LIMITED")) {
61                // 错误:限频报错
62                // 解决方式:稍后重试
63                // 描述: 接口频率限制,直接立即重试大概率还会是系统失败,建议等1分钟后再重试
64            } else if (e.getErrorCode().equals("SIGN_ERROR")) {
65                // 错误:签名错误
66                // 解决方式:检查平台商户证书序列号,证书私钥文件,公钥ID,公钥文件,同时确认下签名过程是不是按照微信支付的签名方式
67                // 描述:签名报错,需要确认签名材料和签名流程是否正确
68            } else if (e.getErrorCode().equals("PARAM_ERROR")) {
69                // 错误:参数错误
70                // 解决方式:按照报错返回的message,重新输入请求参数
71                // 描述:参数的类型,长度,或者必填选项没有填写等
72            } else if (e.getErrorCode().equals("INVALID_REQUEST")) {
73                // 错误:请求非法,请求参数正确,但是不符合下载账单业务规则
74                // 解决方式:根据具体message查看具体哪里不符合业务规则,如果可以修改参数达到符合业务规则的修改请求符合业务规则之后再重试
75                // 描述:不符合业务规则的场景如:
76                // - 账单时间超过180天,不允许申请下载账单
77            } else {
78                // 其他类型错误:稍等一会后重试
79            }
80        }
81    }
82}
83

 

反馈
咨询
目录
置顶