首页 > 基础资料 博客日记

【Java学习】Java对外接口签名(Signature)签名算法实现,开放平台api接口签名怎么写,sign签名怎么实现,第三方接口签名校验设计

2025-01-03 07:00:08基础资料围观356

本篇文章分享【Java学习】Java对外接口签名(Signature)签名算法实现,开放平台api接口签名怎么写,sign签名怎么实现,第三方接口签名校验设计,对你有帮助的话记得收藏一下,看Java资料网收获更多编程知识

Java对外接口签名(Signature)签名算法实现,开放平台api接口签名怎么写,sign签名怎么实现,第三方接口签名校验设计

签名生成规则:
1、将请求参数中除secret外的参数按参数名的字母顺序升序排列(相同情况向后顺位)
2、将参数以及参数值按序拼接成字符串
3、前后拼接secret的参数值(注意:只是参数)
4、加密字符串生成签名(使用MD5加密,生成32位大写的签名)

演示参数:

参数
appidd39d19fbb616c3eeab5f8b3aad60172c
secret6d5ca7e5cff60eecf9b71c761fb9f1da
startTime2024-10-10 09:00:00
endTime2024-10-11 18:00:00
pageNum1
pageSize10

一、将参数放入map中

    // 修改APP_ID,APP_SECRET为自己的参数值
    public static final String APP_ID =  "d39d19fbb616c3eeab5f8b3aad60172c";
    public static final String APP_SECRET =  "6d5ca7e5cff60eecf9b71c761fb9f1da";
    public static void main(String[] args) throws Exception {
		//参考上面提供的参数 (根据自己的实际调用参数)
		Map<String, String> params = new HashMap<>();
        params.put("appid", APP_ID);
        params.put("start", "2024-10-10 09:00:00");
        params.put("end", "2024-10-11 18:00:00");
        params.put("pageNo", "1");
        params.put("pageSize", "10");
	}

二、拼接加密前的字符串

		// 拼接加密前的字符串
        List<String> keys = new ArrayList<>(params.keySet());
        //如下:
        拼接加密前的字符串:[pageNo, appid, start, pageSize, end]

三、将请求参数按升序排列

		// 请求参数按升序排列
        Collections.sort(keys);
        log.info("请求参数按升序排列:"+keys);
        //如下:
        请求参数按升序排列:[appid, end, pageNo, pageSize, start]

四、字符串前后拼接secret参数

		// 字符串前后拼接secret参数  
		//(!!!注意 这里是 前后拼接 secret的参数 不是字段名和参数)
		// 注意二 字段与字段之间没有&符
         StringBuilder sb = new StringBuilder(APP_SECRET);
        for (String key : keys) {
            sb.append(key).append(params.get(key));
        }
        sb.append(APP_SECRET);
        log.info("字符串前后拼接secret参数:"+sb.toString());
        //如下:字符串前后拼接secret参数:
        6d5ca7e5cff60eecf9b71c761fb9f1daappidd39d19fbb616c3eeab5f8b3aad60172cend2024-10-11 18:00:00pageNo1pageSize10start2024-10-10 09:00:006d5ca7e5cff60eecf9b71c761fb9f1da

2、字符串前后拼接secret参数(有&符的)

		//字符串前后拼接secret参数
		TreeMap<String, Object> sortedParams = new TreeMap<>(params);
        StringBuilder sb = new StringBuilder(APP_SECRET);
        sb.append("&");
        sortedParams.forEach((k, v) -> sb.append(k).append("=").append(v).append("&"));
        log.info("将东西串起来:"+sb);
        sb.append(APP_SECRET);
        //如果结尾不再拼接APP_SECRET 记得把最后一个 & 给切割掉。
//        if (sb.toString().endsWith("&")) {
//            sb.replace(sb.length() - 1,sb.length()) ;
//        }
        String signString = sb.toString();
        log.info("字符符串前后拼接secret参数:"+signString);
        //如下:字符串前后拼接secret参数:
        6d5ca7e5cff60eecf9b71c761fb9f1da&appid=d39d19fbb616c3eeab5f8b3aad60172c&end=2024-10-11 18:00:00&pageNo=1&pageSize=10&start=2024-10-10 09:00:00&6d5ca7e5cff60eecf9b71c761fb9f1da

五、MD5 加密

		// 字符串前后拼接secret参数  
		String sign = md5(signString).toUpperCase();
		//.toUpperCase()  转换大写
		//.toLowerCase()  转换小写
        log.info("sign:"+sign);
        //如下:字符串前后拼接secret参数:
        sign大写:177C24AAA5456216A57C0A957BA0BB5B
        sign小写:177c24aaa5456216a57c0a957ba0bb5b
        //如下:(有& )字符串前后拼接secret参数:
        sign大写:BE356A3B47D6129DC985D96262E72517
        sign小写:be356a3b47d6129dc985d96262e72517

MD5 加密工具

    private static String md5(String input) throws NoSuchAlgorithmException {
        MessageDigest md = MessageDigest.getInstance("MD5");
        byte[] digest = md.digest(input.getBytes(StandardCharsets.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();
    }

全部代码(仅供参考)

package com.example;

import lombok.extern.slf4j.Slf4j;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.*;

/**
 * @ClassName : DataEncryptor  
 * @Description : 测试
 * @Author : zlm
 * @Date: 2024/9/19 11:52
 */
@Slf4j
public class DataEncryptor  {

    // 修改APP_ID,APP_SECRET为自己的参数值
    public static final String APP_ID =  "d39d19fbb616c3eeab5f8b3aad60172c";
    public static final String APP_SECRET =  "6d5ca7e5cff60eecf9b71c761fb9f1da";

    public static void main(String[] args) throws Exception {
        Map<String, String> params = new HashMap<>();
        params.put("appid", APP_ID);
        // 修改下列接口参数为自己的实际调用参数
        params.put("start", "2024-10-10 09:00:00");
        params.put("end", "2024-10-11 18:00:00");
        params.put("pageNo", "1");
        params.put("pageSize", "10");

        // 1. 拼接加密前的字符串
        List<String> keys = new ArrayList<>(params.keySet());
        log.info("拼接加密前的字符串:"+keys);
        // 请求参数按升序排列
        Collections.sort(keys);
        log.info("请求参数按升序排列:"+keys);
        // 字符串前后拼接secret参数
        StringBuilder sb = new StringBuilder(APP_SECRET);
        for (String key : keys) {
            sb.append(key).append(params.get(key));
        }
        sb.append(APP_SECRET);
        log.info("字符串前后拼接secret参数:"+sb.toString());
        String signString = sb.toString();

        // 2. MD5 加密
        String sign = md5(signString).toUpperCase();
        log.info("sign:"+sign);

    }

    // md5加密,也可用DigestUtils工具类的md5Hex方法替代

    private static String md5(String input) throws NoSuchAlgorithmException {
        MessageDigest md = MessageDigest.getInstance("MD5");
        byte[] digest = md.digest(input.getBytes(StandardCharsets.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();
    }

}



文章来源:https://blog.csdn.net/weixin_46161568/article/details/143108502
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:jacktools123@163.com进行投诉反馈,一经查实,立即删除!

标签:

相关文章

本站推荐

标签云