申请单个子商户资金账单

更新时间:2023.10.11

# 下载接口说明

微信支付按天提供微信支付账户的资金流水账单文件,服务商可以通过该接口获取子商户账单文件的下载地址。文件内包含子商户资金操作相关的业务单号、收支金额、记账时间等信息,供商户进行核对。

注意

  • 调用该接口前,服务商需提前在【服务商平台 (opens new window) -> 产品中心】开通“下载二级商户资金账单”产品权限;
  • 资金账单中的数据反映的是子商户微信账户资金变动情况;
  • 当日账单在次日上午9点开始生成,建议商户在上午10点以后获取;
  • 资金账单中涉及金额的字段单位为“元”;
  • 该接口只能下载三个月以内的资金流水账单。

# 接口说明

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

请求方式: 【GET】

请求URL: "https://api.mch.weixin.qq.com/v3/bill/sub-merchant-fundflowbill"

# 请求参数

    Query 查询参数
  • sub_mchid 必填 string(32)
    下载指定子商户的账单。
  • bill_date 必填 string(10)
    账单日期,格式yyyy-MM-dd,仅支持三个月内的账单下载申请。
  • account_type 必填 string(16)
    枚举值:
    BASIC:基本账户
    OPERATION:运营账户
    FEES:手续费账户
  • algorithm 必填 string(31)
    枚举值:
    AEAD_AES_256_GCM:AEAD_AES_256_GCM加密算法
  • tar_type 选填 string
    压不填则以不压缩的方式返回数据流
    枚举值:
    GZIP:返回格式为.gzip的压缩包账单

# 应答参数

    200OK
  • download_bill_count 必填 integer
    下载信息总数
  • download_bill_list 选填 array
    下载信息明细
    • 数组

请求示例

1curl -X GET \
2https://api.mch.weixin.qq.com/v3/bill/sub-merchant-fundflowbill?sub_mchid=19000000001&bill_date=2019-06-11&account_type=BASIC&algorithm=AEAD_AES_256_GCM&tar_type=GZIP

应答示例

1{
2 "download_bill_count": 1,
3 "download_bill_list": [
4 {
5 "bill_sequence": 1,
6 "download_url": "https://api.mch.weixin.qq.com/v3/bill/downloadurl?token=xxx",
7 "encrypt_key": "a0YK7p+9XaKzE9N4qtFfG/9za1oqKlLXXJWBkH+kX84onAs2Ol/E1fk+6S+FuBXczGDRU8I8D+6PfbwKYBGm0wANUTqHOSezzfbieIo2t51UIId7sP9SoN38W2+IcYDviIsu59KSdyiL3TY2xqZNT8UDcnMWzTNZdSv+CLsSgblB6OKGN9JONTadOFGfv1OKkTp86Li+X7S9bG62wsa572/5Rm4MmDCiKwY4bX2EynWQHBEOExD5URxT6/MX3F1D3BNYrE4fUu1F03k25xVlXnZDjksy6Rf3SCgadR+Cepc6mdfF9b2gTxNsJFMEdYXbqL0W1WQZ3UqSPQCguK6uLA==",
8 "hash_type": "SHA1",
9 "hash_value": "79bb0f45fc4c42234a918000b2668d689e2bde04",
10 "nonce": "a8607ef79034c49c"
11 }
12 ]
13}

# 文件格式说明

账单文件包括明细数据和汇总数据两部分,每一部分都包含一行表头和若干行具体数据。 明细数据每一行对应一笔资金操作,同时每一个数据前加入了字符`,以避免数据被Excel按科学计数法处理。如需汇总金额等数据,可以批量替换掉该字符。

# 文件分割和合并

当子商户资金账单文件太大(未压缩情况下约大于16GB)时,微信支付会对账单文件进行分割,此时接口会返回多个下载地址。商户分别根据下载地址下载账单文件并解密。解密后,将多个文件按账单文件序号(变量名:bill_sequence)的顺序合并为完整的资金账单文件。

商户需要注意,当返回多个下载地址时,商户依然需要在下载地址有效时间内发起下载请求。因此建议商户获取到下载地址后,并发请求下载。

# 文件解密

# 解密流程

子商户资金账单文件采用商户指定的加密算法(目前只支持AES-256-GCM算法)进行加密,商户需要进行解密才能得到账单明文。解密流程是:

步骤一: 下载账单文件,得到账单文件密文ciphertext;
步骤二: 使用商户证书私钥解密从接口获取的加密密钥(变量名:encrypt_key)得到密钥明文key;
步骤三: 利用步骤一、二中得到的账单密文ciphertext,密钥key和接口返回的随机字符串nonce解密账单,得到账单明文。

# 代码示例

账单文件解密代码示例请参考[WechatPay-API-v3 证书和回调报文解密] (opens new window)注意:返回的账单文件是二进制密文,需以字节数组形式处理,不需要进行Base64解码

下面对解密代码中使用的参数进行说明:

1{
2 // 密文
3 "ciphertext": "下载得到的账单文件密文",
4 // 加密使用的密钥
5 "key": "用商户证书私钥解密加密密钥得到的明文",
6 // 加密使用的随机字符串
7 "nonce": "接口返回的随机字符串",
8 // 附加数据包(填空)
9 "associated_data": ""
10}

下面对如何用商户证书私钥解密加密密钥进行说明:
商户从接口获取的加密密钥(变量名:encrypt_key)是使用商户证书公钥进行RSA加密返回的密文,商户解密后才能得到密钥原文。
解密流程如下:对encrypt_key先做Base64解码,然后对解码结果使用商户证书私钥进行RSA解密,指定填充方式为最优非对称加密填充(OAEP)。
下面我们使用命令行演示如何解密,更多的示例可以参考[WechatPay-API-v3 敏感信息加密] (opens new window)。 解密AES密钥得到key:

1$echo -n { encrypt_key } | openssl enc -A -base64 -d | openssl rsautl -decrypt -oaep -inkey {商户证书私钥文件}

# 错误码

# 公共错误码

状态码 错误码 描述 解决方案
400 PARAM_ERROR 参数错误 请根据错误提示正确传入参数
400 INVALID_REQUEST HTTP 请求不符合微信支付 APIv3 接口规则 请参阅 接口规则 (opens new window)
401 SIGN_ERROR 验证不通过 请参阅 签名常见问题 (opens new window)
500 SYSTEM_ERROR 系统异常,请稍后重试 请稍后重试

# 业务错误码

状态码 错误码 描述 解决方案
400 INVALID_REQUEST 参数错误 请检查bill_date,仅支持下载3个月以内的资金流水账单
400 NO_STATEMENT_EXIST 请求的账单文件不存在 请检查二级商户在指定日期是否有资金操作
400 STATEMENT_CREATING 账单生成中 请先检查二级商户在指定日期内是否有资金操作,若有,则在T+1日上午10点后再重新下载
403 NO_AUTH 权限异常 请检查sub_mchid是否为服务商的子商户
403 NO_AUTH 权限异常 请电商平台在产品中心开通下载二级商户资金账单产品权限
429 FREQUENCY_LIMITED 请求过于频繁 请降低调用频率
500 SYSTEM_ERROR 系统错误 系统异常,请使用相同参数稍后重新调用