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

Google Vision API调用报403错误 求PHP控制器中key.json使用方法

问题原因

你遇到的403 PERMISSION_DENIED 错误,核心是Google Vision服务端没有拿到合法的身份验证凭据,你用服务账号密钥文件初始化的方式逻辑是对的,问题基本出在密钥路径、密钥权限或者项目配置上。

排查&解决步骤

  • 第一步:修正密钥文件路径

你当前代码中用的file_get_contents("key.json")是相对路径,取值是相对于PHP入口文件(比如Laravel框架的public/index.php)的路径,不是控制器文件的路径,90%的概率是程序没有读取到正确的密钥文件。
先加调试代码确认文件是否能被读取:

dd(file_exists("key.json"));

如果返回false,就替换成绝对路径,以Laravel框架为例,把key.json放在项目根目录,用base_path()生成绝对路径:

$keyPath = base_path('key.json');

其他框架可以用对应获取项目根目录的方法,或者直接写完整的服务器绝对路径。

  • 第二步:确认密钥和项目配置合法

    1. 确认你的Google Cloud项目已经开通了「Cloud Vision API」,未开通的话即使密钥正确也会报权限错误
    2. 确认key.json是从Google Cloud控制台「IAM与管理→服务账号」页面生成的,且对应服务账号已经分配了Vision API用户或更高权限的角色
    3. 确认服务器的PHP进程有读取key.json的权限,给文件设置644权限即可,不要放在public等公开可访问的目录避免密钥泄露
  • 第三步:优化冗余代码

你当前代码里第一行的base64编码操作完全没有用到,属于冗余代码可以直接删除,修正后的完整参考代码如下:

if($request->hasFile('image')){
    // 替换为你实际的密钥文件绝对路径
    $keyPath = base_path('key.json');
    if (!file_exists($keyPath)) {
        dd('密钥文件不存在,请检查路径配置');
    }
    // 初始化Vision客户端
    $vision = new VisionClient([
        'keyFile' => json_decode(file_get_contents($keyPath), true)
    ]);
    // 读取上传图片资源
    $imageResource = fopen($request->file('image')->getPathname(), 'r');
    $image = $vision->image($imageResource, ['DOCUMENT_TEXT_DETECTION']);
    $result = $vision->annotate($image);
    dd($result);
}
  • 备用验证方案

如果修正后还是报错,可以直接用密钥参数初始化客户端,验证是否是密钥本身的问题:

$vision = new VisionClient([
    'projectId' => '你的Google Cloud项目ID',
    'credentials' => [
        'client_email' => 'key.json中的client_email字段值',
        'private_key' => 'key.json中的private_key字段值,注意保留首尾的密钥标识字符串'
    ]
]);

额外注意事项

如果你的服务器部署在中国大陆境内,需要确认服务器能正常访问Google的API服务端点,网络不通也可能引发身份验证失败类的报错。

内容的提问来源于stack exchange,提问作者Barkat Ullah Hossain

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 18:42:02