2013-08-21 95 views
2

我一直在尝试了几天,现在成功地发布到他们的网站客户端的Facebook页面墙时200。我需要能够做到这一点,而无需登录的用户,这点我是能够实现与要在文档中提供的URL生成扩展的访问令牌。Facebook的PHP SDK - 错误#试图用setExtendedAccessToken

我所试图做的是使用PHP SDK在这个问题来获取扩展标记 - Facebook PHP SDK: getting "long-lived" access token now that "offline_access" is deprecated,但是我收到以下错误: (#200) The user hasn't authorized the application to perform this action

由图形生成的身份验证令牌的调试API资源管理器显示自己的用户,包括必要的manage_pagesstatus_update范围。不知道这是相关的 - 但是,如果我跑me/accounts,该perms阵列不会有问题的网页下的数据列出来。

这里是我试图使用的代码:

$facebook = new Facebook(array('appId' => 'xxxxxxx', 'secret' => 'xxxxxx')); 
    $pageID = 'xxxxxxxx'; 
    $facebook->setExtendedAccessToken(); 
    $accessToken = $facebook->getAccessToken(); 
    try { 
     $page_info = $facebook->api("/$pageID?fields=access_token"); 
     print_r ($page_info); 
    } catch (FacebookApiException $e) { 
      echo $e->getMessage(); 
    } 
    if(!empty($accessToken)) { 
     $args = array(
      'access_token' => $accessToken, 
      'message'  => "Catch phrase!" 
     ); 
     $facebook->api("/$pageID/feed","post",$args); 
    } else { 
     // Handle error 
    } 

UPDATE 我发现,如果我呼应的getAccessToken()输出端的结果是应用程序ID,并通过|分离的秘密 - 这是我应该接受的吗?对我来说似乎很奇怪,因为我看到的所有其他代币都是随机的,而且更长。

任何帮助都将不胜感激,我至今浪费在这那么多时间。它似乎只适用于其他人。

UPDATE 2 嗨,沃伦!看起来你是这些零件的新手,欢迎!感谢您对此的研究,是否需要将这些标记保存到数据库表中,并检查每次尝试发布时它们是否已过期?我只是张贴到页面的页面,显然这需要在页面access_token而不是什么我假设是用户access_token。我相信我也会在某处阅读页面访问令牌永不过期,但如果我刷新Graph API Explorer页面或请求新的用户令牌,它将发生变化。十分不解..不知道是不是我甚至需要处理在此应用程序获得新令牌或只使用一个页面access_token出现工作?

+0

嗨我没有答案,因为我太寻找相同的解决方案。我发现这使我觉得现在不可能。 https://developers.facebook.com/roadmap/offline-access-removal/如果用户已经登录,我可以得到这个工作,但是如果你需要确保它在用户注销时工作。 –

回答

0

也只是看base_facebook.php文件,并有以下功能:

/** 
    * Returns the access token that should be used for logged out 
    * users when no authorization code is available. 
    * 
    * @return string The application access token, useful for gathering 
    *    public information about users and applications. 
    */ 
    protected function getApplicationAccessToken() { 
    return $this->appId.'|'.$this->appSecret; 
    } 

显示你所遇到的功能setExtendedAccessToken()调用getAccessToken()调用它上面的函数里面做setExtendedAccessToken以下:

$access_token_response = $this->_oauthRequest(
     $this->getUrl('graph', '/oauth/access_token'), 
     $params = array(
      'client_id' => $this->getAppId(), 
      'client_secret' => $this->getAppSecret(), 
      'grant_type' => 'fb_exchange_token', 
      'fb_exchange_token' => $this->getAccessToken(), 
     ) 
    ); 

此函数的返回是然后{ “错误”:{ “消息”: “未指定用户访问令牌”, “类型”: “OAuthException”, “代码”:1}},但因为没有access_token函数只是返回假

的fb_exchange_token不能是应用程序ID和应用相结合的秘密。

0

我已经做了一些测试,什么我发现是,如果你让用户登录,你可以到那里访问令牌。如果您将此令牌传递给setAccessToken,则运行setExtendedToken。如果通过运行getAccessToken保存了toke,则可以在用户注销后再使用该令牌。

$facebook->setAccessToken($facebook->getAccessToken()); 
$facebook->setExtendedAccessToken(); 

$access_token = $facebook->getAccessToken(); // save this for later use 

您需要让用户登录才能询问他们是否有权访问该帐户。如果您需要访问Facebook页面,请确保他们是管理员并要求提供manage_page权限。

希望这有助于

+0

沃伦,你可以检查我的问题的更新?感谢您对此的帮助:) – NightMICU

0

从我迄今发现当用户登录不会过期,只要你不回来Unix时间戳,所以你就没有办法知道时,返回的扩展标记何时到期。

这就是我在我的应用程序中所做的。

要求用户登录Facebook并访问权限除外。使用getAccessToken获取当前的访问令牌。通过这个,我传入getExtendedAccessToken,然后再次运行getAccessToken,最终获得我存储在数据库中的扩展访问令牌以供以后使用。

0
$facebook = new Facebook(array(
        'appId' => 'YOURAPPID', 
        'secret' => 'YOURSECRET', 
      )); 
$params = array(
         'scope'=>'publish_stream,manage_pages' 

       ); 
$loginUrl = $facebook->getLoginUrl($params); // Use this to request them to login in then when they are do the following you will need them to return to your app 

$facebook = new Facebook(array(
        'appId' => 'YOURAPPID', 
        'secret' => 'YOURSECRET', 
      )); 
$facebook->setAccessToken($facebook->getAccessToken()); 
$facebook->setExtendedAccessToken(); 
$access_token = $facebook->getAccessToken(); // store $access_token for later use