Публикация игрового достижения - Ошибка неверного токена: «Идентификатор уже указан»

Я пытаюсь опубликовать игровое достижение на Facebook, используя приведенный ниже код PHP CURL.

У меня есть две переменные $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);

person ivias    schedule 06.07.2012    source источник
comment
Какую версию PHP-SDK вы используете?   -  person Drewness    schedule 07.07.2012
comment
v3.1.1 из github.com/facebook/facebook-php-sdk   -  person ivias    schedule 10.07.2012


Ответы (1)


«Идентификатор уже был указан» может быть вызван, если вы сделаете запрос, например:

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

В этом примере первый «[USER ID]» в пути — это «идентификатор» Facebook для запроса, и указание другого идентификатора в качестве параметра вызывает ошибку.

В этом случае наиболее вероятная причина заключается в том, что URL-адрес вашего достижения имеет «?id=» в URL-адресе, который не экранируется должным образом перед вызовом API — либо проверьте свою кодировку, либо измените имя параметра, который вы используете в код генерации вашего достижения

person Igy    schedule 07.07.2012
comment
На самом деле, похоже, что у вас есть незакодированный ?id= в URL-адресе вашего достижения - я почти уверен, что это проблема. - person Igy; 07.07.2012
comment
Привет, Игги. Кодирование URL-адреса помогло мне избавиться от этой ошибки, однако теперь я получаю новую ошибку. Когда я пытаюсь зарегистрировать достижение, мне сообщается, что у apps.facebook.com/canvas_appname есть игра типа og. Когда я использую инструмент facebook linter и помещаю этот URL-адрес, он отображается как игра, и для этого требуется game.achievement og:type. Я не вижу никаких настроек, где я могу изменить это на стороне разработчиков. - person ivias; 10.07.2012
comment
Похоже, это должен быть новый вопрос, но вы уверены, что ваше приложение не выполняет какое-либо перенаправление и что сам URL-адрес правильный? - person Igy; 10.07.2012
comment
Нет, приложение не делает никакого перенаправления. Я не понимаю, почему инструменты facebook linter возвращают игру, когда я помещаю туда URL. Я помещаю apps.facebook.com/myappname, и он говорит мне, что это игра, поэтому я получаю сообщение об ошибке, так как это должно быть game.achievement - person ivias; 10.07.2012