2

几天来,我一直在尝试从他们的网站成功地发布到客户的 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 Explorer 生成的身份验证令牌的调试将我自己显示为用户,并包括所需的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 和由 an 分隔的秘密|- 这是我应该收到的吗?对我来说似乎很奇怪,因为我看到的所有其他令牌都是随机的并且更长。

任何帮助都将不胜感激,到目前为止,我已经浪费了很多时间。它似乎对其他人有用。

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

4

4 回答 4

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
于 2013-10-17T15:26:56.390 回答
0

I have done some testing and what I have found out is if you get the user to login, you can get there access token. If you pass this token into setAccessToken then run setExtendedToken. If you then save the toke by running getAccessToken you can use this token later when the user is logged out.

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

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

You need to get the user to login to ask them for permission to get access to there account. If you need to get access to a facebook page make sure they are an admin and ask for the manage_page permission.

Hope this helps

于 2013-08-22T16:48:51.963 回答
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":"No user access token specified","type":"OAuthException","code":1}} 但是因为没有 access_token 函数只是返回错误的

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

于 2013-08-22T15:37:23.923 回答
0

从我目前发现的情况来看,用户登录时返回的扩展令牌不会过期,因为您没有取回 unix 时间戳,因此您无法知道它何时过期。

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

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

于 2013-10-17T15:17:53.323 回答