package com.jsowell.thirdparty.lianlian.util;

import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.crypto.Mac;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.util.Map;

public class GBSignUtils {

	public static final Logger logger = LoggerFactory.getLogger(GBSignUtils.class);

	public static String sign(Map<String, String> paramValues, String secret) {
		try {
			StringBuilder sb = new StringBuilder();
			for (String value : paramValues.values()) {
				if (StringUtils.isNotBlank(value)) {
					sb.append(value);
				}
			}
			logger.debug("需要签名的内容：{},密钥{}", sb.toString(), secret);
			byte[] md5Digest = HmacMD5Encrypt(sb.toString(), secret);
			String result = Encodes.encodeHex(md5Digest).toUpperCase();
			logger.debug("HmacSHA1的签名内容：{}", result);
			return result;
		} catch (Exception e) {
			throw new RuntimeException("数据签名出错", e);
		}
	}

	/**
	 * 使用 HMAC-MD5 签名方法对对encryptText进行签名
	 *
	 * @param encryptText
	 *            被签名的字符串
	 * @param encryptKey
	 *            密钥
	 * @return
	 * @throws Exception
	 */
	public static byte[] HmacMD5Encrypt(String encryptText, String encryptKey) throws Exception {
		byte[] data = encryptKey.getBytes("UTF-8");
		// 根据给定的字节数组构造一个密钥,第二参数指定一个密钥算法的名称
		SecretKey secretKey = new SecretKeySpec(data, "HmacMD5");
		// 生成一个指定 Mac 算法 的 Mac 对象
		Mac mac = Mac.getInstance("HmacMD5");
		// 用给定密钥初始化 Mac 对象
		mac.init(secretKey);

		byte[] text = encryptText.getBytes("UTF-8");
		// 完成 Mac 操作
		return mac.doFinal(text);
	}

}
