You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

请求将Go版TikTok Shop签名生成代码转为Python并排查签名无效问题

TikTok Shop签名生成:Go转Python的问题排查与修复

问题背景

我有一段生成TikTok Shop签名的Go语言示例代码,测试参数如下:
app_secret = 777, path = /api/orders, app_key = 12345, timestamp = 1623812664

我尝试将其转换为Python代码,但提交时始终提示签名无效,请求帮助完成代码转换并排查问题。


Go语言示例代码

import (
    "crypto/hmac"
    "crypto/sha256"
    "encoding/hex"
    "sort"
)

func generateSHA256(path string, queries map[string]string, secret string) string{
    keys := make([]string, len(queries))
    idx := 0
    for k, _ := range queries{
        keys[idx] = k
        idx++
    }
    sort.Slice(keys, func(i, j int) bool {
        return keys[i] < keys[j]
    })
    input := path
    for _, key := range keys{
        input = input + key + queries[key]
    }
    input = secret + input + secret

    h := hmac.New(sha256.New, []byte(secret))
    if _, err := h.Write([]byte(input)); err != nil{
        // todo: log error
        return ""
    }

    return hex.EncodeToString(h.Sum(nil))
}

我写的Python代码

import hmac
import hashlib

def _short_sign(self, app_key, app_secret, path, timestamp):
    base_string = "%sapp_key%stimestamp%s"%(path, app_key, timestamp)
    sign_string = app_secret + base_string + app_secret
    sign = hmac.new(app_secret.encode(), sign_string.encode(), hashlib.sha256).hexdigest()
    return sign

问题分析与修复

你的Python代码和Go代码的核心差异在于参数处理的通用性和严谨性:

  1. Go代码会将所有查询参数的key按字典序升序排序后再拼接,你的代码直接硬编码了app_key和timestamp的顺序,虽然当前两个参数的顺序符合字典序,但后续新增参数时必然出错;
  2. 若传入的timestamp是整数类型,虽然Python拼接时会自动转字符串,但没有显式处理可能导致隐式类型转换问题;
  3. 硬编码参数拼接逻辑不符合接口签名的通用规范,容易出现拼写错误。

正确的Python实现

完全对齐Go代码的逻辑,实现通用的签名生成函数:

import hmac
import hashlib

def generate_tiktok_sign(path, queries, app_secret):
    # 对查询参数的key按字典序升序排序
    sorted_keys = sorted(queries.keys())
    # 拼接基础字符串:path + 排序后的key+value
    input_str = path
    for key in sorted_keys:
        input_str += key + queries[key]
    # 前后拼接app_secret
    input_str = app_secret + input_str + app_secret
    # 生成HMAC-SHA256签名
    sign = hmac.new(app_secret.encode('utf-8'), input_str.encode('utf-8'), hashlib.sha256).hexdigest()
    return sign

# 测试用例
if __name__ == "__main__":
    app_secret = "777"
    path = "/api/orders"
    queries = {
        "app_key": "12345",
        "timestamp": "1623812664"  # 必须显式转为字符串
    }
    sign = generate_tiktok_sign(path, queries, app_secret)
    print("生成的签名:", sign)

关键注意事项

  • 所有查询参数(包括app_key、timestamp)必须以字符串类型传入queries字典;
  • 必须严格按照字典序排序参数key,这是TikTok签名算法的核心要求;
  • 确保app_secret和拼接后的字符串编码统一为UTF-8,和Go代码的字节转换逻辑保持一致。

内容的提问来源于stack exchange,提问作者Aravinth Draj

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 01:25:23