PHP Facebook SDK 4.0 post作为页面服务器到服务器


PHP Facebook SDK 4.0 post as a page server to server

我试图在Facebook页面上发布一个页面,因为6天没有成功,这是真正令人沮丧的使用新的Facebook SDK 4.0.4。

我在PHP 5.4下(根据Facebook 4.0 SDK版本的要求)。我已经阅读了一些facebook的文档(不是很清楚)https://developers.facebook.com/docs/reference/php/4.0.0.

来记录:

<?php
require_once( BaseRoot. '/include/scripts/facebook_php_sdk/src/Facebook/FacebookSession.php' );
require_once( BaseRoot. '/include/scripts/facebook_php_sdk/src/Facebook/FacebookRedirectLoginHelper.php' );
require_once( BaseRoot. '/include/scripts/facebook_php_sdk/src/Facebook/FacebookRequest.php' );
require_once( BaseRoot. '/include/scripts/facebook_php_sdk/src/Facebook/FacebookResponse.php' );
require_once( BaseRoot. '/include/scripts/facebook_php_sdk/src/Facebook/FacebookSDKException.php' );
require_once( BaseRoot. '/include/scripts/facebook_php_sdk/src/Facebook/FacebookRequestException.php' );
require_once( BaseRoot. '/include/scripts/facebook_php_sdk/src/Facebook/FacebookOtherException.php' );
require_once( BaseRoot. '/include/scripts/facebook_php_sdk/src/Facebook/FacebookAuthorizationException.php' );
require_once( BaseRoot. '/include/scripts/facebook_php_sdk/src/Facebook/GraphObject.php' );
require_once( BaseRoot. '/include/scripts/facebook_php_sdk/src/Facebook/GraphSessionInfo.php' );
require_once( BaseRoot. '/include/scripts/facebook_php_sdk/src/Facebook/FacebookServerException.php' );
use Facebook'FacebookSession;
use Facebook'FacebookRedirectLoginHelper;
use Facebook'FacebookRequest;
use Facebook'FacebookResponse;
use Facebook'FacebookSDKException;
use Facebook'FacebookRequestException;
use Facebook'FacebookOtherException;
use Facebook'FacebookAuthorizationException;
use Facebook'GraphObject;
use Facebook'GraphSessionInfo;
use Facebook'FacebookServerException;

        session_start();

        // init app with app id and secret
        FacebookSession::setDefaultApplication($site["facebook_appid"],$site["facebook_appsecret"] );
        // login helper with redirect_uri
        $helper = new FacebookRedirectLoginHelper($site["url"].$_SERVER['REQUEST_URI']);
        // see if a existing session exists
        if ( isset( $_SESSION ) && isset( $_SESSION['fb_token'] ) ) {
          // create new session from saved access_token
          $session = new FacebookSession( $_SESSION['fb_token'] );
          // validate the access_token to make sure it's still valid
          try {
            if ( !$session->validate() ) {
              $session = null;
            }
          } catch ( Exception $e ) {
            // catch any exceptions
            $session = null;
          }
           echo '<a href="' . $helper->getLogoutUrl( $session, 'http://yourwebsite.com/app/logout.php' ) . '">Logout</a>';
        } else {
          // no session exists
          try {
            $session = $helper->getSessionFromRedirect();
          } catch( FacebookRequestException $ex ) {
            // When Facebook returns an error
          } catch( Exception $ex ) {
            // When validation fails or other local issues
            echo $ex->message;
          }
          echo '<a href="' . $helper->getLoginUrl( array( 'public_profile', 'email', 'user_friends' , 'publish_stream', 'manage_pages', 'publish_actions', 'status_update', 'user_likes ',  'photo_upload') ) . '">Login</a>';

        }

///////////////////////////
// SHORT LIVED TOKEN
  $request = new FacebookRequest( $session, "GET", "/".$site["facebook_appid"]."/accounts?access_token=".$site["facebook_appid"]."|".$site["facebook_appsecret"]."&grant_type=client_credentials" );
  $response = $request->execute();
  // get response
  $graphObject = $response->getGraphObject()->asArray();

  if (DebugMode) e($graphObject);
    $site['facebook_short-lived_access_token'] =  $graphObject['data'][0]->access_token;
////////////////////////
///////////////////////////
// LONG LIVED TOKEN
  $request = new FacebookRequest( $session, "GET", "/oauth/access_token?grant_type=fb_exchange_token&client_id=".$site["facebook_appid"]."&client_secret=".$site["facebook_appsecret"]."&fb_exchange_token=" .$site['facebook_short-lived_access_token']);
  $response = $request->execute();
  // get response
  $graphObject = $response->getGraphObject()->asArray();

  if (DebugMode) e($graphObject);
    $site['facebook_long-lived_access_token'] =  $graphObject['access_token'];
    $_SESSION['fb_token'] = $site['facebook_long-lived_access_token'];
    if (DebugMode) e($site['facebook_long-lived_access_token']);
?>

发布:

<?php
require_once( BaseRoot. '/include/scripts/facebook_php_sdk/src/Facebook/FacebookRequest.php' );
require_once( BaseRoot. '/include/scripts/facebook_php_sdk/src/Facebook/GraphObject.php' );
require_once( BaseRoot. '/include/scripts/facebook_php_sdk/src/Facebook/FacebookSDKException.php' );
require_once( BaseRoot. '/include/scripts/facebook_php_sdk/src/Facebook/FacebookRequestException.php' );
require_once( BaseRoot. '/include/scripts/facebook_php_sdk/src/Facebook/FacebookPermissionException.php' );

use Facebook'FacebookRequest;
use Facebook'GraphObject;
use Facebook'FacebookRequestException;
use Facebook'FacebookSDKException;
use Facebook'FacebookPermissionException;

if($session) {

  try {
    $response = (new FacebookRequest(
      $session, 'POST', "/".$site["facebook_page_id"]."/feed",
      array(
        'access_token' => $_SESSION['fb_token'],
        'link' => $site["url"].'/url',
        'name' => 'link name',
        'caption' => 'link caption',
        'description' => 'link description',
        'picture' => $site["url"].'/alpha.png',
        'message' => 'User provided message'
      )
    ))->execute()->getGraphObject();
    echo "Posted with id: " . $response->getProperty('id');
  } catch(FacebookRequestException $e) {
    echo "Exception occured, code: " . $e->getCode();
    echo " with message: " . $e->getMessage();
  }   
}
?>

我首先获得一个会话ID,然后请求并获得一个短期令牌,使用该令牌我请求并获得一个长期令牌(60天有效期)。然后使用最后获得的令牌继续执行发布脚本。我提交了一个帖子,它返回一个帖子id,就像它工作一样,但页面上没有任何内容,我的个人Facebook历史中没有任何内容。

我的应用程序是在开发模式,并没有由Facebook审查,但似乎没有必要了:http://www.nextscripts.com/known-issues/facebook-issues/

你知道我哪里错了吗?

我不是很喜欢facebook SDK,但我注意到有一行我怀疑是不正确的:

echo '<a href="' . $helper->getLoginUrl( array( 'public_profile', 'email', 'user_friends' , 'publish_stream', 'manage_pages', 'publish_actions', 'status_update', 'user_likes ',  'photo_upload') ) . '">Login</a>';
关于这个函数的facebook文档可以在这里找到。它指出,你应该,要求额外的权限,给一个数组的索引'scope'和值在字符串与逗号之间你想要请求的每个权限,而不是一个数组的索引调用权限,但没有任何数据在其中。我猜应该是这样的:
$helper->getLoginUrl( array( 'scope' => 'public_profile,email,user_friens,publish_stream,<and so on>'));