2012-06-28 35 views
1

我使用FB.ui()像這樣:FB.ui拼圖:不一致的錯誤代碼191 ...(好像FB.init經常不工作)

<script> 
     window.fbAsyncInit = function() { 
     FB.init({ 
      appId  : '##########', // App ID 
      channelUrl : '//www.xxxxxxxxxx.com/channel.php', // Channel File 
      status  : true, // check login status 
      cookie  : true, // enable cookies to allow the server to access the session 
      xfbml  : true // parse XFBML 
     }); 

     // Additional initialization code here 
     }; 

     // Load the SDK Asynchronously 
     (function(d){ 
     var js, id = 'facebook-jssdk', ref = d.getElementsByTagName('script')[0]; 
     if (d.getElementById(id)) {return;} 
     js = d.createElement('script'); js.id = id; js.async = true; 
     js.src = "//connect.facebook.net/en_US/all.js"; 
     ref.parentNode.insertBefore(js, ref); 
     }(document)); 
    </script> 

然後,這裏的鏈接發送消息:

<a href='#' onClick=" 
     FB.ui({ 
      method: 'send', 
      name: 'Bla bla bla', 
      link: 'http://www.xxxxxxxxxxx.com', 
      to: ###########, 
      //redirect_uri: 'http://www.xxxxxxxxxxx.com/fb/' 
      }); 
     ">Send a message</a> 

問題: 這個工作對我來說就像魅力和每臺計算機/瀏覽器我測試過的。但我的客戶得到以下錯誤消息非常頻繁:

API Error Code: 191 
API Error Description: The specified URL is not owned by the application 
Error Message: redirect_uri is not owned by the application 

enter image description here

這我完全難住了!我的代碼有問題嗎?如果是這樣,爲什麼我不能重現此錯誤,而我的客戶一直可以在多臺計算機/瀏覽器上?

PS:如果你想嘗試自己,該網頁是生活here。你必須授權應用程序,但我保證不會發生令人毛骨悚然的事情。

編輯:該錯誤提到redirect_uri,你會注意到在我的代碼中註釋掉了。原因是因爲當我包含該參數時,當我點擊「關閉」時,對話不會關閉。

編輯2:我能夠在朋友的電腦上重現此錯誤,並且CBroe也證實了它。所以,(拋開爲什麼我自己還不能生產的奧祕),最讓我難堪的是爲什麼這隻會發生一半的時間?如果我的代碼不正確,它應該永遠不會工作,對吧?

這裏是從錯誤信息的網址:

https://www.facebook.com/dialog/send?display=popup&link=http%3A%2F%2Fwww.streetofwalls.com&locale=en_US&name=Career%20Networking%20powered%20by%20Street%20of%20Walls&next=http%3A%2F%2Fstatic.ak.facebook.com%2Fconnect%2Fxd_arbiter.php%3Fversion%3D8%23cb%3Df2c657ef78%26origin%3Dhttp%253A%252F%252Fwww.streetofwalls.com%252Ff3575a615c%26domain%3Dwww.streetofwalls.com%26relation%3Dopener%26frame%3Df1ca46b43c%26result%3D%2522xxRESULTTOKENxx%2522&sdk=joey&show_error=true&to=573501273 

url_decode()版本:

https://www.facebook.com/dialog/send?display=popup&link=http://www.streetofwalls.com&locale=en_US&name=Career Networking powered by Street of Walls&next=http://static.ak.facebook.com/connect/xd_arbiter.php?version=8#cb=f2c657ef78&origin=http%3A%2F%2Fwww.streetofwalls.com%2Ff3575a615c&domain=www.streetofwalls.com&relation=opener&frame=f1ca46b43c&result=%22xxRESULTTOKENxx%22&sdk=joey&show_error=true&to=573501273

