Facebook: Post on Page as Page issue (access token / php)

169

I'm totally frustrated with my first facebook app project. I'm having major issues with what seems to be a simple task.

I want to setup a cron job on my server (easy) that will post something smart on a facebook page (not my profile), and it should be posted as page. I coded myself into a corner and am totally confused now... Can anyone help, please?

I've been thru pretty much every error message and am now stuck on "OAuthException: Error validating application."

Here's what I have now:

First php -> Gets a new Access Token for my page access. This part seems to work fine, as I get the next page called and receive a new access token.

<?php
require_once 'facebook.php';

$app_id = "1234....";
$app_secret = "5678....";
$my_url = "http://.../next.php";

$facebook = new Facebook(array(
 'appId' => $app_id,
 'secret' => $app_secret,
 'cookie' => true
));

// known valid access token stored in a database
$access_token = "abc....";

$code = $_REQUEST["code"];

// If we get a code, it means that we have re-authed the user
//and can get a valid access_token.
if (isset($code)) {
    $token_url="https://graph.facebook.com/oauth/access_token?
client_id="
      . $app_id . "&redirect_uri=" . urlencode($my_url)
      . "&client_secret=" . $app_secret
      . "&code=" . $code . "&display=popup";
    $response = file_get_contents($token_url);
    $params = null;
    parse_str($response, $params);
    $access_token = $params['access_token'];

}

// Attempt to query the graph:
$graph_url = "https://graph.facebook.com/me?"
    . "access_token=" . $access_token;
$response = curl_get_file_contents($graph_url);
$decoded_response = json_decode($response);

//Check for errors
if ($decoded_response->error) {
  // check to see if this is an oAuth error:
  if ($decoded_response->error->type== "OAuthException") {
      // Retrieving a valid access token.
      $dialog_url= "https://www.facebook.com/dialog/oauth?"
        . "client_id=" . $app_id
        . "&redirect_uri=" . urlencode($my_url);
      echo("<script> top.location.href='" . $dialog_url
      . "'</script>");
  } else {
      echo "other error has happened";
    }
} else {

  // success
    echo("success" . $decoded_response->name);

}

