Доступ к данным POST в приложении Facebook Canvas

У меня есть простая форма в моем приложении Canvas/iframe Facebook, и я пытаюсь передать значения как POST. Теперь, прочитав все об этом повсюду в S.O. и последние документы FB, насколько я понимаю, все данные, отправляемые через форму POST, могут быть доступны на принимающей стороне из объекта $_REQUEST.

Я также читал в другой теме на S.O. что для того, чтобы POST-формы работали, вам нужно передать ввод с именем «signed_request» со значением в качестве текущего signed_request (у меня есть подписанный запрос, работающий нормально, в противном случае... все элементы входа и аутентификации работают нормально). Это нигде не упоминается в официальных документах FB.

Итак, моя проблема в том, что все, что возвращается в объекте $_REQUEST, — это подписанный запрос и куча других вещей сеанса. Мои входные данные формы нигде не могут быть найдены.

Единственный способ, которым я могу их прочитать, - это установить метод формы на «ЗАПРОС», который даже не является методом реальной формы. Но затем он принимает все мои входные данные и отправляет их в виде аргументов GET в URL-адресе. Ужасный. Вот пример страницы из моего приложения на основе холста только с формой, которую я использую для отладки (опуская все элементы аутентификации):

<form enctype="application/x-www-form-urlencoded" method="POST" target="_top" id="my_form" action="https://apps.facebook.com/myfakeapp/form_test.php">
<input type="text" name="test1" value="58" />
<input type="text" name="test2" value="123" />
<input type="text" name="test3" value="434" />
<input type="text" name="test4" value="645" />
<input type="text" name="signed_request" value="<? echo $_REQUEST['signed_request']; ?>">
<input value="Submit Answers" type="submit">
</form>

Документы FB сбивают с толку, поскольку некоторые из них относятся к этому режиму бета-миграции, который у них был для старых приложений, обрабатывающих запросы POST для приложений на основе холста.


person jonkeegan    schedule 10.10.2011    source источник
comment
Глупый вопрос: вы вообще пытались использовать $_POST или пропустили его из-за того, что прочитали? Edit_: если вы находитесь в iFrame, вы можете просто использовать form_test.php в качестве своего действия, целевой и полный URL-адрес приложения здесь не требуется (по крайней мере, это работает в моих приложениях, работающих на фан-страницах внутри вкладки)   -  person Björn Kaiser    schedule 10.10.2011
comment
Да, поверьте мне, я пробовал это миллион раз! Кажется, что в документации FB действительно есть большая черная дыра в отношении того, как обрабатывать формы в приложениях на основе холста.   -  person jonkeegan    schedule 10.10.2011


Ответы (1)


Вы объединяете два отдельных метода... цель отправки формы с target=_top и action=apps.facebook.com/xxx состоит в том, чтобы заставить Facebook автоматически отправлять параметр signed_request. Если вы отправляете его сами, вам следует использовать «внешний» адрес вашей страницы в качестве действия и не включать целевой атрибут. Используя target=_top, вы перезагружаете весь фреймворк и отправляете данные своей формы в Facebook, который, конечно же, их игнорирует.

person Floyd Wilburn    schedule 10.10.2011
comment
Обратите внимание, что это не так просто! вам нужно фактически обработать signed_request и проверить, не истек ли срок его действия, и текущий пользователь на самом деле является пользователем, отправившим форму (а не другим пользователем, который вышел из текущего пользователя с другой вкладки)! Я не уверен, обновит ли Facebook все вкладки, когда такое произойдет. Но это стоит проверить. - person ifaour; 11.10.2011
comment
Он заявил, что оставил код аутентификации только в целях тестирования/отладки и что он уже заранее отработал обработку sign_request. Поскольку он передает исходный signed_request, эта часть не должна меняться. - person Floyd Wilburn; 11.10.2011