<p>PHP 8.2 + ThinkPHP 集成通义千问 API 需手动封装 HMAC-SHA256 签名请求类,严格遵循 DashScope 认证规范:使用 sk- 开头 API Key、固定接口地址、JSON body 及毫秒级时间戳校验。</p>

PHP 8.2 + ThinkPHP 项目集成通义千问 API,核心是绕过官方无 PHP SDK 的限制,用原生 cURL 构造带签名的 HTTPS 请求。不能直接填个 URL 就发,必须严格遵循 DashScope 的认证规范——尤其是 HMAC-SHA256 签名、固定接口地址、JSON body 格式和时间戳校验。
1. 前置准备:开通服务 + 获取密钥
在 ThinkPHP 项目启动前,必须完成这三件事:
- 登录阿里云百炼控制台,完成实名认证并开通「通义千问」服务(如 qwen-plus 或 qwen-max)
- 进入「API 密钥管理」页面,创建新密钥 → 复制以 sk- 开头的完整字符串(这是 DASHSCOPE_API_KEY,不是 AccessKey)
- 将密钥写入 ThinkPHP 的环境配置(推荐
.env文件):DASHSCOPE_API_KEY=sk-xxxxxxxxxxxxxxxxxxxxxxxx
2. 封装签名请求类(关键步骤)
ThinkPHP 不自带签名逻辑,需手动封装一个 QwenClient 类(建议放在 app/common 或 app/library 下):
- 构造规范化字符串:按字母序拼接
X-Ca-Nonce、X-Ca-Timestamp、X-Ca-Key的 key:value,加两个换行;再拼上POST、路径/api/v1/services/aigc/text-generation/generation、空查询参数、body 的 SHA256 值 - 用
hash_hmac('sha256', $canonicalString, $secret, true)计算原始签名,再base64_encode() - 注意:
$secret是你的 API Key 字符串本身(无需解码),但 body 必须是 UTF-8 编码的合法 JSON 字符串(别传 PHP 数组)
3. 在控制器中调用(示例)
例如在 app/controller/Ai.php 中:
立即学习“PHP免费学习笔记(深入)”;
- 读取
env('DASHSCOPE_API_KEY')获取密钥 - 组织标准请求体:
['model' => 'qwen-plus', 'input' => ['messages' => [['role' => 'user', 'content' => $question]]]] - 调用封装好的
QwenClient::request($body),捕获返回的output.text - 返回 JSON 给前端:
return json(['code' => 0, 'data' => $response['output']['text']]);
4. 注意事项与避坑点
ThinkPHP 项目容易忽略但会导致 401/400 的细节:
- 请求地址必须是 https://dashscope.aliyuncs.com/api/v1/services/aigc/text-generation/generation(不是控制台里看到的“服务地址”)
- Header 中必须包含
X-Ca-Key(值为 sk-xxx)、X-Ca-Nonce(随机字符串)、X-Ca-Timestamp(毫秒级时间戳,误差 ≤ 900 秒) - Content-Type 固定为
application/json,且 body 要用json_encode($data, JSON_UNESCAPED_UNICODE)保证中文不乱码 - 别用
file_get_contents或简单curl_setopt($ch, CURLOPT_URL, ...)拼接参数——它不支持自定义 header 和签名
不复杂但容易忽略。只要签名对、地址对、body 对、时间戳在窗口内,ThinkPHP 项目就能稳定调通通义千问。



















