微信支付时候数据签名、解析、请求demo

来源:互联网 发布:如何查询数据库名称 编辑:程序博客网 时间:2024/06/11 21:51

集成微信支付的时候还是有些坑的,我服务端需要做的事情工具类封装出来,希望能帮到各位集成微信支付的同学。

//parameters 请求微信支付时候需要的参数
//private_key 私钥

public static String createSign(SortedMap<String,String> parameters,String private_key)  {//首先要做的是把签名参数key=value的方式连接起来//因为SortedMap已经对参数进行过排序。所以我们不需要对参数在进行排序操作//注意:sign和key是不参加签名的。私钥要放在签名连接的最后面        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=" + private_key);//最后加密时添加商户密钥,由于key值放在最后,所以不用添加到SortMap里面去,单独处理,编码方式采用UTF-8        String sign = MD5Encode(sb.toString(),"utf-8").toUpperCase();        return sign;    }

//我把MD5加密也贴上吧。具体不细说

    public static String MD5Encode(String origin, String charsetname) {        String resultString = null;        try {           resultString = new String(origin);           MessageDigest md = MessageDigest.getInstance("MD5");           if (charsetname == null || "".equals(charsetname))              resultString = byteArrayToHexString(md.digest(resultString.getBytes()));           else              resultString = byteArrayToHexString(md.digest(resultString.getBytes("utf-8")));//正确的写法        } catch (Exception exception) {        }        return resultString;     }    private static final String hexDigits[] = { "0", "1", "2", "3", "4", "5",        "6", "7", "8", "9", "a", "b", "c", "d", "e", "f"    };    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;        int d1 = n / 16;        int d2 = n % 16;        return hexDigits[d1] + hexDigits[d2];     }
//将封装好的参数转换成Xml格式类型的请求字符串    //签名要放到所有参数的最后面    //attach字段和body字段需要转义。sign也需要转义    public static String getRequestXml(SortedMap<String,String> parameters){          StringBuffer sb = new StringBuffer();        sb.append("<xml>");        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("sign".equalsIgnoreCase(k)){            }            else if ("attach".equalsIgnoreCase(k)||"body".equalsIgnoreCase(k)) {                sb.append("<"+k+">"+"<![CDATA["+v+"]]></"+k+">");            }            else {                sb.append("<"+k+">"+v+"</"+k+">");            }        }        sb.append("<"+"sign"+">"+"<![CDATA["+parameters.get("sign")+"]]></"+"sign"+">");        sb.append("</xml>");        return sb.toString();       } 
//解析微信返回的xml数据public static Map<String,String> doXMLParse(String strxml)  {        if (StringUtils.isEmpty(strxml)) {            return null;        }        strxml = strxml.replaceFirst("encoding=\".*\"", "encoding=\"UTF-8\"");        Map<String,String> m = new HashMap<String,String>();        InputStream in = new ByteArrayInputStream(strxml.getBytes("UTF-8"));        SAXBuilder builder = new SAXBuilder();        Document doc = builder.build(in);        Element root = doc.getRootElement();        List list = root.getChildren();        Iterator it = list.iterator();        while (it.hasNext()) {            Element e = (Element) it.next();            String k = e.getName();            String v = "";            List children = e.getChildren();            if (children.isEmpty()) {                v = e.getTextNormalize();            } else {                v = getChildrenText(children);            }            m.put(k, v);        }        // 关闭流        in.close();        return m;    }
//获取子结点的xml private static String getChildrenText(List children) {        StringBuffer sb = new StringBuffer();        if (!children.isEmpty()) {            Iterator it = children.iterator();            while (it.hasNext()) {                Element e = (Element) it.next();                String name = e.getName();                String value = e.getTextNormalize();                List list = e.getChildren();                sb.append("<" + name + ">");                if (!list.isEmpty()) {                    sb.append(getChildrenText(list));                }                sb.append(value);                sb.append("</" + name + ">");            }        }        return sb.toString();    }

请笑纳

原创粉丝点击