快手直播api调用核心是http请求加sha256签名认证,需严格按字典序拼接参数与app_secret生成sign,配合有效access_token(2小时过期)、秒级timestamp(偏差≤5分钟)、唯一nonce,并正确使用file_get_contents发起带header的请求。

快手直播 API 的 PHP 调用本质是 HTTP 请求 + 签名认证
快手开放平台不提供官方 PHP SDK,所有接口调用都基于 RESTful HTTP 请求,核心难点不在 PHP 语法,而在 sign 签名生成是否合规。签名错一个字符,就会返回 {"error_code":10001,"error_msg":"invalid sign"} —— 这是最常卡住的地方。
签名规则必须严格按文档:对请求参数(含 access_token、timestamp、nonce 等)做字典序排序后拼接,再与 app_secret 拼接,最后用 hash_hmac('sha256', $str, $app_secret) 计算。注意:timestamp 必须是秒级 Unix 时间戳,且与快手服务器时间差不能超过 5 分钟。
- 漏传
nonce(随机字符串,建议用uniqid()生成)会导致签名失效 - 参数名大小写敏感,比如
live_id写成Live_Id就会报错 - GET 和 POST 接口的签名参数范围不同:GET 是全部 query 参数;POST 是 body 中的 JSON 字段 + URL query 参数(不含 body)
获取直播流信息要用 /open/live/stream_info 接口
这个接口返回的是当前直播的推流地址、状态、观看人数等,不是录播回放。它要求你已通过 /open/auth/token 换取了有效的 access_token,且该 token 绑定的快手账号有对应直播间的管理权限。
常见错误是直接拿 client_id + client_secret 去调用,忘了先换 token。或者 token 过期(有效期 2 小时)后没刷新,结果返回 {"error_code":10005,"error_msg":"invalid access_token"}。
- 必须带
access_token在 query 中,例如:?access_token=at_xxx&live_id=xxx -
live_id是直播间 ID,不是主播 UID,可在快手创作者后台「直播管理」里找到 - 返回字段中
stream_url是真正的拉流地址(如 RTMP 或 FLV),但需注意快手默认返回的是鉴权 URL,含auth_key参数,过期时间由auth_key_timeout控制
PHP 发起请求别硬写 cURL,用 file_get_contents + stream_context_create 更稳
快手接口对 User-Agent、Content-Type、超时控制较敏感,cURL 配置稍有遗漏就可能被限流或返回空响应。相比手动设一堆 curl_setopt,用原生流封装更简洁可靠。
关键点在于:必须显式设置 Content-Type: application/json(即使 GET 请求也要带,部分快手接口校验此 header),且 timeout 建议设为 10 秒以上,避免因网络抖动误判失败。
- GET 示例:
file_get_contents("https://api.kuaishou.com/open/live/stream_info?access_token={$token}&live_id={$live_id}", false, stream_context_create(['http'=>['header'=>"User-Agent: PHP/7.4\r\nContent-Type: application/json\r\n",'timeout'=>10]])) - POST 示例要额外加
method和content,JSON body 必须用json_encode()且不带中文编码(UTF-8 即可) - 别用
$_GET或$_POST直接接收快手回调——它的回调是纯 JSON body,PHP 默认不解析,得用file_get_contents('php://input')
签名和 token 别写死,必须封装成可复用函数
每次调用都要重算 sign 和检查 access_token 是否过期,硬编码会导致后期维护崩溃。最简方案是抽两个函数:get_kuaishou_sign($params, $app_secret) 和 get_access_token(),后者内部缓存 token 及其 expires_in 时间戳。
容易被忽略的是:快手的 refresh_token 有效期只有 30 天,且只能用一次。如果依赖长期自动刷新,必须在每次成功刷新后持久化新 refresh_token,否则 30 天后整个授权链就断了。
-
get_kuaishou_sign()函数里,务必对$params做ksort(),然后urldecode(http_build_query($params))再拼$app_secret - 缓存
access_token时,别只存值,要连同expires_at(时间戳)一起存,比如写进 Redis:setex ks_token 7000 $token(7000 秒 ≈ 2 小时) - 测试阶段把完整请求 URL 和签名原文打日志,和快手文档里的“签名示例”逐字符比对,比抓包还快
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











