微信支付对账单查询获取
第一步:拼接请求参数(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,商户号,子商户号,设备号,微信订单号,商户订单号,用户标识,交易类型,交易状态,付款银行,货币种类,总金额, 代金券或立减优惠金额,退款申请时间,退款成功时间,微信退款单号,商户退款单号,退款金额, 代金券或立减优惠退款金额,退款类型,退款状态,商品名称,商户数据包,手续费,费率 ,订单金额,申请退款金额,费率备注