2012-02-23 34 views
3

我開發了一個Facebook畫布應用程序,向用戶發送新聞傳遞,我希望能夠允許用戶點擊新聞傳遞中的鏈接,並將其與應用程序中呈現的一些數據一起帶到我的應用程序中例如通過將它傳遞給查詢字符串)。如何在查詢字符串中將某些值傳遞給我的Facebook畫布應用程序?

當我創建將用戶的動態消息發佈的鏈接我設置鏈接場 -

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

這工作,當用戶點擊這個鏈接的瀏覽器引導他們該鏈接。但是我無法訪問$ _GET ['datatopass']變量(使用PHP),它看起來是空白的。我已經嘗試使用JavaScript來輸出window.location變量,並且我沒有看到我傳遞的查詢字符串,儘管我在瀏覽器地址欄中看到上面的url。我所看到的是我在facebook開發人員應用程序中設置的網站網址,以及facebook使用的狀態代碼 params。它剝離了我的datatopass param,我希望能夠在我的應用程序啓動時閱讀。

所以...我怎麼傳遞我想發送的數據?如果您使用的是signed_request,我知道有一個app_data字段,但據我所知,這僅適用於坐在頁面的Tab中的應用程序。我正在使用iFrame canvas應用程序方法。

當我看着我的Apache服務器的訪問日誌,我可以看到,有我的網站的URL地址的POST進入我的附加查詢字符串 - 隨之而來的是GET項

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" 

-

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" 

我的歉意我真的不明白上述是做什麼,但希望這將是有用的額外信息,在幫助回答這個問題。

回答

1

您可能需要/在URL即應用程序名後..

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

+0

嗨 - 是的,這是我的錯誤打印我應該添加/在我的問題 - 但我的瀏覽器會爲我添加這個,如果我不這樣,我看到相同的行爲,無論。當我在Facebook上配置應用時,我有Site URL = http://my.domain.com/facebookapp/index.php和canvas url = http://my.domain.com/facebookapp/ Canvas頁面是http:// apps.facebook.com/myappname(沒有斜線,但隨後Facebook會爲你填充)..我更新了我的問題,但是感謝您指出了這一點。 – undefined 2012-02-23 15:40:51

1

是否使用重寫引擎? Facebook支持它,所以像apps.facebook.com/myapp/data/anotherdata這樣的鏈接是有效的。 試試這個方法,如果print_r($ _ REQUEST)通過,就試試它。

1

Facebook用於允許畫布應用的GET參數。這些參數通過Facebook用來嵌入您的應用的IFRAME標籤傳遞。但是,這帶來了安全風險,因爲該頁面包含的所有腳本(css,js ...)都可以通過引用來訪問這些參數。因此,所有應用程序都需要遷移到使用POST參數。請參閱本文檔的附加信息:

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

+0

好吧,但我仍然看不到我如何在查詢字符串中傳遞變量 - 我想用鏈接更新用戶的狀態,當他們點擊它時會啓動我的應用程序並使用url的查詢字符串部分中的數據進行預配置。那麼這是不是可以做到這一點? – undefined 2012-02-24 14:05:20

+0

URL的查詢字符串中的變量是GET參數。 Facebook正在自動剝離這些變量。您可能會在地址欄中看到它們,但它們並未包含在IFRAME標記中,這是真正重要的。你試圖做的事情當然是可能的,它只需要多一點編碼。例如,您可以使用帶有隱藏字段的FORM標籤來替換傳統的錨鏈接,以獲取所需的參數。另一種選擇是使用JavaScript自動將傳統鏈接轉換爲POST,請參閱此處的示例: http://code.google.com/p/postlink/ – 2012-02-24 15:21:01

+0

感謝吉爾,我一直在想,我可能不得不做我想你是在暗示鏈接到一個腳本(託管在我的服務器上),該腳本將查詢字符串參數轉換爲表單,然後將其提交給我的畫布應用 - 這就是你的意思嗎? – undefined 2012-02-24 16:48:17

4

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; 
?> 
+0

嘗試過,但不起作用。 – dtbarne 2012-11-14 16:14:51

+0

這很奇怪。它似乎仍然在爲我工作。你的app_data是在json_encoded字符串中嗎?我不知道這些帖子是否有幫助:[facebook-app-data](http://stackoverflow.com/questions/8646589/facebook-app-data)[另一篇文章](http://stackoverflow.com/questions/10801807/facebook-fan-page-app-pass-string-to-app-data-and-retrieve) – fldsofglry 2012-11-15 15:42:27

+0

從我們的結尾看,他們的分享功能在美國東部時間晚上7點。我想知道這是否也會影響到這個功能。 – fldsofglry 2012-11-15 15:49:05

1

你傳遞到apps.facebook.com鏈接的任何值也會傳遞到你的畫布頁面。一個例外是signed_request,Facebook將其POST到您的畫布頁面。

+0

謝謝@dtbarne。這個應該被標記爲答案。 – brainondev 2014-08-05 10:07:19

相關問題