Alexa技能返回INVALID_SKILL_RESPONSE错误排查求助
排查Alexa Skill返回INVALID_SKILL_RESPONSE的可能原因
我之前搭建Alexa Skill后端的时候也踩过这个坑,结合你的代码和Alexa的规范,几个最可能导致INVALID_SKILL_RESPONSE的原因如下:
JSON响应格式或编码问题
你的响应结构看起来符合基本要求,但细节上可能有疏漏:- 检查是否存在UTF-8 BOM:如果你的PHP文件开头有隐藏的BOM字符,返回的JSON会被多余字节污染,导致Alexa解析失败。用文本编辑器(比如VS Code)将文件编码设为“UTF-8无BOM”即可解决。
- 补充
shouldEndSession字段:虽然Alexa允许省略这个字段,但明确设置它能避免潜在的解析问题。修改你的响应数组试试:return response( [ 'version' => '1.0', 'response' => [ 'outputSpeech' => [ 'type' => 'PlainText', 'text' => 'Hello world', ], 'shouldEndSession' => false // 新增该字段 ] ], 200, ['Content-Type' => 'application/json'] ); - 确认JSON编码正确性:如果是自定义的响应逻辑,确保用
json_encode()时没有错误(比如设置JSON_UNESCAPED_UNICODE等参数),Laravel的response()->json()则无需担心这个问题。
HTTPS证书不符合要求
Alexa对HTTPS证书的校验非常严格:- 必须是公共可信CA颁发的证书,自签名证书会直接被拒绝。
- 证书域名必须与端点域名完全匹配(如果是子域名,证书需要包含通配符或对应子域名)。
- 证书链必须完整:很多服务器只安装了主证书,缺少中间证书,导致Alexa无法验证证书有效性。可以用SSL检测工具确认证书链是否完整。
响应中存在多余输出
检查你的PHP代码有没有在return response()之前输出任何内容——比如echo、var_dump,甚至是PHP标签外的空格、换行、注释。这些多余内容会破坏JSON结构,导致Alexa解析失败。例如:<?php // 这里的换行或空格会被输出到响应头之后 return response(...); ?> <!-- 标签外的注释也会被当作输出内容 -->确保PHP文件除了核心代码,没有任何额外输出。
请求验证未通过(间接导致响应无效)
虽然你的端点被触发了,但如果服务未正确验证Alexa的请求签名,亚马逊可能会拒绝你的响应。Alexa要求所有请求必须验证签名和来源合法性。你可以先在Alexa开发者控制台的「Endpoint」设置中关闭「Skill Request Validation」进行测试:如果关闭后响应正常,那就是签名验证逻辑出了问题,需要修复验证流程(比如同步服务器时间、确保能正确获取亚马逊的验证证书)。
内容的提问来源于stack exchange,提问作者Yue Zhuo
相关产品推荐
相关产品推荐

