申请服务商资金账单

更新时间:2025.01.16

微信支付按天提供服务商各账户的资金流水账单文件,服务商可以通过该接口获取账单文件的下载地址。账单文件详细记录了服务商账户资金操作的相关信息,包括业务单号、收支金额及记账时间等,以便服务商进行核对与确认。详细介绍参考:下载账单-产品介绍

注意:

  • 资金账单中的数据反映的是服务商微信账户资金变动情况;

  • 当日账单将在次日上午9点开始生成,建议服务商在次日上午10点以后获取;

  • 资金账单中所有涉及金额的字段均以“元”为单位。

文件格式说明

账单文件主要由明细数据和汇总数据两大部分构成,每部分均包含一行表头以及多行详细数据。

明细数据的每一行都代表一笔具体的资金操作。为防止数据在Excel中被自动转换为科学计数法,每项数据前均添加了字符`。若需汇总计算金额等数据,可以批量移除该字符。

接口说明

支持商户:【普通服务商】【平台商户】

请求方式:【GET】/v3/bill/fundflowbill

请求域名:【主域名】https://api.mch.weixin.qq.com 使用该域名将访问就近的接入点

     【备域名】https://api2.mch.weixin.qq.com 使用该域名将访问异地的接入点 ,指引点击查看

请求参数

Header HTTP头参数

Authorization  必填 string

请参考签名认证生成认证信息


Accept  必填 string

请设置为application/json


query 查询参数

bill_date  必填 string(10)

【账单日期】 账单日期,格式yyyy-MM-DD,仅支持三个月内的账单下载申请。


account_type  选填 string

【资金账户类型】 资金账户类型,不填默认是BASIC

可选取值:

  • BASIC: 基本账户

  • OPERATION: 运营账户

  • FEES: 手续费账户


tar_type  选填 string

【压缩类型】 压缩类型,不填则以不压缩的方式返回账单文件流。
可选取值:
GZIP: 下载账单时返回.gzip格式的压缩文件流

请求示例

Java
Go
curl

需配合微信支付工具库 WXPayUtility 使用,请参考 Java 

1package com.java.demo;
2
3import com.google.gson.annotations.Expose;
4import com.google.gson.annotations.SerializedName;
5import com.java.utils.WXPayUtility; // 引用微信支付工具库 参考:https://pay.weixin.qq.com/doc/v3/partner/4014985777
6import java.io.IOException;
7import java.io.UncheckedIOException;
8import java.security.PrivateKey;
9import java.security.PublicKey;
10import java.util.ArrayList;
11import java.util.HashMap;
12import java.util.List;
13import java.util.Map;
14import okhttp3.MediaType;
15import okhttp3.OkHttpClient;
16import okhttp3.Request;
17import okhttp3.RequestBody;
18import okhttp3.Response;
19
20/**
21 * 申请资金账单API
22 */
23public class GetFundFlowBill {
24  private static String HOST = "https://api.mch.weixin.qq.com";
25  private static String METHOD = "GET";
26  private static String PATH = "/v3/bill/fundflowbill";
27
28  public static void main(String[] args) {
29    // TODO: 请准备商户开发必要参数,参考:https://pay.weixin.qq.com/doc/v3/partner/4013080340
30    GetFundFlowBill client = new GetFundFlowBill(
31        "填入 商户号",                  // 商户号,是由微信支付系统生成并分配给每个商户的唯一标识符,商户号获取方式参考https://pay.weixin.qq.com/doc/v3/partner/4013080340
32        "填入 商户API证书序列号",       // 商户API证书序列号,如何获取请参考https://pay.weixin.qq.com/doc/v3/partner/4013058924
33        "填入 商户API证书私钥文件路径", // 商户API证书私钥文件路径,本地文件路径
34        "填入 微信支付公钥ID",          // 微信支付公钥ID,如何获取请参考https://pay.weixin.qq.com/doc/v3/partner/4013038589
35        "填入 微信支付公钥文件路径"     // 微信支付公钥文件路径,本地文件路径
36    );
37
38    GetFundFlowBillRequest request = new GetFundFlowBillRequest();
39    request.billDate = "2019-06-11";
40    request.accountType = FundFlowBillAccountType.BASIC;
41    request.tarType = TarType.GZIP;
42    try {
43      QueryBillEntity response = client.run(request);
44
45      // TODO: 请求成功,继续业务逻辑
46      System.out.println(response);
47    } catch (WXPayUtility.ApiException e) {
48      // TODO: 请求失败,根据状态码执行不同的逻辑
49      e.printStackTrace();
50    }
51  }
52
53  public QueryBillEntity run(GetFundFlowBillRequest request) {
54    String uri = PATH;
55    Map<String, Object> args = new HashMap<>();
56    args.put("bill_date", request.billDate);
57    args.put("account_type", request.accountType);
58    args.put("tar_type", request.tarType);
59    uri = uri + "?" + WXPayUtility.urlEncode(args);
60
61    Request.Builder reqBuilder = new Request.Builder().url(HOST + uri);
62    reqBuilder.addHeader("Accept", "application/json");
63    reqBuilder.addHeader("Wechatpay-Serial", wechatPayPublicKeyId);
64    reqBuilder.addHeader("Authorization", WXPayUtility.buildAuthorization(mchid, certificateSerialNo, privateKey, METHOD, uri, null));
65    reqBuilder.method(METHOD, null);
66    Request httpRequest = reqBuilder.build();
67
68    // 发送HTTP请求
69    OkHttpClient client = new OkHttpClient.Builder().build();
70    try (Response httpResponse = client.newCall(httpRequest).execute()) {
71      String respBody = WXPayUtility.extractBody(httpResponse);
72      if (httpResponse.code() >= 200 && httpResponse.code() < 300) {
73        // 2XX 成功,验证应答签名
74        WXPayUtility.validateResponse(this.wechatPayPublicKeyId, this.wechatPayPublicKey,
75                                      httpResponse.headers(), respBody);
76
77        // 从HTTP应答报文构建返回数据
78        return WXPayUtility.fromJson(respBody, QueryBillEntity.class);
79      } else {
80        throw new WXPayUtility.ApiException(httpResponse.code(), respBody, httpResponse.headers());
81      }
82    } catch (IOException e) {
83      throw new UncheckedIOException("Sending request to " + uri + " failed.", e);
84    }
85  }
86
87  private final String mchid;
88  private final String certificateSerialNo;
89  private final PrivateKey privateKey;
90  private final String wechatPayPublicKeyId;
91  private final PublicKey wechatPayPublicKey;
92
93  public GetFundFlowBill(String mchid, String certificateSerialNo, String privateKeyFilePath, String wechatPayPublicKeyId, String wechatPayPublicKeyFilePath) {
94    this.mchid = mchid;
95    this.certificateSerialNo = certificateSerialNo;
96    this.privateKey = WXPayUtility.loadPrivateKeyFromPath(privateKeyFilePath);
97    this.wechatPayPublicKeyId = wechatPayPublicKeyId;
98    this.wechatPayPublicKey = WXPayUtility.loadPublicKeyFromPath(wechatPayPublicKeyFilePath);
99  }
100
101  public static class QueryBillEntity {
102    @SerializedName("hash_type")
103    public HashType hashType;
104
105    @SerializedName("hash_value")
106    public String hashValue;
107
108    @SerializedName("download_url")
109    public String downloadUrl;
110  }
111
112  public static class GetFundFlowBillRequest {
113    @SerializedName("bill_date")
114    @Expose(serialize = false)
115    public String billDate;
116
117    @SerializedName("account_type")
118    @Expose(serialize = false)
119    public FundFlowBillAccountType accountType;
120
121    @SerializedName("tar_type")
122    @Expose(serialize = false)
123    public TarType tarType;
124  }
125
126  public enum HashType {
127    @SerializedName("SHA1")
128    SHA1
129  }
130
131  public enum FundFlowBillAccountType {
132    @SerializedName("BASIC")
133    BASIC,
134    @SerializedName("OPERATION")
135    OPERATION,
136    @SerializedName("FEES")
137    FEES
138  }
139
140  public enum TarType {
141    @SerializedName("GZIP")
142    GZIP
143  }
144}

 

应答参数

200 OK

hash_type  必填 string

【哈希类型】 哈希类型,固定为SHA1。


hash_value  必填 string(1024)

【哈希值】 账单文件的SHA1摘要值,用于服务商侧校验文件的一致性。


download_url  必填 string(2048)

【下载地址】 供下一步请求账单文件的下载地址,该地址5min内有效。参考下载账单

应答示例

200 OK

1{
2  "hash_type" : "SHA1",
3  "hash_value" : "79bb0f45fc4c42234a918000b2668d689e2bde04",
4  "download_url" : "https://api.mch.weixin.qq.com/v3/bill/downloadurl?token=xxx"
5}
6

 

错误码

公共错误码

状态码

错误码

描述

解决方案

400

PARAM_ERROR

参数错误

请根据错误提示正确传入参数

400

INVALID_REQUEST

HTTP 请求不符合微信支付 APIv3 接口规则

请参阅 接口规则

401

SIGN_ERROR

验证不通过

请参阅 签名常见问题

500

SYSTEM_ERROR

系统异常,请稍后重试

请稍后重试

业务错误码

状态码

错误码

描述

解决方案

400

INVALID_REQUEST

参数错误

请根据接口返回的错误描述检查参数,参数需按文档要求进行填写

400

NO_STATEMENT_EXIST

账单文件不存在

请检查当前服务商商户号是否在指定日期有资金变动

400

STATEMENT_CREATING

账单生成中

请先检查当前商户号在指定日期内是否有成功的交易或退款,若有,则在T+1日上午10点后再重新下载

429

FREQUENCY_LIMITED

请求过于频繁

请降低调用频率

 

 

反馈
咨询
目录
置顶