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

Uber API返回invalid_grant错误,求排查解决方案

解决Uber API返回invalid_grant错误的问题

我完全懂你的感受,Uber的API文档确实经常让人摸不着头脑,遇到invalid_grant这种模糊的错误更是头疼。咱们一步步来排查问题,先从最容易出错的地方开始:

一、Uber开发者后台必须检查的配置

这些是很多人忽略的基础配置,也是invalid_grant的高发原因:

  • 回调地址必须完全匹配:你代码里的redirect_uri是http://localhost:3000/auth/uber/callback,一定要去Uber开发者后台的应用设置里,把这个地址原封不动填进去——包括http(不能写成https)、端口3000、后面的路径,甚至大小写都不能差一点。Uber对这个匹配要求特别严格。
  • 确认应用是激活状态:新创建的应用默认可能是草稿状态,你得在后台找到「激活应用」的按钮,把它切换成已激活,不然所有请求都会被拒绝。
  • 核对client_id和client_secret:把代码里的这两个值和后台里的复制一遍,别漏了下划线、连字符这些特殊字符,有时候复制的时候会不小心多了个空格或者少了个字符。

二、你的PHP代码里的几个问题

我看了你的代码,有几个小细节导致请求可能不正常:

  1. CURL默认直接输出响应,不会返回内容:curl_exec($ch)默认会把结果直接打印出来,而不是赋值给$result,所以你后面的json_decode其实是在解码一个布尔值,肯定出问题。必须加上curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);,这样curl才会把响应内容返回给变量。
  2. 手动拼接POST字段容易出错:你自己循环拼接fields_string的方式,可能会因为特殊字符转义的问题出错,不如直接用PHP内置的http_build_query($fields)来处理,它会自动处理转义和拼接。
  3. 缺少错误处理:加上一些调试代码,能帮你快速定位问题,比如检查curl是否执行成功,打印完整的响应内容。

这里是修正后的代码:

<?php 
// 先检查是否拿到了授权code
if (!isset($_GET['code'])) {
    echo "Error: 没有获取到授权code";
    exit;
}

$fields = array( 
    'client_secret' => '57KC5WGG3Ia455lc-i53e345345znXBB_0', 
    'client_id' => 'nnV4-_lsG9xl-SbAIQjIhwer234534534', 
    'grant_type' => 'authorization_code', 
    'redirect_uri' => "http://localhost:3000/auth/uber/callback", 
    'code' => $_GET['code'] 
); 

$ch = curl_init(); 
curl_setopt($ch,CURLOPT_URL, "https://login.uber.com/oauth/v2/token"); 
curl_setopt($ch,CURLOPT_POST, true); 
curl_setopt($ch,CURLOPT_POSTFIELDS, http_build_query($fields));
// 关键:让curl返回响应内容,而不是直接输出
curl_setopt($ch,CURLOPT_RETURNTRANSFER, true);
// 可选:关闭SSL验证(本地测试用,生产环境不要加)
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER, false);

$result = curl_exec($ch); 

// 检查curl是否执行成功
if ($result === false) {
    echo "CURL错误: " . curl_error($ch);
    curl_close($ch);
    exit;
}

$responseData = json_decode($result , TRUE); 

// 打印完整响应,方便调试
echo "完整响应: " . $result . "<br>";

if (isset($responseData["error"])) {
    echo "错误信息: " . $responseData["error"] . " - " . ($responseData["error_description"] ?? "无详细描述");
} else {
    $access_token = $responseData["access_token"]; 
    echo "Access Token :" . $access_token ; 
}

curl_close($ch); 
?>

三、流程上可能遗漏的步骤

  • code只能用一次:这个$_GET['code']是用户授权后Uber跳转到你回调页面时带过来的,它只能用来换一次access_token,用过就失效了。如果你反复刷新回调页面,用同一个code请求,就会返回invalid_grant。
  • 必须先走授权流程:你得先引导用户访问Uber的授权页面,比如通过一个链接跳转到:
    https://login.uber.com/oauth/v2/authorize?client_id=你的client_id&redirect_uri=http://localhost:3000/auth/uber/callback&response_type=code&scope=request
    
    这里的scope要根据你需要的权限来填,比如叫车需要request权限,你得在后台先把这些权限添加到应用里。用户授权后,才会跳回你的回调页面,拿到有效的code,再执行你这段换token的代码。

最后的调试技巧

如果还是不行,你可以用Postman之类的工具,手动模拟POST请求到https://login.uber.com/oauth/v2/token,把所有参数填进去,看看能不能拿到token。如果Postman能成功,那就是代码的问题;如果Postman也返回invalid_grant,那肯定是后台配置或者code的问题。

内容的提问来源于stack exchange,提问作者phasco phaisco

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:32:16