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代码里的几个问题
我看了你的代码,有几个小细节导致请求可能不正常:
- CURL默认直接输出响应,不会返回内容:
curl_exec($ch)默认会把结果直接打印出来,而不是赋值给$result,所以你后面的json_decode其实是在解码一个布尔值,肯定出问题。必须加上curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);,这样curl才会把响应内容返回给变量。 - 手动拼接POST字段容易出错:你自己循环拼接
fields_string的方式,可能会因为特殊字符转义的问题出错,不如直接用PHP内置的http_build_query($fields)来处理,它会自动处理转义和拼接。 - 缺少错误处理:加上一些调试代码,能帮你快速定位问题,比如检查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=requestscope要根据你需要的权限来填,比如叫车需要request权限,你得在后台先把这些权限添加到应用里。用户授权后,才会跳回你的回调页面,拿到有效的code,再执行你这段换token的代码。
最后的调试技巧
如果还是不行,你可以用Postman之类的工具,手动模拟POST请求到https://login.uber.com/oauth/v2/token,把所有参数填进去,看看能不能拿到token。如果Postman能成功,那就是代码的问题;如果Postman也返回invalid_grant,那肯定是后台配置或者code的问题。
内容的提问来源于stack exchange,提问作者phasco phaisco
相关产品推荐
相关产品推荐

