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
相关产品推荐
相关产品推荐

