必须先获取AccessKey并构造Signature V4签名请求,否则返回401/403错误;需在控制台创建密钥、配置.env、安装Guzzle,推荐用Signer.php自动签名,请求时注意host、x-date、x-content-sha256头及messages首项role为user。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

要在PHP项目中调用火山引擎豆包大模型API完成文本生成任务,必须先获取有效Access Key并构造符合签名规范的HTTP请求,否则会返回401或403错误。
准备认证凭证与环境
登录火山引擎控制台→进入「访问密钥」页面→点击「创建AccessKey」→复制生成的AccessKeyId和SecretAccessKey,【SecretAccessKey仅显示一次,关闭后不可找回】。
在项目根目录创建.env文件,写入:
DOUBAO_ACCESS_KEY_ID=AKIxxxxxxxxxxxxxx
DOUBAO_SECRET_ACCESS_KEY=SKxxxxxxxxxxxxxxxxxxxxxxxxxxxx
立即进入“豆包AI人工智官网入口”;
立即学习“豆包AI人工智能在线问答入口”;
安装SDK依赖
执行命令安装官方推荐的Guzzle HTTP客户端:
composer require guzzlehttp/guzzle:^7.5
不建议使用curl扩展手动拼接请求头,签名计算逻辑复杂且易出错,官方未提供PHP原生签名工具类。
构造带Signature V4签名的请求
豆包API强制要求使用AWS Signature V4签名机制,不能跳过或用简单token替代。
方法一:使用现成封装类(推荐)
下载vendor/byteplus-sdk-php/doubao/src/Signer.php(需从GitHub仓库v0.2.1 tag中提取),将其引入项目;实例化Signer时传入AccessKeyId、SecretAccessKey、Region(如cn-north-1)、Service(doubao);调用sign()方法传入Guzzle Request对象,自动注入Authorization头。
方法二:手动构造签名(仅调试用)
按顺序拼接Canonical URI(固定为/v1/chat/completions)、Canonical Query String(为空)、Canonical Headers(host、x-content-sha256、x-date三项小写排序)、Signed Headers(host;x-content-sha256;x-date);计算Payload Hash(对空JSON体取sha256 hex);生成DateStamp(Ymd格式)和CredentialScope(Ymd/region/service/aws4_request);逐轮哈希生成Signing Key;最终组合Signature并填入Authorization头。这一步极易因换行符、空格、大小写不一致导致签名失败。
发起模型调用请求
第一步:初始化Guzzle客户端,设置base_uri为https://ark.cn-beijing.volces.com
第二步:构建JSON请求体,必须包含model(如"ep-20240815150950-2zq2w")、messages(数组,每项含role和content)、max_tokens(建议设为1024);【messages[0].role必须是user,不能填system或assistant】
第三步:设置请求头:Content-Type: application/json;X-Date: 用new DateTime('UTC')生成ISO8601格式时间串(如20240815T081234Z);X-Content-Sha256: 对空字符串或实际body做sha256 hex;Host: ark.cn-beijing.volces.com
第四步:执行$client->post('/v1/chat/completions', ['json' => $body, 'headers' => $headers])
第五步:捕获响应,用$json = json_decode($response->getBody(), true)解析;检查$data['choices'][0]['message']['content']是否为非空字符串



















