MD5接口签名算法工具类

766 阅读1分钟
/**
 * 
 *
 */
public class SignUtils {

    private static Logger LOG = LoggerFactory.getLogger(SignUtils.class);

    private SignUtils() {
    }

    public static String signMD5(Object object, String key) {
        String json = JSON.toJSONString(object);
        return signMD5(json, key);
    }

    public static String signMD5(String json, String key) {
        Map<String, Object> map = JSON.parseObject(json);
        return signMD5(map, key);
    }

    public static String signOnMethod(Map<String, Object> map,String signMethod, String key) {
        map.remove("sign"); // 移除原报文签名
        map.remove("signMethod");//移除签名方法
        map.remove("extField");//移除扩展字段
        return sign(signMethod, map, key);
    }

    public static String signMD5(Map<String, Object> map, String key) {
        map.remove("sign"); // 移除原报文签名
        map.remove("signMethod");//移除签名方法
        map.remove("extField");//移除扩展字段
        return sign("MD5", map, key);
    }

    public static String sign(String signMethod, Map<String, Object> map, String key) {
        StringBuilder signBuilder = buildSign(map);
        if (StringUtils.isNotEmpty(key)) {
            signBuilder.append("&key=").append(key);
        }
//        LOG.info("签名源串为:{}", signBuilder.toString());
        byte[] digest = DigestUtils.getDigest(signMethod).digest(signBuilder.toString().getBytes());
        return new String(Hex.encodeHex(digest));
    }

    @SuppressWarnings("unchecked")
    private static String signStr(Object obj) {
        if (obj == null)
            return null;

        if (obj instanceof Map) {
            return buildSign((Map<String, Object>) obj).insert(0, '{').append('}').toString();
        }

        if (obj instanceof List) {
            return buildSign((List<Object>) obj).insert(0, '[').append(']').toString();
        }

        return obj.toString();
    }

    private static StringBuilder buildSign(Map<String, Object> map) {
        if (!(map instanceof TreeMap)) {
            map = new TreeMap<String, Object>(map); // 按字母顺序排序
        }

        StringBuilder builder = new StringBuilder();
        for (Map.Entry<String, Object> entry : map.entrySet()) {
            String key = entry.getKey();
            Object value = entry.getValue();
            if (value != null && StringUtils.isNotEmpty(value.toString())) {
                builder.append(key).append("=").append(signStr(value)).append("&");
            }
        }

        return builder.deleteCharAt(builder.length() - 1);
    }

    private static StringBuilder buildSign(List<Object> list) {
        StringBuilder builder = new StringBuilder();

        if (list == null || list.isEmpty()) {
            return builder;
        }

        for (Object obj : list) {
            builder.append(signStr(obj)).append(",");
        }

        return builder.deleteCharAt(builder.length() - 1);
    }

}