微信小程序直播的开播码需通过服务端调用微信接口获取,ThinkPHP需封装getAccessToken()方法获取并缓存access_token,再依次调用create_room和getpushurl接口,返回拼接好的完整RTMP推流地址。

ThinkPHP 本身不提供直播能力,也不能直接创建微信小程序直播间或生成推流地址——这些必须调用微信官方接口,由后端 PHP(配合 ThinkPHP)完成鉴权、请求和数据透传。关键点在于:你得用 ThinkPHP 控制器调用微信 https://api.weixin.qq.com/wxa/business/create_room 和 https://api.weixin.qq.com/wxa/business/getpushurl 这两个接口,且全程依赖有效的 access_token。
为什么不能在前端直接调用微信直播接口
微信直播相关接口(如创建直播间、获取推流地址)全部要求服务端调用,且需携带 access_token。该 token 有有效期(2 小时),需由后端定时刷新并缓存,前端无法安全存储或可靠续期。若强行在小程序 JS 里拼 URL 请求,会返回 {"errcode":40001,"errmsg":"invalid credential, access_token is invalid or not latest"}。
常见错误现象:
- 前端 fetch 调用
/wxa/business/create_room直接报 401 或 40001 错误 - 手动在浏览器访问带 token 的 URL,偶尔成功但很快失效,无法用于生产推流
- token 硬编码在 JS 里,被反编译后导致凭证泄露、直播间被恶意操作
ThinkPHP6 中正确获取 access_token 并缓存
微信的 access_token 不是小程序登录态 token,而是调用「小程序直播管理接口」所需的平台级凭证,必须由后端主动获取并本地缓存(推荐 Redis 或文件缓存),避免每次请求都重拉。
立即学习“PHP免费学习笔记(深入)”;
实操建议:
- 在
app/controller/Api/LiveController.php中封装getAccessToken()方法,先查缓存;未命中则调用https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=xxx&secret=xxx - 缓存 key 建议为
wechat:live:access_token,过期时间设为 7000 秒(留 200 秒缓冲) - 不要用
session()或cookie()存 token —— 它是全局共享凭证,不是用户私有态 - 使用
think\Cache::store('redis')->set()比文件缓存更稳妥,尤其在多实例部署时
创建直播间并获取推流地址的完整链路
微信要求:先调 create_room 得到 room_id,再用该 ID 调 getpushurl 拿推流地址(RTMP URL + stream name + auth key)。ThinkPHP 需串起这两步,并校验每步返回。
示例关键逻辑(简化版):
// LiveController.php
public function createAndPush()
{
$token = $this->getAccessToken(); // 上一步封装的方法
// 步骤 1:创建直播间
$createRes = json_decode(file_get_contents(
'https://api.weixin.qq.com/wxa/business/create_room?access_token=' . $token
), true);
if (empty($createRes['roomid'])) {
return json(['code' => 500, 'msg' => '创建失败:' . ($createRes['errmsg'] ?? '未知错误')]);
}
$roomId = $createRes['roomid'];
// 步骤 2:获取推流地址
$pushRes = json_decode(file_get_contents(
'https://api.weixin.qq.com/wxa/business/getpushurl?access_token=' . $token . '&room_id=' . $roomId
), true);
if (empty($pushRes['push_url'])) {
return json(['code' => 500, 'msg' => '推流地址获取失败:' . ($pushRes['errmsg'] ?? '未知错误')]);
}
return json([
'code' => 0,
'data' => [
'room_id' => $roomId,
'push_url' => $pushRes['push_url'],
'stream_name' => $pushRes['stream_name'],
'auth_key' => $pushRes['auth_key']
]
]);
}
注意点:
-
push_url是完整 RTMP 地址(如rtmp://live.weixin.qq.com/live/xxx),不含stream_name和auth_key,三者需拼成最终推流串:{push_url}/{stream_name}?auth_key={auth_key} - 微信对
create_room的入参有强校验(如封面图必须是 CDN 可公开访问的 HTTPS 地址),传错会静默失败或返回模糊错误码 85073 - 一个
room_id对应唯一推流地址,不可复用;重推需新建房间或调用renew_push_url
小程序端怎么安全拿到推流地址
小程序不能直接暴露推流地址给用户(防盗推),也不能让主播在前端拼接完整 URL。正确做法是:ThinkPHP 接口返回已拼好的、带时效 auth_key 的完整推流 URL,并限制该 URL 仅允许来自指定 IP 或 User-Agent(可选)。
实操建议:
- ThinkPHP 接口返回字段中,只传
full_push_url(即拼接后的完整地址),不拆开传push_url/stream_name/auth_key - 小程序调用该接口时,需携带登录态(如
token或openid),后端做权限判断:仅认证主播账号可触发创建 - 避免在日志中打印完整
full_push_url,防止密钥泄露 - 微信推流地址 auth_key 默认有效期 2 小时,如需延长,得调用
renew_push_url接口(同样需服务端发起)
最易被忽略的一点:微信直播接口返回的 push_url 是腾讯云 SRS 集群地址,它不接受任意 stream_name —— 必须严格使用接口返回的 stream_name,哪怕只是改一个字符,OBS 或 FFmpeg 都会推流失败并报错 NetStream.Publish.BadName。



















