package jframe.pay.wx.http; import java.io.BufferedReader; import java.io.FileOutputStream; import java.io.StringReader; import java.io.UnsupportedEncodingException; import java.util.LinkedList; import java.util.List; import java.util.Random; import org.apache.http.NameValuePair; import org.apache.http.message.BasicNameValuePair; import jframe.pay.wx.domain.WxFields; import jframe.pay.wx.http.client.TenpayHttpClient; import jframe.pay.wx.http.client.WxServiceNew; import jframe.pay.wx.http.util.MD5Util; public class DownloadBillRequestHandler extends RequestHandler { public DownloadBillRequestHandler() { super(); } /** * 创建md5摘要,规则是:按参数固定顺序组串,遇到空值的参数不参加签名。 */ protected void createSign() { StringBuffer sb = new StringBuffer(); sb.append("spid=" + this.getParameter("spid") + "&"); sb.append("trans_time=" + this.getParameter("trans_time") + "&"); sb.append("stamp=" + this.getParameter("stamp") + "&"); sb.append("cft_signtype=" + this.getParameter("cft_signtype") + "&"); sb.append("mchtype=" + this.getParameter("mchtype") + "&"); sb.append("key=" + this.getKey()); String enc = ""; String sign = MD5Util.MD5Encode(sb.toString(), enc).toLowerCase(); this.setParameter("sign", sign); // debug信息 this.setDebugInfo(sb.toString() + " => sign:" + sign); } private static String genNonceStr() { Random random = new Random(); return MD5Util.MD5Encode(String.valueOf(random.nextInt(10000)), ""); // return // MD5.getMessageDigest(String.valueOf(random.nextInt(10000)).getBytes()); } public static void main(String[] args) throws Exception { TenpayHttpClient client = new TenpayHttpClient(); String date = "20160406"; String appid = "wx*********5c"; String mchid = "12*****2"; String appkey = "1234*********op12"; // ALL SUCCESS REFUND String billType = "ALL"; List<NameValuePair> packageParams = new LinkedList<NameValuePair>(); packageParams.add(new BasicNameValuePair(WxFields.F_appid, appid)); packageParams.add(new BasicNameValuePair(WxFields.F_bill_date, date)); packageParams.add(new BasicNameValuePair(WxFields.F_bill_type, billType)); packageParams.add(new BasicNameValuePair(WxFields.F_mch_id, mchid)); packageParams.add(new BasicNameValuePair(WxFields.F_nonce_str, genNonceStr())); String sign = genPackageSign(packageParams, appkey); packageParams.add(new BasicNameValuePair("sign", sign)); String entity = WxServiceNew.toXml(packageParams); // byte[] buf = httpPost(url, entity); TenpayHttpClient httpClient = new TenpayHttpClient(); httpClient.setReqContent(entity); client.callHttpPost("https://api.mch.weixin.qq.com/pay/downloadbill", entity); String rspContent = client.getResContent(); System.out.println(rspContent); String file = "/Users/dzh/share/ody/opay/bl/bl-bill-" + date + ".txt"; FileOutputStream fos = new FileOutputStream(file); fos.write(rspContent.getBytes("utf-8")); fos.flush(); fos.close(); BufferedReader in = new BufferedReader(new StringReader(rspContent)); String line = null; while ((line = in.readLine()) != null) { String[] arr = line.split(","); if (arr.length > 21) System.out.println(arr[0] + "->" + arr[6] + "->" + arr[9] + "->" + arr[21]); } } public static String genPackageSign(List<NameValuePair> params, String appkey) throws UnsupportedEncodingException { StringBuilder sb = new StringBuilder(); for (int i = 0; i < params.size(); i++) { sb.append(params.get(i).getName()); sb.append('='); sb.append(params.get(i).getValue()); sb.append('&'); } sb.append("key="); sb.append(appkey); String packageSign = WxServiceNew.getMessageDigest(sb.toString().getBytes("UTF-8")).toUpperCase(); // String packageSign = MD5Util.MD5Encode(sb.toString(), // "").toUpperCase(); return packageSign; } }