准备工作
public class TencentMapConstant {
public static final String KEY = "M2OBZ-5EXK7-CWSX2-H5S2N-WALLF-*****";
public static final String SK = "6S7I4XfPMccif1zl8pY7vWofEW*****";
public static final String HOST = "https://apis.map.qq.com";
public static final String GEOCODER_API = "/ws/geocoder/v1";
public static final String DISTANCE_API = "/ws/distance/v1/matrix";
public static final String IP_LOCATION_API = "/ws/location/v1/ip";
}
@Data
public class TencentMapResult<T> {
private Integer status;
private String message;
private String request_id;
private Integer count;
private T data;
private T result;
}
main方法
public static void main(String[] args) {
JSONObject requestData = new JSONObject();
requestData.set("mode", "driving");
requestData.set("key", TencentMapConstant.KEY);
requestData.set("from", "32.139063,118.724270");
requestData.set("to", "32.150763,118.734398;32.157158,118.696632");
String signature = TencentMapUtil.generateSignaturePost(TencentMapConstant.DISTANCE_API, requestData);
String finalRequest = TencentMapConstant.HOST + TencentMapConstant.DISTANCE_API + "?mode=driving" + "&sig=" + signature;
System.out.println(finalRequest);
RestTemplate restTemplate = new RestTemplate();
System.out.println(restTemplate.postForObject(finalRequest, requestData, TencentMapResult.class));
}
TencentMapUtil 签名生成工具类
@Slf4j
public class TencentMapUtil {
public static String generateSignatureGet(String path, Map<String, String> params) {
try {
TreeMap<String, String> sortedParams = new TreeMap<>(params);
StringBuilder rawSignatureBuilder = new StringBuilder();
rawSignatureBuilder.append(path).append("?");
int entryIndex = 0;
for (Map.Entry<String, String> entry : sortedParams.entrySet()) {
rawSignatureBuilder.append(entry.getKey()).append("=").append(entry.getValue());
if (entryIndex < sortedParams.size() - 1) {
rawSignatureBuilder.append("&");
}
entryIndex++;
}
rawSignatureBuilder.append(TencentMapConstant.SK);
String rawSignature = rawSignatureBuilder.toString();
byte[] signatureBytes = MessageDigest.getInstance("MD5").digest(rawSignature.getBytes("UTF-8"));
String signature = byteArrayToHexString(signatureBytes);
return URLEncoder.encode(signature, "UTF-8");
} catch (NoSuchAlgorithmException | UnsupportedEncodingException e) {
log.error("签名计算失败: {}", e.getMessage(), e);
return null;
}
}
private static String byteArrayToHexString(byte[] bytes) {
StringBuilder hexString = new StringBuilder();
for (byte b : bytes) {
hexString.append(String.format("%02x", b));
}
return hexString.toString();
}
public static String encodeParams(Map<String, String> params) {
TreeMap<String, String> sortedParams = new TreeMap<>(params);
StringBuilder rawSignatureBuilder = new StringBuilder();
for (Map.Entry<String, String> entry : sortedParams.entrySet()) {
rawSignatureBuilder.append(entry.getKey()).append("=").append(entry.getValue()).append("&");
}
return rawSignatureBuilder.toString();
}
public static String generateSignaturePost(String path, JSONObject jsonObject) {
Set<String> propertyNames = jsonObject.keySet();
List<String> sortedPropertyNames = new ArrayList<>(propertyNames);
Collections.sort(sortedPropertyNames);
JSONObject sortedJsonObject = new JSONObject();
for (String propertyName : sortedPropertyNames) {
sortedJsonObject.put(propertyName, JSONUtil.toJsonStr(jsonObject.get(propertyName)));
}
jsonObject.clear();
jsonObject.putAll(sortedJsonObject);
StringBuilder rawSignatureBuilder = new StringBuilder();
for (Map.Entry<String, Object> entry : jsonObject.entrySet()) {
String propertyName = entry.getKey();
String propertyValue = (String) entry.getValue();
rawSignatureBuilder.append(propertyName)
.append("=")
.append(propertyValue)
.append("&");
}
if (rawSignatureBuilder.length() > 0) {
rawSignatureBuilder.deleteCharAt(rawSignatureBuilder.length() - 1);
}
rawSignatureBuilder.insert(0, path + "?").append(TencentMapConstant.SK);
String rawSignature = rawSignatureBuilder.toString();
try {
byte[] signatureBytes = MessageDigest.getInstance("MD5").digest(rawSignature.getBytes("UTF-8"));
String signature = byteArrayToHexString(signatureBytes);
return URLEncoder.encode(signature, "UTF-8");
} catch (NoSuchAlgorithmException | UnsupportedEncodingException e) {
log.error("签名计算失败: {}", e.getMessage(), e);
}
return null;
}
}
附: 签名校验生成规则