高德加签测试

This commit is contained in:
dengwc 2024-04-16 16:59:13 +08:00
parent 6748fe647e
commit d2619520eb
11 changed files with 232 additions and 10 deletions

View File

@ -5,4 +5,7 @@ public class AmapConstant {
public static final String USER_UPDATE_PATH = "/ws/boss/enterprise/openapi/employee/query"; public static final String USER_UPDATE_PATH = "/ws/boss/enterprise/openapi/employee/query";
public static final String USER_QUERY_PATH = "/ws/boss/enterprise/openapi/employee/update"; public static final String USER_QUERY_PATH = "/ws/boss/enterprise/openapi/employee/update";
public static final String USER_DELETE_PATH = "/ws/boss/enterprise/openapi/employee/delete"; public static final String USER_DELETE_PATH = "/ws/boss/enterprise/openapi/employee/delete";
//token地址
public static final String TOKEN_URL = "/ws/car/open/enterprise/auth/get_token";
} }

View File

@ -1,10 +1,16 @@
package com.chint.infrastructure.util; package com.chint.infrastructure.util;
import com.google.common.base.Charsets; import com.google.common.base.Charsets;
import com.google.common.collect.ImmutableList;
import com.google.common.hash.Hashing; import com.google.common.hash.Hashing;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.lang3.ArrayUtils;
import javax.crypto.Cipher;
import javax.crypto.Mac; import javax.crypto.Mac;
import javax.crypto.SecretKey; import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec; import javax.crypto.spec.SecretKeySpec;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.lang.reflect.Method; import java.lang.reflect.Method;
@ -14,8 +20,9 @@ import java.nio.charset.StandardCharsets;
import java.security.InvalidKeyException; import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException; import java.security.NoSuchAlgorithmException;
import java.util.*; import java.util.*;
import java.util.stream.Collectors;
import java.util.Map.Entry;
@Slf4j
public class SignUtils { public class SignUtils {
@ -96,7 +103,36 @@ public class SignUtils {
} }
String res = joiner + "@" + signKey; String res = joiner + "@" + signKey;
return Hashing.md5().hashString(res, Charsets.UTF_8).toString().toUpperCase(); log.info("参数拼接后的原始签名串:{}", res);
String sign = Hashing.md5().hashString(res, Charsets.UTF_8).toString().toUpperCase();
log.info("参数签名串:{}", sign);
return sign;
}
//不加签的参数名
private final static List<String> UN_SIGN_KEYS = ImmutableList.of("keyt", "ent", "sign");
/**
* 1过滤不加签参数
* 2对参数的key值按ASCII码自然排序
* 3参数按照 key=value&拼接
* 4最后拼接 @signKey
* 5对拼接后的字符串做MD5得到sign值
*
* @param paramsMap
* @return
*/
public static String calculateSign(Map<String, String> paramsMap,String signKey) {
String originParamStr = paramsMap.entrySet().stream()
.filter(entry -> !UN_SIGN_KEYS.contains(entry.getKey()))
.sorted(Comparator.comparing(Entry::getKey))
.map(entry -> entry.getKey() + "=" + entry.getValue())
.collect(Collectors.joining("&"));
originParamStr = originParamStr + "@" + signKey;
log.info("参数拼接后的原始签名串:{}", originParamStr);
String sign = String.valueOf(Hashing.md5().hashString(originParamStr, Charsets.UTF_8)).toUpperCase();
log.info("参数签名串:{}", sign);
return sign;
} }
} }

View File

