PHP调用通义千问需直连DashScope REST API,用cURL或file_get_contents发送带Authorization和Content-Type头的JSON请求;API Key须在DashScope控制台单独创建,格式为sk-xxx;请求地址为https://dashscope.aliyuncs.com/api/v1/services/aigc/text-generation/generation;body中model、input.messages(数组)、parameters为必填;流式响应需用CURLOPT_WRITEFUNCTION逐行解析data:前缀的JSON Lines;错误信息藏在响应体message字段中,非HTTP状态码。

PHP 调用通义千问模型没有官方 SDK,必须直连 DashScope REST API;用 cURL 或 file_get_contents 发送带 Authorization: Bearer sk-xxx 的 JSON 请求即可跑通,别浪费时间搜 composer require qwen——压根不存在。
怎么拿到能用的 API Key
API Key 不是阿里云主账号的 AccessKey(那种以 LTAI 开头的),必须单独在 DashScope 控制台创建:
- 访问 DashScope 控制台 →「API Key 管理」→「创建新的 API Key」
- 生成的密钥一定是
sk-开头、长度约 40 位的字符串,只显示一次,务必立刻复制保存 - 不要硬编码进 PHP 文件,推荐用
$_ENV['DASHSCOPE_API_KEY']或getenv('DASHSCOPE_API_KEY')读取 - 若用百炼控制台(
bailian.console.aliyun.com)申请的 key,需确认它已开通 DashScope 权限,否则返回403 Forbidden
请求地址和 header 怎么写才不报 401/400
域名、路径、header 缺一不可,错一个就直接失败:
- 固定请求地址:
https://dashscope.aliyuncs.com/api/v1/services/aigc/text-generation/generation(注意是aliyuncs.com,不是aliyun.com) - 必须携带两个 header:
Authorization: Bearer sk-xxx和Content-Type: application/json - 建议加上
User-Agent: aliyun-dashscope-php,部分服务器会拦截空 UA 请求 - 漏掉
Content-Type会返回400 Bad Request;Authorization格式不对(比如少了Bearer前缀)会返回401 Unauthorized
POST body 结构和 model 参数怎么配
不同模型对 input 字段结构要求不同,qwen-max 和 qwen-long 不能混用:
统一LLM网关 - 一个API对接70+AI模型,使用单一API密钥即可调用GPT、Claude、Gemini、Qwen、Deepseek、Grok等主流模型。
立即学习“PHP免费学习笔记(深入)”;
-
qwen-max:body 中input.messages是数组,每项含role(user/assistant)和content字符串 -
qwen-long:部分接口(如兼容模式)要求messages同样结构,但响应字段可能是output.choices[0].message.content,而非output.text - 必填字段:
model(如"qwen-max")、input(含messages)、parameters(可为{}或new stdClass()) - 常见错误:
messages写成对象而非数组、role拼错(如写成Role)、content为空字符串导致400
流式输出(SSE)怎么接住 chunk 数据
启用 stream: true 后,响应是分块的 JSON Lines(每行一个 JSON 对象),不能直接 json_decode(file_get_contents(...)):
- 必须用
cURL并设置CURLOPT_WRITEFUNCTION回调函数逐块处理 - 每块数据以
data: { ... }开头,需手动剥离前缀再json_decode($line, true) - 关键字段是
choices[0].delta.content(不是message),首次 chunk 可能只有id和object,content为空 - 别忘了在回调里调用
ob_flush(); flush();,否则浏览器收不到实时数据
最易被忽略的是:DashScope 的 error message 全部藏在响应体的 message 字段里,而不是 HTTP status text;哪怕返回 200,也可能含 "success": false 和具体失败原因,得先检查 $response['error'] 或 $response['message'] 才能定位问题。


















