当前位置: 首页 > 知识库问答 >
问题:

使用PHP客户端设置Google Calendar API的推送通知

潘国源
2023-03-14

但是他们似乎没有一个方法来观看PHP库中的谷歌日历资源。其他库可能有watch方法,但我不太确定。

基本上,为了设置特定资源的推送通知,您必须向如下URL发送post请求······

POST https://www.googleapis.com/calendar/v3/calendars/my_calendar@gmail.com/events/watch
Authorization: Bearer auth_token_for_current_user
Content-Type: application/json

{
  "id": "01234567-89ab-cdef-0123456789ab", // Your channel ID.
  "type": "web_hook",
  "address": "https://mydomain.com/notifications" // Your receiving URL.
}

我可以在PHP中使用curl轻松地做到这一点,但我的问题是请求没有经过Google OAuth令牌的授权,因此会导致错误。

更新

我试图发送连接到谷歌没有添加适当的头,所以我得到了一个授权错误。更正了该部分之后,我仍然遇到Invalid Credentials错误。下面是我的代码片段的样子...

    $url = sprintf("https://www.googleapis.com/calendar/v3/calendars/%s/events/watch", $calendar);

    /* setup the POST parameters */
    $fields = array(
        'id'        => "some_unique_key",
        'type'      => "web_hook",
        'address'   => sprintf("http://%s//event_status/update_google_events", $_SERVER['SERVER_NAME'])
        );

    /* convert the POST parameters to URL query */
    $fields_string = '';
    foreach ($fields as $key => $value) {
        $fields_string .= sprintf("%s=%s&", $key, $value);
    }
    rtrim($fields_string, '&');

    /* setup POST headers */
    $headers[] = 'Content-Type: application/json';
    $headers[] = 'Authorization: OAuth ' . $access_token;

    /* send POST request */
    $channel = curl_init();
    curl_setopt($channel, CURLOPT_HTTPHEADER, $headers);
    curl_setopt($channel, CURLOPT_URL, $url);
    curl_setopt($channel, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($channel, CURLOPT_POST, true);
    curl_setopt($channel, CURLOPT_POSTFIELDS, $fields_string);
    curl_setopt($channel, CURLOPT_CONNECTTIMEOUT, 2);
    curl_setopt($channel, CURLOPT_TIMEOUT, 3);
    $response = curl_exec($channel);
    curl_close($channel);

    error_log($response);

共有1个答案

花俊雄
2023-03-14

这是我解决问题的办法。我在谷歌游乐场里摆弄了一下,就知道我做错了什么。

我所做的就是

  • 我对POST请求的正文进行了JSON编码,而不是发送URL查询参数。
  • 将POST请求的授权部分从OAuth{access_token}更改为承载{access_token}
$url = sprintf("https://www.googleapis.com/calendar/v3/calendars/%s/events/watch", $calendar);

/* setup the POST parameters */
$fields = json_encode(array(
    'id'        => "some_unique_key",
    'type'      => "web_hook",
    'address'   => sprintf("http://%s//event_status/update_google_events", $_SERVER['SERVER_NAME'])
    ));

/* setup POST headers */
$headers[] = 'Content-Type: application/json';
$headers[] = 'Authorization: Bearer ' . $access_token;

/* send POST request */
$channel = curl_init();
curl_setopt($channel, CURLOPT_HTTPHEADER, $headers);
curl_setopt($channel, CURLOPT_URL, $url);
curl_setopt($channel, CURLOPT_RETURNTRANSFER, true);
curl_setopt($channel, CURLOPT_POST, true);
curl_setopt($channel, CURLOPT_POSTFIELDS, $fields);
curl_setopt($channel, CURLOPT_CONNECTTIMEOUT, 2);
curl_setopt($channel, CURLOPT_TIMEOUT, 3);
$response = curl_exec($channel);
curl_close($channel);

error_log($response);
 类似资料:
  • 问题内容: 我想在我的Elasticsearch php客户端到我的Elasticsearch服务器之间配置一个小的超时。 我试图将一些参数传递给耗时的客户端,但这似乎不起作用。这是代码: 我搜索发现可能是由于在cURL层中设置了超时(低于guzzle而引起的问题 限制了与Guzzle HTTP PHP客户端的连接时间 我想我需要以某种方式将CURLOPT_CONNECTTIMEOUT_MS参数设

  • 客户端关于推送的方法只有两个,它们分别是: Subscribe 方法 Subscribe(name string, id string, settings *InvokeSettings, callback interface{}) (err error) Subscribe 方法的用处是订阅服务器端的推送服务。该方法有两种方式,一种是自动获取设置客户端 id,另一种是手动设置客户端 id。 参数

  • 问题内容: 我想创建一个应用程序,当超级用户单击链接时,用户应该获得通知或类似pdf的内容,以便他们在屏幕上访问。 用例:当教师想与他的学生共享PDF时,他应该能够通知他的学生有关可下载的pdf的信息,并且必须提供一个链接来做到这一点。 问题答案: 当您想在CakePHP中实现此功能(因此我假设它是基于Web的应用程序)时,用户必须打开“活动”页面才能接收推送消息。 值得一看前两个答案,但也只需考

  • > 在移动应用程序中为用户分配一些数据标签,例如“HAS Items:true”或“Is interestedinProduct”,然后用这些用户标签在Oneignal控制台中创建片段。 在我的后端保存Oneignal,将其与匹配,然后根据后端数据库数据有选择地向用户发送消息。 做这件事的首选方法是什么?或者它应该是两者的结合,这取决于我的用例?有没有办法让它完全自动化?例如。根据一些分析事件,在

  • 长连接服务(TCP、WebSocket)支持向客户端推送数据,具体用法https://doc.imiphp.com/utils/Server.html

  • 长连接服务(TCP、WebSocket)支持向客户端推送数据,具体用法https://doc.imiphp.com/utils/Server.html