Gateway authentication signature example
Dependencies required for Java signature (it is recommended to choose version 1.2.79).
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.79</version>
</dependency>
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.SerializerFeature;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.HashMap;
import java.util.Map;
public class UptickUtils {
/**
* Perform signature processing on request parameters.
*
* @param path ;
* @param query Query params,For example:"key1=value1&key2=value2",It needs to be converted to Map format.
* @param body Body params,For example:"{\"count\": 1, \"address\": \"random_string\"}",It needs to be converted to Map format.
* @param timestamp For example:1647751123703
* @param apiSecret API Secret,For example:"gV2dou/EfI45TiHhzUcQ1QClRQ2hsH+pu3gU3m8DYOg="
* @return Result
*/
public static String signRequest(String path, Map<String, Object> query, Map<String, Object> body, long timestamp, String apiSecret) {
Map<String, Object> paramsMap = new HashMap();
paramsMap.put("path_url", path);
if (query != null && !query.isEmpty()) {
query.forEach((key, value) -> paramsMap.put("query_" + key, String.valueOf(value)));
}
if (body != null && !body.isEmpty()) {
body.forEach((key, value) -> paramsMap.put("body_" + key, value));
}
// Serialize the request parameters into a sorted JSON string.
String jsonStr = JSON.toJSONString(paramsMap, SerializerFeature.MapSortField);
// Signature
String signature = sha256Sum(jsonStr + String.valueOf(timestamp) + apiSecret);
return signature;
}
/**
* SHA256
*
* @param str
* @return
*/
private static String sha256Sum(String str) {
MessageDigest digest = null;
try {
digest = MessageDigest.getInstance("SHA-256");
} catch (NoSuchAlgorithmException e) {
// Should not happen
e.printStackTrace();
}
byte[] encodedHash = digest.digest(str.getBytes(StandardCharsets.UTF_8));
return bytesToHex(encodedHash);
}
/**
* bytes to Hex
*
* @param hash
* @return
*/
private static String bytesToHex(byte[] hash) {
StringBuilder hexString = new StringBuilder(2 * hash.length);
for (int i = 0; i < hash.length; i++) {
String hex = Integer.toHexString(0xff & hash[i]);
if (hex.length() == 1) {
hexString.append('0');
}
hexString.append(hex);
}
return hexString.toString();
}
}