【发布时间】:2017-06-22 19:58:33
【问题描述】:
<?php
include('lead1.php');
require_once __DIR__ . '/vendor/autoload.php';
global $link;
$emailmsgsql = "SELECT *
FROM psleads WHERE agreeid = '6'";
$msgreqsres = mysqli_query($link, $emailmsgsql); // or die(mysql_error()0);
$msgreqs = $msgreqsres->fetch_assoc();
$start = $msgreqs['contractbegindate'] . ' ' . $msgreqs['contractbegintime'];
$end = $msgreqs['contractenddate'] . ' ' . $msgreqs['contractendtime'];
$startDT = new DateTime($start, new DateTimeZone('Pacific/Honolulu'));
$endDT = new DateTime($end, new DateTimeZone('Pacific/Honolulu'));
$startDTw3c = $startDT->format(DateTime::W3C);
$endDTw3c = $endDT->format(DateTime::W3C);
putenv('GOOGLE_APPLICATION_CREDENTIALS=./service-account.json');
define('CREDENTIALS_PATH', '~/calendar-php.json');
define('CLIENT_SECRET_PATH', './client_secret.json');
//define('CLIENT_SECRET_PATH', __DIR__ . '/client_secret.json');
$client = new Google_Client();
$client->setApplicationName("Paradise_Sound_Booking_Calendar");
$client->addScope('https://www.googleapis.com/auth/calendar');
$client->setAuthConfig(CLIENT_SECRET_PATH);
$client->setClientId('532085378494-s908fs5mu4rf2e2s60cecgaprg9pem1p.apps.googleusercontent.com');
$client->setDeveloperKey("XXXXX");//flo.gd
$client->useApplicationDefaultCredentials();
// Load previously authorized credentials from a file.
function expandHomeDirectory($path) {
$homeDirectory = getenv('HOME');
if (empty($homeDirectory)) {
$homeDirectory = getenv('HOMEDRIVE') . getenv('HOMEPATH');
}
return str_replace('~', realpath($homeDirectory), $path);
}
$credentialsPath = expandHomeDirectory(CREDENTIALS_PATH);
if (file_exists($credentialsPath)) {
$accessToken = json_decode(file_get_contents($credentialsPath), true);
} else {
// Request authorization from the user.
$authUrl = $client->createAuthUrl();
printf("Open the following link in your browser:\n%s\n", $authUrl);
print 'Enter verification code: ';
//$authCode = trim(fgets(STDIN));
$authCode = 'Manually pasted return code into script here';
// Exchange authorization code for an access token.
$accessToken = $client->fetchAccessTokenWithAuthCode($authCode);
// Store the credentials to disk.
if(!file_exists(dirname($credentialsPath))) {
mkdir(dirname($credentialsPath), 0700, true);
}
file_put_contents($credentialsPath, json_encode($accessToken));
printf("Credentials saved to %s\n", $credentialsPath);
}
$client->setAccessToken($accessToken);
// Refresh the token if it's expired.
if ($client->isAccessTokenExpired()) {
$client->fetchAccessTokenWithRefreshToken($client->getRefreshToken());
file_put_contents($credentialsPath, json_encode($client->getAccessToken()));
}
$service = new Google_Service_Calendar($client);
$event = new Google_Service_Calendar_Event(array(
'summary' => 'Booked Event ' . $msgreqs['contractbegindate'],
'start' => array(
'dateTime' => $startDTw3c,
//'dateTime' => '2015-05-28T09:00:00-07:00',
'timeZone' => 'Pacific/Honolulu',
),
'end' => array(
'dateTime' => $endDTw3c,
'timeZone' => 'Pacific/Honolulu',
)
));
$calendarId = 'iddnpsbinrifod2826eqo1kmoo@group.calendar.google.com';
$eventres = $service->events->insert($calendarId, $event);
echo json_encode($eventres);
?>
这是我用来测试将事件插入到我的谷歌日历中的 PHP 代码。
我以为我可以只使用一个 API 密钥,但谷歌似乎有这种令人费解的 OAUTH 方式,我只是想不通。我可以在我的 API Developers Console 中看到我所有的 403 错误。
有没有人有工作代码可以在我的日历中插入简单的事件。
上下文:
我将从 paypal 收到一个 IPN(完成),这将触发这个脚本,该脚本会将一个事件插入我的日历,而不是用户。任何人都可以在不向我介绍谷歌开发者文档的情况下帮助我吗?它们似乎很少,我一遍又一遍地阅读它们,但无济于解决我的问题。
这是我得到的错误:
致命错误:未捕获的异常“Google_Service_Exception”与 消息'{“错误”:{“错误”:[{“域”:“全局”,“原因”: “禁止”,“消息”:“禁止”}],“代码”:403,“消息”: “禁止” } } ' 在 /home/dahfrench/flo.gd/src/Google/Http/REST.php:118 堆栈跟踪:#0 /home/dahfrench/flo.gd/src/Google/Http/REST.php(94): Google_Http_REST::decodeHttpResponse(对象(GuzzleHttp\Psr7\Response), 对象(GuzzleHttp\Psr7\Request),'Google_Service_...')#1 [内部 功能]: Google_Http_REST::doExecute(Object(GuzzleHttp\Client), 对象(GuzzleHttp\Psr7\Request),'Google_Service_...')#2 /home/dahfrench/flo.gd/src/Google/Task/Runner.php(181): call_user_func_array(Array, Array) #3 /home/dahfrench/flo.gd/src/Google/Http/REST.php(58): Google_Task_Runner->run() #4 /home/dahfrench/flo.gd/src/Google/Client.php(789): Google_Http_REST::execute(Object(GuzzleHttp\Client), 对象(GuzzleHttp\Psr7\Request),'Google_Service_...',数组)#5 /home/dahfrench/flo.gd/src/Google/Service/Resource.php(232):粘进去 /home/dahfrench/flo.gd/src/Google/Http/REST.php 在第 118 行
【问题讨论】:
-
另外,在我做任何 OAuth 废话之前,我遇到了这个错误,因为我认为我需要谷歌建议的服务帐户身份验证来进行服务器到服务器的通信。
-
API 密钥用于访问公共数据(甚至可能不是 oauth),Oauth2 和服务帐户用于访问私人用户数据。
标签: php google-api google-calendar-api google-oauth google-api-php-client