You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么我的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 14:36:05