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

时间:2013-08-21 14:53:59

标签: php facebook facebook-graph-api facebook-php-sdk

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

我想要做的是使用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

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

更新 我发现,如果我回显getAccessToken()的输出结果是应用程序ID和由|分隔的秘密 - 这是我应该收到的吗?对我来说似乎很奇怪,因为我看到的所有其他令牌都是随机的,而且更长。

任何帮助都会受到赞赏,到目前为止我浪费了很多时间。它似乎适用于其他所有人。

更新2 嗨沃伦!看起来你是这些部件的新手,欢迎!感谢您对此的研究,我是否需要将这些令牌保存到数据库表中并检查每次我尝试发布时它们是否已过期?我只是作为页面发布到页面,显然这需要页面access_token而不是我假设的是用户access_token。我相信我还读到了页面访问令牌永不过期的地方,尽管如果我刷新Graph API Explorer页面或请求新的用户令牌它会发生变化。非常令人费解..不知道我是否需要处理在这个应用程序中获取新令牌或只是使用似乎有效的页面access_token

4 个答案:

答案 0 :(得分: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(),
        )
      );

然后返回此函数{“error”:{“message”:“没有指定用户访问令牌”,“类型”:“OAuthException”,“code”:1}}但是因为没有access_token function只返回false

fb_exchange_token不能是app id和app secret的组合。

答案 1 :(得分:0)

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

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

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

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

希望这有帮助

答案 2 :(得分:0)

从我到目前为止发现的用户登录后返回的扩展令牌不会过期,因为你没有得到一个unix时间戳,所以你无法知道它何时到期。

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

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

答案 3 :(得分: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