facebookphp-sdk-尝试使用setExtendedAccessToken时出现错误#200


facebook php sdk - Error #200 when trying to use setExtendedAccessToken

几天来,我一直在尝试从客户的网站成功发布到他们的Facebook页面墙上。我需要能够在没有用户登录的情况下做到这一点,这是我通过访问文档中提供的URL生成的扩展访问令牌实现的。

我想做的是使用PHP SDK获取一个扩展令牌,就像在这个问题中一样——Facebook PHP SDK:geting"长寿命";现在访问令牌;offline_access"已弃用,但我收到以下错误:(#200) The user hasn't authorized the application to perform this action

Graph API资源管理器生成的auth令牌的调试将我显示为用户,并包括所需的manage_pagesstatus_update作用域。但是,如果我运行me/accountsperms数组不会在相关页面的数据下列出这些内容——不确定这是否相关。

以下是我尝试使用的代码:

$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
    }

更新我发现,如果我响应getAccessToken()的输出,结果是应用程序ID和秘密由|分隔——这是我应该接收的吗?我觉得很奇怪,因为我看到的所有其他代币都是随机的,而且时间更长。

任何帮助都将不胜感激,到目前为止,我已经在这方面浪费了太多时间。这似乎对其他人都有效。

更新2嗨,沃伦!看起来你对这些地方还很陌生,欢迎!感谢您对此的研究,我是否需要将这些代币保存到DB表中,并在每次尝试发布时检查它们是否过期?我只是作为页面发布到页面,显然这需要页面access_token,而不是我假设的用户access_token。我相信我在某个地方也读到Page访问令牌从未过期,尽管如果刷新Graph API Explorer页面或请求新的用户令牌,它会更改。非常令人费解。。不知道我是否需要在这个应用程序中获取新代币,或者只使用一个看起来有效的页面access_token

也只是查看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()时您正在经历的情况,该函数调用上面的函数在setExtendedAAccessToken内执行以下操作:

$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(),
        )
      );

该函数的返回是{"error":{"message":"No user access token specified","type":"OAuthException","code":1}},但由于没有access_token,该函数只返回false

fb_exchange_token不能是应用程序id和应用程序机密的组合。

我已经做了一些测试,我发现如果你让用户登录,你就可以获得访问令牌。如果将此令牌传递到setAccessToken中,则运行setExtendedToken。如果通过运行getAccessToken保存令牌,则可以在用户注销后使用此令牌。

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

你需要让用户登录,请求他们允许访问该帐户。如果你需要访问facebook页面,请确保他们是管理员,并要求获得manage_page权限。

希望这能帮助

根据我目前所发现的,用户登录时返回的扩展令牌不会过期,因为您无法返回unix时间戳,因此无法知道它何时过期。

这就是我在申请中所做的。

请求用户登录到facebook,但访问权限除外。使用getAccessToken获取当前访问令牌。有了这个,我传入getExtendedAccessToken,然后再次运行getAccessToken,最终获得扩展访问令牌,并将其存储在数据库中以备将来使用。

$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