Как я могу передать некоторые значения своему приложению Facebook canvas в строке запроса? - PullRequest
3 голосов
/ 23 февраля 2012

Я разработал приложение для холста на Facebook, которое публикует пользователям новостные ленты, и я хочу, чтобы пользователи могли нажимать на ссылку в новостной ленте и переходить в мое приложение вместе с некоторыми данными, которые будут представлены в приложении например, передав его в строке запроса).

Когда я создаю ссылку, которая будет публиковаться в новостной ленте пользователя, я устанавливаю поле ссылки на -

http://apps.facebook.com/myappname/?datatopass=mydata

Это работает, когда пользователь нажимает эту ссылку, браузер направляет его на эту ссылку. Однако я не могу получить доступ к переменной $ _GET ['datatopass'] (используя PHP), и она кажется пустой. Я пытался использовать javascript для вывода переменной window.location, и я не вижу свою переданную строку запроса, хотя я вижу URL-адрес, как это было выше в адресной строке моего браузера. То, что я вижу, - это URL сайта, который я настроил в приложении для разработчиков на Facebook, и параметры state и code , которые использует Facebook. Он лишил моего параметра datatopass , который я хотел прочитать, когда запустило мое приложение.

Итак ... как я могу передать данные, которые я хочу отправить? Я знаю, что есть поле app_data, если вы используете signature_request, но, насколько я понимаю, это хорошо только для приложений, которые находятся на вкладке страницы. Я использую метод приложения iFrame canvas.

Когда я просматриваю журналы доступа моего сервера apache, я вижу, что есть запись POST для адреса моего сайта с моей добавленной строкой запроса -

my.domain.com 123.456.7.890 - - [23/Feb/2012:14:21:19 +0000] "POST /facebookapp/?datatopass=mydata HTTP/1.1" 200 300 "http://apps.facebook.com/myappname/?datatopass=mydata" "Mozilla/5.0 (Windows NT 5.1; rv:11.0) Gecko/20100101 Firefox/11.0"

Далее следует запись GET -

my.domain.com 123.456.7.890 - - [23/Feb/2012:14:21:20 +0000] "GET /facebookapp/directory/?state=99226fiawhoidhaoia09809a085d94832&code=ahfakshdlkfhalksj.... HTTP/1.1" 200 27094 "http://my.domain.com/facebookapp/?play=asd" "Mozilla/5.0 (Windows NT 5.1; rv:11.0) Gecko/20100101 Firefox/11.0"

Мои извинения. Я не совсем понимаю, что делает вышеупомянутое, но надеялся, что это будет полезной дополнительной информацией, чтобы помочь ответить на этот вопрос.

Ответы [ 5 ]

4 голосов
/ 19 июня 2012

Facebook позволяет передавать данные через переменную app_data.Эта переменная является частью подписанного запроса и является строкой в ​​кодировке json.Поэтому пример может выглядеть так:

 top.location.href = "http://www.facebook.com/pages/PAGENAME/PAGE_ID?sk=APP_ID&app_data=MYDATA";

Эта переменная app_data становится частью подписанного запроса Facebook.Дополнительную информацию можно найти здесь: http://developers.facebook.com/docs/authentication/signed_request/
Вы просто анализируете подписанный запрос и затем можете получить доступ к данным через app_data, как показано в документации:

 function parse_signed_request($signed_request, $secret) {
      list($encoded_sig, $payload) = explode('.', $signed_request, 2); 

      // decode the data
      $sig = base64_url_decode($encoded_sig);
      $data = json_decode(base64_url_decode($payload), true);

      if (strtoupper($data['algorithm']) !== 'HMAC-SHA256') {
          error_log('Unknown algorithm. Expected HMAC-SHA256');
          return null;
      }

      // check sig
      $expected_sig = hash_hmac('sha256', $payload, $secret, $raw = true);
      if ($sig !== $expected_sig) {
          error_log('Bad Signed JSON signature!');
          return null;
      }

      return $data;
 }

 function base64_url_decode($input) {
      return base64_decode(strtr($input, '-_', '+/'));
 }

Итак, вы можете вызвать функциюи получить доступ к app_data вот так вот с таким:

 <?php 
      $signed_request = parse_signed_request($signed_request, $secret);
      $signed_request['app_data'] = MYDATA;
 ?>
1 голос
/ 15 ноября 2012

Любые значения, которые вы передаете в ссылку apps.facebook.com, также будут переданы на вашу страницу холста. Единственным исключением является signed_request, который Facebook размещает на вашей странице холста.

1 голос
/ 23 февраля 2012

Используете ли вы переписать движок? Facebook поддерживает это, поэтому ссылка, такая как apps.facebook.com/myapp/data/anotherdata, является действительной. Попробуйте это так и print_r ($ _ REQUEST), чтобы проверить, если это передано.

1 голос
/ 23 февраля 2012

Facebook используется для разрешения параметров GET для приложений холста.Эти параметры были переданы через тег IFRAME, который Facebook использовал для встраивания вашего приложения.Однако это создает угрозу безопасности, поскольку все скрипты, включенные на странице (css, js ...), имеют доступ к этим параметрам через Referrer.В результате все приложения должны были перейти на использование параметров POST.Пожалуйста, смотрите этот документ для дополнительной информации:

http://developers.facebook.com/docs/canvas/post/

1 голос
/ 23 февраля 2012

Возможно, вам потребуется / после имени приложения в URL, т.е. ..

http://apps.facebook.com/myappname/?datatopass=mydata

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...