Foursquare API Checkin

时间:2012-02-25 13:06:27

标签: api curl foursquare checkin

我的问题对我来说似乎很复杂(也许不是你们),所以我会尽力解释。我正在构建一个“应用程序”(不是本机应用程序,基于HTML的应用程序),可以在各个场所的iPad自助服务终端上运行,以便人们可以在Foursquare上办理登机手续。这意味着lat / long已知(来自列表的固定位置)。我已经将这个与Facebook合作,但Foursquare很痛苦。

我尝试了大量不同的解决方案,教程和库(包括Epi-async库),我发现的最好的是:http://blog.jambura.com/2011/07/23/implementing-foursquare-api-with-ease/。这就是我的代码所基于的。

话虽如此,我的应用程序流程如下:

  1. 用户从index.php
  2. 开始
  3. 用户触摸按钮“登入Foursquare!”
  4. 用户被路由到登录屏幕,然后进入允许屏幕以允许访问该应用程序。
  5. 使用来自附带文件的信息签入用户。
  6. 用户被引导回应用程序,其中显示一个秘密词,他们可以告诉收银员打折(显然我明白Facebook和Foursquare都提供“内置”的签入交易,但对于这个问题的缘故只是假装这对你有意义。:P)
  7. 显示单词后,用户自动注销,会话被销毁,应用程序返回index.php让下一个人签到。(我不知道如何通过以下方式注销Foursquare API还没有,我想我到达那个桥时会穿过那个桥。我希望session_destroy();就够了!)
  8. 现在,重要的是要注意,通过Facebook,您可以通过PHP完成所有工作,而根本不需要使用CURL。这允许我传递一个名为$ loc_id的GET变量,以便我有一个持久的方法来记住这个人所在的位置,这样我就可以拉出任何“签入文本”(对于Foursquare而言,它就是“喊叫”)以及我可能需要的任何纬度/长度等等。

    使用Foursquare,我试图将$ loc_id设置为会话变量,因为我必须使用POST,并且不能在我的应用程序和Foursquare之间携带任何基于URL的变量(就像我可以使用Facebook)。

    不幸的是,我只能让Foursquare检查中途工作。让我告诉你我正在使用的代码(请原谅我的格式,仍然试图抓住这个疯狂的系统):

    1. index.php <a href="checkin-foursquare.php?loc_id=<?php echo $loc_id; ?>">&lt; - 这是启动流程的原因

    2. 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=";
      
      ?>
      
    3. 签-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;
          }
          }
            ?>
      
    4. 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;
      ?>
      
    5. 所以基本上它是index.php - &gt; checkin-foursquare.php - &gt; foursquare.com - &gt; callback-foursquare.php - &gt;回到checkin-foursquare.php来实际检查 - &gt;字foursquare.php

      这看起来是否正确?

      如果我转到“https://www.mydomain.com/path/to/app/checkin-foursquare.php?loc_id=SOME-CITY-HERE”,则会正确加载登录页面。当我登录时,它会正确显示“将您的foursquare帐户连接到:”屏幕。但是,一旦我到达这一点,单击“允许”按钮会将我指回foursquare-checkin.php,然后将相同的“将您的foursquare帐户连接到:”屏幕一遍又一遍地显示出来。我觉得我错过了一些令牌或其他东西,比如Foursquare没有正确授权(就像我没有提供正确的令牌?),但我不知道出了什么问题。 :(

      我注意到在循环网址的末尾附加了'error = redirect_uri_mismatch'。但是我的Foursquare设置中的回调URL与fs_conn.php中的$ callback_url相同...所以我不确定重定向URI有什么问题。?

      我试着看这个,但它没有多大帮助,它看起来像我正在做的但是代码分开不同(例如我不需要弹出窗口):Connecting with FourSquare API V2 using PHP

      我知道我只有一半的CSRF保护,但我不确定如何用Foursquare正确实现它。这是什么导致我陷入循环? :(

      无论如何,我很遗憾这已经很久了,我永远感激任何读过这篇文章的人。我在这里阅读了很多页面,所有这些都开始模糊起来。我多年来一直在使用这个网站,这是我第一次无法自己解决问题。失败。 :(

1 个答案:

答案 0 :(得分:2)

虽然没有得到官方支持,但foursquare API还有许多社区贡献的库。如果您使用PHP访问API,则应考虑使用列出的PHP库之一:https://developer.foursquare.com/resources/libraries