Я пытаюсь разработать приложение Facebook (apps.facebook.com/some_app), используя PHP, где мне нужно представить некоторую информацию на основе интересов пользователя. Я нашел, что это под "user_likes> games".
Мои проблемы заключаются в следующем:
$auth_url = "http://www.facebook.com/dialog/oauth?client_id=" . $app_id . "&redirect_uri=" . urlencode($canvas_page) ."&scope=user_likes";
http://MY_CANVAS_PAGE/?code=some base64 encoded letters
if(empty($code) && !isset($_REQUEST['error'])) { $_SESSION['state'] = md5(uniqid(rand(), TRUE)); //CSRF protection echo("<script> top.location.href='" . $auth_url . "'</script>"); }
$signed_request = $_REQUEST["signed_request"]; list($encoded_sig, $payload) = explode('.', $signed_request, 2); $data = json_decode(base64_decode(strtr($payload, '-_', '+/')), true); echo ("Welcome User: " . $data["user_id"]);
Также попробовал код, найденный в http://developers.facebook.com/blog/post/500/
но я получаю ошибку при попытке получить информацию об отладке, используя
print_r($decoded_response);
stdClass Object ( [error] => stdClass Object ( [message] => An active access token must be used to query information about the current user. [type] => OAuthException [code] => 2500 ) )
Чтобы получить общедоступную информацию пользователя, я также попробовал предложенный пример в PHP SDK
$facebook = new Facebook(array( 'appId' => MY_APP_ID, //registered facebook APP ID 'secret' => MY_SECRET, //secret key for APP )); $fb_user = $facebook->getUser(); if($fb_user){ try { $user_profile = $facebook->api('/me'); echo $user_profile['email']; } catch(FacebookApiException $e) { $fb_user = null; } }
Но успеха нет. Может кто-нибудь объяснить мне, почему я получаю эту ошибку и как правильно получить доступ к музыке пользователя. Возможно, я неправильно понял API.
благодаря
Дипак
Ошибка 2500 означает, что у вас нет токена доступа или токена доступа к доступу, но вы пытаетесь получить доступ /me/
– 'me' является заполнителем для «текущего пользователя или идентификатора страницы», поэтому не будет действителен без токена доступа для пользователя или стр.
Чтобы получить доступ к списку пользователей, вам также понадобится разрешение user_likes
при авторизации их
Наиболее вероятными причинами, которые я видел для приложений, которые не могут обменять code
для токена доступа, являются:
redirect_uri
относится к корню папки или сервера и не имеет завершающей косой черты (т.е. это http://www.example.com
вместо http://www.example.com/
) redirect_uri
вы использовали при первом вызове в диалоговом окне auth, не была точно такой же, как redirect_uri
вы использовали в вызове, чтобы обменять код на access_token Если ваш поток авторизации нарушен по какой-либо другой причине, и вы не можете понять это из примеров SDK или документации по аутентификации , это может занять некоторое время, когда кто-то может рассказать вам об этом, потому что вам могут не хватать некоторых базовых знаний, необходимых для понимания их ответы
Для меня я пытался получить токен аутентификации с php и выяснил, что ошибка 2500 была вызвана проблемой с file_get_contents
ничего не возвращал. Я мог получить доступ к URL-адресу в моем браузере, но не с помощью file_get_contents
. Я исправил его, используя CURL вместо этого, как описано здесь: https://stackoverflow.com/a/6325313 .
В результате я использовал код из https://developers.facebook.com/docs/authentication/server-side/ и заменил строку:
$response = file_get_contents($token_url);
с
$ch = curl_init($token_url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $response = curl_exec($ch);
Поэтому стало:
$token_url = "https://graph.facebook.com/oauth/access_token?client_id=" . $app_id . "&redirect_uri=" . urlencode($redirect_url) . "&client_secret=" . $app_secret . "&code=" . $code; /* Facebook say to use this, but file_get_contents isn't working! $response = file_get_contents($token_url,null, $val); */ // Use this as an alternative $ch = curl_init($token_url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $response = curl_exec($ch); // From https://developers.facebook.com/docs/authentication/server-side/ $params = null; parse_str($response, $params); $access_token = $params['access_token'];
попробуйте этот код
$code = $_REQUEST["code"]; if(empty($code)) { $dialog_url = "http://www.facebook.com/dialog/oauth?client_id=" . $app_id . "&redirect_uri=" . urlencode($my_url) ; echo("<script>top.location.href='" . $dialog_url . "'</script>"); } $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); $access_token = $params['access_token'];
PS: адрес электронной почты пользователя не является общедоступной информацией, и для этого вам необходимо разрешение пользователя user_email
Я решил свою проблему благодаря https://developers.facebook.com/blog/post/534/
Я просто скопировал образец и вставил его в свой скрипт. Он полностью подходит. Это своего рода гибридное использование PHP и Javascript.