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

Laravel生产环境调用Google获取用户信息报错:URI must be a string or UriInterface

问题分析与解决方案

核心原因

报错"URI must be a string or UriInterface"大概率是因为request('access_token')在生产环境返回了null、非字符串类型或者空值,导致Guzzle在构建请求URL时无法生成有效的URI。本地环境能正常运行,说明本地传入的access_token是合法的字符串,而生产环境存在参数缺失或类型异常的情况。

解决方案

1. 验证并处理access_token参数

在请求Google接口前,先确保access_token存在且为字符串类型:

use GuzzleHttp\Client;
use Illuminate\Support\Facades\Log;

// 记录token值用于排查(生产环境可临时开启)
Log::info('Access Token received: ', ['token' => request('access_token')]);

$accessToken = request('access_token');
// 验证参数有效性
if (empty($accessToken) || !is_string($accessToken)) {
    abort(400, 'Invalid access token');
}

$client = new Client();
$requestAPI = $client->get('https://www.googleapis.com/oauth2/v1/tokeninfo', [
    'headers' => [
        'Content-Type' => 'application/json',
    ],
    'query' => [
        'access_token' => $accessToken
    ]
]);

2. 强制转换参数类型(快速临时修复)

如果确定参数只是类型问题,可以强制转换为字符串避免报错:

'access_token' => (string) request('access_token', '')

注意:如果access_token为空,Google接口仍会返回错误,但至少能解决当前的URI格式问题。

3. 检查Guzzle版本一致性

确认生产环境的Guzzle版本与本地一致。Laravel 8默认依赖Guzzle 7.x,可通过composer show guzzlehttp/guzzle查看版本,若版本差异较大,执行composer update guzzlehttp/guzzle同步版本。

4. 排查生产环境请求上下文

如果是在非HTTP请求上下文(如队列任务、命令行)中调用这段代码,request()助手函数无法获取到请求参数,会直接返回null,此时需要通过其他方式传递access_token。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 14:55:14