微信支付对账单查询获取
第一步:拼接请求参数(xml格式) 请求字段说明 appid 微信公众号开发者ID 必填 nonce_str 随机字符串 必填长度不长于32位(可用随机字符串生成工具类生成) mch_id 微信商户号id 必填 bill_type 对账单类型,ALL(默认值),返回当日所有订单信息(不含充值退款订单);SUCCESS,返回当日成功支付的订单(不含充值退款订单);REFUND,返回当日退款订单(不含充值退款订单)RECHARGE_REFUND,返回当日充值退款订单 bill_date 对账单日期,日期格式(yyyyMMdd) sign 签名参考对账微信签名生成算法; 1.将所有要发送的数据拼接成键值对 key=value&key1=value&key2=value&… 格式的字符串。
2.在第一步生成的字符串后面拼接key(为商户平台设置的密钥key)&key=” 商户平台密钥”,然后对签名进行加密,加密方式目前只支持 HMAC-SHA256和MD5,默认为MD5加密;
/** * md5加密算法 * @param originString 待加密字符串 * @return 加密后的字符串 */ public static String encodeByMD5(String originString){ if (originString != null){ try{ //创建具有指定算法名称的信息摘要 MessageDigest md = MessageDigest.getInstance("MD5"); //使用指定的字节数组对摘要进行最后更新,然后完成摘要计算 byte[] results = md.digest(originString.getBytes()); //将得到的字节数组变成字符串返回 String resultString = byteArrayToHexString(results); return resultString.toUpperCase(); } catch(Exception ex){ ex.printStackTrace(); } } return null; } /** * 转换字节数组为十六进制字符串 * @param * @return 十六进制字符串 */ private static String byteArrayToHexString(byte[] b){ StringBuffer resultSb = new StringBuffer(); for (int i = 0; i < b.length; i++){ resultSb.append(byteToHexString(b[i])); } return resultSb.toString(); } /** 将一个字节转化成十六进制形式的字符串 */ private static String byteToHexString(byte b){ int n = b; if (n < 0) { n = 256 + n; } int d1 = n / 16; int d2 = n % 16; return HEX_DIGITS[d1] + HEX_DIGITS[d2]; }`请求参数实例: 第二步:请求微信支付交易账单接口 请求地址:https://api.mch.weixin.qq.com/pay/downloadbill 必须为http post请求,用httpclient即可
public class HttpClientUtil { public static String doPost(String url, String jsonStr, String charset) throws Exception { CloseableHttpClient httpClient = HttpClients.createDefault(); HttpPost httpPost = null; String result = null; httpPost = new HttpPost(url); httpPost.setHeader("Content-Type", "application/xml"); StringEntity se = new StringEntity(jsonStr, charset); httpPost.setEntity(se); RequestConfig requestConfig = RequestConfig.custom() .setConnectTimeout(60000).setConnectionRequestTimeout(60000) .setSocketTimeout(60000).build(); httpPost.setConfig(requestConfig); HttpResponse response = httpClient.execute(httpPost); if (response != null) { HttpEntity resEntity = response.getEntity(); if (resEntity != null) { result = EntityUtils.toString(resEntity, charset); } } return result; } }第三步:接受返回数据进行解析
String result = "返回的数据"; String[] resArr = null; if (result != null && result.length() > 0) { resArr = result.split("\n"); } int success = 0; int fail = 0; if (resArr.length > 3) { for (int i = 1; i < resArr.length; i++) { String consumeStr = resArr[i].replaceAll("`", ""); String[] consumeArr = consumeStr.split(","); if (consumeArr.length > 10) { //根据对账类型赋值 boolean saveSuccess = SaveAllOrderIntf.saveModel(targetBillModel, consumeArr, mch_id, settletypeId); if (saveSuccess) { success++; } else { fail++; } } } saveMsg.append("保存成功:").append(success).append("张账单;").append("保存失败:").append(fail).append("张账单。\r\n"); }表头信息说明 当日所有订单 交易时间,公众账号ID,商户号,子商户号,设备号,微信订单号,商户订单号,用户标识,交易类型,交易状态,付款银行,货币种类,总金额,代金券或立减优惠金额,微信退款单号,商户退款单号,退款金额, 代金券或立减优惠退款金额,退款类型,退款状态,商品名称,商户数据包,手续费,费率 ,订单金额,申请退款金额,费率备注
当日成功支付的订单 交易时间,公众账号ID,商户号,子商户号,设备号,微信订单号,商户订单号,用户标识,交易类型,交易状态,付款银行,货币种类,总金额, 代金券或立减优惠金额,商品名称,商户数据包,手续费,费率 ,订单金额,费率备注
当日退款的订单 交易时间,公众账号ID,商户号,子商户号,设备号,微信订单号,商户订单号,用户标识,交易类型,交易状态,付款银行,货币种类,总金额, 代金券或立减优惠金额,退款申请时间,退款成功时间,微信退款单号,商户退款单号,退款金额, 代金券或立减优惠退款金额,退款类型,退款状态,商品名称,商户数据包,手续费,费率 ,订单金额,申请退款金额,费率备注