1

我正在尝试使用 Facebook Graph API 发布签到。我已经浏览了Facebook API 文档(签入)并且也获得了publish_checkins许可。但是,我的签到没有发布。我可以知道有什么问题还是我错过了什么?感谢您的时间 :)

fbmain.php

$user = $facebook->getUser();
$access_token = $facebook->getAccessToken();

// Session based API call
if ($user) {
    try {
            $me = $facebook->api('/me');
            if($me)
            {
                $_SESSION['fbID'] = $me['id'];
                $uid = $me['id'];
            }
        } catch (FacebookApiException $e) {
          error_log($e);   
        }
}
else {
   echo "<script type='text/javascript'>top.location.href='$loginUrl';</script>";
   exit;
}

$loginUrl = $facebook->getLoginUrl(
        array(
            'redirect_uri' => $redirect_url,
            'scope' => status_update, publish_stream, publish_checkins, 
                user_checkins, user_location, user_status'
            )
);

main.php - 使用 PHP SDK(本例中使用了错误的 SDK,应该使用 JavaScript SDK)

<?php
    include_once "fbmain.php";

    if (!isset($_POST['latitude']) && !isset($_POST['longitude']))
    {
?>
<html>
    <head>
        //ajax POST of latitude and longitude
    </head>

    <body>
        <input type="button" value="Check In!" onclick="checkin();"/></span>
    </body>
</html>
<?php
}
else
{
?>
<script type="text/javascript">
    function checkin()
    {
        try
        {
            $tryCatch = $facebook->api('/'.$uid.'/checkins', 'POST', array(
                'access_token' => $facebook->getAccessToken(),
                'place' => '165122993538708',
                'message' =>'MESSAGE_HERE',
                'coordinates' => json_encode(array(
                    'latitude'  => '1.3019399200902',
                    'longitude' => '103.84067653695'
                ))
            ));
        }
        catch(FacebookApiException $e)
        {
            $tryCatch=$e->getMessage();
        }
        return $tryCatch;
    }
</script>
<?php
}
?>

问题已解决 - 发布签到时要注意的事项

  • 确保publish_checkins已授予权限。
  • 必须用于json_encode()编码coordinatesPHP SDK 的参数。
  • placecoordinates参数是强制性的。
  • publish_checkins如果您刚刚向现有的允许权限列表添加了权限,则需要重新进行身份验证。
4

2 回答 2

1

显然,我在问题中发布的配置和 PHP 签入功能是正确的。但是,正如 Nehal 所指出的,对于我的情况,我应该使用 JavaScript SDK 而不是 PHP SDK。供以后参考...

使用 JavaScript SDK

function checkin()
{
    FB.api('/me/checkins', 'post', 
    { message: 'MESSAGE_HERE',
       place: 165122993538708,
       coordinates: {
           'latitude': 1.3019399200902,
           'longitude': 103.84067653695
       }
    },
        function (response) {
            alert("Checked in!");
        }
    );
}
于 2012-06-19T13:14:29.133 回答
0

您还需要学习 PHP 和变量作用域。

$facebook = new Facebook(array(
          'appId'  => FB_API_KEY,
          'secret' => FB_SECRET_KEY,
          'cookie' => true,
        ));
$loginUrl = $facebook->getLoginUrl(
        array('scope' => 'status_update,publish_stream,publish_checkins,user_checkins,user_location,user_status,user_checkins')
);

// Session based API call
if ($user) {
    try {
            $me = $facebook->api('/me');
            if($me)
            {
                $_SESSION['fbID'] = $me['id'];                
            }
        } catch (FacebookApiException $e) {
          error_log($e);   
        }
}
else {
   echo "<script type='text/javascript'>top.location.href='$loginUrl';</script>";
   exit;
}

function checkin($fb)
{
    try
    {
        $tryCatch = $fb->api('/'.$_SESSION['fbID'].'/checkins', 'POST', array(
            'access_token' => $fb->getAccessToken(), //corrected
            'place' => '165122993538708',
            'message' =>'I went to placename today',
            'coordinates' => json_encode(array(
                'latitude'  => '1.3019399200902',
                'longitude' => '103.84067653695'
            ))
        ));
    }
    catch(FacebookApiException $e)
    {
        $tryCatch=$e->getMessage();
    }
    return $tryCatch;
}

checkin($facebook); //calling the function and passing facebook object to function
于 2012-06-18T14:24:15.040 回答