抖音小程序POST数据需用file_get_contents('php://input')读取原始JSON并json_decode,校验签名须用原始请求体,登录态必须调用官方jscode2session接口。

抖音小程序的 POST 数据不是标准 JSON,PHP 默认收不到 $_POST
抖音小程序调用 wx.request 发起请求时,若 header['content-type'] 设为 "application/json",后端 PHP 不会自动解析到 $_POST —— 这是绝大多数人卡住的第一步。PHP 只在 Content-Type: application/x-www-form-urlencoded 或 multipart/form-data 时填充 $_POST,而 JSON 是原始流体,需手动读取。
- 用
file_get_contents('php://input')获取原始请求体(推荐) - 不要依赖
$_POST,除非前端明确用form-data或urlencoded提交 - 若前端发的是 JSON,
getallheaders()可查Content-Type确认是否为application/json
json_decode(file_get_contents('php://input'), true) 是最简接收方式
这是抖音小程序对接 PHP 后端最常用、最稳的入口写法。注意必须加第二个参数 true,否则返回对象,后续取值要写 ->,容易出错且和数组逻辑不统一。
$raw = file_get_contents('php://input');
$data = json_decode($raw, true);
if (json_last_error() !== JSON_ERROR_NONE) {
http_response_code(400);
echo json_encode(['msg' => 'invalid json']);
exit;
}
// 此时 $data 是关联数组,可直接 $data['open_id']、$data['scene'] 等
- 务必检查
json_last_error(),抖音某些 SDK 或自定义请求可能发空体或格式错误 - 如果前端用了
encodeURIComponent包裹整个 JSON 字符串(极少见但存在),需先urldecode()再解码 - 抖音云开发或字节云网关转发时,可能额外加一层
body字段包装,需看实际打印$raw内容判断
抖音签名验证:用 hash_hmac('sha256', $raw, $secret) 校验 X-Hub-Signature-256
抖音服务端回调(如用户授权成功、消息推送)会带签名头 X-Hub-Signature-256,格式为 sha256=xxx。验证必须用原始请求体(php://input),不能用已解码的 $data,否则哈希不一致。
- 从
getallheaders()里取X-Hub-Signature-256,截掉sha256=前缀 - 签名密钥是抖音后台「小程序设置 → 开发管理 → 服务器域名与令牌」里配置的
Token和EncodingAESKey?不对——那是微信。抖音用的是「Webhook 密钥」或「开放平台应用密钥client_secret」,具体看接口文档归属(抖店 / 小程序 / 开放平台) - 常见坑:PHP 的
hash_hmac第三个参数是key,不能误传成base64_decode($key),抖音给的密钥是明文字符串,直接用
抖音小程序登录态校验要调用 https://developer.toutiao.com/api/apps/v1/jscode2session
前端调 tt.login() 拿到 code 后,PHP 需用该 code 换取 open_id 和 session_key。这不是自己签名校验,而是必须走抖音官方接口。
立即学习“PHP免费学习笔记(深入)”;
$code = $_GET['code'] ?? '';
$app_id = 'your_app_id';
$secret = 'your_app_secret'; // 注意:不是前端传来的,是后台配置的
$url = "https://developer.toutiao.com/api/apps/v1/jscode2session?appid={$app_id}&secret={$secret}&js_code={$code}&grant_type=authorization_code";
$response = file_get_contents($url);
$result = json_decode($response, true);
if (isset($result['open_id'])) {
// 校验通过,可存 session 或生成自定义 token
} else {
// 处理错误,如 code 已用、过期、app_id 不匹配等
}
- 这个接口不支持 POST,只能 GET,
js_code是一次性且 5 分钟失效 - 返回字段含
open_id(用户唯一标识)、union_id(跨小程序唯一,需同主体)、session_key(用于解密敏感数据) - 别把
session_key返回给前端,它应仅在服务端用于解密(如用户手机号),且需妥善存储、及时丢弃
open_id、js_code、X-Hub-Signature-256,大小写和下划线必须完全一致,PHP 对键名大小写敏感,少个下划线或写成 openid 就拿不到值。











