抖音电商推荐接口需用PHP调用,先在开放平台创建应用获取client_key/client_secret,通过HMAC-SHA256对排序后query参数签名,携带access_token(Redis缓存续期),传合规行为数据调用/item/recommend。

怎么用 PHP 调用字节跳动 AI 商品推荐接口
字节跳动没有开放「AI 商品推荐」的独立 SaaS 接口,所谓「千人千面推荐」在实际对接中,基本只有两种路径:一是走 穿山甲广告平台 的商品广告推荐(需广告主资质+审核),二是调用 抖音电商开放平台 的 item.recommend 类接口(需店铺/服务商授权)。PHP 本身不参与模型推理,只是做 HTTP 请求封装和参数签名。
常见错误现象:401 invalid sign(签名错)、403 no permission(权限不足)、500 unknown appid(未在开放平台创建应用)。
- 必须先在
https://developer.open-douyin.com创建应用,获取client_key和client_secret - 所有请求必须带
access_token,它由client_key+client_secret+refresh_token换取,有效期 2 小时,需自行缓存续期 - 签名算法是
HMAC-SHA256,不是 MD5 或 base64,且要对排序后的 query string 做签名,不是 raw body - 推荐接口如
/api/item/recommend要求传user_unique_id(脱敏后的用户标识,不能是明文手机号或 openid)
PHP 如何拼装带签名的抖音电商推荐请求
签名逻辑容易出错——不是对 JSON body 签名,而是对 URL query 参数(含 timestamp、nonce、app_key)按 key 字典序排序后拼接成字符串再签。PHP 里别用 http_build_query() 直接拼,它不保证排序,得手动 ksort。
使用场景:你已有用户行为日志(比如最近点击的 3 个商品 ID、加购时间戳),想喂给抖音接口换一批相似商品。
立即学习“PHP免费学习笔记(深入)”;
- 构造参数数组时,必须包含:
app_key、timestamp(秒级 Unix 时间戳)、nonce(随机 8 位字符串)、sign_method(固定HMAC-SHA256)、access_token - 签名原文 =
concat(ksort(params), '&', client_secret),注意末尾不加 &,且client_secret是原始密钥,不 urlencode - 发送请求用
curl即可,Content-Type设为application/json,body 里放行为数据,例如:{"action_list":[{"action_type":"click","item_id":"721xxx","action_time":1715xxxxxx}]}
为什么推荐结果总和用户行为对不上
不是 PHP 写错了,大概率是行为数据没达标。抖音电商接口对输入行为有硬性过滤:单次最多传 20 条行为,且 action_time 必须在近 7 天内,超过直接忽略;item_id 必须是抖音小店已上架且状态为「正常售卖」的商品 ID,测试用的 mock ID 会返回空列表。
性能影响:接口平均响应 300–600ms,但若传了无效 item_id 或格式错误的 action_time,可能升到 2s+ 并触发限流(错误响应头含 X-RateLimit-Remaining: 0)。
- 检查
item_id是否真实存在:用item.info.get接口查一遍,别信前端传来的 ID -
action_type只认预设值:click、cart_add、purchase、view,写成CLICK或add_to_cart都算非法 - 不要在每次页面加载都调推荐接口——它不支持高并发,QPS 限制通常为 5,需加本地缓存(比如 Redis 存 5 分钟)
PHP 里怎么安全存 access_token 和 refresh_token
token 不是存在 session 或 cookie 里的东西,它属于服务端凭据,泄露等于开放平台账号失控。别用文件存,尤其别存 config.php 里——万一被 Nginx 配置错误导致源码暴露,就全完了。
兼容性注意:抖音接口要求 access_token 必须每 2 小时刷新,PHP-FPM 子进程之间不共享内存,所以不能靠单个进程变量缓存。
- 必须用外部存储:Redis 最稳妥,key 设为
douyin:token:{app_key},设 TTL 为 70 分钟(留 10 分钟缓冲) - 刷新逻辑要加分布式锁,避免多个请求同时发现 token 过期然后并发刷新,造成
refresh_token失效(它是一次性使用的) - 错误响应里如果出现
"error_code":10003,就是refresh_token已被用过,得重新走授权码流程,这时候 PHP 应该触发告警,而不是静默重试
最麻烦的其实是行为数据清洗——用户点击了 50 次,你不能全扔过去;抖音只认最近、最密集、类型最丰富的那十几条。这块没标准答案,得自己按业务权衡,PHP 只负责把干净数据送出去。



















