0.1 签名方法
签名方式
appId和appSecret由平台提供,appId用于标识访问者的身份;appSecret是用于加密签名字符串和服务器端验证签名字符串的密钥,不传输,必须严格保密。
在请求接口前,按照下面的方法对请求进行签名处理:
1. 按照参数名称的字典顺序对请求中所有的请求参数(包括URL?后面的部分以及body部分,但不能包括appId、appSecret、timestamp)进行排序。
2. 计算signStr = appId+timestamp+appSecret+body中的所有key-value(中间不需要符号),例如:
appId : tDc6zHpf(找技术支持提供)
appSecret : 1d85aa21e9d08d2ff4145f49d73aa77d3bd981db(找技术支持提供)
timestamp : 1622806861000
url:{{host}}/monthCard/info?appId=×tamp=&carNumber=藏ZAA001&parkId=1376868353461542914
signStr = appIdtDc6zHpftimestamp1622806861000appSecret1d85aa21e9d08d2ff4145f49d73aa77d3bd981dbcarNumber藏ZAA001parkId1376868353461542914
其中:appIdtDc6zHpftimestamp1622806861000appSecret1d85aa21e9d08d2ff4145f49d73aa77d3bd981db是固定位置,其他参数才参与排序后拼接
3. 将signStr进行md5后获得sign值,再转成大写得到9264C99ED4A947F25FF2C9127CF06332,将sign=9264C99ED4A947F25FF2C9127CF06332拼接再url后面,最终请求的url是
GET请求:{{host}}/monthCard/info?appId=×tamp=&carNumber=藏ZAA001&parkId=1376868353461542914&sign=9264C99ED4A947F25FF2C9127CF06332
POST请求:{{host}}/monthCard/info?appId=×tamp=&sign=A67ED3CEF877C5A790DBA41F8B0D0B87
body参数
{
"carNumber":"藏ZAA001",
"parkId":"1376868353461542914"
}
加密算法参考《hutool》
java示例
/**
* @param params 根据key排序后的参数集合
* @param timestamp 时间戳
* @param appId
* @param appSecret
* @return 签名结果
*/
public static String getParamsSign(SortedMap<String, String> params, String timestamp, String appId, String appSecret) {
Set<Map.Entry<String, String>> entries = params.entrySet();
Iterator<Map.Entry<String, String>> iterator = entries.iterator();
StringBuilder valueStr = new StringBuilder();
valueStr.append("appId");
valueStr.append(appId);
valueStr.append("timestamp");
valueStr.append(timestamp);
valueStr.append("appSecret");
valueStr.append(appSecret);
while (iterator.hasNext()) {
Map.Entry<String, String> entry = iterator.next();
// 签名结果字段不处理
if (StrUtil.equalsAnyIgnoreCase(entry.getKey(), new String[]{"sign", "appId", "timestamp"})) {
continue;
}
String value = StrUtil.trimToEmpty(entry.getValue());
if (value == null) {
value = "";
}
if (StrUtil.isNotEmpty(value)) {
valueStr.append(entry.getKey());
valueStr.append(value);
}
}
String md5Result = SecureUtil.md5(valueStr.toString()).toUpperCase();
log.info("MD5结果数据={}, 待MD5源数据={},待加密对象={}", md5Result, valueStr, JSON.toJSONString(params));
return md5Result;
}
修改于 2024-08-19 03:12:28