SDK Facebook

Eléphanteau du PHP | 12 Messages

09 nov. 2017, 12:27

Bonjour,
Après avoir résolu mes problèmes de mails je me penche sur la publication automatique su une page Facebook avec le sdk php-graph.
Je coince dès le début, à la récupération du Token.

Voici la procédure que j'ai suivi:

Installation via Composer du sdk
Création d'une app sur le developpeur facebook, je lui indique le Domaine de l'app, à savoir mon nom de domaine, je lui indique également l'url du site et je récupère id et clé secrète.
Je crée 2 fichiers, recupToken.php et fb-callback.php que je mets dans le dossier:
facebook/src/Facebook

Voici ces deux fichiers:

Code : Tout sélectionner

<?php session_start(); include 'autoload.php'; $fb = new Facebook\Facebook([ 'app_id' => 'monid', 'app_secret' => 'clesecret', 'default_graph_version' => 'v2.11', ]); $helper = $fb->getRedirectLoginHelper(); $permissions = ['email','publish_pages','manage_pages','user_friends','public_profile']; // Optional permissions $loginUrl = $helper->getLoginUrl('http://mon-site/facebook/src/Facebook/fb-callback.php', $permissions); echo '<a href="' . $loginUrl . '">Log in with Facebook!</a>'; ?>

Code : Tout sélectionner

