需用AccessKey签名调用火山引擎Seedance API:先在IAM创建密钥并存入.env,再用Guzzle 7.x发起带X-Date和Authorization头的POST请求,构造含scene/texts/duration的JSON体,响应成功后轮询获取video_url。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

要在PHP项目中调用火山引擎Seedance服务生成视频,需完成身份认证、构造请求体、发起HTTP POST调用并解析返回结果。整个过程依赖火山引擎OpenAPI规范,必须使用Access Key和Secret Key签名,否则401报错且无调试提示。
获取并配置火山引擎AccessKey凭证
登录火山引擎控制台→进入「访问控制(IAM)」→「用户管理」→找到目标子用户→点击「管理访问密钥」→「创建访问密钥」,获得AccessKeyId和SecretKey。
将这两个值安全写入项目环境变量,不要硬编码在PHP源文件里。例如在.env中添加:
VC_ACCESS_KEY_ID=AKIxxxxxxxxxxxxxx
VC_SECRET_ACCESS_KEY=SKxxxxxxxxxxxxxxxxxxxxxxxxxxxx
这一步漏掉或填错任意一位字符,后续所有请求都会返回{"code":401,"message":"Unauthorized"},且无法从错误信息反推是密钥问题。
立即学习“PHP免费学习笔记(深入)”;
安装必要依赖并初始化HTTP客户端
执行命令安装Guzzle HTTP库:composer require guzzlehttp/guzzle:^7.5。
在PHP脚本开头引入:<?php require_once 'vendor/autoload.php'; use GuzzleHttp\Client;
注意:必须使用Guzzle 7.x版本,6.x不支持PSR-18异步流式响应,而Seedance接口返回的是分块传输的JSON流,旧版本会截断body导致json_decode失败。
构造Seedance视频生成请求
第一步:设置请求URL为https://seedance.volcengineapi.com/api/v1/videos,仅支持POST方法。
第二步:组装请求头,必须包含:
– Content-Type: application/json
– X-Date: 当前UTC时间RFC3339格式(如2024-05-22T08:12:34Z),误差超过300秒会被拒绝
– Authorization: 签名字符串(见下一步)
第三步:调用火山引擎官方SDK或手动实现V4签名算法——先拼接CanonicalRequest,再计算Signature,最终组合成Authorization头。此步骤不可跳过,【未签名的请求一律被网关拦截,不会到达Seedance后端】。
第四步:构建JSON请求体,至少包含scene(模板ID)、texts(字幕数组)、duration(单位秒),示例:
{
"scene": "sce_abc123",
"texts": [{"text": "欢迎使用Seedance"}],
"duration": 5
}
发送请求并处理响应
方法一:使用Guzzle同步调用
$client = new Client();
$response = $client->post($url, [
'headers' => $headers,
'json' => $payload
]);
$data = json_decode($response->getBody()->getContents(), true);
方法二:启用stream=true接收SSE流式响应(推荐用于长任务)
当video_id返回后,需轮询GET /api/v1/videos/{video_id}直到status变为success,此时response.body.video_url才可用。
收到HTTP 200但data中无video_id字段?检查payload是否含非法字符(如中文引号、全角空格),Seedance解析器对JSON格式极其严格,一个多余空格会导致整个body被忽略并静默返回空对象。



















