签名生成

约 775 字大约 3 分钟

调用引力 openapi 接口时,部分接口需要Authorizationsign 字段,本文主要给出示例,我们提供了以下 JavaGolangPython 版本的实例,请参照示例生成签名。

主要分为两个方法如下:

获取 sign

获取 sign 时,先组装 params 参数,参数为接口除了 sign 字段之外的其他所有字段的字典集合,组装完成后,调用 getSign 方法获取 sign 字符串。

提示

params 参数,不同的接口有不同的要求,具体请参考各个接口说明文档。

获取 Authorization

使用上一步获取的signapp_key,调用 getAuthorization 方法获取 Authorization 字符串,其中 app_key 为您申请的开发者应用的 key,您可以在引力后台-设置-引力开发者中查看。

代码示例

import cn.hutool.jwt.JWTUtil;
import cn.hutool.jwt.signers.JWTSigner;
import cn.hutool.jwt.signers.JWTSignerUtil;
import com.alibaba.fastjson2.JSONObject;
import com.google.common.base.Charsets;
import com.google.common.base.Joiner;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.common.hash.Hashing;
import org.junit.jupiter.api.Test;

import java.util.*;

public class TestJWT {

 @Test public void test() {

    String appKey = "your_app_key";

    HashMap<String, Object> params = Maps.newHashMap();
    params.put("date_list", Arrays.asList("2023-08-14", "2023-08-19"));
    params.put("metrics_list", Lists.newArrayList("AdCost","AppActivateStandard","AppROI"));
    params.put("dims_list", Lists.newArrayList("date","advertiser_id"));
    params.put("statistics_caliber", "user_activated_time");
    params.put("decimal_point", 4);
    params.put("app_id", 13467210);

    // 使用TreeMap保证key按字典序排序,否则可能会校验失败!
    TreeMap<String, Object> filtering = new TreeMap<>();
    filtering.put("ad_platform_list", Lists.newArrayList());
    filtering.put("channel_list", Lists.newArrayList());
    filtering.put("version_list", Lists.newArrayList());
    filtering.put("turbo_promoted_object_id_list", Lists.newArrayList());

    params.put("filtering", filtering);
    params.put("sign", "");


    String sign = getSign(params, appKey);
    System.out.println(sign);
    params.put("sign", sign);

    String authorization = getAuthorization(appKey, sign);
    System.out.println(authorization);
 }


 /** * 参数加签 *
    * @param map 参数
    * @param appKey 申请的引力APPKEY
    * @return 签名 */
public String getSign(Map<String, Object> map, String appKey) {
    List<String> params = new ArrayList<>();
    for (Map.Entry<String, Object> entry : map.entrySet()) {
        if (entry.getKey().equals("sign")) {
          continue;
    }
        params.add(entry.getKey() + "=" + JSONObject.toJSONString(entry.getValue()));
    }
    Collections.sort(params);
    StringBuilder sb = new StringBuilder();
    sb.append(Joiner.on("&").join(params));
    sb.append(appKey);
    String str = sb.toString().replaceAll("\"", "");
    return Hashing.md5().newHasher().putString(str, Charsets.UTF_8).hash().toString();
 }

 /** * 请求头加签 *
 * @param appKey 申请的引力APPKEY
 * @param sign 参数加签
 * @return 请求头签名
*/ public String getAuthorization(String appKey, String sign) {
    HashMap<String, Object> payload = Maps.newHashMap();
    payload.put("app_key", appKey);
    JWTSigner jwtSigner = JWTSignerUtil.hs256(sign.getBytes());
    return JWTUtil.createToken(payload, jwtSigner);
 }
}