package com.sooka.common.utils; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.Map; /** * Created by yanhongliang on 16/6/14. */ public class Http { public interface SignParams { String signParams(String params); } static public void setOnSignParams(SignParams signParams) { onSignParams = signParams; } static private SignParams onSignParams; static public String stringFromParams(Map post) { StringBuilder buffer = new StringBuilder(); if (post == null) return null; ArrayList keys = new ArrayList<>(post.size()); keys.addAll(post.keySet()); Collections.sort(keys); // ArrayList> params = new ArrayList<>(post.size()); // // for (Map.Entry entry: post.entrySet()) { // params.add(entry); // } // // Collections.sort(params, new Comparator>() { // @Override // public int compare(Map.Entry lhs, Map.Entry rhs) { // // System.out.println("-----lhs-----:=>"+lhs.getKey().hashCode()); // System.out.println("-----rhs-----:=>"+rhs.getKey().hashCode()); // // return lhs.getKey().hashCode() - rhs.getKey().hashCode(); // } // }); for (String key : keys) { Object value = post.get(key); if (buffer.length() > 0) buffer.append("&"); buffer.append(key); buffer.append("="); try { buffer.append(URLEncoder.encode(String.valueOf(value), "UTF-8")); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } } String paramsString = new String(buffer); if (onSignParams != null) { paramsString = onSignParams.signParams(paramsString); } return paramsString; } public static String getMd5(String string) { byte[] hash; try { hash = MessageDigest.getInstance("MD5").digest(string.getBytes("UTF-8")); } catch (NoSuchAlgorithmException e) { throw new RuntimeException("Huh, MD5 should be supported?", e); } catch (UnsupportedEncodingException e) { throw new RuntimeException("Huh, UTF-8 should be supported?", e); } StringBuilder hex = new StringBuilder(hash.length * 2); for (byte b : hash) { if ((b & 0xFF) < 0x10) hex.append("0"); hex.append(Integer.toHexString(b & 0xFF)); } return hex.toString(); } }