通过Curl PHP无法获取Quickbooks API授权码,浏览器访问正常
问题:PHP Curl调用Quickbooks OAuth2授权接口返回空字符串
我需要获取Quickbooks API的授权码来换取access token,进而发起API请求。手动在浏览器粘贴授权链接能正常获取授权码,但用PHP Curl调用时返回1400字符的空字符串。
Quickbooks API官方示例请求
curl -X POST 'https://appcenter.intuit.com/connect/oauth2? client_id=Q3ylJatCvnkYqVKLmkxxxxxxxxxxxxxxxkYB36b5mws7HkKUEv9aI&response_type=code& scope=com.intuit.quickbooks.accounting& redirect_uri=https://www.mydemoapp.com/oauth-redirect& state=security_token%3D138r5719ru3e1%26url%3Dhttps://www.mydemoapp.com/oauth-redirect'
替换自有凭证后编写了PHP Curl代码,浏览器访问链接能获取授权码并换取access token,但后端调用失败。尝试将redirect_uri设为当前页面地址https://roifelawgroup.com/clientform/login/info_submit.php及主域名https://roifelawgroup.com均无效,移除CURLOPT_FOLLOWLOCATION选项会收到301永久重定向错误。
我的PHP Curl代码
function authcode(){ $url = "https://appcenter.intuit.com/connect/oauth2?client_id=ABfQBA8VYPPUETO5isi2v8p39lQwEsw1ozL7NhZxxxxxx&response_type=code&scope=com.intuit.quickbooks.payment&redirect_uri=https://roifelawgroup.com&state=security_token%3D138r5719ru3e1%26url%3Dhttps://roifelawgroup.com"; $curl = curl_init($url); curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_POST, true); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true); // 移除这行会收到301永久重定向错误 $headers = array( "Content-Length: 0", ); curl_setopt($curl, CURLOPT_HTTPHEADER, $headers); // 仅用于调试! curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); $resp = curl_exec($curl); curl_close($curl); var_dump($resp); }
问题分析与解决方案
核心问题点
- 请求方法错误:Quickbooks OAuth2授权码流程的第一步(获取授权码)必须用GET请求,而非POST。你当前代码强制设置了
CURLOPT_POST, true,这是核心错误。 - 无法模拟用户交互:授权码流程需要用户手动登录Quickbooks账号并完成授权操作,后端Curl调用无法模拟这一步,直接调用只会返回未渲染的登录页面HTML(看起来像空字符串是因为页面依赖前端渲染)。
正确实现步骤
- 修正请求逻辑:后端不能直接调用接口拿授权码,正确流程是:
- 后端生成合法的授权URL,引导前端跳转至该URL;
- 用户在Quickbooks页面完成登录授权后,会被重定向到你预设的
redirect_uri,此时URL参数中会携带code(授权码); - 后端在
redirect_uri对应的页面中提取code,再用这个code调用接口换取access token。
修正后的代码示例
生成授权URL并引导用户跳转
function getAuthUrl(){ $client_id = "ABfQBA8VYPPUETO5isi2v8p39lQwEsw1ozL7NhZxxxxxx"; $scope = "com.intuit.quickbooks.payment"; $redirect_uri = urlencode("https://roifelawgroup.com/clientform/login/info_submit.php"); $state = urlencode("security_token=138r5719ru3e1&url=https://roifelawgroup.com"); $auth_url = "https://appcenter.intuit.com/connect/oauth2?client_id={$client_id}&response_type=code&scope={$scope}&redirect_uri={$redirect_uri}&state={$state}"; // 跳转至Quickbooks授权页面 header("Location: {$auth_url}"); exit; }
在redirect_uri页面中获取授权码并换取token
// 在https://roifelawgroup.com/clientform/login/info_submit.php中执行 if(isset($_GET['code'])){ $code = $_GET['code']; $client_id = "ABfQBA8VYPPUETO5isi2v8p39lQwEsw1ozL7NhZxxxxxx"; $client_secret = "你的client_secret"; $redirect_uri = "https://roifelawgroup.com/clientform/login/info_submit.php"; $token_url = "https://oauth.platform.intuit.com/oauth2/v1/tokens/bearer"; $post_data = array( 'grant_type' => 'authorization_code', 'code' => $code, 'redirect_uri' => $redirect_uri, 'client_id' => $client_id, 'client_secret' => $client_secret ); $curl = curl_init($token_url); curl_setopt($curl, CURLOPT_POST, true); curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($post_data)); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); // 生产环境建议开启SSL验证 curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, true); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, true); $resp = curl_exec($curl); $token_data = json_decode($resp, true); // 输出token信息,可根据业务逻辑存储 var_dump($token_data); }
内容的提问来源于stack exchange,提问作者Steve
相关产品推荐
相关产品推荐

