下载交易账单接口开发
应用场景:
商户可以通过该接口下载历史交易清单。比如掉单、系统错误等导致商户侧和微信侧数据不一致,通过对账单核对后可校正支付状态。
注意:
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<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
最后解析响应的数据即可。