2015-03-25 35 views
0

Facebook對我來說有點黑盒子,但我相信我已經遵循了SO和其他地方的建議,但是我仍然無法實現這個目標。Facebook的JS SDK共享到託管頁面

基於建議的回答編輯的代碼:

<div id="fb-root"></div> 
<script> 
    (function(d, s, id){ 
    var js, fjs = d.getElementsByTagName(s)[0]; 
    if (d.getElementById(id)) {return;} 
    js = d.createElement(s); js.id = id; 
    js.src = "//connect.facebook.net/en_US/sdk.js"; 
    fjs.parentNode.insertBefore(js, fjs); 
    }(document, 'script', 'facebook-jssdk')); 

    var login; 
    window.fbAsyncInit = function() { 
    FB.init({ 
     appId  : 'Valid_App_ID', 
     status  : true, 
     xfbml  : true, 
     version : 'v2.2' 
    }); 

    FB.login(function(response) { 
    if (response.authResponse) { 
     FB.api('/me', function(response) { 
      login = response; 
      console.log('Hello ' + response.name); 
     }); 
    } else { 
     //login cancelled or not every permission accepted 
    } 
}, {scope: 'manage_pages, publish_actions'}); 

function fb_share() { 
    FB.ui({ 
     method: 'feed', 
     name: login.name, 
     link: 'valid_URL', 
     picture: 'valid_image_URL', 
     caption: 'some_text', 
     to: valid_page_ID 
    }, function(response) { 
     console.log(response); 
    }); 

} 
$(document).ready(function(){ 
    $('.share-btn').on('click', fb_share); 
}); 
     }; 
</script> 

在實踐中,鏈接,圖像,標題字段是從用戶輸入填充,並且to字段是基於所述name(以便完成自動它始終是由登錄用戶管理的頁面)。

我已將自己用作測試(作爲應用設置的'角色'添加),並已授予對登錄範圍內的其他項目的權限。我可以通過在FB_share函數中註釋to:行來成功發佈我的個人時間表,但如果我留下該行,即使page_ID用於我管理的頁面,也會在控制檯中(以及在控制檯中分享對話框):

Object {error_code: 100, error_msg: "Cannot post to a user who has not installed the application."}

我敢肯定,我失去了一些東西簡單,但是從我讀過的,上面的代碼應該工作。

任何人都可以指向正確的方向嗎?感謝您的任何建議。

+0

變量'login'是來自登錄的響應數據。我已經嘗試過使用'login.id'和'login.name',但沒有區別。 'login.first_name'只是因爲那是我更願意在共享帖子上顯示的內容。我會更正上面的代碼。 – sideroxylon 2015-03-25 01:15:58

+0

你使用'localhost'嗎? – PHPglue 2015-03-25 01:19:37

+0

否 - 我在網站上加載了該頁面。 – sideroxylon 2015-03-25 01:20:50

回答

0

除了嵌入正確的<script>標籤的自動執行功能之外,所有代碼需要在FB.init()之後的window.fbAsyncInit = function(){ /* in here */}之內運行。

window.fbAsyncInit = function(){ 
    FB.init({ 
    appId: 'valid_App_ID', 
    status: true, 
    xfbml: true, 
    version: 'v2.2' 
    }); 
    FB.login(function(response){ 
    if(response.authResponse){ 
     FB.api('/me', function(apiResp){ 
     // remember asyc is asyc 
     $('.share-btn').click(function(){ 
      FB.ui({ 
      method: 'feed', 
      name: apiResp.first_name, 
      link: 'valid_URL', 
      picture: 'vaild_image_URL', 
      caption: 'some_text', 
      to: 'Facebook_Page_ID' 
      }, function(uiResp){ 
       console.log(uiResp); 
      } 
      }); 
     }); 
     }); 
    } 
    else{ 
     // redirect to facebook url to app loggin 
    } 
    }, {scope: 'manage_pages, publish_actions'}); 
} 
(function(d, s, id){ 
    var js, fjs = d.getElementsByTagName(s)[0]; 
    if(d.getElementById(id)){return;} 
    js = d.createElement(s); js.id = id; 
    // if running from localhost add protocol like https: 
    js.src = '//connect.facebook.net/en_US/sdk.js'; 
    fjs.parentNode.insertBefore(js, fjs); 
})(document, 'script', 'facebook-jssdk'); 
+0

我已將自執行代碼移到頂端,並將所有代碼放在'fbAsyncInit'函數內,但結果相同。我將編輯上面的新代碼。謝謝你的幫助。 – sideroxylon 2015-03-25 02:00:11

+0

那麼,我幾乎完全遵循這個(只是將自執行代碼移到頂部並刪除了一個額外的'}')並添加到基本代碼中以獲取各種輸入的值以填充'FB.ui'中的元素 - 和相同的結果(錯誤信息如上)。我已確認應用程序ID是準確的,我的FB ID是作爲應用程序的'角色'添加的,頁面ID絕對是我擁有管理員權限的頁面,並且我已授予「範圍」中擴展權限的權限'。如果我運行'FB。api('/ me/accounts',function(apiResp){console.log(apiResp);''我可以看到頁面 – sideroxylon 2015-03-25 08:58:53

+0

如果我運行'FB.api('/ me/permissions',function(apiResp){console .log(apiResp);',列出了兩個擴展權限。 – sideroxylon 2015-03-25 09:07:06

0

看來FB.ui方法(上面)缺少訪問令牌,我找不到任何方法來添加它。下面的代碼(依賴於圖形API)工作(不同,但確定)。如果瀏覽器阻止彈出窗口,則需要.go點擊功能。然後,在FB.login函數之後,FB.api允許訪問循環的用戶頁面以獲取其下拉選擇器的編號和名稱。單擊.share-btn然後檢索正確的頁面ID和訪問令牌,並將它們傳遞給FB.api函數的第二個調用,該函數將消息發佈。這種方法遺漏的是前面代碼的UI方面,其中提議的帖子顯示在彈出的帖子選項中。我還沒有找到任何方法來複制。

window.fbAsyncInit = function(){ 
    FB.init({ 
    appId: 'Valid_App_ID', 
    status: true, 
    xfbml: true, 
    version: 'v2.2' 
    }); 

    $('.go').click(function(){ 

    FB.login(function(response){ 
    if(response.authResponse){ 
    FB.api('/me/accounts', function(apiResp){ 
     console.log(apiResp); 
     for (var i = 0; i < apiResp.data.length; i++) { 
     $('#select').append('<option value = ' + i + '>' + apiResp.data[i].name + '</option>'); 
     } 
     $('.share-btn').click(function(){ 
      var n = $('#select').val(); 
      var to = apiResp.data[n].id + '/feed?access_token=' + apiResp.data[n].access_token; 
      FB.api(to, 'post', {message: message}, function(response) { 
      console.log(response); 
      }); 
     }); 
     }); 
    } 
    else{ 
     // redirect to facebook url to app login 
    } 
}, {scope: 'manage_pages, publish_actions'}); 

    }); 

}