public static String buildDataToSign(HttpServletRequest request, String timestamp, String nonce) {
StringBuilder sb = new StringBuilder();
// 1. HTTP方法(必须)
sb.append(request.getMethod().toUpperCase()).append("\n");
// 2. 请求路径(必须)
sb.append(request.getRequestURI()).append("\n");
// 3. 查询参数(GET请求必须)
String queryString = buildSortedQueryString(request);
if (!queryString.isEmpty()) {
sb.append(queryString).append("\n");
} else {
sb.append("\n"); // 空行保持结构
}
// 4. 请求体(POST/PUT必须)
String requestBody = ServletUtils.getPostData(request);
if (StringUtils.isNotBlank(requestBody)) {
String formatBody = formatRequestBody(requestBody);
String sha256HexStr = DigestUtils.sha256Hex(formatBody);
sb.append(sha256HexStr).append("\n");
} else {
sb.append("\n"); // 空行保持结构
}
// 5. 时间戳和随机因子(必须)
sb.append(timestamp).append("\n");
sb.append(nonce);
return sb.toString();
}
/**
* 构建排序后的查询字符串
*/
private static String buildSortedQueryString(HttpServletRequest request) {
Map<String, String> params = new TreeMap<>();
Enumeration<String> paramNames = request.getParameterNames();
while (paramNames.hasMoreElements()) {
String paramName = paramNames.nextElement();
String paramValue = request.getParameter(paramName);
params.put(paramName, paramValue);
}
if (params.isEmpty()) {
return "";
}
return params.entrySet().stream()
.map(entry -> entry.getKey() + "=" + entry.getValue())
.collect(Collectors.joining("&"));
}
/**
* 将 post json data 进行格式
*
* @param requestBody
* @return
*/
public static String formatRequestBody(String requestBody) {
Map<String, Object> data = JacksonUtils.parseObject(requestBody, new TypeReference<Map<String, Object>>() {
});
StringBuffer content = new StringBuffer();
append(content, data);
return content.toString();
}
private static void append(StringBuffer content, Map<String, Object> sourceObj) {
if (sourceObj == null) {
return;
}
Map<String, Object> obj = sourceObj;
if (obj.keySet().size() == 0) {
return;
}
List<String> keyList = new ArrayList<String>(obj.keySet().size());
for (String key : obj.keySet()) {
keyList.add(key);
}
Collections.sort(keyList);
for (String key : keyList) {
Object value = obj.get(key);
if (value instanceof List) {
for (int i = 0; i < ((List<?>) value).size(); i++) {
Object item = ((List<?>) value).get(i);
if (item instanceof Map) {
append(content, (Map<String, Object>) item);
}
}
} else if (value instanceof Map) {
append(content, (Map<String, Object>) value);
} else if (value instanceof String
|| value instanceof Float
|| value instanceof Double
|| value instanceof Integer
|| value instanceof Long
|| value instanceof BigDecimal
|| value instanceof Boolean) {
if (content.length() > 0) {
content.append("&");
}
content.append(key);
content.append("=");
content.append(value);
}
}
}