调用TikTok Marketing API持续返回40115错误:Timestamp has expired
TikTok OAuth2 获取refresh_token返回40115 "Timestamp has expired" 问题解决
错误信息
{ "code": 40115, "message": "Timestamp has expired." }
问题分析
这个错误通常由以下几种原因导致:
- 服务器时间偏差:TikTok OAuth接口会验证请求的时间有效性,若你的服务器本地时间与TikTok服务器时间差超过阈值(一般为1-5分钟),会直接触发该错误。你提到响应头显示即时日期,说明TikTok服务器时间正常,问题大概率出在你自己的服务器时间上。
- auth_code过期:TikTok授权码
auth_code有效期极短(通常5分钟内),如果从回调跳转完成到调用creator_token接口的间隔过长,授权码失效也可能引发类似错误。 - 请求缺少时间戳或签名:部分TikTok API要求请求携带
timestamp参数并附带签名,若你的请求未满足这个要求,接口会判定时间验证失败。
解决步骤
1. 同步服务器时间
先检查服务器当前时间是否与标准UTC时间一致:
# 查看当前服务器UTC时间 date -u
如果时间偏差较大,立即同步时间:
- Ubuntu/Debian系统:
sudo timedatectl set-ntp on - CentOS/RHEL系统:
sudo ntpdate pool.ntp.org
确保服务器时间与标准时间偏差控制在1分钟以内。
2. 缩短auth_code处理延迟
检查回调函数中是否有不必要的耗时操作(如大量日志写入、复杂数据库查询等),尽量在获取auth_code后立即调用creator_token接口,避免授权码过期。
3. 补充时间戳与签名参数
TikTok部分API要求请求携带timestamp(秒级UTC时间戳)并生成签名。修改你的代码如下:
public function callback(Request $request) { $accessTokenUrl = 'https://business-api.tiktok.com/open_api/v1.3/oauth2/creator_token/?business=tt_user'; $timestamp = time(); $params = [ "client_id" => env('TIKTOK_CLIENT_ID'), "client_secret" => env('TIKTOK_CLIENT_SECRET'), "grant_type" => "authorization_code", "auth_code" => $request['auth_code'], "timestamp" => $timestamp ]; // 按TikTok签名规则生成签名:参数按键名排序拼接,用client_secret做HMAC-SHA256加密 ksort($params); $signStr = http_build_query($params); $signature = hash_hmac('sha256', $signStr, env('TIKTOK_CLIENT_SECRET')); $response = Http::withHeaders([ 'Content-Type' => 'application/json', 'Signature' => $signature ])->post($accessTokenUrl, $params); if($response->successful()) { dump($response->headers()); dd($response->json()); } else { dump($response->headers()); dd($response->json()); } }
注意:签名的具体位置(请求头或请求参数)可能因API版本不同而变化,请以TikTok官方文档为准。
内容的提问来源于stack exchange,提问作者Edvard Åkerberg
相关产品推荐
相关产品推荐

