package com.dsh.app.util.pay.wechat; import com.dsh.app.util.DateTimeHelper; import com.dsh.app.util.pay.config.Config; import org.jdom.Document; import org.jdom.Element; import org.jdom.JDOMException; import org.jdom.input.SAXBuilder; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.util.*; public class WXPayCommonUtil { public static String CreateNoncestr(int length) { String chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; String res = ""; for (int i = 0; i < length; i++) { Random rd = new Random(); res += chars.indexOf(rd.nextInt(chars.length() - 1)); } return res; } public static String CreateNoncestr() { String chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; String res = ""; for (int i = 0; i < 16; i++) { Random rd = new Random(); res += chars.charAt(rd.nextInt(chars.length() - 1)); } return res; } /** * 是否签名正确,规则是:按参数名称a-z排序,遇到空值的参数不参加签名。 * * @return boolean */ public static boolean isTenpaySign(String characterEncoding, SortedMap packageParams) { StringBuffer sb = new StringBuffer(); Set es = packageParams.entrySet(); Iterator it = es.iterator(); while (it.hasNext()) { Map.Entry entry = (Map.Entry) it.next(); String k = (String) entry.getKey(); String v = (String) entry.getValue(); if (!"sign".equals(k) && null != v && !"".equals(v)) { sb.append(k + "=" + v + "&"); } } sb.append("key=" + Config.WX_PAY_API_KEY); //算出摘要 String mysign = WXMD5Util.MD5Encode(sb.toString(), characterEncoding).toLowerCase(); String tenpaySign = ((String) packageParams.get("sign")).toLowerCase(); return tenpaySign.equals(mysign); } /** * @param characterEncoding 编码格式 * @param parameters 请求参数 * @return * @Description:sign签名 */ public static String createSign(String characterEncoding, SortedMap parameters) { StringBuffer sb = new StringBuffer(); Set es = parameters.entrySet(); Iterator it = es.iterator(); while (it.hasNext()) { Map.Entry entry = (Map.Entry) it.next(); String k = (String) entry.getKey(); Object v = entry.getValue(); if (null != v && !"".equals(v) && !"sign".equals(k) && !"key".equals(k)) { sb.append(k + "=" + v + "&"); } } sb.append("key=" + Config.WX_PAY_API_KEY); String sign = WXMD5Util.MD5Encode(sb.toString(), "UTF-8").toUpperCase(); return sign; } /** * @param parameters 请求参数 * @return * @Description:将请求参数转换为xml格式的string */ public static String getRequestXml(SortedMap parameters) { StringBuffer sb = new StringBuffer(); sb.append(""); Set es = parameters.entrySet(); Iterator it = es.iterator(); while (it.hasNext()) { Map.Entry entry = (Map.Entry) it.next(); String k = (String) entry.getKey(); String v = (String) entry.getValue(); if ("attach".equalsIgnoreCase(k) || "body".equalsIgnoreCase(k)) { sb.append("<" + k + ">" + ""); } else { sb.append("<" + k + ">" + v + ""); } } sb.append(""); return sb.toString(); } /** * @param return_code 返回编码 * @param return_msg 返回信息 * @return * @Description:返回给微信的参数 */ public static String setXML(String return_code, String return_msg) { return ""; } public static Map decodeXml(String content) { Map xml = new HashMap(); try { //创建一个SAXBuilder对象 SAXBuilder saxBuilder = new SAXBuilder(); byte[] bytes = content.getBytes("UTF-8"); InputStream xmlInput = new ByteArrayInputStream(bytes); //读取prop.xml资源 Document doc = saxBuilder.build(xmlInput); //获取根元素(prop) Element root = doc.getRootElement(); //获取根元素下面的所有子元素(mess) List messList = root.getChildren(); for (Element element : messList) { xml.put(element.getName(), element.getValue()); } } catch (JDOMException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return xml; } public static SortedMap appParam(String content) { String sign = ""; Boolean status = false; SortedMap params = new TreeMap<>(); Map maps = decodeXml(content); for (Map.Entry item : maps.entrySet()) { if (item.getKey().equals("result_code") && item.getValue().equals("SUCCESS")) { status = true; } maps.put(item.getKey(), item.getValue()); System.out.println(item.getKey() + "-------" + item.getValue()); } if (status) { maps.remove("return_code"); maps.remove("return_msg"); maps.remove("result_code"); maps.remove("sign"); maps.remove("trade_type"); maps.put("partnerid", maps.get("mch_id")); maps.remove("mch_id"); maps.put("timestamp", DateTimeHelper.formatDateTimetoString(DateTimeHelper.getWXTime(), DateTimeHelper.FMT_yyyyMMddHH_noseparator)); maps.put("package", "Sign=WXPay");//默认sign=WXPay maps.put("noncestr", maps.get("nonce_str")); maps.remove("nonce_str"); maps.put("prepayid", maps.get("prepay_id")); maps.remove("prepay_id"); params = new TreeMap<>(maps); String signAgain = WXPayCommonUtil.createSign("UTF-8", params);//再次生成签名 System.out.println("+二次签名+" + signAgain); params.put("sign", signAgain); } return params; } }