发布游戏成就 - 令牌无效错误:“已指定 ID”

Posted

技术标签:

【中文标题】发布游戏成就 - 令牌无效错误:“已指定 ID”【英文标题】:Posting Game Achievement - Invalid Token Error: 'An ID has already been specified' 【发布时间】:2012-07-07 07:12:20 【问题描述】:

我正在尝试使用下面显示的 php CURL 代码将游戏成就发布到 Facebook。

我有两个变量 $non_sef_achievement$sef_achievement

使用$sef_achievement 我知道我有一个invalid type game 并且需要game.achievements

使用$non_sef_achievement 变量我在注册成就时得到以下转储。请注意,当我发布分数时,我会收到true,而另一个错误是当我尝试发布成就时。

你能帮我找出我做错了什么吗?

[string] "error":"message":"Invalid token: \"103032446\". An ID has already been specified.","type":"OAuthException","code":2500 = "Register: " Tooltip

[string] true = "Post Score: " Tooltip

[string] "error":"message":"Invalid token: \"1000234234602\". An ID has already been specified.","type":"OAuthException","code":2500 = "Post Achievement: " Tooltip

注释标记已被编辑。

    //Get the achievement
    $achievement_user = $this->achUser->event_user->username;
   // $achievement = 'http://apps.facebook.com/my_app/component/achievements/achievement/'.$this->achUser->ach->name.'-'.$this->achUser->ach->id;
     $non_sef_achievement = 'https://apps.facebook.com/my_app/index.php?option=com_jachievements&view=achievement&id='.$this->achUser->ach->id;
   // http://mysite.com/index.php?option=com_jachievements&view=achievement&id=1
     $sef_achievement = 'https://apps.facebook.com/my_app/achievements/achievement/'.$this->achUser->ach->id;

    //CHECK https 
    $achievement_display_order = 1;

    // Get an App Access Token
    $token_url = 'https://graph.facebook.com/oauth/access_token?'
        . 'client_id=' . $app_id
        . '&client_secret=' . $app_secret
        . '&grant_type=client_credentials';


    $token_response = file_get_contents($token_url);
    $params = null;
    parse_str($token_response, $params);
    $app_access_token = $params['access_token'];

    $achievement_registration_URL = 'https://graph.facebook.com/'.$app_id.'/achievements';

    $ch = curl_init($achievement_registration_URL);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, 'achievement='.$non_sef_achievement.'&display_order='.$achievement_display_order.'&access_token='.$app_access_token);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    $result = curl_exec($ch);
    curl_close($ch);

 $ach_id = $this->achUser->ach->id;

    $db =& JFactory::getDBO();
    $tableName = $db->nameQuote('jos_ja_achievements_actions');
    $achparams = $db->nameQuote('params');
    $achtype = $db->nameQuote('community_addkarmapoints');
    $sql = "SELECT $achparams FROM ".$tableName." WHERE ach_id =  $ach_id AND `type_name` = 'community_addkarmapoints'" ; 
    $db->setQuery($sql);
    $row = $db->loadRow();
    $achparam = $row['0'];
    $str = explode('"',$achparam);
    $ach_points = $str['3'];

    $score = $ach_points;

         $score_URL = 'https://graph.facebook.com/' .$fbUserId. '/scores';      
    $ch = curl_init($score_URL);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, 'score='.$score.'&access_token=' . $app_access_token);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    $result = curl_exec($ch);
    curl_close($ch);


         POST a user achievement         
    $achievement_URL = 'https://graph.facebook.com/'.$fbUserId.'/achievements';
    $ch = curl_init($achievement_URL);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, 'achievement='.$non_sef_achievement.'&access_token=' . $app_access_token);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    $result = curl_exec($ch);
    curl_close($ch);

【问题讨论】:

你用的是什么版本的PHP-SDK? v3.1.1 来自github.com/facebook/facebook-php-sdk 【参考方案1】:

如果您提出如下请求,可能会导致“已指定 ID”:

https://graph.facebook.com/[USER ID]/feed?id=[SOME OTHER ID]

在该示例中,路径中的第一个“[USER ID]”是 Facebook 的请求“id”,指定另一个 ID 作为参数会触发错误。

在这种情况下,最可能的原因是,如果您的成就网址中有一个“?id=”,在您调用 API 之前没有正确转义 - 请检查您的编码或更改参数的名称您在成就生成代码中使用

【讨论】:

实际上,您的成就 URL 中似乎有一个未编码的?id= - 我很确定这是问题所在 嗨,伊吉。对 URL 进行编码帮助我克服了该错误,但是我现在遇到了一个新错误,当尝试注册成就时,它告诉我 apps.facebook.com/canvas_appname 具有 og 类型的游戏。当我使用 facebook linter 工具并将此 url 显示为游戏时,它需要 game.achievement og:type。我没有看到任何可以在开发人员方面进行更改的设置。 听起来这应该是一个新问题,但您确定您的应用没有进行重定向,并且 URL 本身是正确的吗? 不,应用程序没有进行任何重定向。我不明白为什么当我把网址放在那里时,facebook linter 工具会返回游戏。我放了apps.facebook.com/myappname,它告诉我类型是游戏,这就是为什么我得到错误,因为它需要是game.achievement

以上是关于发布游戏成就 - 令牌无效错误:“已指定 ID”的主要内容,如果未能解决你的问题,请参考以下文章

加载操作中的 BigQuery 错误:令牌无效 - 令牌无效:无状态令牌已过期

令牌无效错误:指定的令牌无效:无法读取未定义的属性“替换”?

如何修复“无效的记住我令牌(系列/令牌)不匹配”错误?

签署令牌如何工作? (无效签名错误)

Laravel 手动生成重置密码令牌:收到错误“此密码重置令牌无效”

iOS代码不断给出“无效令牌”错误