Мой вопрос кажется мне довольно сложным (возможно, не вам, ребята), поэтому я постараюсь объяснить как можно лучше. Я создаю «приложение» (не родное приложение, приложение на основе HTML) для запуска на киосках iPad в различных местах, чтобы люди могли регистрироваться на Foursquare. Это означает, что широта/долгота уже известны (фиксированные местоположения взяты из списка). У меня это уже работает с Facebook, но с Foursquare у меня проблемы.
Я пробовал множество различных решений, учебных пособий и библиотек (включая библиотеку Epi-async), и лучшее, что я нашел, это: http://blog.jambura.com/2011/07./23/implementing-foursquare-api-with-ease/. Это то, на чем основан мой код.
С учетом сказанного, поток моих приложений выглядит следующим образом:
- Пользователь начинает с index.php
- Пользователь нажимает кнопку «Отметиться на Foursquare!»
- Пользователь перенаправляется на экран входа в систему, а затем на экран «Разрешить», чтобы разрешить доступ к приложению.
- Пользователь регистрируется, используя информацию, поступающую из включенного файла.
- Пользователь перенаправляется обратно в приложение, где отображается секретное слово, которое он может сказать кассиру для получения скидки (очевидно, я понимаю, что и Facebook, и Foursquare предлагают регистрацию сделок, которые являются «встроенными», но ради этого вопрос, просто притворись, что это имеет смысл для тебя. :P)
- После отображения слова пользователь автоматически выходит из системы, сессия уничтожается, и приложение возвращается к index.php, чтобы позволить следующему человеку зарегистрироваться. (Я пока не знаю, как выйти из Foursquare через API, Я решил, что перейду этот мост, когда доберусь до него. Я надеюсь, что session_destroy(); достаточно!)
Здесь важно отметить, что с Facebook вы можете делать все через PHP и вообще не нужно использовать CURL. Это позволяет мне передать переменную GET с именем $loc_id, чтобы у меня было постоянное средство для запоминания того, в каком месте находится человек, а также это позволяет мне получать любой «чек в тексте» (для Foursquare это «крик») как любая широта / долгота, которая мне может понадобиться, и т. д.
С Foursquare я пытаюсь установить $loc_id в переменную сеанса, так как я должен использовать POST и не могу передавать какие-либо переменные на основе URL между моим приложением и Foursquare (как я могу с Facebook).
К сожалению, я могу заставить отметку Foursquare работать только наполовину. Позвольте мне показать вам код, который я использую (извините за форматирование, я все еще пытаюсь освоить эту сумасшедшую систему):
index.php:
<a href="checkin-foursquare.php?loc_id=<?php echo $loc_id; ?>">
‹ -- Это то, что запускает процессfs_conn.php:
<?PHP // $_SESSION["loc_id"] = $_GET["loc_id"]; I removed this because I wasn't sure if it was unsetting itself all the time $callback_url="https://www.mydomain.com/path/to/app/callback-foursquare.php"; $client_id="xxx"; $client_secret="yyy"; $authorize_url="https://foursquare.com/oauth2/authorize?client_id={$client_id}&response_type=code&redirect_uri={$callback_url}"; $access_token_url="https://foursquare.com/oauth2/access_token?post_checkins=post_checkins&client_id={$client_id}&client_secret={$client_secret}&grant_type=authorization_code&redirect_uri={$callback_url}&code="; ?>
checkin-foursquare.php:
<?php include_once 'inc/locations.php'; // this is where my location info is stored include_once 'inc/fs_conn.php'; // these are the keys/urls session_start(); $_SESSION["loc_id"] = $_GET["loc_id"]; $code = $_REQUEST["code"]; if(empty($code)) { $_SESSION['state'] = md5(uniqid(rand(), TRUE)); //CSRF protection $dialog_url = "https://foursquare.com/oauth2/authenticate?client_id=" . $client_id . "&redirect_uri=" . urlencode($authorize_url) . "&display=touch&response_type=code"; echo("<script> top.location.href='" . $dialog_url . "'</script>"); } else { if($_GET['post_checkins']=='post_checkins') { $url = 'https://api.foursquare.com/v2/checkins/add'; $fields = array( 'venueId'=> $venue_id, 'venue'=> $venue_name, 'shout'=> $shout, 'broadcast'=>'public', 'll'=> $loc_lat . "," . $loc_long, 'oauth_token'=> $_SESSION['access_token'] ); foreach($fields as $key=>$value) { $fields_string .= $key.'='.$value.'&'; } rtrim($fields_string,'&'); $ch = curl_init(); curl_setopt($ch,CURLOPT_URL,$url); curl_setopt($ch,CURLOPT_POST,count($fields)); curl_setopt($ch,CURLOPT_POSTFIELDS,$fields_string); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_exec($ch); curl_close($ch); header('Location: word-foursquare.php?loc_id=' . $_SESSION["$loc_id"] ); // this displays the secret word exit; } } ?>
callback-foursquare.php:
<?php // this is what gets redirected from Foursquare and is listed in the "callback" field include('inc/fs_conn.php'); // keys/urls again $access_token_url=$access_token_url.$_GET['code']; $access_token=json_decode(file_get_contents("{$access_token_url}"),true); $_SESSION['access_token']=$access_token['access_token']; header('Location: checkin-foursquare.php?loc_id=' . $_SESSION["loc_id"] . '&post_checkins=post_checkins'); exit; ?>
Таким образом, в основном это идет index.php -> checkin-foursquare.php -> foursquare.com -> callback-foursquare.php -> обратно в checkin-foursquare.php, чтобы фактически выполнить проверку -> word-foursquare.php
Это выглядит правильно?
Если я перейду на 'https://www.mydomain.com/path/to/app/checkin-foursquare.php?loc_id=SOME-CITY-HERE' правильно загружает страницу входа. Когда я вхожу в систему, отображается экран «Подключите свою учетную запись Foursquare к:». Однако, как только я дошел до этого момента, нажав кнопку «Разрешить», я возвращаюсь к файлу Foursquare-checkin.php, а затем снова и снова появляется один и тот же экран «Подключите свою учетную запись Foursquare с помощью:». Я чувствую, что мне не хватает какого-то токена или чего-то еще, например, Foursquare неправильно авторизуется (например, я не предоставляю ему правильный токен?), но я понятия не имею, что не так. :(
Я заметил, что в конце зацикленного URL добавлено «error=redirect_uri_mismatch». Однако URL-адрес обратного вызова в моих настройках Foursquare совпадает с $callback_url в fs_conn.php... поэтому я не уверен, что не так с URI перенаправления..?
Я пытался посмотреть на это, но это не очень помогло, это похоже на то, что я делаю, но с кодом, разделенным по-разному (например, мне не нужны всплывающие окна): Подключение к FourSquare API V2 с помощью PHP
Я знаю, что у меня есть только половина защиты от CSRF, но я не знаю, как правильно реализовать ее с помощью Foursquare. Это то, что заставляет меня застрять в петле? :(
В любом случае, извините, что так длинно, и я бесконечно благодарен всем, кто дочитал до этого места. Я прочитал так много страниц здесь, на SO, что все это начинает размываться. Я пользуюсь этим сайтом в течение многих лет, и это первый раз, когда я никогда не мог понять что-то самостоятельно. Отказ. :(