抖音电商API调用必须通过OAuth2授权获取access_token,不可直连或硬编码;订单需分状态轮询拉取,库存更新须用平台生成的product_id和sku_id;PHP需正确处理SSL证书、JSON解析及限频。

抖音电商 API 的 PHP 调用必须走 OAuth2 授权,不能直连
抖音小店 API(包括订单、库存等)全部要求服务端完成 OAuth2 授权流程,拿到 access_token 后才能调用。直接拼接 token 或硬编码密钥会失败,返回 {"code":15,"message":"invalid access_token"} 或 401。
- 必须先引导用户跳转到抖音授权页(
https://open.douyin.com/platform/oauth/connect),带上client_key、scope(如order.list、product.inventory.get)、redirect_uri(需与后台配置一致) - 用户同意后回调地址会带
code参数,PHP 用这个code换取access_token,调用接口:POST https://open.douyin.com/oauth/access_token,传client_key、client_secret、code -
access_token有效期 2 小时,且每个店铺独立;刷新要用refresh_token(首次换取时一起返回),不是重走 OAuth 流程
同步订单:用 order.list 接口分页拉取,注意时间戳和状态过滤
抖音不支持 webhook 主动推送订单,只能轮询拉取。直接调 order.list 很容易漏单或重复,关键在参数组合。
- 必传
start_time和end_time(单位秒),建议每次请求跨度 ≤ 1 小时,避免超时或限流;用上一次成功同步的最后订单create_time作为下轮start_time -
status建议分多次拉:先拉PAID(已支付),再拉CONFIRMED(已发货),避免把“待付款”误同步进 ERP - 响应里
data.orders是数组,但字段名和含义和文档不完全一致——比如order_id是抖音侧 ID,out_order_sn才是商家自定义单号;pay_time是时间戳(秒级),不是字符串
更新库存:调 product.inventory.update 前必须确认商品 & 规格 ID 准确
抖音库存接口不认 SKU 编码,只认平台生成的 product_id 和 sku_id。填错任何一个,返回 {"code":20001,"message":"商品不存在"},但实际商品明明在后台可见。
- 这两个 ID 只能从商品列表接口(
product.list)或订单详情(order.detail)里取,不能靠商家后台页面 URL 或 Excel 表格里的“货号”硬匹配 - 更新时
inventory字段是整数,不能为小数或字符串;设为 0 表示售罄,设为负数会被拒绝 - 频繁调用(如每秒多次)会触发风控,返回
429 Too Many Requests;生产环境建议加 Redis 锁 + 时间窗口限频(例如 1 分钟最多 30 次)
PHP 实现要注意 cURL 默认不校验证书,线上必须关掉 CURLOPT_SSL_VERIFYPEER
抖音 API 强制 HTTPS,但 PHP cURL 默认开启证书校验。本地开发可能忽略,上线后常见错误是 cURL error 60: SSL certificate problem,导致所有请求静默失败。
立即学习“PHP免费学习笔记(深入)”;
- 务必在 curl 初始化后显式关闭:
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false)—— 仅限开发调试;生产环境应设为true并配置CURLOPT_CAINFO指向最新 CA 证书 bundle - 抖音返回 JSON,但部分字段含中文或特殊符号(如商品标题里的 emoji),PHP
json_decode()需加第二个参数true,否则对象属性无法用->访问 - 不要用
file_get_contents()直接请求,它不支持 POST body、header 自定义,也难处理重定向和错误码
抖音电商 API 的坑不在语法,而在状态机设计——订单状态流转非线性,库存变更依赖商品元数据准确性,而这两者都得靠你主动维护映射关系。没做好的话,补单、锁库存、超卖问题会集中爆发,而且日志里很难一眼定位是哪一层断了。



















