第二次操作

时间:2016-02-03 17:16:09

标签: php codeigniter api calendar google-calendar-api

我正在为这个网站工作,让您可以在线安排与老师在不同科目上的教学课程。我们最近添加了一个用户链接谷歌日历的选项,以便他们安排的每个新教学会话都会在他们的日历上自动创建。

这很有效。当访问令牌到期时,我有刷新令牌(离线访问)。所以这一切都正常运作。

问题是,当老师和用户都将他们的日历链接起来,并且我的功能试图为两者创建相同的事件时,第一个被创建(比方说,为用户),但是当它的时间为教师创建相同的事件,它失败了404“notFound”,好像它没有找到日历。

我的猜测是我使用相同的Google客户端对象,一旦设置它们,您可能无法更改访问令牌。我已经尝试unset()$this->gclient = null,但它无效。

我正在使用CodeIgniter,所以我为google calendar api创建了一个库。在我的代码中,我做了类似的事情:

...

if ($user->hasGoogleCalendar) {
    $this->addEventToCalendar($user, $event);
}
if ($teacher->hasGoogleCalendar) {
   $this->addEventToCalendar($teacher, $event);
}

...

function addEventToCalendar($user, $event) {
  //the constructor for gcalendar creates the google client
  $this->load->library("gcalendar");

  //this verifies the access token, refreshes if necessary and
  //creates the event 
  $this->gcalendar->addEventToCalendar($user->access_token, $user->calendarId, $event);
}

所以这是第一次(对于$ user),但是对$teacher失败(404 notFound)。如果我反转第一个if语句(以便老师是第一个,然后是用户),那么教师会在他/她的日历上获得该事件而学生则不会。

所以基本上问题是我无法为同一个Google客户端设置新的access_token,或类似的东西。我试图卸载库并再次加载,但还没有找到使其工作的方法。

我也尝试过:

$this->load->library("gcalendar", NULL, "gcalendar1");
$this->load->library("gcalendar", NULL, "gcalendar2");

但是它是一样的,现在我有两个不同的对象$this->gcalendar1$this->gcalendar2但是会​​出现同样的错误。

对于我的图书馆,我正在使用Google Api PHP client

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

行。我分析了Google Client类,它为用户凭据/数据创建了基于文件的缓存。所以问题是当用户连接他们的谷歌日历帐户并且他们的数据存储在文件中时。如果其他用户试图连接他们的谷歌日历,该类将无法获得此用户的凭据,而是使用缓存文件(如果它仍然有效,我猜测基于时间),但此缓存包含第一个用户的文件。所以基本上用户B有一个属于用户A的刷新令牌/访问令牌,这就是它失败的原因。

目前,我修改了Google Client类并强制它不使用缓存。我会对此做一些更多的研究,因为缓存必须在那里是有原因的。

现在它正常运作!