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

通过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);
 

}

问题分析与解决方案

核心问题点

  1. 请求方法错误:Quickbooks OAuth2授权码流程的第一步(获取授权码)必须用GET请求,而非POST。你当前代码强制设置了CURLOPT_POST, true,这是核心错误。
  2. 无法模拟用户交互:授权码流程需要用户手动登录Quickbooks账号并完成授权操作,后端Curl调用无法模拟这一步,直接调用只会返回未渲染的登录页面HTML(看起来像空字符串是因为页面依赖前端渲染)。

正确实现步骤

  1. 修正请求逻辑:后端不能直接调用接口拿授权码,正确流程是:
    • 后端生成合法的授权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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 00:06:25