@ -24,7 +24,7 @@ public class AmapUserRequest {
private UserHttpRequest userHttpRequest; private UserHttpRequest userHttpRequest;
@Value("${amap.eId}") @Value("${amap.eId}")
private Integer eId; private String eId;
@Value("${amap.baseUrl}") @Value("${amap.baseUrl}")
private String BaseUrl; private String BaseUrl;

View File

@ -8,7 +8,7 @@ public class BaseRequestParam {
// 应用ID根据业务场景填写 // 应用ID根据业务场景填写
private String appId; private String appId;
// 设备ID某些业务场景下需要 // 设备ID某些业务场景下需要
private Integer eid; private String eid;
// 企业编号根据企业分配 // 企业编号根据企业分配
private Integer ent; private Integer ent;
// 请求签名保障请求安全 // 请求签名保障请求安全

View File

@ -4,12 +4,10 @@ import lombok.Data;
@Data @Data
public class BaseResponse { public class BaseResponse {
// 响应代码0表示成功其他值表示错误 // 响应代码1表示成功非1表示失败
private Integer code; private Integer code;
// 响应消息"Success"错误信息 // 响应消息code=1时为"Successful"code!=1时为错误信息
private String message; private String message;
// 返回的数据对象具体内容根据业务定义
private Object data;
// 响应时间戳标记响应生成时间 // 响应时间戳标记响应生成时间
private long timestamp; private long timestamp;
// 跟踪ID用于日志跟踪等 // 跟踪ID用于日志跟踪等

View File

@ -0,0 +1,81 @@
package com.chint.interfaces.rest.amap.request;
import com.chint.infrastructure.util.SignUtils;
import com.chint.interfaces.rest.amap.BaseRequestParam;
import com.chint.interfaces.rest.amap.BaseResponse;
import com.chint.interfaces.rest.base.PostRequest;
import com.google.common.base.Charsets;
import com.google.gson.Gson;
import lombok.extern.slf4j.Slf4j;
import org.apache.http.HttpEntity;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import static com.chint.infrastructure.constant.AmapConstant.USER_CREATE_PATH;
@Slf4j
@Component
public class AmapRequest {
//应用ID
@Value("${amap.appId}")
private String appId;
//企业id
@Value("${amap.eId}")
private String eid;
//密钥key
@Value("${amap.keyt}")
private String keyt;
@Value("${amap.signKey}")
private String signKey;
@Autowired
private PostRequest request;
public <V> V get(String url, Map<String, String> params, Class<V> responseType) {
params.put("appId", appId);
params.put("keyt", keyt);
params.put("eid", eid);
params.put("ent", "4");
//构造签名
String sign = SignUtils.calculateSign(params, signKey);
//将sign值添加到请求参数中
params.put("sign", sign);
//发送get请求
return request.getSend(url, params, responseType);
}
public <V> V post(String url, BaseRequestParam baseRequestParam, Class<V> responseType) {
baseRequestParam.setAppId(appId);
baseRequestParam.setEid(eid);
baseRequestParam.setEnt(4);
baseRequestParam.setTimestamp(String.valueOf(System.currentTimeMillis()));
//将sign值添加到请求参数中
baseRequestParam.generateSign(signKey);
return request.post(url, baseRequestParam, responseType);
}
}

View File

@ -0,0 +1,31 @@
package com.chint.interfaces.rest.amap.request;
import com.chint.interfaces.rest.amap.token.TokenDto;
import com.chint.interfaces.rest.amap.token.TokenResponse;
import com.google.gson.Gson;
import lombok.Data;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import static com.chint.infrastructure.constant.AmapConstant.TOKEN_URL;
@Data
@Component
public class TokenRequest {
@Value("${amap.baseUrl}")
private String baseUrl;
@Autowired
private AmapRequest gaoDeRequest;
public TokenResponse getToken(TokenDto.UserInfo userInfo) {
TokenDto tokenDto = new TokenDto();
Gson gson = new Gson();
String json = gson.toJson(userInfo);
tokenDto.setUserInfo(json);
return gaoDeRequest.post(baseUrl + TOKEN_URL, tokenDto, TokenResponse.class);
}
}

View File

@ -0,0 +1,15 @@
package com.chint.interfaces.rest.amap.token;
import com.chint.interfaces.rest.amap.BaseRequestParam;
import lombok.Data;
@Data
public class TokenDto extends BaseRequestParam {
private String userInfo;
@Data
public static class UserInfo {
private String userId;//企业用户ID
private String mobile;//企业用户手机号
private int[] rideTypes;//运力类型
}
}

View File

@ -0,0 +1,19 @@
package com.chint.interfaces.rest.amap.token;
import com.chint.interfaces.rest.amap.BaseResponse;
import lombok.Data;
@Data
public class TokenResponse extends BaseResponse {
private Boolean result;
private Data data;
private String version;
@lombok.Data
public static class Data {
private String token;//token
private String expiretime;//过期时间
}
}

View File

@ -1,6 +1,7 @@
package com.chint.interfaces.rest.base; package com.chint.interfaces.rest.base;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.google.common.base.Charsets;
import com.google.gson.Gson; import com.google.gson.Gson;
import lombok.Data; import lombok.Data;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@ -9,6 +10,7 @@ import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse; import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient; import org.apache.http.client.HttpClient;
import org.apache.http.client.config.RequestConfig; import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost; import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpUriRequest; import org.apache.http.client.methods.HttpUriRequest;
@ -20,6 +22,7 @@ import org.apache.http.util.EntityUtils;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.io.IOException; import java.io.IOException;
import java.net.URLEncoder;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
@ -103,6 +106,24 @@ public class PostRequest {
} }
public <T> T getSend(String url, Map<String, String> paramsMap, Class<T> responseType) {
String responseBody;
try {
StringBuilder getUrl = new StringBuilder(url + "?");
for (Map.Entry<String, String> param : paramsMap.entrySet()) {
if (param.getValue() != null && !param.getValue().trim().isEmpty()) {
getUrl.append(param.getKey()).append("=").append(URLEncoder.encode(param.getValue(), Charsets.UTF_8)).append("&");
}
}
log.info("HttpClientUtil getUrl is {}", getUrl);
HttpUriRequest request = new HttpGet(getUrl.toString());
responseBody = EntityUtils.toString(client.execute(request).getEntity(), "UTF-8");
return gson.fromJson(responseBody, responseType);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public <T> T postANBPM(String url, Object jsonRequest, Class<T> responseType) { public <T> T postANBPM(String url, Object jsonRequest, Class<T> responseType) {
HttpPost post = new HttpPost(url); HttpPost post = new HttpPost(url);
String json = JSON.toJSONString(jsonRequest); String json = JSON.toJSONString(jsonRequest);

View File

@ -3,6 +3,9 @@ package com.chint;
import com.chint.domain.aggregates.user.User; import com.chint.domain.aggregates.user.User;
import com.chint.interfaces.rest.amap.AmapUserRequest; import com.chint.interfaces.rest.amap.AmapUserRequest;
import com.chint.interfaces.rest.amap.BaseResponse; import com.chint.interfaces.rest.amap.BaseResponse;
import com.chint.interfaces.rest.amap.token.TokenDto;
import com.chint.interfaces.rest.amap.token.TokenResponse;
import com.chint.interfaces.rest.amap.request.TokenRequest;
import com.google.gson.Gson; import com.google.gson.Gson;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@ -18,9 +21,24 @@ public class AmapTest {
private User user = new User(1L, "230615020", 1, "卢麟哲", "1033719135@qq.com", "15857193365", "A30000001"); private User user = new User(1L, "230615020", 1, "卢麟哲", "1033719135@qq.com", "15857193365", "A30000001");
@Test // @Test
public void createUser(){ public void createUser(){
BaseResponse baseResponse = amapUserRequest.createUser(user); BaseResponse baseResponse = amapUserRequest.createUser(user);
System.out.println(gson.toJson(baseResponse)); System.out.println(gson.toJson(baseResponse));
} }
@Autowired
private TokenRequest tokenRequest;
// @Test
public void gaoDe() {
TokenDto.UserInfo userInfo = new TokenDto.UserInfo();
userInfo.setUserId("230615020");
userInfo.setMobile("15857193365");
userInfo.setRideTypes(new int[]{1, 2});
TokenResponse response = tokenRequest.getToken(userInfo);
String token = response.getData().getToken();
System.out.println("token = " + token);
}
} }