AI-ready documentation
签名生成
说明 Gravity Engine OpenAPI 的 sign 与 Authorization 生成步骤,并提供 Java、Go 和 Python 示例代码。
调用引力服务端 openapi 接口时,部分接口需要 Authorization 和 sign 字段,本文主要给出示例,我们提供了以下 Java、Golang 和 Python 版本的示例,请参照示例生成签名。
主要分为两个方法:
- 获取 sign
- 获取 Authorization
现分别介绍如下。
1. 获取 sign
获取 sign 时,先组装 params 参数,参数为接口除了 sign 字段之外的其他所有字段的字典集合,组装完成后,调用 getSign 方法获取 sign 字符串。
针对 params 参数,不同的接口有不同的要求,具体请参考各个接口说明文档。
2. 获取 Authorization
使用上一步获取的 sign 和 app_key,调用 getAuthorization 方法获取 Authorization 字符串,其中 app_key 为您申请的开发者应用的 key,您可以在引力后台-设置-引力开发者中查看。
3. 代码示例
package com.example;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.alibaba.fastjson2.JSONObject;
import com.alibaba.fastjson2.JSONWriter;
import com.google.common.base.Charsets;
import com.google.common.base.Joiner;
import com.google.common.collect.Maps;
import com.google.common.hash.Hashing;
import cn.hutool.jwt.JWTUtil;
import cn.hutool.jwt.signers.JWTSigner;
import cn.hutool.jwt.signers.JWTSignerUtil;
/**
* 引力引擎签名工具类
*/
public class SignUtil {
/**
* 字符串转Unicode编码
* @param string 原始字符串
* @return Unicode编码字符串
*/
public static String string2Unicode(String string) {
StringBuffer unicode = new StringBuffer();
for (int i = 0; i < string.length(); i++) {
char c = string.charAt(i);
if (c < 0x20 || c > 0x7E) {
String tmp = Integer.toHexString(c);
if (tmp.length() >= 4) {
unicode.append("\\u" + Integer.toHexString(c));
} else if (tmp.length() == 3) {
unicode.append("\\u0" + Integer.toHexString(c));
} else if (tmp.length() == 2) {
unicode.append("\\u00" + Integer.toHexString(c));
} else if (tmp.length() == 1) {
unicode.append("\\u000" + Integer.toHexString(c));
} else {
unicode.append("\\u0000");
}
} else {
unicode.append(c);
}
}
return unicode.toString();
}
/**
* 参数加签
* @param map 请求参数
* @param appKey 申请的引力APPKEY
* @return 签名字符串
*/
public static 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(), JSONWriter.Feature.MapSortField));
}
Collections.sort(params);
StringBuilder sb = new StringBuilder();
sb.append(Joiner.on("&").join(params));
sb.append(appKey);
String str = sb.toString().replaceAll("\"", "").replaceAll(" ", "");
return Hashing.md5().newHasher().putString(string2Unicode(str), Charsets.UTF_8).hash().toString();
}
/**
* 请求头加签
* @param appKey 申请的引力APPKEY
* @param sign 参数加签
* @return Authorization 请求头签名
*/
public static 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);
}
}