使用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
相关产品推荐
相关产品推荐

