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');
其他框架可以用对应获取项目根目录的方法,或者直接写完整的服务器绝对路径。
第二步:确认密钥和项目配置合法
- 确认你的Google Cloud项目已经开通了「Cloud Vision API」,未开通的话即使密钥正确也会报权限错误
- 确认
key.json是从Google Cloud控制台「IAM与管理→服务账号」页面生成的,且对应服务账号已经分配了Vision API用户或更高权限的角色 - 确认服务器的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
相关产品推荐
相关产品推荐

