请求将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代码的核心差异在于参数处理的通用性和严谨性:
- Go代码会将所有查询参数的key按字典序升序排序后再拼接,你的代码直接硬编码了
app_key和timestamp的顺序,虽然当前两个参数的顺序符合字典序,但后续新增参数时必然出错; - 若传入的
timestamp是整数类型,虽然Python拼接时会自动转字符串,但没有显式处理可能导致隐式类型转换问题; - 硬编码参数拼接逻辑不符合接口签名的通用规范,容易出现拼写错误。
正确的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
相关产品推荐
相关产品推荐

