首页 文章

如何使用php从用户访问令牌获取Facebook页面访问令牌?

提问于
浏览
0

我正在尝试使用存储在我的数据库中的用户访问令牌和页面ID来获取页面访问令牌 . 到目前为止,我还没有使用facebook.php而只是使用php的curl_ *函数 . 到目前为止,我可以发送帖子到页面(具有硬编码页面ID),但我想在这样做时模拟页面 .

我可以在没有facebook.php的情况下轻松完成这项工作,这样会很好,因为它可能会让我觉得我应该重写到目前为止我所做的事情 . 如果没有,那么我如何从facebook对象获取页面访问令牌 - 记住到目前为止,至少我没有在我的数据库中存储用户ID或页面ID,只是用户访问令牌,当然还有我的app id和secret .

我一直在寻找获取页面访问令牌的例子,但我发现它不是我需要的东西,因为它获取了一个用户对象,这样做似乎迫使用户每次都登录到facebook,但我存储了用户访问权限令牌,以避免发生这种情况 .

我是否需要比manage_page和publish_stream更多的权限?我尝试添加offline_access但它似乎不再可用(路线图提到这一点) .

这是我最近尝试使用facebook.php文件的一些代码:

// try using facebook.php
    require_once 'src/facebook.php';
    // Create our Application instance 
    $facebook = new Facebook(array(
      'appId'  => $FB_APP_ID,      // $FB_APP_ID      hardcoded earlier
      'secret' => $FB_APP_SECRET,  // $FB_APP_SECRET  hardcoded earlier
    ));

    $facebook->setAccessToken($FB_ACCESS_TOKEN );
        //got user access token  $FB_ACCESS_TOKEN from database
    // Get User ID -- why?
    $user = $facebook->getUser();

    //------ get PAGE access token
    $attachment_1 = array(
        'access_token' => $FB_ACCESS_TOKEN
    );

    $result = $facebook->api("/me/accounts", $attachment_1);
    foreach($result["data"] as $page) {
        if($page["id"] == $page_id) {// $page_id hardcoded earlier
            $page_access_token = $page["access_token"];

            break;
        }
    }
    echo '
'.__FILE__.' '.__FUNCTION__.' '.__LINE__.' $result= ' ; var_dump($result); //this prints: array(1) { ["data"]=> array(0) { } } $facebook->setAccessToken($page_access_token ); // Get User ID, why - re-init with new token maybe? $user = $facebook->getUser(); //------ write to page wall try { $attachment = array( 'access_token' => $page_access_token, 'link' => $postLink, 'message'=> $postMessage ); $result = $facebook->api('/me/feed','POST', $attachment); echo '
'.__FILE__.' '.__FUNCTION__.' '.__LINE__.' $result= ' ; var_dump($result); } catch(Exception $e) { echo '
'.__FILE__.' '.__FUNCTION__.' '.__LINE__.' $e= ' ; var_dump($e); /*this gives : "An active access token must be used to query information about the current user." */ } die;

谢谢

PS:我硬编码了用户ID并开始调用

$result = $facebook->api("/$user_id/accounts", $attachment_1);

我仍然得到一个空洞的结果 .

PPS:即使我的帐户设置为管理器,图形API资源管理器也不会显示我的粉丝页面 . 我尝试发布工作但是从我的帐户而不是从页面显示 .

PPPS:通过在图形资源管理器页面上添加权限来获得一点进展,以获取访问令牌,但这对我以编程方式需要访问令牌没有帮助 . 当有多个粉丝页面的用户登录我的网站时,我想向他们显示他们的Facebook粉丝页面列表供您选择 . 在实践中,不是刚刚在应用程序上授予的权限?

PPPPS:我的应用程序的权限列表现在位于:email,user_about_me,publish_actions和扩展权限:manage_pages,publish_stream,create_note,status_update,share_item我还需要更多?当我现在尝试时,我仍然无法从通话中得到任何结果:

$facebook->api("/$user_id/accounts", $attachment_1);

Px5S:DOH !!!我现在看到,当我的脚本第一次获取并将其存储在数据库中时,我忽略了将manage_pages权限添加到我对用户访问令牌的调用中 . 但是当我重用那个新的访问令牌时,我仍然会收到错误:“必须使用活动访问令牌来查询有关当前用户的信息 . ”那么,这些令牌不能重复使用吗?他们不是长期的吗?会读更多东西......