<?php session_start(); include 'autoload.php'; $fb = new Facebook\Facebook([ 'app_id' => 'appid', 'app_secret' => 'appsecret', 'default_graph_version' => 'v2.11', ]); $helper = $fb->getRedirectLoginHelper(); try { $accessToken = $helper->getAccessToken(); } catch(Facebook\Exceptions\FacebookResponseException $e) { // When Graph returns an error echo 'Graph returned an error: ' . $e->getMessage(); exit; } catch(Facebook\Exceptions\FacebookSDKException $e) { // When validation fails or other local issues echo 'Facebook SDK returned an error: ' . $e->getMessage(); exit; } if (! isset($accessToken)) { if ($helper->getError()) { header('HTTP/1.0 401 Unauthorized'); echo "Error: " . $helper->getError() . "\n"; echo "Error Code: " . $helper->getErrorCode() . "\n"; echo "Error Reason: " . $helper->getErrorReason() . "\n"; echo "Error Description: " . $helper->getErrorDescription() . "\n"; } else { header('HTTP/1.0 400 Bad Request'); echo 'Bad request'; } exit; } // Logged in echo '<h3>Access Token</h3>'; var_dump($accessToken->getValue()); // The OAuth 2.0 client handler helps us manage access tokens $oAuth2Client = $fb->getOAuth2Client(); // Get the access token metadata from /debug_token $tokenMetadata = $oAuth2Client->debugToken($accessToken); echo '<h3>Metadata</h3>'; var_dump($tokenMetadata); // Validation (these will throw FacebookSDKException's when they fail) $tokenMetadata->validateAppId($config['app_id']); // If you know the user ID this access token belongs to, you can validate it here //$tokenMetadata->validateUserId('123'); $tokenMetadata->validateExpiration(); if (! $accessToken->isLongLived()) { // Exchanges a short-lived access token for a long-lived one try { $accessToken = $oAuth2Client->getLongLivedAccessToken($accessToken); } catch (Facebook\Exceptions\FacebookSDKException $e) { echo "<p>Error getting long-lived access token: " . $e->getMessage() . "</p>\n\n"; exit; } echo '<h3>Long-lived</h3>'; var_dump($accessToken->getValue()); } $_SESSION['fb_access_token'] = (string) $accessToken; // User is logged in with a long-lived access token. // You can redirect them to a members-only page. //header('Location: https://example.com/members.php'); ?>

Je tape l'url dans mon navigateur, clic sur Log in... , mais j'ai un warning:
Impossible de charger cette URL: Le domaine de cette URL n’est pas inscrit dans ceux de l’application. Pour pouvoir importer cette URL, ajoutez tous les domaines et sous-domaines de votre application au champ Domaines des paramètres de l’application.

Vu ce warning je me dit que c'est du côté de facebook developpeur que je suis planté, mais je coince, je ne vois pas ce que je n'ai surement pas ou mal renseigné.

Merci pour votre aide.

Stef

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

09 nov. 2017, 19:58

Là c'est un truc super spécifique à Facebook, tu as bien suivi les tutos de Facebook et regardé dans leurs pages d'aide ?
Par exemple ici : https://www.facebook.com/help/community ... 3912835746
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphanteau du PHP | 12 Messages

10 nov. 2017, 12:07

Bonjour, oui j'ai bien fait le tour des aides et tutos. Je ne vois pas où est ma faille.

Mammouth du PHP | 571 Messages

10 nov. 2017, 17:24

bonjour,
dans un premier, il faut s'assurer que ton token utilisateur est valide.

Si tu n'as pas créer le token utilisateur, les étapes pour sa création sont ici (voir étape 5).
Une fois ce token crée, tu peux tester avec ton script si tu arrives à te connecter :

Code : Tout sélectionner

include 'autoload.php'; define('USER_TOKEN','le-token-utilisateur'); $fb = new Facebook\Facebook([ 'app_id' => 'monid', 'app_secret' => 'clesecret', 'default_graph_version' => 'v2.11', ]); try { $response = $fb->get('/me', USER_TOKEN); } catch(\Facebook\Exceptions\FacebookResponseException $e) { // When Graph returns an error echo 'Graph returned an error: ' . $e->getMessage(); exit; } catch(\Facebook\Exceptions\FacebookSDKException $e) { // When validation fails or other local issues echo 'Facebook SDK returned an error: ' . $e->getMessage(); exit; } $me = $response->getGraphUser(); echo 'Vous êtes connecté en tant que ' . $me->getName();
si tu arrives à te connecter avec le script ci-dessous, tu peux passer maintenant à l'étape 2 comme expliqué 6. Obtenir un token d’accès de Page

Tu peux remplacer le token utilisateur par le token de page dans le script précédent puis relancer le teste pour voir s'il y a connexion.

Enfin si token de page OK, tu peux maintenant poster un message:

Code : Tout sélectionner

include 'autoload.php'; define('USER_TOKEN','le-token-utilisateur'); $fb = new Facebook\Facebook([ 'app_id' => 'monid', 'app_secret' => 'clesecret', 'default_graph_version' => 'v2.11', ]); try { $attachment = array( 'access_token' => PAGE_TOKEN, 'caption' => 'title of link', 'description' => "lorem", 'message' => "le message de teste à envoyer au mur fb", 'name' => "name of link", ); $response =$fb->post('/{ton-id-de-page}/feed', $attachment, '{page-token}'); } catch(\Facebook\Exceptions\FacebookResponseException $e) { // When Graph returns an error echo 'Graph returned an error: ' . $e->getMessage(); exit; } catch(\Facebook\Exceptions\FacebookSDKException $e) { // When validation fails or other local issues echo 'Facebook SDK returned an error: ' . $e->getMessage(); exit; } $me = $response->getGraphUser(); echo 'Vous êtes connecté en tant que ' . $me->getName();
---------------------------------
Pendant la génération du token utilisateur ou de page depuis l'espace d'admin fb, il faut attribuer ces 2 permissions(manage_pages et publish_pages)

Eléphanteau du PHP | 12 Messages

10 nov. 2017, 19:32

Bonsoir Yann,
et merci.
Donc si je comprends bien ceci implique qu'à chaque demande de publication il faut récupérer un nouveau token utilisateur ?
le token de page étant toujours le même c'est bien cela ?

Mammouth du PHP | 571 Messages

13 nov. 2017, 15:36

non tout ce que facebook fait c'est de vérifier que l'expéditeur d'un message a bien le token valide c-a-d a bien le droit d'y poster sur le mur auquel il souhaite envoyer le message. Il se trouve que le token utilisateur a une durée de vie d'1 heure( c'est possible de l'étendre à 2 mois depuis ton espace dev facebook), donc impossible de l'utiliser au delà d'une heure. Pour ton cas (application de publication), tu auras forcement besoin de token de page qui lui n'expire pas. Ce token de page est généré à partir du token utilisateur depuis ton espace dev fb