如何将Curl返回结果中的单个值存入PHP变量?
问题解决:从Curl返回的JSON中提取access_token
你的代码存在几个关键问题,导致无法成功提取access_token,下面是问题分析和修正方案:
问题点分析
- 重复发起Curl请求:你先后执行了
$body = curl_exec($ch);和$result = curl_exec($ch);,这会触发两次API请求,不仅浪费资源,还可能导致第二次请求返回异常结果。 - 未解析JSON字符串:Curl返回的是JSON格式的字符串,并非PHP数组或对象,所以
is_array($result) || is_object($result)的判断永远不成立,foreach循环根本不会执行。 - HTTP头设置顺序错误:你在第一次Curl执行后才设置
CURLOPT_HTTPHEADER,导致第一次请求没有携带正确的请求头,完全不符合逻辑。
修正后的代码
<?php $ch = curl_init(); // 一次性设置所有Curl选项 curl_setopt($ch, CURLOPT_URL, 'https://api.dropbox.com/oauth2/token'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, "refresh_token=<REFRESH HERE>&grant_type=refresh_token&client_id=<KEY HERE>&client_secret=<SECRET HERE>"); // 提前设置请求头,确保在请求发起前生效 $headers = array(); $headers[] = 'Content-Type: application/x-www-form-urlencoded'; curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); // 仅执行一次Curl请求 $result = curl_exec($ch); if (curl_errno($ch)) { echo '错误:' . curl_error($ch); } else { // 将JSON字符串解析为关联数组(第二个参数为true) $decodedData = json_decode($result, true); // 校验解析结果并提取目标字段 if (is_array($decodedData) && isset($decodedData['access_token'])) { echo '提取到的access_token:' . $decodedData['access_token']; } else { echo 'JSON解析失败或返回数据中不存在access_token'; // 如需排查问题,可临时打印原始返回结果 // echo '原始返回数据:' . $result; } } curl_close($ch); ?>
关键说明
- 用
json_decode($result, true)将JSON字符串转为关联数组,第二个参数设为true可以确保返回数组而非对象,直接通过键名即可访问目标值。 - 不需要foreach循环,因为API返回的是单个JSON对象,而非数组列表,直接通过
$decodedData['access_token']就能拿到结果。 - 增加
isset($decodedData['access_token'])判断,避免API返回异常数据时出现报错。
内容的提问来源于stack exchange,提问作者higashikata
相关产品推荐
相关产品推荐

