如何从PHP脚本发布到朋友墙?

时间:2012-02-28 16:04:24

标签: php facebook facebook-wall

希望有人可以帮我解决这个奇怪的问题。

我有一个数据库存储已注册的所有用户的Facebook ID,这样就可以了。

用户可以通过PHP脚本向Facebook好友发送消息,该脚本通过应用程序激活。

在我的脚本中,我有一个部分说明如果你的一个朋友的ID不在数据库中(即他们不是注册用户),那么在他们的Facebook墙上发布一条消息,通知他们有人尝试过使用该应用程序与他们联系。

然后有第二个数据库存储我们通过FB通知的人的ID,这样我们就不会向他们发送多个请求。

问题是该消息不会出现在他们的墙上。消息以字符串形式发送到PHP脚本:

    NSString *urlString = [@"myApp/myphp.php?"stringByAppendingString:@"task=send"];
    urlString = [urlString stringByAppendingString:@"&facebookID="];
    urlString = [urlString stringByAppendingString:[friendsToSendTo objectAtIndex:i]];
    urlString = [urlString stringByAppendingString:@"&message="];
    urlString = [urlString stringByAppendingString:message];
    urlString = [urlString stringByAppendingString:@"&sound="];
    urlString = [urlString stringByAppendingString:chosenSoundToSend];
    urlString = [urlString stringByAppendingString:@"&sendersName="];
    urlString = [urlString stringByAppendingString:myName];

在PHP脚本中,task = send部分然后开始向收件人发送邮件的过程。这部分工作得非常好,收到的信息完全没有问题。

如果找不到他们的ID,则转到此处:

    $this->_postToFacebook($sendersName, $facebookID);

_postToFacebook函数如下所示:

    private function _postToFacebook($sender, $receiver)
    {
    require_once "facebook.php";

    //registered with developers.facebook for this particular app
    $app_id = "****************";
    $app_secret = "*****************";

    $facebook = new Facebook(array(
    'appId' => $app_id,
    'secret' => $app_secret,
    'cookie' => true
    ));

    // Get the url to redirect for login to facebook
    // and request permission to write on the user's wall.
    $login_url = $facebook->getLoginUrl(
        array('scope' => 'publish_stream')
    );

    // If not authenticated, redirect to the facebook login dialog.
    // The $login_url will take care of redirecting back to us
    // after successful login.
    if (! $facebook->getUser()) {
        echo <<< EOT
    <script type="text/javascript">
    top.location.href = "$login_url";
    </script>;
    EOT;

        exit;
    }
    // Do the wall post.
    $facebook->api("/$receiver/feed", "post", array(
        message => "$sender sent you a message",
        picture => "image.jpg",
        link => "mywebsite.com",
        name => "Visit iTunes to download and reply",
        caption => "mycaption"
    ));

}

这似乎是失败的部分,或者至少这是我最初的假设。 但是,如果我手动将生成的URL(.... task = send&amp; facebookID = 12345789 ...等)输入浏览器并按Enter键,则会将消息发布到用户墙。

所以现在我完全糊涂了。 当通过浏览器触发时,如果Facebook ID已注册,则在应用程序中收到消息,如果没有,则将消息发布到FB。 从应用程序本身,收件人注册时收到消息 - 但发布到FB永远不会有效。 据推测,我在某个地方错过了某种许可?

提前感谢任何可以提供帮助的人: - )

编辑:如果它是权限,我应该添加我已设置这些权限:

 if (![facebook isSessionValid]){

    NSArray *permissions = [[NSArray alloc] initWithObjects:
                            @"user_relationships", @"friends_relationships",
                            @"user_relationship_details", @"friends_relationship_details",
                            @"read_friendlists",@"offline_access", @"publish_stream",
                            nil];
    [facebook authorize:permissions];
    [permissions release];
}

在facebook课程中,我必须将这些更改为NO,否则它根本不会连接,也许这也会导致问题?

- (void)authorize:(NSArray *)permissions {
  self.permissions = permissions;

   [self authorizeWithFBAppAuth:NO safariAuth:NO];
}

1 个答案:

答案 0 :(得分:1)

您可能需要对URL字符串进行编码。如果字段(如名称,消息等)包含空格或其他特殊字符,则来自iOS的URL请求/连接将失败。 Web浏览器通常会自动为您执行此编码,但iOS不会。

获得网址后,请尝试:

urlString = [urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]

作为旁注,您可能希望使用[NSString stringWithFormat:@"", ...]而不是多次stringByAppendingString来电。类似的东西:

urlString = [NSString stringWithFormat:
             @"myApp/myphp.php?facebookID=%@&message=%@&sound=%@",
             [friendsToSendTo objectAtIndex:i]], message, sound];