为什么我的PHP实现的Discord OAuth2授权请求没有返回任何内容?
问题排查及修复方案
核心错误点
- 请求头与传参格式不匹配:代码声明
Content-Type: application/x-www-form-urlencoded,但实际传输的是JSON格式字符串,Discord OAuth2 接口无法识别该格式的参数,直接拒绝请求。 - cURL 配置错误:错误使用
CURLOPT_RETURNHEADERS参数,未开启CURLOPT_RETURNTRANSFER,导致请求结果无法正常返回,出错时直接返回空值。 - 缺少必填参数:使用
authorization_code模式换取token时,必须传入和授权请求阶段完全一致的redirect_uri参数,你现有代码未携带该参数。 - 缺少错误排查逻辑:未捕获cURL执行错误与接口返回的HTTP状态码,无法定位具体失败原因。
修复后代码
$code = $_GET['code']; // 替换为授权请求时使用的redirect_uri,必须和之前提交的完全一致 $redirect_uri = 'https://你的域名/回调地址'; $headers = [ "Accept: application/json", ]; // 参数使用数组格式,后续自动转为x-www-form-urlencoded格式 $data = [ "grant_type" => "authorization_code", "code" => $code, "client_secret" => $clientsecret, "client_id" => $clientid, "redirect_uri" => $redirect_uri ]; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, 'https://discord.com/api/oauth2/token'); curl_setopt($ch, CURLOPT_POST, true); // 开启响应内容返回,不直接输出到页面 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 本地调试时可开启关闭SSL校验,生产环境建议移除该行 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); // 自动将数组转为符合要求的x-www-form-urlencoded格式 curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data)); $response = curl_exec($ch); // 打印cURL层面的错误信息 if(curl_errno($ch)) { echo 'cURL错误:' . curl_error($ch); } // 打印HTTP状态码,4xx为参数错误,5xx为Discord服务端错误 $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); echo 'HTTP状态码:' . $http_code . '<br>'; curl_close($ch); // 打印完整响应结果 var_dump($response);
额外验证点
- 确认获取到的
$_GET['code']未过期,Discord授权code有效期仅5分钟,且只能使用一次。 - 确认你的服务器可以正常访问Discord公共接口,无网络层面的访问限制。
内容的提问来源于stack exchange,提问作者Witz
相关产品推荐
相关产品推荐

