当前位置: API文档

Java语言示例:




/**

 * 慧经营签名工具类

 */

@Slf4j

public class HjySignUtil {



    private static String slipt = ":";

    private static String link = "&";


    /**

     * 校验sign param生成sign与remoteSign进行比较

     *

     * @param params     需要校验的数据

     * @param appKey     安全key

     * @param remoteSign 校验的sign

     * @return

     */


    public static boolean checkSign(Map<String, Object> params, String appKey, String remoteSign) {

        try {

            params.remove("sign");

            params.remove("hjySign");

            String localSign = sign(params, appKey);

            log.info("根据远程调用的请求参数生成的签名:{}", localSign);

            if (localSign.equals(remoteSign)) {

                return true;

            }

        } catch (IOException e) {

            e.printStackTrace();

        }

        return false;

    }


    /**

     * 获取签名-慧经营开发平台

     *

     * @param params

     * @param appKey

     * @return

     * @throws IOException

     */

    public static String sign(Map<String, Object> params, String appKey) throws IOException {

        StringBuilder sb = new StringBuilder(getParamStrFromMap(params));

        sb.append(appKey);

        String sbStr = sb.toString().replace("\"", "");

        sbStr = sbStr.replace(" ", "");

        String md5 = md5Hex(sbStr);

        log.info("带验签的参数 sbT:{}", sbStr);

        return md5.toLowerCase();

    }


    public static String md5Hex(String message) {

        try {

            MessageDigest md = MessageDigest.getInstance("MD5");

            return hex(md.digest(message.getBytes("UTF-8")));

        } catch (NoSuchAlgorithmException var2) {

        } catch (UnsupportedEncodingException var3) {

        }

        return null;

    }


    public static String hex(byte[] array) {

        StringBuffer sb = new StringBuffer();


        for (int i = 0; i < array.length; ++i) {

            sb.append(Integer.toHexString(array[i] & 255 | 256).substring(1, 3));

        }


        return sb.toString();

    }


    private static String getParamStrFromMap(Map<String, Object> params) {

        StringBuilder sb = new StringBuilder();

        if (params != null && !params.isEmpty()) {

            String[] keys = params.keySet().toArray(new String[0]);

            Arrays.sort(keys);

            for (int i = 0; i < keys.length; ++i) {

                String name = keys[i];

                sb.append(name);

                sb.append(slipt);

                sb.append(params.get(name));

                sb.append(link);

            }

        }

        String substring = sb.substring(0, sb.length() - 1);

        return substring;

    }

//测试验证签名

    public static void main(String[] args) throws IOException {

        Map<String, Object> map = new HashMap<>();

        map.put("businessDate", "2023-11-02");

        map.put("voucherNo", "SalVchRv289697553763745510");

        map.put("shopNo", "0100001180");

        map.put("warehouseNo", "BC");

        map.put("appId", "fa330697b64a49a9a4f6fe6b7fef57a7");

        map.put("sid", "hjytest41");

        String sign = sign(map, "869eae0c3c39e13dc8bb6d78d910fc1a64cb7ac6");

        System.out.println(sign);


        boolean flag = checkSign(map, "869eae0c3c39e13dc8bb6d78d910fc1a64cb7ac6", sign);

        if (!flag) {

            System.out.println("shibai");

        } else {

            System.out.println("chenggong");

        }

    }

}

Python语言示例:




import hashlib

import logging

from collections import OrderedDict


# 配置日志

logging.basicConfig(level=logging.INFO)

logger = logging.getLogger(__name__)


# 定义常量

SPLIT = ":"

LINK = "&"


def check_sign(params: dict, app_key: str, remote_sign: str) -> bool:

    """

    校验签名是否一致

    :param params: 请求参数

    :param app_key: 应用密钥

    :param remote_sign: 远程签名

    :return: 是否一致

    """

    params.pop("sign", None)

    params.pop("hjySign", None)


    try:

        local_sign = sign(params, app_key)

        logger.info(f"根据远程调用的请求参数生成的签名:{local_sign}")

        return local_sign == remote_sign

    except Exception as e:

        logger.error(f"签名校验异常:{e}")

        return False



