微信支付对账单查询获取

微信支付对账单查询获取

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值