下载交易账单接口开发
应用场景:
商户可以通过该接口下载历史交易清单。比如掉单、系统错误等导致商户侧和微信侧数据不一致,通过对账单核对后可校正支付状态。
注意:
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);// APPidwx.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<String> splitGroup = Arrays.asList(tradeInfo.split(qDate));List<WechatBillAcount> billGroup =new ArrayList<>();for (int i = 0; i < splitGroup.size(); i++) {//把第一行表头去掉if (i == 0) {continue;}//取到微信账单数据List<String> 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>wx2421b1c4370ec43b</appid><bill_date>20141110</bill_date><bill_type>ALL</bill_type><mch_id>10000100</mch_id><nonce_str>21df7dc9cd8616b56919f20d9f679233</nonce_str><sign>332F17B766FC787203EBE9D6E40457A1</sign>
</xml>
失败示例:
<xml><return_code><![CDATA[FAIL]]></return_code>
<return_msg><![CDATA[require POST method]]></return_msg>
<error_code><![CDATA[20001]]></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
最后解析响应的数据即可。