Facebook API。无法使用PHP

时间:2015-09-05 09:56:49

标签: php facebook facebook-graph-api

我在使用PHP 5.5中的SDK试图在Facebook页面中发布时遇到困难。我想制作一个PHP脚本,以便在我管理的Facebook页面中自动发布更新。当我使用Graph API Explorer发出请求时,它工作得很完美,但我总是收到错误消息"(#200)用户没有授权应用程序执行此操作"从PHP脚本开始。

以下是我使用的步骤和代码:

  1. 使用"获取访问令牌"为我的应用程序获取一个短期访问令牌Graph API Explorer的选项,具有权限manage_pages和publish_pages。
  2. 使用PHP SDK的getOAuth2Client获取永不过期的访问令牌。
  3. 使用" / me / accounts"获取网页访问令牌。请求
  4. 使用页面访问令牌和方法发送发布请求" PORT / pageId / feed"使用params:access_token和message
  5. 获取页面访问令牌后,如果我使用Graph API Explorer执行发布请求,它可以正常工作,但是从PHP脚本失败。

    以下是我使用的完整代码:

    <?php
    require_once __DIR__ . '/Facebook/autoload.php';
    
    $appId = 'my_app_id';
    $appSecret = 'my_app_secret';
    $pageId = 'my_page_id';
    
    $shortToken = 'token got in step 1';
    
    $fb = new Facebook\Facebook([
      'app_id' => $appId,
      'app_secret' => $appSecret,
      'default_graph_version' => 'v2.2',
    ]);
    
    $oAuth2Client = $fb->getOAuth2Client();
    $longLivedAccessToken = $oAuth2Client->getLongLivedAccessToken($shortToken);
    
    echo '<p>Long-live token: ' . $longLivedAccessToken . '</p>';
    
    // Get page access_token
    $request = $fb->request('GET', '/me/accounts');
    $request->setParams(['access_token' => $longLivedAccessToken]);
    try {
      $response = $fb->getClient()->sendRequest($request);
    } catch(Facebook\Exceptions\FacebookResponseException $e) {
      echo 'Graph returned an error: ' . $e->getMessage();
      exit;
    } catch(Facebook\Exceptions\FacebookSDKException $e) {
      echo 'Facebook SDK returned an error: ' . $e->getMessage();
      exit;
    }
    $graphEdge = $response->getGraphEdge();
    foreach ($graphEdge as $graphNode) {
      if ($graphNode['id'] == $pageId) {
        $pageAccessToken = $graphNode['access_token'];
      }
    }
    echo '<p>Page access token: ' . $pageAccessToken . '</p>';
    
    $request = $fb->request('POST', '/' . $pageId . '/feed');
    $request->setParams(['access_token' => $pageAccessToken, 'message' => 'Page publish test message']);
    
    try {
      $response = $fb->getClient()->sendRequest($request);
    } catch(Facebook\Exceptions\FacebookResponseException $e) {
      echo 'Graph returned an error: ' . $e->getMessage();
      exit;
    } catch(Facebook\Exceptions\FacebookSDKException $e) {
      echo 'Facebook SDK returned an error: ' . $e->getMessage();
      exit;
    }
    ?>
    

    输出示例:

    Long-live token: XXXX
    Page access token: XXX
    Graph returned an error: (#200) The user hasn't authorized the application to perform this action
    

    所有令牌均有效,使用Facebook Access Token Debugger进行检查。页面令牌信息包含应用ID,页面ID和我的用户ID,以及manage_pages,publish_pages和public_profile权限。

    我的应用程序有默认设置。我刚刚添加了一个类型&#34;网站&#34;的平台。使用我的网页的网址。该应用程序是&#34;直播&#34;并且未提交审批(我只是创建了在Facebook页面中自动发布消息的应用程序)。

    我已经在这里和互联网上阅读了很多消息和示例但是我没有让它发挥作用。我希望有人能帮助我。

    非常感谢!

1 个答案:

答案 0 :(得分:0)

为了它的价值。我遇到了同样的问题。我意识到我没有使用页面的访问令牌,我使用的是/me/访问令牌。

我拥有publish_pagesmanage_pages的权限。

供参考,我正在使用Lumen框架。

public function submitStock(Request $request){

  //first get Page token data from /me/accounts
  $pageTokenData = $this->fb->get("/me/accounts", $_SESSION['facebook_access_token'])->getDecodedBody();

  $pageToken = null;

  //check get the token for the desired app
  foreach($pageTokenData['data'] as $account){
    if($account['name'] == "AppName"){
      $pageToken = $account['access_token'];
    }
  }

  //set message text from POST
  $message = $request->input('message');

  //send post using the Pages app token, not the /me/ token
  $this->fb->post('/'.$this->page.'/feed', 
    ['message' => $message], 
    $pageToken);


  return redirect($_SERVER['HTTP_REFERER']);
}