跳到主要内容
当前模块服务端集成
AI-ready documentation

签名生成

说明 Gravity Engine OpenAPI 的 sign 与 Authorization 生成步骤,并提供 Java、Go 和 Python 示例代码。

查看 Markdown

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

主要分为两个方法:

  1. 获取 sign
  2. 获取 Authorization

现分别介绍如下。

1. 获取 sign

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

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

2. 获取 Authorization

使用上一步获取的 signapp_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);
    }
}

本页内容