我正在尝试通过php脚本将日历事件添加到我的Google日历中。请注意,我可以直接通过Google测试page成功完成此操作,因此我认为我的日历设置正确。但是,当我尝试从php脚本执行此操作时,我无法获取OAuth2令牌。
以下脚本(主要来自Google示例)运行时没有错误,但总是会出现“Connect Me!”。链接。当我点击此链接时,它会转到验证屏幕,警告我此应用程序想要管理我的日历。我点击“接受”,然后点击我的日历。有点不方便,但如果这得到了OAuth令牌,那很好。
然后我回去再次运行脚本,希望访问令牌现在可用,但我得到的结果完全相同。无论我运行多少次这个脚本,我都不会获得令牌,我需要这些令牌来扩展脚本以将事件添加到日历中。
我已经在这里待了好几天了,我只是没有到达任何地方。有人可以帮忙吗?感谢。
<?php
require_once '../../src/Google_Client.php';
require_once '../../src/contrib/Google_CalendarService.php';
require_once '../../src/auth/Google_OAuth2.php';
session_start();
$client = new Google_Client();
$client->setApplicationName("Add Google Calendar Entries");
// Visit https://code.google.com/apis/console?api=calendar to generate your
// client id, client secret, and to register your redirect uri.
$client->setClientId('843319906820-1s1d737e77o71a3vaskf434k3ape1fk5.apps.googleusercontent.com');
$client->setClientSecret('AP5imn3e0TEWNyLTCNm8YJj6');
$client->setRedirectUri('https://www.google.com/calendar/');
$client->setDeveloperKey('AIzaSyDIw3ks7AmrIrRxjO9y2gWBhQDYHFWd-uc');
$client->setUseObjects(true);
$cal = new Google_CalendarService($client);
if (isset($_GET['logout'])) {
unset($_SESSION['token']);
}
if (isset($_GET['code'])) {
$client->authenticate($_GET['code']);
$_SESSION['token'] = $client->getAccessToken();
header('Location: http://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF']);
}
if (isset($_SESSION['token'])) {
$client->setAccessToken($_SESSION['token']);
}
if ($client->getAccessToken()) {
$calList = $cal->calendarList->listCalendarList();
print "<h1>Calendar List</h1><pre>" . print_r($calList, true) . "</pre>";
$_SESSION['token'] = $client->getAccessToken();
} else {
$authUrl = $client->createAuthUrl();
print "<a class='login' href='$authUrl'>Connect Me!</a>";
}
?>
编辑:试图实施Vinicius Pinto的建议。我已将我的重定向更改为直接指向此脚本。现在我收到了这个错误:
致命错误:带有消息的未捕获异常'Google_ServiceException' '调用GET时出错 https://www.googleapis.com/calendar/v3/users/me/calendarList?key=AIzaSyDIw3ks7AmrIrRxjO9y2gWBhQDYHFWd-uc: (403)访问未配置。请使用Google Developers Console 激活项目的API。'在 d:\主机\ 11347607 \ HTML \脚本\谷歌API的PHP客户端的\ src \ IO \ Google_REST.php:66 堆栈跟踪:#0 d:\主机\ 11347607 \ HTML \脚本\谷歌API的PHP客户端的\ src \ IO \ Google_REST.php(36): Google_REST :: decodeHttpResponse(Object(Google_HttpRequest))#1 d:\主机\ 11347607 \ HTML \脚本\谷歌API的PHP客户端的\ src \服务\ Google_ServiceResource.php(186): Google_REST :: execute(Object(Google_HttpRequest))#2 d:\主机\ 11347607 \ HTML \脚本\谷歌API的PHP客户端的\ src \的contrib \ Google_CalendarService.php(205): Google_ServiceResource-&gt; __ call('list',Array)#3 d:\主机\ 11347607 \ HTML \脚本\ Google处理API-PHP-客户\例子\日历\ simple.php(43): Google_CalendarListServiceResource-&gt; listCalen in d:\主机\ 11347607 \ HTML \脚本\谷歌API的PHP客户端的\ src \ IO \ Google_REST.php 在第66行
似乎我没有在开发者控制台中激活正确的API。我激活了Calendar API
和Google Cloud Storage JSON API
,没有其他任何内容。我没有看到任何其他相关的API,我不认为这条消息告诉我它想要哪些API。
编辑2:看起来我使用了错误的开发人员密钥。我已将其更改为服务器应用程序的密钥。现在我的错误是:
致命错误:带有消息的未捕获异常'Google_AuthException' '刷新OAuth2令牌时出错,消息:'{“error”: “invalid_client”}''in d:\主机\ 11347607 \ HTML \脚本\谷歌API的PHP客户端的\ src \权威性\ Google_OAuth2.php:288 堆栈跟踪:#0 d:\主机\ 11347607 \ HTML \脚本\谷歌API的PHP客户端的\ src \权威性\ Google_OAuth2.php(248): Google_OAuth2-&gt; refreshTokenRequest(数组)#1 d:\主机\ 11347607 \ HTML \脚本\谷歌API的PHP客户端的\ src \权威性\ Google_OAuth2.php(225): Google_OAuth2-&gt; refreshToken('1 / 6ZdJyZALqcbwW ...')#2 d:\主机\ 11347607 \ HTML \脚本\谷歌API的PHP客户端的\ src \服务\ Google_ServiceResource.php(167): Google_OAuth2-&gt; sign(对象(Google_HttpRequest))#3 d:\主机\ 11347607 \ HTML \脚本\谷歌API的PHP客户端的\ src \的contrib \ Google_CalendarService.php(205): Google_ServiceResource-&gt; __ call('list',Array)#4 d:\主机\ 11347607 \ HTML \脚本\谷歌API的PHP客户端\例子\日历\ simple.php(47): Google_CalendarListServiceResource-&gt; listCalendarList()in d:\主机\ 11347607 \ HTML \脚本\谷歌API的PHP客户端的\ src \权威性\ Google_OAuth2.php 在第288行
答案 0 :(得分:1)
$client->setRedirectUri()
应该会收到指向您的应用程序的网址,因为这是您在Google网页中授权应用程序后重定向到的网址。这就是您重定向到日历的原因,因为您使用的是日历网址。
您的脚本似乎已经期待$ _GET ['code'],因此请尝试将重定向网址设置为此脚本的网址。您还需要在开发人员控制台中的API下设置相同的网址 - &gt;凭证。
当您使用值代码调用$client->authenticate($_GET['code']);
时,您只会获得一个令牌。
看看this lib I just commited to Github,这是一个早期版本,但它运行正常(我正在使用YouTube访问)。它正在使用new official library。
更新:正如评论中所述,即使所有Google示例代码都设置了开发人员密钥,但实际上并不需要开发人员密钥。