PHP调用GA4 Data API v1 runReport获取纯JSON返回方法
问题说明
PHP环境下使用Google Analytics Data API v1对接GA4,期望获取纯JSON格式的报表数据,但调用runReport接口返回的响应对象直接打印仅输出{},仅能通过SDK提供的预定义类方法读取字段数值,需要可行方案获取纯JSON格式返回结果。
现有实现代码如下:
<?php putenv('GOOGLE_APPLICATION_CREDENTIALS=xxx.json'); require_once 'vendor\autoload.php'; use Google\Analytics\Data\V1beta\BetaAnalyticsDataClient; use Google\Analytics\Data\V1beta\DateRange; use Google\Analytics\Data\V1beta\Dimension; use Google\Analytics\Data\V1beta\Metric; use Google\Cloud\BigQuery\Connection\Rest; $property_id = 'xxx'; // GA4 property ID // Using a default constructor instructs the client to use the credentials // specified in GOOGLE_APPLICATION_CREDENTIALS environment variable. $client = new BetaAnalyticsDataClient(); // Make an API call. $response = $client->runReport([ 'property' => 'properties/' . $property_id, 'dateRanges' => [ new DateRange([ 'start_date' => '2022-06-30', 'end_date' => 'today', ]), ], 'dimensions' => [ new Dimension( [ 'name' => 'city', ] ), ], 'metrics' => [ new Metric( [ 'name' => 'activeUsers', ] ) ] ]); print 'Report result: ' . PHP_EOL; printVisitorsLocationInNumber($response); function printVisitorsLocationInNumber($resp) { foreach ($resp->getRows() as $row) { echo $row->getDimensionValues()[0]->getValue() . ' ' . $row->getMetricValues()[0]->getValue() . PHP_EOL . '</br>';; } }
原因说明
Google Analytics Data API PHP SDK返回的响应是Protobuf格式的实体对象,不属于普通可直接遍历序列化的PHP stdClass对象,因此直接打印、调用json_encode都会得到空的{}结果。
解决方案
方案1:调用SDK内置序列化方法(推荐)
所有Protobuf消息类都内置了serializeToJsonString()方法,可以直接输出和GA官方API响应结构完全一致的标准JSON字符串,无需手动逐字段映射。
调用示例:
// 接口请求完成后直接获取JSON字符串 $jsonResult = $response->serializeToJsonString(); // 直接输出JSON header('Content-Type: application/json'); echo $jsonResult; // 如果需要转成PHP数组处理,二次解码即可 $arrayResult = json_decode($jsonResult, true);
注意:如果调用方法不存在,执行composer update google/analytics-data google/protobuf升级依赖到最新稳定版即可。
方案2:手动组装结构化数据(适配自定义结构需求)
如果只需要提取指定字段、或者需要自定义JSON结构,可以遍历响应对象的内置方法提取字段,组装为PHP数组后再转JSON:
function getCustomReportJson($resp): string { $data = [ 'dimension_headers' => [], 'metric_headers' => [], 'rows' => [], 'total_row_count' => $resp->getRowCount() ]; // 提取维度表头 foreach ($resp->getDimensionHeaders() as $dimensionHeader) { $data['dimension_headers'][] = $dimensionHeader->getName(); } // 提取指标表头 foreach ($resp->getMetricHeaders() as $metricHeader) { $data['metric_headers'][] = $metricHeader->getName(); } // 提取明细行 foreach ($resp->getRows() as $row) { $dimValues = []; foreach ($row->getDimensionValues() as $dimValue) { $dimValues[] = $dimValue->getValue(); } $metricValues = []; foreach ($row->getMetricValues() as $metricValue) { $metricValues[] = $metricValue->getValue(); } $data['rows'][] = [ 'dimensions' => array_combine($data['dimension_headers'], $dimValues), 'metrics' => array_combine($data['metric_headers'], $metricValues) ]; } return json_encode($data, JSON_UNESCAPED_UNICODE); } // 调用示例 $customJson = getCustomReportJson($response); echo $customJson;
代码修正提示
原代码中引入的Google\Cloud\BigQuery\Connection\Rest属于BigQuery服务相关类,和GA4报表接口调用无关,可以删除避免不必要的类加载开销。
内容的提问来源于stack exchange,提问作者Voon Tao Tan
相关产品推荐
相关产品推荐

