请求Bearer Token时出现Uncaught TypeError:无法访问字符串类型偏移量
解决Bearer Token请求代码中的致命错误
原代码的核心问题
- 注释掉了
$data = curl_exec($ch);,导致$data未被赋值,直接对其执行数组操作会触发未定义变量/无法对非数组类型进行数组操作的致命错误 - 接口返回的是JSON字符串,不能直接当作数组修改,必须先解码为关联数组
- 直接将数组写入文件会导致文件内容为
Array,需要先编码为JSON格式 - 逻辑顺序混乱,修改字段、保存文件、解码的步骤完全颠倒
修正后的完整代码
function requestBearerToken() { global $username, $password; $base_url = 'https://example-url.com/endpoint'; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $base_url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_POST, 1); $headers = array( 'Content-Type: application/json', 'Authorization: Basic ' . base64_encode("$username:$password"), ); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); // 获取接口的JSON响应 $response = curl_exec($ch); // 检查curl请求是否失败 if(curl_errno($ch)) { echo 'Curl错误: ' . curl_error($ch); curl_close($ch); return; } curl_close($ch); // 将JSON字符串解码为关联数组 $data = json_decode($response, true); // 检查JSON解码是否成功 if(json_last_error() !== JSON_ERROR_NONE) { echo 'JSON解码错误: ' . json_last_error_msg(); return; } // 添加自定义的过期时间字段(若需数组形式则改为$data['expires_on'][0]) $data['expires_on'] = date("d-m-Y H:i:s", time() + 580); // 将修改后的数组编码为美观的JSON格式并保存 file_put_contents("bearer.json", json_encode($data, JSON_PRETTY_PRINT)); // 获取并输出token相关数据 $token = $data['access_token']; print_r($data); }
关键修改说明
- 恢复了
curl_exec的调用,确保拿到接口返回的JSON数据 - 增加了curl请求和JSON解码的错误检查,方便排查问题
- 严格遵循「请求数据→解码为数组→修改字段→编码为JSON→保存文件」的逻辑顺序
- 写入文件时用
json_encode处理数组,保证文件内容是合法的JSON格式 - 若业务确实需要
expires_on为数组形式,可将赋值语句改为$data['expires_on'][0] = date("d-m-Y H:i:s", time() + 580);
内容的提问来源于stack exchange,提问作者Luuc
相关产品推荐
相关产品推荐