function curl_get_file_contents($URL) {
    $c = curl_init();
    curl_setopt($c, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($c, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($c, CURLOPT_URL, $URL);
    $contents = curl_exec($c);
    $err  = curl_getinfo($c,CURLINFO_HTTP_CODE);
    curl_close($c);
    if ($contents) return $contents;
    else return FALSE;
}

?>

Next php -> Read the access token and post on the wall. I get the access token from my query string, but then why do I receive the error message. My id, secret and page id are all in order...

<?php
require_once 'facebook.php';

$app_id = "1234....";
$app_secret = "5678....";
$page_id = "0909....";

$facebook = new Facebook(array(
 'appId' => $app_id,
 'secret' => $app_secret,
 'cookie' => true
));

$access_token = $_GET['code'];
echo($access_token);

try {
    $attachment = array(
                'access_token' => $access_token,
                'message'=> "Hello World"
        );

    $result = $facebook->api('/'.$page_id.'/feed','POST',
$attachment);
    var_dump($result);

} catch(Exception $e) {
    echo $e;
}

?>

I'm sure there is a simpler way to do so.... and a way to actually make it work! Any help is appreciated!

I followed this script Update facebook page status from that page itself and this https://developers.facebook.com/blog/post/500

Thank you.

91

Answer

Solution:

// firstly include the fb sdk 

$facebook = new Facebook(array(
                'appId'  => 'your app id',
                'secret' => 'your app secret',`enter code here`
                'cookie' => true,

    ));


$session = $facebook->getUser();
    $loginUrl = $facebook->getLoginUrl(
                    array(
                        'scope' => 'user_status,publish_stream,email,user_location,user_birthday,friends_birthday,manage_pages',
                        'redirect_uri' => 'http://www.example.com/'
                    )
                );

    $logoutUrl = $facebook->getLogoutUrl(
                    array(
                        // any url u want to redirsct onto   
                        'redirect_uri' => 'http://www.example.com/'

                    )
                );

// when redirected from facebook get the code 
    $code = $_GET['code'];

// 

                                        $my_url     = 'http://www.example.com/';

                                        $app_id     = 'your app id ';
                                        $app_secret = 'your app secret ';
                                        // here we have the access token so we will play with it 
                                        if (isset($code)) {
                                                $token_url="https://graph.facebook.com/oauth/access_token?client_id="
                                                  . $app_id . "&redirect_uri=" . urlencode($my_url) 
                                                  . "&client_secret=" . $app_secret 
                                                  . "&code=" . $code ;
                                                $response = file_get_contents($token_url);
                                                $params = null;
                                                parse_str($response, $params);
                                                $user_access_token = $params['access_token'];
                                          }

// here we got the access token of user over here in $user_access_token
// now we will get for our page
//------ get PAGE access token
                                        $attachment_1 = array(
                                            'access_token' => $user_access_token
                                        );
                                        $page_id = 'your page id ';
                                        $result = $facebook->api("/me/accounts", $attachment_1);
                                            foreach($result["data"] as $page) {
                                                if($page["id"] == $page_id) {
                                                    $page_access_token = $page["access_token"];
                                                    break;
                                                }
                                            }

                                        //          write to page wall
                                        try {
                                            $attachment = array(
                                                        'access_token' => $page_access_token,
                                                        'message'=> 'hello world posting like admin!',
                                                        'page_id'=> $page_id
                                                );

                                             $result = $facebook->api('/'.$page_id.'/feed','POST',$attachment);
                                            //$result = $facebook->api('/me/feed','POST', $attachment);
                                            var_dump($result);

                                        } catch(Exception $e) {
                                            echo $e;
                                        }
281

Answer

Solution:

From your code, it appears you are not getting a PAGE access token which you need, but instead you're using a USER access token, hence why the API doesn't like it. For more information on how to get a PAGE access token from a USER one, please see the Page login section of https://developers.facebook.com/docs/authentication/

642

Answer

Solution:

After many hours of trial and error, here's my solution that works so far.

<?php

require_once 'facebook.php';

//------ vars
$app_id = "123...";
$app_secret = "abc..."; 
$page_id = "999...";
$my_url = "http://exactly the same as defined /";

//------ fb object
$facebook = new Facebook(array(
 'appId' => $app_id,
 'secret' => $app_secret,
 'cookie' => true
));

//------ verification CODE
// this is not pretty -> the code should be received with a another graph query...
// but I couldn't get this to work. Thus I'm using my last known Verification Code
$code = "ABC123...";

//------ get USER access token
if (isset($code)) {
    $token_url="https://graph.facebook.com/oauth/access_token?client_id=" . $app_id 
        . "&client_secret=" . $app_secret 
        . "&code=" . $code 
        . "&redirect_uri=" . $my_url;

    $response = file_get_contents($token_url);
    $params = null;
    parse_str($response, $params);
    $user_access_token = $params['access_token'];

} else {
    echo("No code");
}

//------ get PAGE access token
$attachment_1 = array(
    'access_token' => $user_access_token
);

$result = $facebook->api("/me/accounts", $attachment_1);
    foreach($result["data"] as $page) {
        if($page["id"] == $page_id) {
            $page_access_token = $page["access_token"];
            break;
        }
    }

//------ write to page wall
try {
    $attachment = array(
                'access_token' => $page_access_token,
                'message'=> 'hello world!'
        );

    $result = $facebook->api('/me/feed','POST', $attachment);
    var_dump($result);

} catch(Exception $e) {
    echo $e;
}

?>

People are also looking for solutions to the problem: mysql - display every record on new line in php response

Source

Didn't find the answer?

Our community is visited by hundreds of web development professionals every day. Ask your question and get a quick answer for free.

Ask a Question

Write quick answer

Do you know the answer to this question? Write a quick response to it. With your help, we will make our community stronger.

Similar questions

Find the answer in similar questions on our website.