关于友盟openApi三方对接

按照获取全部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();
        }
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值