package thyyxxk.webserver.utils;

import lombok.extern.slf4j.Slf4j;

import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;

/**
 * @author dj
 */
@Slf4j
public class Md5Util {
    public static String encrypt(String sourceStr) {
        String result = "";
        try {
            MessageDigest md = MessageDigest.getInstance("MD5");
            md.update(sourceStr.getBytes(StandardCharsets.UTF_8));
            byte[] b = md.digest();
            int i;
            StringBuilder buf = new StringBuilder();
            for (byte value : b) {
                i = value;
                if (i < 0) {
                    i += 256;
                }
                if (i < 16) {
                    buf.append("0");
                }
                buf.append(Integer.toHexString(i));
            }
            result = buf.toString();
        } catch (Exception e) {
            log.error("MD5加密出错：", e);
        }
        return result;
    }


    /**
     * 生成签名，用于在微信支付前，获取预支付时候需要使用的参数sign
     * <p>算法参考：https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=4_3</p>
     *
     * @param params 需要发送的所有数据设置为的Map
     * @return 签名sign
     */
    public static String createWxPaySign(TreeMap<String, String> params) {
        List<Map.Entry<String, String>> infoIds = new ArrayList<>(params.entrySet());
        // 对所有传入参数按照字段名的 ASCII 码从小到大排序（字典序）
        infoIds.sort(Map.Entry.comparingByKey());
        StringBuilder stringA = new StringBuilder();
        for (Map.Entry<String, String> item : infoIds) {
            String key = item.getKey();
            String val = item.getValue();
            if (StringUtil.notBlank(val)) {
                stringA.append(key).append("=").append(val).append("&");
            }
        }
        String stringSignTemp = stringA.substring(0, stringA.length() - 1) + "&key=" + WxCertUtil.MERCHANT_KEY;
        return encrypt(stringSignTemp).toUpperCase();
    }
}
