Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php][facebook] Graph API nie zwraca urodzin mimo prawidłowego tokenu
Forum PHP.pl > Forum > PHP
LamaMASTER
Korzystam z wywołań graph API u siebie w projekcie PHP.

Przy każdym logowaniu generuję też access token aplikacji. Logowanie przez aplikację wymaga zgody na udostępnienie daty urodzenia (bez tego aplikacja nie przepuszcza do logowania).

Po logowaniu dodaję info o użytkownikach do bazy i później na podstawie ich FB_USER_ID mogę pobierać informacje/wykonywać akcje.

Wszystkie opcje mi działają prócz daty urodzin. Próbuję ją pobrać tak:

$fbf = file_get_contents('https://graph.facebook.com/'.$fb_id.'/?access_token='.$appaccesstoken);
$fbf = json_decode($fbf);

print_r($fbf);
echo $fbf->birthday;

Dostaję tablicę danego użytkownika z podstawowymi danymi, ale daty urodzin (birthday, wg dokumentacji), tam nie ma.

Konfiguracja zezwoleń w aplikacji:

http://i.imgur.com/xxWEPEw.jpg

SCOPE przy logowaniu przez FB:

scope=publish_actions,share_item,status_update,email,user_likes,user_birthday

Wszystkie inne rzeczy dostaję bez problemu (email, mogę publikować informacje, lajkować itp., ale nie dostaję daty urodzenia...).

Co robię źle?
ssstrz
nie wykonujesz zapytania o pole urodzin. przetestuj sobie zapytania tutaj https://developers.facebook.com/tools/explorer potem jak bd ok uzyskaj nowy token
LamaMASTER
Dzięki za ten debugger. Wybierając birthday mam "field is empty or disallowed by the access token".

Rozumiem, że mój AT nie uwzględnia tego pola, ale generuję go przy każdym logowaniu z określonym SCOPE, więc powinien się odświeżać.

Generując nowy access token z poziomu tego debuggera dla mojej aplikacji wszystko jest OK, ale przecież nie wkleję tego tokena na sztywno w kod. Jak zrobić, by taki też generował się u mnie?

Robię to tak:

Kod
$appaccesstoken = file_get_contents('https://graph.facebook.com/oauth/access_token?client_id='.$fb['client_id'].'&client_secret='.$fb['client_secret'].'&grant_type=client_credentials');


Coś tutaj jeszcze muszę zmienić?
ssstrz
Ja to robię w ten sposób:
  1. $redirectLink='https://www.facebook.com/dialog/oauth?client_id='.$appId.'&redirect_uri='.urlencode($urlHost).'&state='.$_SESSION['state']
  2. .'&scope=user_birthday,read_stream,email';

i np link albo od razu przekierowanie:
  1. header('Location: '.$redirectLink);

i teraz na podstawie tokena pobierasz dane z json

//
$appId - chyba wiadomo
$urlHost - np localhost
$_SESSION['state'] - $_SESSION['state']=md5(uniqid(rand(),true));
LamaMASTER
Tak mam jak loguję usera i wtedy na jego access tokenie mogę pobrać dane bez problemu.

Chodzi o to, że jak już usera dodałem do bazy to generuję app access token, który jest używany np. w cronie, który z kolei sprawdza czy user zalajkował stronę i takie tam. Teraz chcę uzupełnić daty urodzin (wcześniej nie było tej opcji) i też cron ma przelecieć po użytkownikach i to sprawdzić (użytkownicy już zezwolili na to info), ale tutaj już nie wiem jak wygenerować sensowny access token aplikacji z danymi uprawnieniami . Mój fragment kodu jest wzięty z dokumentacji FB:

https://developers.facebook.com/docs/facebo...ens/#generating

Oczywiście mógłbym pobrać daty zaraz po zalogowaniu usera, ale musiałbym czekać, aż każdy znowu się zaloguje smile.gif Poza tym to samo będzie ze sprawdzaniem lajków, jak ktoś odlajkuje stronę to chcę mu wyłączyć pewne profity, a takie sprawdzanie chciałem robić raz dziennie cronem właśnie jako pętla z appaccesstoken, która sprawdzi każdego usera od razu, nawet jeśli nie logował się od dawna na stronie.
ssstrz
ale jak aktualny access token nie udostępnia w scope daty urodzin to nie ma opcji aby tak o sobie dopisać birthday, musisz chyba aktualizować te tokeny, ja innej opcji nie widze
LamaMASTER
OK, mam rozwiązanie.

Niepotrzebnie generuję APP Access Token. Wydawało mi się, że tego typu TOKEN generuje wszystkie uprawnienia aplikacji i pozwala na pokazywanie wszystkiego, a tak naprawdę on służy tylko do zarządzania aplikacją i nie jest potrzebny (nazwa jest myląca).

Zamiast tego wystarczy generować zwykły access token, ten sam co przy logowaniu użytkowników (ze scope), ale nie trzeba do niego robić logowania. Token uwzględnia wszystkie uprawnienia i możemy używać po prostu $_SESSION['access_token'] do autoryzowania sprawdzania urodzin, lajków itp.

Teraz wszystko śmiga smile.gif

Dzięki za nakierowanie.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.