def sign(params: dict, app_key: str) -> str:

    """

    生成签名

    :param params: 参数字典

    :param app_key: 应用密钥

    :return: MD5 签名

    """

    param_str = get_param_str_from_map(params)

    param_str += app_key

    param_str = param_str.replace('"', "").replace(" ", "")

    logger.info(f"带验签的参数:{param_str}")

    return md5_hex(param_str).lower()



def md5_hex(message: str) -> str:

    """

    计算字符串的 MD5 值

    :param message: 输入字符串

    :return: MD5 字符串

    """

    md = hashlib.md5()

    md.update(message.encode("utf-8"))

    return md.hexdigest()



def get_param_str_from_map(params: dict) -> str:

    """

    将参数字典转换为签名字符串

    :param params: 参数字典

    :return: 签名字符串

    """

    if not params:

        return ""


    # 按 key 排序

    sorted_params = OrderedDict(sorted(params.items()))

    result = ""

    for key, value in sorted_params.items():

        result += f"{key}{SPLIT}{value}{LINK}"

    return result[:-1]  # 去掉最后一个 &



if __name__ == "__main__":

    test_params = {

        "businessDate": "2023-11-02",

        "voucherNo": "SalVchRv289697553763745510",

        "shopNo": "0100001180",

        "warehouseNo": "BC",

        "appId": "fa330697b64a49a9a4f6fe6b7fef57a7",

        "sid": "hjytest41",

    }

    app_key = "869eae0c3c39e13dc8bb6d78d910fc1a64cb7ac6"

    signature = sign(test_params, app_key)

    print(f"生成的签名:{signature}")


    is_valid = check_sign(test_params, app_key, signature)

    print("验证结果:chenggong" if is_valid else "shibai")

C#语言示例:



 private static string getParamStrFromMap(Dictionary<string, object> paramsDict)

    {

        var sb = new System.Text.StringBuilder();

        if (paramsDict != null && paramsDict.Count > 0)

        {

            var keys = paramsDict.Keys.ToArray();

            Array.Sort(keys);

            foreach (var name in keys)

            {

                sb.Append(name);

                sb.Append(slipt); // 注意: 这里的 slipt 和 link 变量需要定义

                sb.Append(paramsDict[name]);

                sb.Append(link);

            }

        }

        string result = sb.ToString(0, sb.Length - 1);

        return result;

    }

    

     public static string Hex(byte[] array)

    {

        var sb = new StringBuilder();


        for (int i = 0; i < array.Length; ++i)

        {

            sb.Append(((array[i] & 255) | 256).ToString("X2").Substring(1, 2));

        }


        return sb.ToString();

    }


 public static string Md5Hex(string message)

    {

        try

        {

            using (MD5 md5 = MD5.Create())

            {

                byte[] inputBytes = Encoding.UTF8.GetBytes(message);

                byte[] hashBytes = md5.ComputeHash(inputBytes);

                return Hex(hashBytes);

            }

        }

        catch (CryptographicException)

        {

            // 处理加密算法异常

        }

        catch (EncoderFallbackException)

        {

            // 处理编码异常

        }

        return null;

    }

    

     public static string Sign(Dictionary<string, object> paramsDict, string appKey)

    {

        try

        {

            StringBuilder sb = new StringBuilder(getParamStrFromMap(paramsDict));

            sb.Append(appKey);

            string sbStr = sb.ToString().Replace("\"", "").Replace(" ", "");

            string md5 = Md5Hex(sbStr);

            Logger.LogInformation("带验签的参数 sbT:{0}", sbStr);

            return md5.ToLower();

        }

        catch (IOException ex)

        {

            Logger.LogError(ex, "发生 IO 异常");

            throw;

        }

    }


常用工具