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

使用TikTok Shop API与Python时如何解决签名无效问题

TikTok Shop API 签名无效(401/106001)排查方案

你遇到的问题很典型:示例凭证能生成正确签名,但自有凭证调用API返回签名无效,且测试工具可正常请求——说明问题不在凭证本身,而是签名生成过程中的实时参数一致性或格式细节出错了。以下是针对性的排查和修复方案:

1. 确保请求体(Body)完全一致

TikTok对签名用的Body要求和实际发送的Body字节级完全一致,包括空格、换行、引号格式。你的示例Body是带空格格式化的,但实际请求时如果用json.dumps生成Body,默认会有缩进,导致签名不匹配。

修复方式:

  • 生成签名和发送请求必须用同一个Body字符串;
  • 如果用json.dumps构造Body,强制使用无空格压缩格式:
    body = json.dumps(payload, separators=(',', ':'))
    

2. 同步Timestamp的时效性与一致性

Timestamp必须是当前时间的秒级Unix时间戳,且签名用的timestamp必须和请求头x-tts-timestamp的值完全一致。常见错误是用了硬编码的旧timestamp,或者请求时更新了timestamp但没同步到签名函数。

修复方式:

  • 每次请求前实时生成timestamp:
    timestamp = str(int(time.time()))
    
  • 把这个实时生成的timestamp同时传入签名函数和请求头。

3. 核对API Path的准确性

签名用的api_path必须和实际请求的路径完全一致,包括开头的/、版本号、路径参数(如果有)。比如实际请求的是/api/v2/order/get,签名里不能写成/order/get。

4. 确认Shop Cipher无拼写错误

检查自有凭证的shop_cipher是否和测试工具里的完全一致,注意大小写、下划线、特殊字符不要输错。

5. 简化签名拼接逻辑(避免冗余步骤)

你的代码里的拼接顺序是对的(因为示例能生成正确签名),但可以简化逻辑减少出错概率:

def generateSignature(app_key, shop_cipher, timestamp, app_secret, body, api_path):
    # 严格按照官方顺序拼接:app_secret + api_path + app_key{值}shop_cipher{值}timestamp{值} + body + app_secret
    input_str = f"{api_path}app_key{app_key}shop_cipher{shop_cipher}timestamp{timestamp}{body}"
    input_str = f"{app_secret}{input_str}{app_secret}"
    input_bytes = input_str.encode('utf-8')
    secret_bytes = app_secret.encode('utf-8')
    return hmac.new(secret_bytes, input_bytes, hashlib.sha256).hexdigest()

完整修复后的代码示例

import hashlib
import hmac
import json
import time

def generateSignature(app_key, shop_cipher, timestamp, app_secret, body, api_path):
    input_str = f"{api_path}app_key{app_key}shop_cipher{shop_cipher}timestamp{timestamp}{body}"
    input_str = f"{app_secret}{input_str}{app_secret}"
    input_bytes = input_str.encode('utf-8')
    secret_bytes = app_secret.encode('utf-8')
    return hmac.new(secret_bytes, input_bytes, hashlib.sha256).hexdigest()

# 加载自有凭证
with open('config.json', 'r') as config_file:
    config = json.load(config_file)

app_key = config['app_key']
shop_cipher = config['shop_cipher']
app_secret = config['app_secret']
api_path = '/event/202309/webhooks'  # 确保和实际请求路径一致

# 实时生成timestamp
timestamp = str(int(time.time()))

# 构造请求体(无空格格式)
payload = {
    "address": "https://partner.tiktokshop.com",
    "event_type": "PACKAGE_UPDATE"
}
body = json.dumps(payload, separators=(',', ':'))

# 生成签名
signature = generateSignature(app_key, shop_cipher, timestamp, app_secret, body, api_path)

# 构造请求头(必须携带这几个字段)
headers = {
    'x-tts-app-key': app_key,
    'x-tts-timestamp': timestamp,
    'x-tts-signature': signature,
    'Content-Type': 'application/json'
}

# 后续发起请求时,使用上述body和headers

核心思路:测试工具能成功,说明凭证合法,重点抓参数的实时同步和格式无差异,这是TikTok API签名最容易踩坑的地方。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 11:37:11