# CloudPay.downloadBill()

> 支持端：[云函数 2.0.2](/miniprogram/dev/wxcloudservice/wxcloud/reference/changelog-server-sdk)

下载对账单

## 说明

商户可以通过该接口下载历史交易清单。比如掉单、系统错误等导致商户侧和微信侧数据不一致，通过对账单核对后可校正支付状态。

注意：

1、微信侧未成功下单的交易不会出现在对账单中。支付成功后撤销的交易会出现在对账单中，跟原支付单订单号一致；

2、微信在次日9点启动生成前一天的对账单，建议商户10点后再获取；

3、对账单中涉及金额的字段单位为“元”。

4、对账单接口只能下载三个月以内的账单。

5、对账单是以商户号纬度来生成的，如一个商户号与多个appid有绑定关系，则使用其中任何一个appid都可以请求下载对账单。对账单中的appid取自交易时候提交的appid，与请求下载对账单时使用的appid无关。

6、小微商户不单独提供对账单下载，如有需要，可在调取【下载对账单】API接口时不传sub_mch_id，获取服务商下全量特约商户（包括小微商户和非小微商户）的对账单。

此接口与微信支付原接口（[文档](https://pay.weixin.qq.com/doc/v2/merchant/4011935219)）的不同点在于：
- 私有安全链路，免证书管理，免签名计算
- 商户号填入 sub_mch_id 字段，小程序/公众号 appid 填入 sub_appid 字段
- 免填写以下字段：mch_id、appid、sign、sign_type
- 接口入参和返回值都为 JSON 而不是 XML

### 参数说明

| 字段名           | 变量名     | 必填 | 类型       | 示例值                           | 描述                                                                                                 |
|------------------|------------|------|------------|----------------------------------|------------------------------------------------------------------------------------------------------|
| 子商户号         | sub_mch_id | 否   | String(32) | 1900000109                       | 微信支付分配的子商户号，如需下载指定的子商户号对账单，则此参数必传。                                 |
| 随机字符串       | nonce_str  | 是   | String(32) | 5K8264ILTKCH16CQ2502SI8ZNMTM67VS | 随机字符串，不长于32位。推荐随机数生成算法                                                           |
| 签名             | sign       | 是   | String(32) | C380BEC2BFD727A4B6845133519F3AD6 | 签名，详见签名生成算法                                                                               |
| 对账单日期       | bill_date  | 是   | String(8)  | 20140603                         | 下载对账单的日期，格式：20140603                                                                     |
| 账单类型         | bill_type  | 否   | String(8)  | ALL                              | ALL，返回当日所有订单信息，默认值
SUCCESS，返回当日成功支付的订单
REFUND，返回当日退款订单
 |
| 压缩账单         | tar_type   | 否   | String     | GZIP                             | 非必传参数，固定值：GZIP，返回格式为.gzip的压缩包账单。不传则默认为数据流形式。                      |

### 返回值说明

失败时，返回以下字段

| 字段名     | 变量名      | 必填 | 类型        | 示例值   | 描述                                            |
|------------|-------------|------|-------------|----------|-------------------------------------------------|
| 返回状态码 | returnCode | 是   | String(16)  | FAIL     | FAIL                                            |
| 错误码描述 | returnMsg  | 否   | String(128) | 签名失败 | 返回信息，如非空，为错误原因，如：签名失败 等。 |
| 错误码     | errorCode  | 否   | String(16)  | 20002    | 失败错误码，详见错误码列表                      |

成功时，数据以文本表格的方式返回，第一行为表头，后面各行为对应的字段内容，字段内容跟查询订单或退款结果一致，具体字段说明可查阅相应接口。

第一行为表头，根据请求下载的对账单类型不同而不同(由bill_type决定)，目前有：
**当日所有订单**
交易时间，服务商的APPID，商户号，子商户号，设备号，微信订单号，商户订单号，用户标识，交易类型，交易状态，付款银行，货币种类，总金额，代金券或立减优惠金额，微信退款单号，商户退款单号，退款金额，代金券或立减优惠退款金额，退款类型，退款状态，商品名称，商户数据包，手续费，费率
**当日成功支付的订单**
交易时间，服务商的APPID，商户号，子商户号，设备号，微信订单号，商户订单号，用户标识，交易类型，交易状态，付款银行，货币种类，总金额，代金券或立减优惠金额，商品名称，商户数据包，手续费，费率
**当日退款的订单**
交易时间，服务商的APPID，商户号，子商户号，设备号，微信订单号，商户订单号，用户标识，交易类型，交易状态，付款银行，货币种类，总金额，代金券或立减优惠金额，退款申请时间，退款成功时间，微信退款单号，商户退款单号，退款金额，代金券或立减优惠退款金额，退款类型，退款状态，商品名称，商户数据包，手续费，费率

从第二行起，为数据记录，各参数以逗号分隔，参数前增加`符号，为标准键盘1左边键的字符，字段顺序与表头一致。

倒数第二行为订单统计标题，最后一行为统计数据

总交易单数，总交易额，总退款金额，总代金券或立减优惠退款金额，手续费总金额

举例如下：

交易时间，服务商的APPID，商户号，子商户号，设备号，微信订单号，商户订单号，用户标识，交易类型，交易状态，付款银行，货币种类，总金额，代金券或立减优惠金额，微信退款单号，商户退款单号，退款金额，代金券或立减优惠退款金额，退款类型，退款状态，商品名称，商户数据包，手续费，费率
`2014-11-10 16：33：45,`wx2421b1c4370ec43b,`10000100,`0,`1000,`1001690740201411100005734289,`1415640626,`085e9858e3ba5186aafcbaed1,`MICROPAY,`SUCCESS,`OTHERS,`CNY,`0.01,`0.0,`0,`0,`0,`0,`,`,`被扫支付测试,`订单额外描述,`0,`0.60%
`2014-11-10 16：46：14,`wx2421b1c4370ec43b,`10000100,`0,`1000,`1002780740201411100005729794,`1415635270,`085e9858e90ca40c0b5aee463,`MICROPAY,`SUCCESS,`OTHERS,`CNY,`0.01,`0.0,`0,`0,`0,`0,`,`,`被扫支付测试,`订单额外描述,`0,`0.60%
总交易单数,总交易额,总退款金额,总代金券或立减优惠退款金额,手续费总金额
`2,`0.02,`0.0,`0.0,`0
**结算对账单**

普通结算对账单

| 字段名称                 | 示例值                       | 字段说明                                                                                                                                                                                                       |
|--------------------------|------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 交易时间                 | 2017-12-14 15:49:06          | 指该笔交易的支付成功时间或发起退款成功时间（注：不是退款成功时间），格式为YYYY-MM-DD HH:MM:SS，如2015-01-01 10:00:00                                                                                           |
| 公众账号ID               | wxab8acb865bb11234           | 发起该笔交易时使用的appid，appid是由微信平台给公众号或app分配的唯一标识、用于区分交易场景                                                                                                                      |
| 商户号                   | 1234567890                   | 发起该笔交易的微信支付商户号，8~10位数字                                                                                                                                                                       |
| 子商户号                 | 0                            | 如果是普通受理模式下的交易，展示特约商户的商户号，8~10位数字
如果是直连模式交易，则展示成数字0                                                                                                              |
| 设备号                   | 8888                         | 该笔交易下单时在device_info字段中传入的信息，没填写则留空                                                                                                                                                      |
| 微信订单号               | 4200000008201712143733500001 | 微信支付为该笔订单（或该笔退款对应的订单）分配的订单号                                                                                                                                                         |
| 商户订单号               | test1                        | 商户传入的该笔订单（或该笔退款对应的订单）的商户订单号，对应下单接口里的out_trade_no字段                                                                                                                       |
| 用户标识                 | testxt08c-XB5-QD208X1Aid0Cbs | 微信平台为支付用户在公众账号(appid)下分配的唯一标识(openid)                                                                                                                                                    |
| 交易类型                 | NATIVE                       | 该笔订单（或该笔退款单对应的订单）的交易类型，使用英文缩写展示，取值和含义： 值：
JSAPI-JSAPI支付（或小程序支付）
NATIVE-Native支付
APP-app支付
MWEB-H5支付
MICROPAY-付款码支付
PAP-委托代扣 |
| 交易状态                 | SUCCESS                      | SUCCESS—支付成功，说明该行数据为一笔支付成功的订单
REFUND—转入退款，说明该行数据为一笔发起退款成功的退款单
REVOKED—已撤销，说明该行数据为一笔成功撤销的撤销单                                            |
| 付款银行                 | OTHERS                       | 银行类型，采用字符串类型的银行标识，如CMC_CREDIT，完整说明见https://pay.weixin.qq.com/doc/v2/merchant/4011941162#8%E3%80%81%E9%93%B6%E8%A1%8C%E7%B1%BB%E5%9E%8B                                                                                       |
| 货币种类                 | CNY                          | 货币类型，符合ISO 4217标准的三位字母代码，如CNY                                                                                                                                                                |
| 总金额                   | 0.01                         | 该笔订单的应结算金额（=订单金额-用户使用的免充值券金额），如果该行数据为退款或撤销则展示0.00，单位元，保留到小数点后2位                                                                                        |
| 代金券或立减优惠金额     | 0.00                         | 该笔订单中使用的微信支付代金券金额（包括充值券和免充值券），如果未使用代金券、或该行数据为退款或撤销则展示0.00，单位元，保留到小数点后2位                                                                      |
| 微信退款单号             | 0                            | 微信支付为该笔退款分配的退款单号，如果该行数据为订单则展示0                                                                                                                                                    |
| 商户退款单号             | 0                            | 商户发起退款时填入的商户退款单号，如果该行数据为订单则展示0                                                                                                                                                    |
| 退款金额                 | 0.00                         | 该笔退款或撤销单的应结算金额（申请退款金额-免充值券退款金额），如果该行数据为订单则展示为0.00，非负数、单位元，保留到小数点后2位                                                                               |
| 代金券或立减优惠退款金额 | 0.00                         | 退款金额中包含的充值券退款金额，如果该行数据为订单或没有充值券退款则展示为0.00，非负数、单位元，保留到小数点后2位                                                                                              |
| 退款类型                 |                              | ORIGINAL—原路退款
BALANCE—转退到用户的微信支付零钱
如果该行数据为订单，则留空                                                                                                                            |
| 退款状态                 |                              | 生成账单文件时该笔退款的状态、后续不会更新，如果该行数据为订单，则留空
SUCCES—退款成功
FAIL—退款失败M
PROCESSING—退款处理中                                                                           |
| 商品名称                 | 中文[body]                   | 商户传入的该笔订单（或该笔退款对应的订单）的商品名称，对应下单接口里的body字段                                                                                                                                 |
| 商户数据包               | 测试中文[attach]             | 商户传入的该笔订单（或该笔退款对应的订单）的商户数据包，对应下单接口里的attach字段，不传时留空                                                                                                                 |
| 手续费                   | 0.00000                      | 该笔订单/退款对应的手续费金额，订单对应正数、退款对应负数，单位元，保留小数点后2位                                                                                                                             |
| 费率                     | 0.00%                        | 该笔交易计费所使用的费率，百分数，如0.60%                                                                                                                                                                      |

开通免充值券后的结算对账单

| 字段名称       | 示例值                       | 字段说明                                                                                                                                                                                                       |
|----------------|------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 交易时间       | 2017-12-14 15:49:06          | 指该笔交易的支付成功时间或发起退款成功时间（注：不是退款成功时间），格式为YYYY-MM-DD HH:MM:SS，如2015-01-01 10:00:00                                                                                           |
| 公众账号ID     | wxab8acb865bb11234           | 发起该笔交易时使用的appid，appid是由微信平台给公众号或app分配的唯一标识、用于区分交易场景                                                                                                                      |
| 商户号         | 1234567890                   | 发起该笔交易的微信支付商户号，8~10位数字                                                                                                                                                                       |
| 特约商户号     | 0                            | 如果是普通受理模式下的交易，展示特约商户的商户号，8~10位数字
如果是直连模式交易，则展示成数字0                                                                                                              |
| 设备号         | 8888                         | 该笔交易下单时在device_info字段中传入的信息，没填写则留空                                                                                                                                                      |
| 微信订单号     | 4200000008201712143733500001 | 微信支付为该笔订单（或该笔退款对应的订单）分配的订单号                                                                                                                                                         |
| 商户订单号     | test1                        | 商户传入的该笔订单（或该笔退款对应的订单）的商户订单号，对应下单接口里的out_trade_no字段                                                                                                                       |
| 用户标识       | testxt08c-XB5-QD208X1Aid0Cbs | 微信平台为支付用户在公众账号(appid)下分配的唯一标识(openid)                                                                                                                                                    |
| 交易类型       | NATIVE                       | 该笔订单（或该笔退款单对应的订单）的交易类型，使用英文缩写展示，取值和含义： 值：
JSAPI-JSAPI支付（或小程序支付）
NATIVE-Native支付
APP-app支付
MWEB-H5支付
MICROPAY-付款码支付
PAP-委托代扣 |
| 交易状态       | SUCCESS                      | SUCCESS—支付成功，说明该行数据为一笔支付成功的订单
REFUND—转入退款，说明该行数据为一笔发起退款成功的退款单
REVOKED—已撤销，说明该行数据为一笔成功撤销的撤销单                                            |
| 付款银行       | OTHERS                       | 银行类型，采用字符串类型的银行标识，如CMC_CREDIT，完整说明见https://pay.weixin.qq.com/doc/v2/merchant/4011941162#8%E3%80%81%E9%93%B6%E8%A1%8C%E7%B1%BB%E5%9E%8B                                                                                       |
| 货币种类       | CNY                          | 货币类型，符合ISO 4217标准的三位字母代码，如CNY                                                                                                                                                                |
| 应结订单金额   | 0.01                         | 该笔订单的应结算金额（=订单金额-用户使用的免充值券金额），如果该行数据为退款或撤销则展示0.00，单位元，保留到小数点后2位                                                                                        |
| 代金券金额     | 0.00                         | 该笔订单中使用的微信支付代金券金额（包括充值券和免充值券），如果未使用代金券、或该行数据为退款或撤销则展示0.00，单位元，保留到小数点后2位                                                                      |
| 微信退款单号   | 0                            | 微信支付为该笔退款分配的退款单号，如果该行数据为订单则展示0                                                                                                                                                    |
| 商户退款单号   | 0                            | 商户发起退款时填入的商户退款单号，如果该行数据为订单则展示0                                                                                                                                                    |
| 退款金额       | 0.00                         | 该笔退款或撤销单的应结算金额（申请退款金额-免充值券退款金额），如果该行数据为订单则展示为0.00，非负数、单位元，保留到小数点后2位                                                                               |
| 充值券退款金额 | 0.00                         | 退款金额中包含的充值券退款金额，如果该行数据为订单或没有充值券退款则展示为0.00，非负数、单位元，保留到小数点后2位                                                                                              |
| 退款类型       |                              | ORIGINAL—原路退款
BALANCE—转退到用户的微信支付零钱
如果该行数据为订单，则留空                                                                                                                            |
| 退款状态       |                              | 生成账单文件时该笔退款的状态、后续不会更新，如果该行数据为订单，则留空
SUCCES—退款成功
FAIL—退款失败M
PROCESSING—退款处理中                                                                           |
| 商品名称       | 中文[body]                   | 商户传入的该笔订单（或该笔退款对应的订单）的商品名称，对应下单接口里的body字段                                                                                                                                 |
| 商户数据包     | 测试中文[attach]             | 商户传入的该笔订单（或该笔退款对应的订单）的商户数据包，对应下单接口里的attach字段，不传时留空                                                                                                                 |
| 手续费         | 0.00000                      | 该笔订单/退款对应的手续费金额，订单对应正数、退款对应负数，单位元，保留小数点后2位                                                                                                                             |
| 费率           | 0.00%                        | 该笔交易计费所使用的费率，百分数，如0.60%                                                                                                                                                                      |
| 订单金额       | 0.01                         | 该笔订单的金额，包括用户支付金额、充值券金额、免充值券金额，如果该行数据为退款或撤销则填0.00，单位元，保留到小数点后2位                                                                                        |
| 申请退款金额   | 0.00                         | 商户发起退款的金额，包括退给用户的金额、充值券退款金额、免充值券退款金额，如果该行数据订单则填0.00，单位元，保留到小数点后2位                                                                                  |
| 费率备注       |                              | 如果有特殊费率规则时则加以说明，默认留空                                                                                                                                                                       |

### 错误码

| 错误码 | 名称                                  | 描述                          | 原因                                       | 解决方案                                                                                                       |
|--------|---------------------------------------|-------------------------------|--------------------------------------------|----------------------------------------------------------------------------------------------------------------|
| 20003  | SYSTEMERROR                           | 下载失败                      | 系统超时                                   | 请尝试再次查询。                                                                                               |
| 20001  | sign error                            | 签名错误                      | 请求参数未按要求进行填写                   | 签名错误，请重新检查参数和签名密钥是否正确                                                                     |
| 20001  | nonce_str too long                    | 参数nonce_str错误             | 请求参数未按要求填写                       | 参数nonce_str长度超长                                                                                          |
| 20001  | invalid tar_type, Only GZIP supported | 参数tar_type错误              | 请求参数未按指引进行填写                   | 请重新检查参数invalid tar_typ是否正确                                                                          |
| 20001  | invalid bill_type                     | 参数bill_type错误             | 请求参数未按指引进行填写                   | 请重新检查参数bill_type是否正确                                                                                |
| 20001  | invalid bill_date                     | 参数bill_date错误             | 请求参数未按指引进行填写                   | 请重新检查参数bill_date是否符合要求                                                                            |
| 20001  | require POST method                   | 请求方式错误                  | 请求方式不符合要求                         | 请求检查参数请求方式是否为post                                                                                 |
| 20001  | empty post data                       | 请求报文错误                  | 请求报文为空                               | 请重新检查请求报文是否正确                                                                                     |
| 20001  | data format error                     | 参数格式错误                  | 请求参数要求为xml格式                      | 请重新检查请求参数格式是否为xml                                                                                |
| 20001  | missing parameter                     | 缺少参数                      | 有必传的参数未上传                         | 请重新检查是否所有必传参数都上传了，且不为空                                                                   |
| 20001  | invalid appid                         | appid错误                     | 请求参数appid有误                          | 请重新检查参数appid是否正确                                                                                    |
| 20001  | invalid parameter                     | 参数错误                      | 有未知的请求参数                           | 请重新检查是否所有参数都与文档相符                                                                             |
| 20001  | sub_mch not allow                     | 特约商户号权限错误            | 无该特约商户账单的下载权限                 | 请检查特约商户号是否正确。若是小微商户，可不传sub_mch_id以获取服务商下全量特约商户的账单                       |
| 20002  | NO Bill Exist                         | 账单不存在                    | 当前商户号没有已成交的订单，不生成对账单   | 请检查当前商户号在指定日期内是否有成功的交易。                                                                 |
| 20002  | Bill Creating                         | 账单未生成                    | 当前商户号没有已成交的订单或对账单尚未生成 | 请先检查当前商户号在指定日期内是否有成功的交易，如指定日期有交易则表示账单正在生成中，请在上午10点以后再下载。 |
| 20007  | 当前商户号账单API权限已经关闭         | 当前商户号账单API权限已经关闭 | 当前商户号账单API权限已经关闭              | 当前商户号账单API权限已经关闭，请联系微信支付解决                                                              |
| 20100  | system error                          | 下载失败                      | 系统超时                                   | 请尝试再次查询。                                                                                               |

## 代码示例

```js
// 云函数代码
const cloud = require('wx-server-sdk')
cloud.init({ env: cloud.DYNAMIC_CURRENT_ENV })

exports.main = async (event, context) => {
  const res = await cloud.cloudPay.downloadBill({
    subMchId: '1900000109',
    billDate: '20140603',
    billType: 'ALL',
    nonceStr: '5K8264ILTKCH16CQ2502SI8ZNMTM67VS'
  })
  return res
}
```

如果是共享小程序调用，appid需要按如下方式传入`cloud.cloudPay({ appid: 'xxxxx' }).downloadBill({其他参数...})`，详情参考[环境共享指引文档](/miniprogram/dev/wxcloudservice/wxcloud/guide/resource-sharing/index)
