对于任何找到THI的人 - 此错误是由于.p12在Win7盒子上下载后损坏。下载到 unix 计算机后,证书工作正常。
我已经遵循了大约一百万个不同的指南,试图让它工作。
我正在尝试使用服务帐户连接到Google Analytics API。
我在控制台中创建了相关的"项目",因为该项目需要对相关 API 的访问权限。
在凭据中,我在OAuth部分添加了服务帐户,下载了p12密钥并存储在服务器上。
当我运行代码时:
//start the google v3 api server authorization with the .p12 key
$client = new Google_Client();
$client->setApplicationName("AnalyticsAPI");
$key = __DIR__ . '/google-keys/AnalyticsAPI-XXXXXX.p12';
$credentials = new Google_Auth_AssertionCredentials(
'101XXXXXXXXXXXXXXXXXXXXXnq4omne@developer.gserviceaccount.com',
array('https://www.googleapis.com/auth/analytics.readonly'),
$key
);
$client->setAssertionCredentials($credentials);
//auto refresh if old
if($client->getAuth()->isAccessTokenExpired()) {
$client->getAuth()->refreshTokenWithAssertion($credentials);
}
//start the analytics shtuff
$service = new Google_Service_Analytics($client);
$accounts = $service->management_accountSummaries->listManagementAccountSummaries();
//Adding Dimensions
$params = array('dimensions' => 'ga:pagePath');
// requesting the data
$data = $service->data_ga->get("ga:$profile_id", $start_date, $end_date, "ga:users,ga:sessions", $params );
print_r($data);
错误来自第 52 行的"Google/Signer/P12.php">
Unable to parse the p12 file. Is this a .p12 file? Is the password correct? OpenSSL error: error:0D0680A8:asn1 encoding routines:ASN1_CHECK_TLEN:wrong tag in /XXXXX/classes/google-api-php-client-master/src/Google/Signer/P12.php on line 52
错误是从 ...签名者/P12.php@ 49:
// This throws on error
$certs = array();
if (!openssl_pkcs12_read($p12, $certs, $password)) {
throw new Google_Auth_Exception(
"Unable to parse the p12 file. " .
"Is this a .p12 file? Is the password correct? OpenSSL error: " .
openssl_error_string()
);
}
当我提取相关代码尝试读取 .p12 文件并自行运行时,我收到相同的错误:
$certs = array();
openssl_pkcs12_read($key, $certs, 'notasecret');
print_r($certs);
echo openssl_error_string();
die(x);
Array ( ) error:0D0680A8:asn1 encoding routines:ASN1_CHECK_TLEN:wrong tag
我完全被难住了。阅读有关该问题的其他一些帖子,例如:获得"无法解析 p12 文件..." 谷歌-api-php-client 出错
我试过了
- 确保权限正确。
-
file_get_contents($key)
,然后传递到产生相同结果的openssl_pkcs12_read
!
有人有任何线索吗?
- 确保您拥有来自 github 的最新 clint lib
- 授予服务帐号电子邮件地址在帐号级别读取谷歌分析的权限
-
试试这个教程谷歌服务帐户与PHP的
session_start(); require_once 'Google/Client.php'; require_once 'Google/Service/Analytics.php'; /************************************************ The following 3 values an befound in the setting for the application you created on Google Developers console. Developers console. The Key file should be placed in a location that is not accessable from the web. outside of web root. web root. In order to access your GA account you must Add the Email address as a user at the ACCOUNT Level in the GA admin. ************************************************/ $client_id = '1046123799103-nk421gjc2v8mlr2qnmmqaak04ntb1dbp.apps.googleusercontent.com'; $Email_address = '1046123799103-nk421gjc2v8mlr2qnmmqaak04ntb1dbp@developer.gserviceaccount.com'; $key_file_location = '629751513db09cd21a941399389f33e5abd633c9-privatekey.p12'; $client = new Google_Client(); $client->setApplicationName("Client_Library_Examples"); $key = file_get_contents($key_file_location); // seproate additional scopes with a comma $scopes ="https://www.googleapis.com/auth/analytics.readonly"; $cred = new Google_Auth_AssertionCredentials( $Email_address, array($scopes), $key ); $client->setAssertionCredentials($cred); if($client->getAuth()->isAccessTokenExpired()) { $client->getAuth()->refreshTokenWithAssertion($cred); } $service = new Google_Service_Analytics($client); $accounts = $service->management_accountSummaries->listManagementAccountSummaries(); //calulating start date $date = new DateTime(date("Y-m-d")); $date->sub(new DateInterval('P10D')); //Adding Dimensions $params = array('dimensions' => 'ga:userType'); // requesting the data $data = $service->data_ga->get("ga:78110423", $date->format('Y-m-d'), date("Y-m-d"), "ga:users,ga:sessions", $params ); ?><html> <?php echo $date->format('Y-m-d') . " - ".date("Y-m-d"). "n";?> <table> <tr> <?php //Printing column headers foreach($data->getColumnHeaders() as $header){ print "<td>".$header['name']."</td>"; } ?> </tr> <?php //printing each row. foreach ($data->getRows() as $row) { print "<tr><td>".$row[0]."</td><td>".$row[1]."</td><td>".$row[2]."</td></tr>"; } //printing the total number of rows ?> <tr><td colspan="2">Rows Returned <?php print $data->getTotalResults();?> </td></tr> </table> </html>
从前面提到的教程中翻录的代码。