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

PHP cURL调用Pardot API如何正确处理字符串响应提取错误码

解决方案

Pardot接口返回的字符串是标准JSON格式,直接用PHP内置json_decode解析即可提取业务错误码。你现有代码存在两处逻辑错误会干扰错误处理,一并修正后即可实现精细化错误分支判断。

现有代码的问题

  • cURL错误判断逻辑写反:curl_errno($curl)返回非0值才代表请求本身出错(网络超时、域名解析失败等),现有代码在请求无错误时进入错误分支,完全不符合预期
  • 错误分支中关闭的cURL句柄变量名错误:初始化的句柄是$curl,分支里写的是curl_close($ch),会触发未定义变量报错
  • CURLOPT_TIMEOUT设置为0代表无限等待,生产环境容易导致请求挂死,建议设置合理超时值

修正后的实现代码

核心逻辑是在拿到cURL响应后,先判断cURL层面的请求错误,再统一解析JSON响应,最后结合HTTP状态码、接口返回的业务code做分支处理:

public function create_prospect(array $fields = [])
{
    $access_token = get_option('pardot_api_key');
    if (empty($access_token)) {
        $access_token = $this->get_oauth_token();
    }
    if (empty($fields)) {
        return false;
    }

    $keys = [];
    foreach ($fields as $key => $value) {
        $keys[] = $key;
    }
    $keys = implode(",", $keys);
    
    $curl = curl_init();
    curl_setopt($curl, CURLOPT_URL, 'https://pi.pardot.com/api/v5/objects/prospects?fields=' . $keys);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($curl, CURLOPT_ENCODING, '');
    curl_setopt($curl, CURLOPT_MAXREDIRS, 10);
    curl_setopt($curl, CURLOPT_TIMEOUT, 30);
    curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
    curl_setopt($curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
    curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'POST');
    curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode(
        $fields,
        JSON_THROW_ON_ERROR
    ));
    curl_setopt($curl, CURLOPT_HTTPHEADER, [
        "Authorization: Bearer {$access_token}",
        "Pardot-Business-Unit-Id: " . FH_Pardot_Settings::get_settings()['business_unit_id'],
        "Content-Type: application/json",
    ]);
    
    $response = curl_exec($curl);
    $http_code = curl_getinfo($curl, CURLINFO_HTTP_CODE);
    
    // 处理cURL层面的请求错误
    if (curl_errno($curl)) {
        $error_msg = curl_error($curl);
        $this->write_log('PHP cURL Error: ' . $error_msg);
        curl_close($curl);
        return [
            'success' => false,
            'error_type' => 'curl_error',
            'message' => $error_msg
        ];
    }
    curl_close($curl);

    // 解析JSON格式响应
    $response_data = json_decode($response, true);
    // 兜底处理JSON解析失败场景
    if (json_last_error() !== JSON_ERROR_NONE) {
        $this->write_log('Pardot API response parse error: ' . json_last_error_msg() . ', raw response: ' . $response);
        return [
            'success' => false,
            'error_type' => 'parse_error',
            'message' => '响应格式解析失败'
        ];
    }

    // 非2xx状态码为接口请求失败,提取业务错误码做分支
    if ($http_code < 200 || $http_code >= 300) {
        $error_code = $response_data['code'] ?? 0;
        $error_msg = $response_data['message'] ?? '未知错误';
        $this->write_log("Pardot API error, code: {$error_code}, message: {$error_msg}, http code: {$http_code}");
        
        // 按错误码写对应处理逻辑
        switch ($error_code) {
            case 184:
                // access_token无效/过期,可在此处触发token刷新逻辑,重试当前请求
                break;
            // 其他错误码按需新增分支
            default:
                break;
        }

        return [
            'success' => false,
            'error_type' => 'api_error',
            'code' => $error_code,
            'message' => $error_msg,
            'http_code' => $http_code
        ];
    }

    // 请求成功,返回解析后的业务数据
    return [
        'success' => true,
        'data' => $response_data
    ];
}

关键说明

  • 调用json_decode时传入第二个参数true,会将JSON对象转换为PHP关联数组,直接通过下标即可取值,不需要额外操作
  • 所有取值都加了??兜底判断,即使接口返回格式不符合预期也不会触发PHP报错
  • 针对测试遇到的184错误码,可以在对应分支中加入自动刷新access_token、重试请求的逻辑,不需要人工介入即可恢复请求

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 13:51:26