Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php facebook访问令牌仅在一个页面上工作_Php_Facebook_Facebook Graph Api_Yii_Facebook Php Sdk - Fatal编程技术网

Php facebook访问令牌仅在一个页面上工作

Php facebook访问令牌仅在一个页面上工作,php,facebook,facebook-graph-api,yii,facebook-php-sdk,Php,Facebook,Facebook Graph Api,Yii,Facebook Php Sdk,我的应用程序在过去3个月一直运行良好,但由于Facebook的一些变化,它遇到了一个新问题。当我通过以下方式获得访问令牌时: $facebook->getAccessToken(); 它返回一个有效的令牌并获取用户信息。但在另一个页面上,我再次使用相同的函数来获取访问令牌,并且获取了无效的访问令牌,包括应用Id。 我试图获取访问令牌并将其保存到会话并在另一个页面上使用,但它显示了一个异常OAutheException:必须使用活动的访问令牌来查询有关当前用户的信息。 但令牌是有效的,我已

我的应用程序在过去3个月一直运行良好,但由于Facebook的一些变化,它遇到了一个新问题。当我通过以下方式获得访问令牌时:

$facebook->getAccessToken();
它返回一个有效的令牌并获取用户信息。但在另一个页面上,我再次使用相同的函数来获取访问令牌,并且获取了无效的访问令牌,包括应用Id。 我试图获取访问令牌并将其保存到会话并在另一个页面上使用,但它显示了一个异常
OAutheException:必须使用活动的访问令牌来查询有关当前用户的信息。
但令牌是有效的,我已经检查过了

原因可能是“”吗? 我想在我的申请表上,令牌的有效期不到一分钟。 请帮帮我

代码-->


试试这个。事情发生了一点混乱,您在try-catch的else开关中设置了令牌

$facebook = Yii::app()->facebook;
try {
    $facebook_uid = $facebook->getUser(); 
     $access_token = $_SESSION['fb_396582000367255_access_token'];
     $facebook->setAccessToken($access_token);
    //$accessToken = $facebook->getAccessToken();
    $fbuser = $facebook->api('/me');

 }catch(Exception $e) {


 }
这是一个错误,但你可以利用肖恩·卡特的作品。如果您确实使用了他的解决方案,则需要防止Facebook SDK清除会话。这就是为什么你只能让它工作一次。一种粗糙而肮脏的方法是修改facebook.php方法来清除所有持久数据

protected function clearAllPersistentData() {
  return;
  foreach (self::$kSupportedKeys as $key) {
      $this->clearPersistentData($key);
  }
}
此外,为了让它为其他人工作(谁的会话没有设置),你需要允许facebook只做一次。所以我要做的是:

$tok = $facebook->getAccessToken();

if(strpos($tok, $config["appId"]) == 0 && isset($_SESSION["fb_" . $config["appId"] . "_access_token"]))
{
    $facebook->setAccessToken($_SESSION["fb_" . $config["appId"] . "_access_token"]);
    $tok =$_SESSION["fb_" . $config["appId"] . "_access_token"];
}

注意,这一切都很肮脏。由于你已经用清除会话的事情把水弄脏了,你还需要自己清除会话来处理其他身份验证情况,如用户注销、删除然后重新添加你的应用程序等。。。等因此,虽然您可以在短期内完成此操作,直到他们修复SDK为止,但不要将其保留在代码中。

尝试使用fbsr_396582000367255_访问_令牌,而不是fb_396582000367255_访问_令牌

是否与此相关“我们只允许将授权代码交换为访问令牌一次,并要求在创建后10分钟内将其交换为访问令牌。这符合OAuth 2.0规范,该规范从一开始就规定“授权代码必须是短期的和一次性的”。有关更多信息,请查看我们的身份验证文档。“?请详细说明一些代码,有消息告诉我访问令牌在新页面上显示为
nil
。my_app_id|3e65ac73b567b54e2c6f6a5b186a71aa这是令牌格式。您不能在
/me
调用中使用应用令牌…它可能与此相关,但仍会出错。”“未定义索引:fb_396582000367255_access_token”您需要使用当前版本的php sdki还建议删除包装器我已经更新了sdk并更新了包装器,新的扩展可以从仅供参考下载这已经修复,所以您不应该再这样做=)
$tok = $facebook->getAccessToken();

if(strpos($tok, $config["appId"]) == 0 && isset($_SESSION["fb_" . $config["appId"] . "_access_token"]))
{
    $facebook->setAccessToken($_SESSION["fb_" . $config["appId"] . "_access_token"]);
    $tok =$_SESSION["fb_" . $config["appId"] . "_access_token"];
}