1 回答

  • 2

    这是我的功能代码,仍然很乱,但似乎工作,请注意第一个$ dialog_url上的范围,请随意模拟我的代码甚至建议改进:

    function doWallPost($postName='',$postMessage='',$postLink='',$postCaption='',$postDescription=''){
    
    global $FB_APP_ID, $FB_APP_SECRET; 
    
    $APP_RETURN_URL=((substr($_SERVER['SERVER_PROTOCOL'],0,4)=="HTTP")?"http://":"https://").$_SERVER['HTTP_HOST'].$_SERVER['SCRIPT_NAME'].'?returnurl=1';
    
    $code = $_REQUEST["code"];
    
    $FB_ACCESS_TOKEN = getFaceBookAccessToken( );
    $FB_ACCESS_TOKEN_OLD = $FB_ACCESS_TOKEN;
    
    
    //if no code ot facebook access token get one
    if( empty($code) && empty($FB_ACCESS_TOKEN) && $_REQUEST["returnurl"] != '1')  
    {      
         // if(  $_REQUEST["returnurl"] == '1') die;
         $dialog_url = "http://www.facebook.com/dialog/oauth?client_id=".$FB_APP_ID."&redirect_uri=".$APP_RETURN_URL."&scope=publish_stream,manage_pages";                  
         header("Location:$dialog_url");
    }
    
    
    if( empty($FB_ACCESS_TOKEN) ){ 
    
        if($_REQUEST['error_code'] == '200'){
            return null;
         }else if (!empty($code)){        
            $token_url = "https://graph.facebook.com/oauth/access_token?client_id=".$FB_APP_ID."&redirect_uri=".urlencode($APP_RETURN_URL)."&client_secret=".$FB_APP_SECRET."&code=".$code;   
            $access_token = file_get_contents($token_url);  
            $param1=explode("&",$access_token);
            $param2=explode("=",$param1[0]);
            $FB_ACCESS_TOKEN=$param2[1];    
        }else{
            return null;
        }
    }
    if(!empty($FB_ACCESS_TOKEN) && $FB_ACCESS_TOKEN_OLD != $FB_ACCESS_TOKEN)  {
        setFaceBookAccessToken( $FB_ACCESS_TOKEN);
    }
    
    $_SESSION['FB_ACCESS_TOKEN'] = $FB_ACCESS_TOKEN;
    
    $page_name = '';
    $page_id =   getFaceBookPageId(); //from db
    
    if(empty($page_id ) ) return null;
    //in case there are multiple page_ids separated by commas  
    if(stripos($page_id, ',') !== false ){
       $page_ids = explode(',', $page_id)   ;// = substr($page_id, 0, stripos($page_id, ','));
    }
    $result = null;
    foreach($page_ids as $page_id){
        $page_id = trim($page_id);
    if( !empty($FB_ACCESS_TOKEN)){ 
        //get page_id
        require_once 'src/facebook.php';
        // Create our Application instance (replace this with your appId and secret).
        $facebook = new Facebook(array(
          'appId'  => $FB_APP_ID,
          'secret' => $FB_APP_SECRET 
        ));  
    
        $facebook->setAccessToken($FB_ACCESS_TOKEN ); 
    
        //------ get PAGE access token
        $page_access_token ='';
        $attachment_1 = array(
            'access_token' => $FB_ACCESS_TOKEN
        );
    
        $result = $facebook->api("/me/accounts", $attachment_1);
        if(count($result["data"])==0)  {
             return null;
        }
    
        foreach($result["data"] as $page) {
            if($page["id"] == $page_id) {
                $page_access_token = $page["access_token"];
                break;
            }
        }
    
        //------ write to page wall
        try {
            $attachment = array(
                        'access_token' => $page_access_token,
                        'link'          => $postLink,
                        'message'=>  $postMessage 
            );
    
            $result = $facebook->api('/me/feed','POST', $attachment);
    
        } catch(Exception $e) {
             return null;
        }
        } //end if( !empty($FB_ACCESS_TOKEN)) 
    
    }//end foreach
    return $result; }
    

    现在,我想知道我是否可以同时向多个页面发送相同的消息......是的,只需循环遍历ID,见上文,它现在支持多个页面ID . 除非有人想为代码做出贡献 - 有很多方法可以改进 - 我已经完成了 .

相关问题