Temu OpenAPI签名算法实现 - JAVA

Temu OpenAPI签名算法描述

  • 为了防止API调用过程中被恶意篡改,调用任何一个API都需要携带请求签名,开放平台服务端会根据请求参数,对签名进行验证,并对签名不合法的请求将会被拒绝

  • 目前支持的签名算法为:MD5 (sign_method=md5),签名过程如下:

    • 本次请求中所有请求参数(包含公共参数与业务参数)进行首字母以ASCII方式升序排列ascii asc ,对于相同字母则使用下个字母做二次排序,字母序为从左到右,以此类推
    • 排序后的结果按照参数名value 的次序进行字符串拼接,拼接处不包含任何字符
    • 拼接完成的字符串做进一步拼接成1个字符串(包含所有kv字符串的长串),并在该长串的头部及尾部分别拼接app_secret ,完成签名字符串的组装
    • 最后对签名字符串,使用MD5 算法加密后,得到的MD5 加密密文后转为大写,即为sign 值

算法实现

调用generateSign方法即可返回符合要求的sign值。有优化建议的可以在评论区一起讨论。

    /**
     * 生成签名的方法
     *
     * @param paramMap  请求参数的键值对
     * @param appSecret 应用的密钥
     * @return 生成的签名字符串
     */
    public static String generateSign(Map<String, Object> paramMap, String appSecret) {
        // Step 1: 按照键的ASCII码顺序对参数进行排序
        List<String> keys = new ArrayList<>(paramMap.keySet());
        Collections.sort(keys);

        // Step 2: 按照"key + value"的顺序将所有参数拼接成一个字符串
        StringBuilder stringBuilder = new StringBuilder();
        for (String key : keys) {
            Object value = paramMap.get(key);
            if (value != null) {
                String jsonValue = null;
                if (value instanceof String) {
                    jsonValue = (String) value;
                } else {
                    jsonValue = JSONObject.toJSONString(value);
                }
                stringBuilder.append(key).append(jsonValue);
            }
        }

        // Step 3: 在拼接好的字符串前后分别添加appSecret
        String signString = appSecret + stringBuilder.toString() + appSecret;
        // Step 4: 使用MD5算法对字符串进行加密,并将结果转换为大写
        return md5(signString).toUpperCase();
    }

    /**
     * 对字符串进行MD5加密
     *
     * @param input 输入的字符串
     * @return MD5加密后的字符串
     */
    private static String md5(String input) {
        try {
            MessageDigest md = MessageDigest.getInstance("MD5");
            byte[] digest = md.digest(input.getBytes("UTF-8"));
            StringBuilder hexString = new StringBuilder();
            for (byte b : digest) {
                String hex = Integer.toHexString(0xFF & b);
                if (hex.length() == 1) {
                    hexString.append('0'); // 补零确保两位十六进制
                }
                hexString.append(hex);
            }
            return hexString.toString();
        } catch (Exception e) {
            throw new RuntimeException("生成MD5哈希失败", e);
        }
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值