插入事件时缺少Google日历的结束时间

时间:2017-03-11 18:33:18

标签: php http post google-calendar-api

我尝试在Google日历中插入一个事件。身份验证和获取事件的工作没有任何问题。不幸的是我收到以下错误消息:

{
  error: {
     errors: [
        {
          domain: "global",
          reason: "required",
          message: "Missing end time."
        }
     ],
     code: 400,
     message: "Missing end time."
   }
}

我在PHP中使用cURL请求该站点。要使用函数countArrayChars()计算请求的Content-Length。以下是我的代码:

$start = date("c", strtotime($start));
$end = date("c", strtotime($end));

$data_array = array(
  "end"=>array("dateTime"=>$end),
  "start"=>array("dateTime"=>$start),
  "summary"=>$name
);

$curl = curl_init();
curl_setopt_array($curl, array(
    CURLOPT_RETURNTRANSFER => 1,
    CURLOPT_URL => 'https://www.googleapis.com/calendar/v3/calendars/primary/events',
    CURLOPT_POST => 1,
    CURLOPT_HTTPHEADER => array("Content-length: ".countArrayChars($data_array),"Content-type: application/json","Authorization: Bearer $access_token\r\n"),
    CURLOPT_POSTFIELDS => $data_array
));
$resp = curl_exec($curl);
curl_close($curl);
echo $resp;

function countArrayChars(array $array){
    $charNumber = 0;
    array_walk_recursive($array, function($val, $key) use (&$charNumber)
    {
        $charNumber += strlen($val) + strlen($key);
    });
    return $charNumber;
}

我还尝试将数据设置为http_build_query,以及json_encode结果。不幸的是,这也没有用。

感谢您的每一个回复。

更新

$data_array = array(
  "end"=>array("dateTime"=>$end,"timeZone"=>"Europe/Zurich"),
  "start"=>array("dateTime"=>$start,"timeZone"=>"Europe/Zurich"),
  "summary"=>$name
);

更新2:

这是$end

的输出
string(25) "2017-03-10T00:00:00+01:00"

3 个答案:

答案 0 :(得分:1)

我不知道这是否会对您有所帮助,但这是我用来通过API向Google日历添加事件的代码:

$event = new Google_Service_Calendar_Event(array(
  'summary' => $summary,
  'location' => $location,
  'description' => $description,
  'start' => array(
    'dateTime' => $startdatetime,
    'timeZone' => 'America/Los_Angeles',
  ),
  'end' => array(
    'dateTime' => $enddatetime,
    'timeZone' => 'America/Los_Angeles',
  ),
  'reminders' => array(
    'useDefault' => FALSE,
  ),
));

您通常需要添加一个时区,就像我一样,这可能是您的问题。我建议先尝试一下。

<强>更新

我找不到任何可能与您的代码有关的错误,这可能与Google接受数据的方式有关。我现在所能提供的就是我的工作方式,我知道它的作用:

首先,按照说明here设置服务帐户(如果尚未设置)。确保创建.p12文件,而不是JSON。

您也可以下载PHP Google日历文件here,而无需使用作曲家。

接下来,使用下面的代码来满足您的需求,但这应该适合您。 (在POST发送之前,dateTime已正确格式化,因此您可能需要更改它)

header('Content-type: application/json');

require_once __DIR__ . '/google-api-php-client/src/Google/autoload.php';

$summary = $_POST["summary"];
$location = $_POST["location"];
$description = $_POST["description"];
$startdatetime = $_POST["startdatetime"];
$enddatetime = $_POST["enddatetime"];




$client_email = "clientemail"; //client email setup when you create the authorization in Google Developer Console.
$private_key = file_get_contents("privatekey.p12"); //location on your server where the .p12 file you created is stored
$scopes = array('https://www.googleapis.com/auth/calendar');
$user_to_impersonate = "primary"; //This can also be an email address associated with the current gmail login if you don't want to use the default one
$credentials = new Google_Auth_AssertionCredentials(
    $client_email,
    $scopes,
    $private_key,
    'notasecret',                                 // Default P12 password
    'http://oauth.net/grant_type/jwt/1.0/bearer', // Default grant type
    $user_to_impersonate
); //Keep everything in this array the same
$client = new Google_Client();
$client->setAssertionCredentials($credentials);
if ($client->getAuth()->isAccessTokenExpired()) {
  $client->getAuth()->refreshTokenWithAssertion();
}
$event = new Google_Service_Calendar_Event(array(
  'summary' => $summary,
  'location' => $location,
  'description' => $description,
  'start' => array(
    'dateTime' => $startdatetime,
    'timeZone' => 'America/Los_Angeles',
  ),
  'end' => array(
    'dateTime' => $enddatetime,
    'timeZone' => 'America/Los_Angeles',
  ),
  'reminders' => array(
    'useDefault' => FALSE,
  ),
));
$service = new Google_Service_Calendar($client);
$calendarId = $useremail;
$event = $service->events->insert($calendarId, $event);
echo json_encode($event);

答案 1 :(得分:0)

检查$start是否小于$end

答案 2 :(得分:0)

谷歌的错误是不正确的。 你必须检查所有输入字段是否有奇怪的符号。我在 locationfield 有 Straße ......这导致了缺少的结束时间错误。