商户可以通过该接口下载历史交易清单。比如掉单、系统错误等导致商户侧和微信侧数据不一致,通过对账单核对后可校正支付状态。
注意:
1、微信侧未成功下单的交易不会出现在对账单中。支付成功后撤销的交易会出现在对账单中,跟原支付单订单号一致;
2、微信在次日9点启动生成前一天的对账单,建议商户10点后再获取;
3、对账单中涉及金额的字段单位为“元”。
4、对账单接口只能下载三个月以内的账单。
5、对账单是以商户号维度来生成的,如一个商户号与多个appid有绑定关系,则使用其中任何一个appid都可以请求下载对账单。对账单中的appid取自交易时候提交的appid,与请求下载对账单时使用的appid无关。
6、自2018年起入驻的商户默认是开通免充值券后的结算对账单,且汇总数据为总交易单数,应结订单总金额,退款总金额,充值券退款总金额,手续费总金额,订单总金额,申请退款总金额。
https://api.mch.weixin.qq.com/pay/downloadbill
1.传入的参数:

基本代码如下:
- String nonceStr = sdf.format(date).toString();
- wx.setAppid(wechatAPIConstant.APP_ID);// APPid
- wx.setMch_id(wechatAPIConstant.MCH_ID);// 商户id
- //加密类型
- wx.setSign_type("MD5");
- wx.setNonce_str(nonceStr);
- //查询日期
- wx.setBill_date(qDate.replace("-", ""));
- wx.setBill_type("ALL");
- //MD5加密
- String MD5 = getEncryptionMD5(wx);//加密签名
- //设置签名
- wx.setSign(MD5);
- //转换为xml类型
- String xml = changeToXML(wx);
- log.info("debug对账单xml: xml={}", xml);
-
- //向微信平台发送xml数据
- StringBuffer buffer = HttpUtil.httpsRequest(wechatAPIConstant.WX_API_CHECK_ACCOUNT, "POST", xml);
-
- //微信平台账单数据
- String s = buffer.toString();
-
- // 去掉汇总数据,并且去掉'`'
- String tradeInfo = s.substring(0, s.indexOf("总")).replace("`", "");
- //以27个数据为一组
- int rowNum = 27;
- //以日期来分割数据
- List
splitGroup = Arrays.asList(tradeInfo.split(qDate)); - List
billGroup =new ArrayList<>(); -
- for (int i = 0; i < splitGroup.size(); i++) {
- //把第一行表头去掉
- if (i == 0) {
- continue;
- }
- //取到微信账单数据
- List
tempSplit = Arrays.asList(splitGroup.get(i).split(",")); - WechatBillAcount bill = new WechatBillAcount();
- bill.setDate(qDate + tempSplit.get(0));
- bill.setAppId(tempSplit.get(1));
- bill.setMch_id(tempSplit.get(2));
- bill.setSubMch_id(tempSplit.get(3));
- bill.setDevice_info(tempSplit.get(4));
- bill.setWeiXinOrderNo(tempSplit.get(5));
- bill.setMchOrderNo(tempSplit.get(6));
- bill.setUserId(tempSplit.get(7));
- bill.setType(tempSplit.get(8));
- bill.setStatus(tempSplit.get(9));
- bill.setBank(tempSplit.get(10));
- bill.setCurrency(tempSplit.get(11));
- bill.setAmount(tempSplit.get(12));
- bill.setEnvelopeAmount(tempSplit.get(13));
- bill.setWxRefundNo(tempSplit.get(14));
- bill.setBusinessRefundNo(tempSplit.get(15));
- bill.setRefundAmount(tempSplit.get(16));
- bill.setRedEnvelopesRefundAmount(tempSplit.get(17));
- bill.setRefundType(tempSplit.get(18));
- bill.setRefundStatus(tempSplit.get(19));
- bill.setName(tempSplit.get(20));
- bill.setPacket(tempSplit.get(21));
- BigDecimal poundage = new BigDecimal(tempSplit.get(22));
- bill.setPoundage(poundage);
- bill.setRate(tempSplit.get(23));
- BigDecimal orderAmount = new BigDecimal(tempSplit.get(24));
- bill.setOrderAmount(orderAmount);
- bill.setAskRefundAmount(tempSplit.get(25));
- billGroup.add(bill);
- }
- addVOToEntity(billGroup);
- }
以xml形式传给微信对账单接口而后接口会返回值:
- <xml>
- <appid>wx2421b1c4370ec43bappid>
- <bill_date>20141110bill_date>
- <bill_type>ALLbill_type>
- <mch_id>10000100mch_id>
- <nonce_str>21df7dc9cd8616b56919f20d9f679233nonce_str>
- <sign>332F17B766FC787203EBE9D6E40457A1sign>
- xml>
失败示例:
- <xml><return_code>return_code>
- <return_msg>return_msg>
- <error_code>error_code>xml>
成功示例:
交易时间,公众账号ID,商户号,子商户号,设备号,微信订单号,商户订单号,用户标识,交易类型,交易状态,付款银行,货币种类,总金额,代金券或立减优惠金额,微信退款单号,商户退款单号,退款金额,代金券或立减优惠退款金额,退款类型,退款状态,商品名称,商户数据包,手续费,费率
`2014-11-1016:33:45,`wx2421b1c4370ec43b,`10000100,`0,`1000,`1001690740201411100005734289,`1415640626,`085e9858e3ba5186aafcbaed1,`MICROPAY,`SUCCESS,`CFT,`CNY,`0.01,`0.0,`0,`0,`0,`0,`,`,`被扫支付测试,`订单额外描述,`0,`0.60%
`2014-11-1016:46:14,`wx2421b1c4370ec43b,`10000100,`0,`1000,`1002780740201411100005729794,`1415635270,`085e9858e90ca40c0b5aee463,`MICROPAY,`SUCCESS,`CFT,`CNY,`0.01,`0.0,`0,`0,`0,`0,`,`,`被扫支付测试,`订单额外描述,`0,`0.60%
总交易单数,总交易额,总退款金额,总代金券或立减优惠退款金额,手续费总金额
`2,`0.02,`0.0,`0.0,`0
最后解析响应的数据即可。