У меня есть небольшое приложение для 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);
}
Спасибо, но моя проблема в том, что подписанный запрос не имеет app_data, поэтому для меня это не помогает. – VORiAND
Я обновил свой ответ. Параметр app_data должен быть строкой запроса base64_encoded. Посмотрите на мой ответ, чтобы узнать, как этого достичь. –
Нравится? top.location.replace (" = $ fbPageAppURL. '& app_data ='. base64_encode ($ request_ids)?>"); – VORiAND