按照获取全部app列表为例
直接上代码
import cn.hutool.http.HttpRequest; import cn.hutool.http.HttpResponse; import javax.crypto.Mac; import javax.crypto.spec.SecretKeySpec; import java.net.URI; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; import java.util.Arrays; import java.util.Formatter; import java.util.List; import java.util.stream.Collectors; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; /** * 友盟三方对接测试 * * @author Administrator * @date 2024/8/28 */ @RestController @RequestMapping("/test/umeng") public class testUmengController { //以获取全部app为例 //踩坑点1:接口那边给的api地址不是完整的地址api地址写的是com.umeng.uapp:umeng.uapp.getAppList-1 //踩坑点2:签名必须把?后面所有拼接的参数按照首字母排序进行加密 private static final String API_URL = "https://gateway.open.umeng.com/openapi/param2/1/" + "com.umeng.uapp/umeng.uapp.getAppList/6262200?startDate=2024-01-15&endDate=2024-08-30&page=2&perPage=100"; private static final String APP_KEY = ""; // 替换为你的实际 appkey private static final String APP_SECRET = ""; // 替换为你的实际 app secret public static void main(String[] args) { try { URI uri = new URI(API_URL); String path = uri.getPath(); String query = uri.getQuery(); // 获取当前时间戳 long timestamp = System.currentTimeMillis() / 1000; String param = getParam1(path); String param2 = getParam2(query); // 生成签名 String sign = generateSign(param, param2, APP_SECRET); System.out.println(sign); // 构建请求 URL String url = API_URL + "&_aop_signature=" + sign; // 发送 GET 请求 HttpResponse response = HttpRequest.post(url) .header("Content-Type", "application/json") .execute(); // 打印响应 System.out.println("Response Code: " + response.isOk()); System.out.println("Response Code: " + response.getStatus()); System.out.println("Response Body: " + response.body()); } catch (Exception e) { e.printStackTrace(); } } /** * 截取url参数信息进行按照字母排序 * @param query * @return */ private static String getParam2(String query) { List<String> sortedParams = Arrays.stream(query.split("&")) .map(param -> param.split("=")) .sorted((p1, p2) -> p1[0].compareTo(p2[0])) .map(p -> p[0] + p[1]) .collect(Collectors.toList()); // Print sorted parameters sortedParams.forEach(System.out::println); StringBuilder result = new StringBuilder(); for (String param : sortedParams) { result.append(param); } return result.toString(); } /** * 截取url * @param path * @return */ private static String getParam1(String path) { String[] pathParts = path.split("/"); StringBuilder targetPart = new StringBuilder(); for (int i = 2; i <= pathParts.length - 1; i++) { if (i > 2) { targetPart.append("/"); } targetPart.append(pathParts[i]); } return targetPart.toString(); } /** * 生成签名 * @param param * @param param2 * @param appSecret * @return * @throws NoSuchAlgorithmException * @throws InvalidKeyException */ private static String generateSign(String param, String param2, String appSecret) throws NoSuchAlgorithmException, InvalidKeyException { // 通常签名是用 appSecret 和其他参数通过某种加密算法生成的,这里用 HMAC-SHA1 作为示例 String data = param + param2; String sign = ""; //先进行hmac_sha1加密 Mac mac = Mac.getInstance("HmacSHA1"); SecretKeySpec secretKey = new SecretKeySpec(appSecret.getBytes(), "HmacSHA1"); mac.init(secretKey); // 计算 HMAC-SHA1 哈希值 byte[] rawHmac = mac.doFinal(data.getBytes()); //转为十六进制并转为大写字符 sign = bytesToHex(rawHmac).toUpperCase(); return sign; } /** * 处理特殊符号 * @param bytes * @return */ private static String bytesToHex(byte[] bytes) { try (Formatter formatter = new Formatter()) { for (byte b : bytes) { formatter.format("%02x", b); } return formatter.toString(); } } }