EDIT3:這個難題的 部分解決。發生錯誤的時間是FB.init()無效的結果。我已將FB.ui()包裝在FB.getLoginStatus(function(response){ \\... }中,所以現在您可以在控制檯中看到更有用的錯誤。開放的問題是...爲什麼FB.init()經常失敗?

+0

在允許您的應用後,當我點擊開始頁面上的「通過邀請好友連接來擴展您的網絡」時,我可以確認該錯誤。 (我只能得到紅色邊框的錯誤信息,而不是詳細的錯誤代碼,但這是因爲它不在我的調試模式,我猜。) – CBroe

+0

這是令人困惑的。錯誤信息似乎有所不同,我根本無法重現!我在發佈問題之前添加了一個'show_errors:true'參數,這似乎顯示了其他信息...有時。 – emersonthis

+0

@CBroe:你的錯誤是否也是間歇性的?我的客戶說它只出現在每兩秒或三頁重新加載。 – emersonthis

回答

-1

因此Nitzan因其富有洞察力的評論而值得讚揚,但這裏有解決方案。

我得到的錯誤消息是由於FB.init()未加載或至少沒有按正確的順序加載相對於頁面的其餘部分的結果。我從Facebook的開發人員文檔複製代碼,它加載異步...這是一種在屁股大痛...

因此,而不是我所做的,我切換到加載它舊老式的方式:

FB.init({ 
     appId  : '##########', // App ID 
     channelUrl : '//www.xxxxxxxxxx.com/channel.php', // Channel File 
     status  : true, // check login status 
     cookie  : true, // enable cookies to allow the server to access the session 
     xfbml  : true // parse XFBML 
    }); 

這,結合其他腳本的一些重新排序,似乎已經解決了我的問題。

+0

正如我在我的回答中提到的,您可以同步加載JavaScript SDK進行調試。但請記住,不建議將此方法用於[docs](https://developers.facebook.com/docs/reference/javascript/)中所述的典型用法。同步操作會阻止網頁,導致性能下降和用戶體驗變慢。這也可能會對SEO造成負面影響,原因是機器人和爬蟲感覺到緩慢的增加。 – borisdiakur

+0

是否同步加載此腳本比同時加載任何其他stript更糟?我得到爲什麼異步是有利的,但我的問題是,它不工作(至少不適合我)!在解決這個問題數週之後,似乎很多人都有這個問題,並且Facebook並沒有通過提供一個簡單的回調函數來告訴你SDK什麼時候初始化,從而使得解決問題變得更加容易。 – emersonthis

+0

正如您已經注意到的那樣,異步加載SDK的設置非常容易出錯,但我的經驗是,總有一種方法可以正確執行。你只需要調整你的代碼並做一點實驗。我在我的答案下面添加了另一條評論,您還有什麼可以嘗試的。祝你好運! – borisdiakur

0

這是由於您的redirect_uri和您爲Facebook應用指定的設置之間的配置錯誤。請參閱this question的答案。

redirect_uri應該等於(或相對)您在Facebook應用程序設置中設置的網站網址。因此,請確保您的網站網址已設置,並且它指向的目錄等於或低於您的redirect_uri。另外,請確保您已在Facebook設置中將應用的網域設置爲正確。

例如:

應用領域:streetofwalls。COM

網站網址:/安全帆布網址:/安全頁面標籤網址:http://www.streetofwalls.com

+1

這不是這個。我已經看到了遍佈各處的錯誤,並且我嘗試了應用程序設置中的每個似乎合理的域(包括尾部反斜槓,沒有尾部反斜槓等)。事實上,如果你看看我的代碼,你會發現我甚至沒有聲明一個重定向URL(參見上面對CBroe的評論)。它的工作時間是2/3。那麼這怎麼會是問題呢?我對FB API知之甚少的教訓告訴我,不正確的設置會導致事情完全停止工作,而不是有時候工作。 – emersonthis

0

首先您加載下面的腳本在頁面的頭:

<script type="text/javascript" src="http://www.streetofwalls.com/wp-content/themes/streetofwalls/js/main.js"></script> 

內部的腳本嘗試異步加載FB JavaScript SDK。 SDK需要fb-root元素才能正確加載,如docs中所述。但是您的fb-root元素可能尚未呈現,因此這是我猜測的問題。

window.fbAsyncInit = ...和異步加載SDK的代碼放在jQuery(document).ready(function($) { ... });裏面,你應該沒問題。

對於調試,您也可以嘗試同步加載Facebook SDK。

我注意到的另一件事: 您的站點頭部有兩個腳本標籤,它們加載FB JavaScript SDK。你應該刪除這兩個。

+0

這是有道理的,但我嘗試了它,當我做到這一點時,我每次都會得到錯誤。所以我順便把它移回了'$ ... ready()' – emersonthis

+0

,我找不到加載SDK的兩個腳本。你能告訴我你在哪裏/看到了什麼? – emersonthis

+0

好吧,現在我只能找到一個腳本,加載SDK。查看源代碼,然後搜索「all.js」。 – borisdiakur