Мой вопрос кажется мне довольно сложным (может быть, не вам, ребята), поэтому я постараюсь объяснить как можно лучше.Я создаю «приложение» (не нативное приложение, приложение на основе HTML) для запуска на киосках iPad в разных местах, чтобы люди могли зарегистрироваться на Foursquare.Это означает, что широта / долгота уже известны (фиксированные местоположения идут из списка).У меня уже есть такая работа с Facebook, но Foursquare вызывает у меня боль.
Я перепробовал множество различных решений, учебных пособий и библиотек (включая библиотеку Epi-async) и самый лучший, который я нашелэто: http://blog.jambura.com/2011/07/23/implementing-foursquare-api-with-ease/. Это то, на чем основан мой код.
С учетом сказанного, мой поток приложений выглядит так:
- Пользователь начинает с индекса.php
- Пользователь нажимает кнопку «Регистрация на Foursquare!»
- Пользователь перенаправляется на экран входа в систему, а затем на экран Разрешить, чтобы разрешить доступ к приложению.
- Пользователь регистрируется с использованием информации, поступающей из включенного файла.
- Пользователь направляется обратно в приложение, где отображается секретное слово, которое может сообщить кассиру о скидке (очевидно, я понимаю, что и Facebook, и Foursquareпредложить проверку в сделках, которые являются «встроенными», но ради этого вопроса просто сделайте вид, что это имеет смысл для вас.: P)
- После отображения слова пользователь автоматически выходит из системы,сеанс уничтожен, и приложение возвращается к index.php, чтобы позволить следующему человеку зарегистрироваться. (Я пока не знаю, как выйти из Foursquare через API, я решил, что перейду этот мост, когда доберусь до него,Я надеюсь, что session_destroy ();достаточно!)
Теперь важно отметить, что с Facebook вы можете делать все через PHP и вообще не использовать CURL.Это позволяет мне передавать переменную GET с именем $ loc_id, чтобы у меня было постоянное средство запоминать, в каком месте находится человек, и это также позволяет мне извлекать любую «проверку текста» (для Foursquare это «крик»)как любой lat / long, который мне может понадобиться и т. д.
В Foursquare я пытаюсь установить $ loc_id в переменную сеанса, поскольку мне приходится использовать POST и я не могу переносить какие-либо переменные на основе URL междумое приложение и Foursquare (как я могу с Facebook).
К сожалению, я могу заставить проверки Foursquare работать только наполовину.Позвольте мне показать вам код, который я использую (прошу прощения за мое форматирование, все еще пытаюсь освоить эту сумасшедшую систему):
index.php : <a href="checkin-foursquare.php?loc_id=<?php echo $loc_id; ?>">
<- это то, что запускает процесс </p>
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, чтобы фактически выполнить checkin -> word-foursquare.php
Выглядит ли это правильно?
Если я перехожу к 'https://www.mydomain.com/path/to/app/checkin-foursquare.php?loc_id=SOME-CITY-HERE', он корректно загружает страницу входа.Когда я вхожу в систему, он корректно отображает экран «Подключить учетную запись foursquare with:».Однако, как только я доберусь до этой точки, нажатие кнопки «Разрешить» возвращает меня к файлу foursquare-checkin.php, а затем вызывает тот же экран «Подключите учетную запись foursquare with:» вверх, снова и снова.Мне кажется, что мне не хватает какого-то токена или чего-то подобного, как Foursquare неправильно авторизуется (как будто я не предоставляю ему правильный токен?), Но я понятия не имею, что не так.: (
Я заметил, что в конце зацикленного URL был добавлен 'error = redirect_uri_mismatch'. Однако URL обратного вызова в моих настройках Foursquare такой же, как $ callback_url в fs_conn.php ..так что я не уверен, что не так с URI перенаправления ..?
Я попытался посмотреть на это, но это не сильно помогло, похоже, что я делаю, но с кодом, разделенным по-другому (например, мне не нужны всплывающие окна): Соединение с FourSquare API V2 с использованием PHP
Я знаю, что у меня есть только половина защиты CSRF, но я не уверен, как правильно реализовать ее с Foursquare. Это то, что заставляет меня зацикливаться? (
В любом случае, мне жаль, что это так долго, и я всегда благодарен всем, кто прочитал это далеко. Я прочитал так много страниц здесь на SO, что все это начинает стираться вместе. Я использую этот сайт в течение многих лет, и это первый раз, когда я никогда не мог понять что-то самостоятельно. Провал. (