2013-12-20 2 views
0

У меня есть небольшое приложение для Facebook в процессе разработки. Цель состоит в том, чтобы отслеживать пользовательские приглашения и подсчитывать, сколько пользователей зарегистрировали «под» пользователей. Если номер цели достигнут, они получат подарок.Подписанный запрос не имеет app_data

Моя проблема заключается в том, что я не могу хранить идентификаторы запроса.

Приложение работает следующим образом:

Во-первых, перенаправление через JavaScript на страницу Facebook с установленным приложением. URL-адрес запроса - apps.facebook.com/XY, это не хорошо для меня, потому что мы хотим увеличить страницу Facebook, например, числа, поэтому, если приложение загружает ее, проверяет URL-адрес, и если это приложение appfaceface.com перенаправляет на страницу Facebook. Поскольку это перенаправление javascript, я могу сохранить только идентификаторы запроса в разделе app_data.

Это PHP часть, чтобы получить запрос идентификаторами:

$request_ids = ""; 

if(isset($_REQUEST['request_ids'])){ 

    if (!isset($_SESSION["RI"])) 
    { 
     $_SESSION["RI"] = $_REQUEST['request_ids']; 
    }else{ 
     $request_ids = $_SESSION["RI"]; 
    } 
} 

Это часть JavaScript в ТЕЛЕ:

 <script type="text/javascript"> 
    function NotInFacebookFrame() { 
     return top === self; 
    } 
    function ReferrerIsFacebookApp() { 
     if(document.referrer) { 
     return document.referrer.indexOf("apps.facebook.com") != -1; 
     } 
     return false; 
     } 
     if (NotInFacebookFrame() || ReferrerIsFacebookApp()) { 
     top.location.replace("<?= $fbPageAppURL.'&app_data='.$request_ids ?>"); 
     } 
     function sendRequestViaMultiFriendSelector() { 
      FB.ui({ 
      method: 'apprequests', 
      message: "<?= $friendInviteMessage ?>" 
      }); 
     } 
    </script> 

После Перенаправление App_Data устанавливается, я могу видеть его в URL, но signed_request не имеет набора app_data. Я храню подписанный запрос в переменной сеанса, потому что у меня подстраниц в приложение и таким образом подписанный запрос всегда должен быть установлен:

if (!isset($_SESSION["SR"])) 
{ 
    $_SESSION["SR"] = $_REQUEST["signed_request"]; 
}else{ 
    $encoded_sig = null; 
    $payload = null; 
    list($encoded_sig, $payload) = explode('.', $_SESSION["SR"], 2); 
    $sig = base64_decode(strtr($encoded_sig, '-_', '+/')); 
    $signed_request = $data = json_decode(base64_decode(strtr($payload, '-_', '+/'), true)); 
} 

$signed_request = objectToArray($signed_request); 

Таким образом, после этого var_dump ($ signed_request); имеет никогда не App_Data в нем :(

Может кто-то помочь мне спасибо

UPDATE:! хорошо, сейчас я вижу, что $ signed_request не права ... Если я загружаю приложение без ссылки запроса, он всегда перенаправляет меня на «пожалуйста, как на странице» раздел:

$page_id = $signed_request["page"]["id"]; 
$like_status = $signed_request["page"]["liked"]; 

    if(!$like_status){ 
     header("Location: notfan.php"); 
     exit; 
    } 

Так подписанный запрос не имеет App_Data и нет страницы и как информация ... :(

EDIT : это полный код подписанного запроса и обработки идентификаторов запросов:

$signed_request = $facebook->getSignedRequest(); 
$request_ids = ""; 

if(isset($_REQUEST['request_ids'])){ 

    if (!isset($_SESSION["RI"])) 
    { 
     $_SESSION["RI"] = $_REQUEST['request_ids']; 
    }else{ 
     $request_ids = $_SESSION["RI"]; 
    } 
} 

if (!isset($_SESSION["SR"])) 
{ 
    $_SESSION["SR"] = $_REQUEST["signed_request"]; 
}else{ 
    $encoded_sig = null; 
    $payload = null; 
    list($encoded_sig, $payload) = explode('.', $_SESSION["SR"], 2); 
    $sig = base64_decode(strtr($encoded_sig, '-_', '+/')); 
    $signed_request = $data = json_decode(base64_decode(strtr($payload, '-_', '+/'), true)); 
    $signed_request = objectToArray($signed_request); 
} 

ответ

1

Это мой способ обработки App_Data:

signed_request:

$fbsr = $facebook->getSignedRequest(); 
if ($fbsr['app_data']) 
{ 
    parse_str(base64_decode($fbsr['app_data']), $app_data); 
    $_GET = array_merge($_GET, $app_data); 
} 

И Link

$app_data = base64_encode(http_build_query(array('key' => 'value'))); 
$url = 'https://www.facebook.com/pages/' . $page_name . '/' . $page_id . '?sk=app_' . $appId . '&app_data=' . $app_data; 

Может быть, это поможет вам.

EDIT

В вашем коде видим это:

top.location.replace("<?= $fbPageAppURL.'&app_data='.$request_ids ?>"); 

Но $request_ids должен быть base64_encoded строка запроса, как это:

top.location.replace("<?= $fbPageAppURL.'&app_data='.base64_encode(http_build_query($request_ids)) ?>");

или если $request_ids является строка:

top.location.replace("<?= $fbPageAppURL.'&app_data='.base64_encode(http_build_query(array('request_ids' => $request_ids))) ?>");

+0

Спасибо, но моя проблема в том, что подписанный запрос не имеет app_data, поэтому для меня это не помогает. – VORiAND

+0

Я обновил свой ответ. Параметр app_data должен быть строкой запроса base64_encoded. Посмотрите на мой ответ, чтобы узнать, как этого достичь. –

+0

Нравится? top.location.replace (""); – VORiAND

Смежные вопросы