package com.bohuikeji.frame.module.admin.utils.kuaishou;

import com.alibaba.fastjson.JSONObject;
import com.google.api.client.util.Strings;
import com.google.common.base.Joiner;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.codec.digest.DigestUtils;
import java.util.*;
import java.util.stream.Collectors;

/**
 * 百度交易中台双向RSA签名工具
 * JDK版本要求：1.8+
 */
@Slf4j
public class kuaishouSign {
    /**
     * 小程序 app_secret
     */
    private static final String APP_SECRET = "F8cGAK-Hpg2qxDBdMTbKMg";

    /**
     * 获取参数 Map 的签名结果
     *
     * @param signParamsMap 含义见上述示例
     * @return 返回签名结果
     */
    public static String calcSign(Map<String, Object> signParamsMap) {
        // 去掉 value 为空的
        Map<String, Object> trimmedParamMap = signParamsMap.entrySet()
                .stream()
                .filter(item -> !Strings.isNullOrEmpty(item.getValue().toString()))
                .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));

        // 按照字母排序
        Map<String, Object> sortedParamMap = trimmedParamMap.entrySet()
                .stream()
                .sorted(Map.Entry.comparingByKey())
                .collect(Collectors.toMap(
                        Map.Entry::getKey,
                        Map.Entry::getValue,
                        (oldValue, newValue) -> oldValue, LinkedHashMap::new));

        // 组装成待签名字符串。(注，引用了guava工具)
        String paramStr = Joiner.on("&").withKeyValueSeparator("=").join(sortedParamMap.entrySet());
        String signStr = paramStr + APP_SECRET;

        // 生成签名返回。(注，引用了commons-codec工具)
        return DigestUtils.md5Hex(signStr);
    }

    public static String checkSign(String dsata) {
        String signStr = dsata + APP_SECRET;
        log.info("验签组合参数：{}",signStr);
        String sign = DigestUtils.md5Hex(signStr);
        return sign;
    }
}

