京东云AI客服API必须使用京东云签名(JDSignature)认证,需用AccessKey、SecretKey、秒级时间戳、HTTP方法、请求路径及body的SHA256哈希共同生成,且SecretKey不可被URL编码,时间偏差须在15分钟内。

京东云 AI 客服 API 的认证方式怎么填
京东云 AI 客服不支持直接用 access_token 或 Cookie 调用,必须用「京东云签名(JDSignature)」——这是绝大多数 PHP 开发者卡住的第一步。
签名不是简单拼接密钥,它依赖 AccessKey、SecretKey、当前时间戳、HTTP 方法、请求路径和 body SHA256 哈希,缺一不可。官方 SDK 里 JdCloud\JdCloudClient 默认只支持 Java/Python,PHP 得自己实现或用社区轻量封装。
- 务必检查
SecretKey是否被 URL 编码过(比如含+或/),未解码会导致签名失败,错误信息是InvalidSignatureException - 时间戳必须是秒级(不是毫秒),且与京东云服务器时间偏差不能超过 15 分钟,否则返回
RequestExpired - 请求 header 中必须带
X-Jdcloud-Date(格式YYYYMMDDTHHMMSSZ)和Authorization字段,漏一个就 401
PHP 发起对话请求的最小可行代码长什么样
不用 SDK 也能跑通,核心就是构造好签名后发 POST 请求到 https://ai.jdcloud.com/api/v1/conversation。重点不是“能不能发”,而是 body 结构和字段是否符合京东云当前版本要求(v1 接口已迭代多次,旧文档里的 botId 已改为 botCode)。
以下是最简可运行示例(用 cURL,不依赖 Guzzle):
$apiUrl = 'https://ai.jdcloud.com/api/v1/conversation';
$body = json_encode([
'botCode' => 'your_bot_code_here',
'userId' => 'user_123',
'text' => '今天天气怎么样?'
]);
$headers = [
'Content-Type: application/json',
'X-Jdcloud-Date: ' . gmdate('Ymd\THis\Z'),
'Authorization: <your_generated_signature>'
];
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $apiUrl);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $body);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
</your_generated_signature>
-
botCode不是控制台看到的「机器人名称」,而是在「智能问答 > 机器人管理」页面 URL 里那段类似bot-abc123的 ID - 如果返回
{"code":400,"message":"invalid botCode"},大概率是botCode错了,或者该机器人没发布(未发布状态无法调用) - 响应体里真正的答案在
$data['result']['answerText'],不是data或content—— 字段名容易看错
如何处理多轮对话中的上下文维持
京东云 AI 客服默认不自动维护会话状态,每次请求都是无状态的。想让机器人记住上一句问的是“iPhone 价格”,下一句说“比华为便宜吗”能关联上,必须手动传 sessionId。
sessionId 是你自己生成的字符串(建议用 uniqid() + 用户标识哈希),只要同一用户后续请求都带相同值,服务端就会把它当做一个会话链路来处理。
- 不要用 PHP 的
session_id()直接当sessionId,因为京东云不读你的 PHP session 存储 - 如果发现机器人反复答非所问,先确认两次请求的
sessionId是否完全一致(注意大小写、空格、编码) - 长时间(>24h)未活跃的
sessionId会被服务端自动清理,再次使用需重新初始化
常见报错和对应排查点
调不通时别急着重写,先看错误码和 message 里有没有关键线索。京东云返回的 JSON 错误结构统一,但字段含义容易误解。
-
{"code":403,"message":"Forbidden"}→ 签名正确但权限不足:检查账号是否开通「AI 客服」服务、API 密钥是否绑定该子用户、资源组是否授权 -
{"code":429,"message":"Too Many Requests"}→ QPS 超限(免费版默认 5 QPS),不是网络问题,加usleep(200000)或用队列控频 -
{"code":500,"message":"Internal Error"}→ 大概率是text字段为空、超长(>512 字符)、含非法控制字符(如 \x00),先trim()再mb_substr($text, 0, 512)
真正麻烦的是签名逻辑本身——它藏在 header 构造细节里,出错不报具体哪步错了,只能靠打印中间变量逐段比对。这点最容易被忽略,也最花时间。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











