首页 > 基础资料 博客日记
【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位大写的签名)
演示参数:
参数 | 值 |
---|---|
appid | d39d19fbb616c3eeab5f8b3aad60172c |
secret | 6d5ca7e5cff60eecf9b71c761fb9f1da |
startTime | 2024-10-10 09:00:00 |
endTime | 2024-10-11 18:00:00 |
pageNum | 1 |
pageSize | 10 |
一、将参数放入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进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:jacktools123@163.com进行投诉反馈,一经查实,立即删除!
标签: