Problema do access do Facebook

Uso uma checkbox de diálogo de solicitação no meu aplicativo onde o usuário pode enviar solicitações aos seus amigos. Uma vez que o usuário envia a solicitação, eu redirecione o aplicativo para uma página onde ele é posto na página de usuários. Eu uso o código abaixo para obter um access_token:

$ch = curl_init(); curl_setopt($ch, CURLOPT_URL, 'https://graph.facebook.com/oauth/access_token?client_id='.APP_ID.'&client_secret='.APP_SECRET.'&redirect_uri=http://www.facebook.com/pages/Cosmetics/167231286678063?sk=app_233227910028874&grant_type=client_credentials'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST,0); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,0); $token = curl_exec($ch); $me = $facebook->api('/me?'.$token); 

mas quando eu tento publicar na parede mostra esse erro:

Erro fatal: OAuthException não capturado: assinatura de token de access OAuth inválida.

Por que você não usa o PHP SDK 3.0.1?

É fácil se você usa o sdk fornecido pelo Facebook, aqui está o exemplo para autenticação usando php sdk 3.0.1:

  FACEBOOK_APP_ID, 'secret' => FACEBOOK_SECRET, 'cookie' => true )); $user = $facebook->getUser(); // Get the UID of the connected user, or 0 if the Facebook user is not connected. if($user == 0) { // If the user is not connected to your application, redirect the user to authentication page /** * Get a Login URL for use with redirects. By default, full page redirect is * assumed. If you are using the generated URL with a window.open() call in * JavaScript, you can pass in display=popup as part of the $params. * * The parameters: * - redirect_uri: the url to go to after a successful login * - scope: comma separated list of requested extended perms */ $login_url = $facebook->getLoginUrl($params = array('redirect_uri' => REDIRECT_URI,'scope' => PERMISSIONS_REQUIRED)); echo (""); } else { // if the user is already connected, then fetch access_token and user's information or show some content to logged in user. try { $access_token = $facebook->getAccessToken(); // Gives you current user's access_token $user = $facebook->api('/me'); // Gets User's information based on permissions the user has granted to your application. } catch(FacebookApiException $e){ $results = $e->getResult(); // Print results if you want to debug. } } ?> 

Não tenho certeza de como exatamente você está tentando autenticar … Pode ser bom fazer um pedido assim, mas o método que uso é o documentado aqui: http://developers.facebook.com/docs/authentication/

Ou seja, você primeiro redireciona o usuário para uma página do Facebook para fazê-lo aceitar permissions. Uma vez que ele aceita, ele é redirecionado para um URL que você forneceu, com um code=### obter argumento que você precisa para executar uma solicitação do lado do servidor para obter o access_token real que você precisa ..

URL de redirecionamento de exemplo:

 $my_url = 'http://www.example.com'; "http://www.facebook.com/dialog/oauth?client_id=". $app_id ."&redirect_uri=". urlencode($my_url); 

Então, quando o usuário clicar em Aceitar, ele é redirecionado para, por exemplo,

 http://www.example.com?code=ABCDEF 

Então, no lado do servidor, você precisa obter o access_token fazendo uma chamada como esta:

 "https://graph.facebook.com/oauth/access_token?" . "client_id=" . $app_id . "&redirect_uri=" . urlencode($my_url) . "&client_secret=" . $app_secret . "&code=" . $code; 

Em seguida, verifique novamente o texto retornado dessa chamada e tente obter

 "https://graph.facebook.com/me?access_token=". $access_token; 

(Você também pode verificar isso manualmente)

EDITAR

Além disso, você provavelmente precisa de mais permissions do usuário para publicar no seu stream. Então, peça permissions adicionando um scope=publish_stream até o primeiro URL (autorização do usuário).

Você está usando &grant_type=client_credentials que lhe dá um token de access para o seu aplicativo como um todo, e não para seu usuário atual. Para obter um token de access para o seu usuário atual, você precisa redirecioná-los para o mesmo URL, mas sem o &grant_type=client_credentials e, em seguida, o Facebook os redirectá de volta para o redirect_uri e enviará o access_token que você precisa. Alternativamente, você pode usar o SDK do Javascript para obter um token de access através de uma janela pop-up sem redirecioná-los.

Aqui está um link para outra questão sobre como autenticar com o JS SDK e sem redirecionamento: autenticação do Facebook sem redirecionamento?

O que você está fazendo lá está obtendo o token de access à aplicação :

O Login do aplicativo permite que você adote várias ações administrativas para seu aplicativo, como recuperar dados Insights ou aprovar solicitações. As chamadas de API gráfica que exigem um token de access a aplicativos são claramente indicadas na referência da API.

O que você precisa é um token de access do usuário com algumas permissions , no seu caso, seria publish_stream .