Вызов Facebook PHP SDK 3 для передачи пользователя в проект AS3 - PullRequest
1 голос
/ 04 ноября 2011

У меня проблемы с загрузкой информации пользователя во Flash из скрипта PHP.

РЕДАКТИРОВАТЬ: index.php вызывается Facebook для проверки подлинности.Затем Flash вызывает database.php для подключения к базе данных и сохранения / вызова информации об игроках и прогресса.Затем Database.php кодирует массив и выводит его во Flash, где он анализируется.

Это работало до прошлых выходных.

index.php

<?php
$app_id = "my_id";
$app_secret = "my_secret";
$my_url = "http://apps.facebook.com/my_app";

session_start();
$code = $_REQUEST["code"];

if(empty($code)) 
{
$_SESSION['state'] = md5(uniqid(rand(), TRUE)); //CSRF protection
 $dialog_url = "http://www.facebook.com/dialog/oauth?client_id=" 
   . $app_id . "&redirect_uri=" . urlencode($my_url) . "&state="
   . $_SESSION['state'];

 echo("<script> top.location.href='" . $dialog_url . "'</script>");
 exit;
}

if($_REQUEST['state'] == $_SESSION['state']) {
 $token_url = "https://graph.facebook.com/oauth/access_token?"
   . "client_id=" . $app_id . "&redirect_uri=" . urlencode($my_url)
   . "&client_secret=" . $app_secret . "&code=" . $code;

 $response = file_get_contents($token_url);
 $params = null;
 parse_str($response, $params);

 $graph_url = "https://graph.facebook.com/me?access_token=" 
   . $params['access_token'];

 $user = json_decode(file_get_contents($graph_url));
 //echo("Hello " . $user->name);
 include_once 'game.php';
}
else 
{
    echo("The state does not match. Try opening the app from the homepage.");
    include_once 'game.php';
}
?>

database.php

<?php
require 'src/facebook.php';

$facebook = new Facebook(array(
 'appId'  => 'my_id',
 'secret' => 'my_secret',
));

// Get User ID
try 
    {
    $user = $facebook->getUser();

    if ($user) 
        {
            $user_profile = $facebook->api('/me');

            //$friends = $facebook->api('/me/friends');
            //print_r($friends);
            mysql_connect("localhost", "DB_USER", "DB_PASS") or die("Could not connect");
        mysql_select_db("stus_zombies") or die("Could not select database");

        $query = mysql_query("SELECT * FROM users WHERE facebook_id = " . $user_profile[id]);  
        $result = mysql_fetch_array($query);

        if(empty($result))
        { 
            $addInfo = mysql_query("INSERT INTO users (first_name, last_name, facebook_id) 
            VALUES ('{$user_profile['first_name']}','{$user_profile['last_name']}','{$user_profile['id']}')");  
                $addInfo = mysql_query("SELECT * FROM users WHERE id = " . mysql_insert_id());  

            $query = mysql_query("INSERT INTO players (facebook_id, coins, health, stamina, xp)
            VALUES ('{$user_profile['id']}','0','25','25','0')");
        }

        $checkProgress = mysql_query("SELECT * FROM players WHERE facebook_id = " . $user_profile[id]);
        $playerCheck = mysql_fetch_array($checkProgress);

        $playerInfo = array(
        first_name => $user_profile[first_name],
            last_name => $user_profile[last_name],
            facebook_id => $user_profile[id], 
            //facebook_access_token => $_SESSION[fb_165114483572553_access_token],
            coins => $playerCheck[coins],
        health => $playerCheck[health],
        stamina => $playerCheck[stamina],
        xp => $playerCheck[xp],); 
        echo json_encode($playerInfo);
        } 

    else
    {
        echo ("No User");
    }
}

catch (FacebookApiException $e) 
{
    error_log($e);
        $user = null;
    }
?>

Я перешел на другой метод аутентификации, и он работал в течение пары часов, прежде чем он остановился.

Второй index.php, который я пробовал:

 <?php

 $app_id = "165114483572553";

 $canvas_page = "https://apps.facebook.com/MY_APP";

 $auth_url = "https://www.facebook.com/dialog/oauth?client_id=" 
        . $app_id . "&redirect_uri=" . urlencode($canvas_page);

 $signed_request = $_REQUEST["signed_request"];

 list($encoded_sig, $payload) = explode('.', $signed_request, 2); 

 $data = json_decode(base64_decode(strtr($payload, '-_', '+/')), true);

 if (empty($data["user_id"])) {
        echo("<script> top.location.href='" . $auth_url . "'</script>");
 } else {
 include_once 'game.php';
 } 
 ?>

База данных класса AS3.as

package  
{
import flash.events.IOErrorEvent;
import com.adobe.webapis.URLLoaderBase;
import flash.events.Event;
import flash.net.*;
import com.adobe.serialization.json.JSON;
import org.flashdevelop.utils.FlashConnect;
import HUD.UI;

public class Database
{
    // Page Loader
    private static var loader:URLLoader;
    private static var dataloader:URLLoader;

    // User Info
    private static var playerData:Object;

    //TEST
    // Player Info
    private static var playerLoader:URLLoader = new URLLoader();
    private static var playerRequest:URLRequest = new URLRequest;
    playerRequest.url = "http://MYURL/database.php";

    public function Database() 
    {

    }

    public function getPlayer():void
    {
        playerLoader.load(playerRequest);
        playerLoader.addEventListener(Event.COMPLETE, decodeJSONPlayer);
        playerLoader.addEventListener(IOErrorEvent.IO_ERROR, onIOError);
    }
    // Decode JSON (Player Coins, ID, Stamina, Health, XP)
    private function decodeJSONPlayer(e:Event):void
    {
        playerLoader = URLLoader(e.target);
        playerData = JSON.decode(playerLoader.data);
        loadPlayerInfo(playerData);
        // Display stats info
        UI.updateHealth();
        UI.updateMoney();
        UI.updateXP();
        UI.updateStamina();
    }

    // Load database info into player's data
    private function loadPlayerInfo(playerData:Object):void
    {
        Player.first_name = playerData.first_name;
        Player.last_name = playerData.last_name;
        Player.facebook_id = playerData.facebook_id;
        Player.facebook_access_token = playerData.facebook_access_token;
        Player.health = playerData.health;
        Player.stamina = playerData.stamina;
        Player.money = playerData.coins;
        Player.xp = playerData.xp;
        trace(playerData.first_name);
        // Display Facebook info
        UI.txtFacebookInfo.text = playerData.first_name +" " + playerData.last_name +" " + playerData.facebook_id;
    }

    // Save all Progress
    public static function setAll(_money:int, _health:int, _stamina:int, _xp:int):void
    {
        var vars:URLVariables = new URLVariables();
        vars.money = _money;
        vars.health = _health;
        vars.stamina = _stamina;
        vars.xp = _xp;

        var request:URLRequest = new URLRequest("http://MYURL/saveplayer.php");
        request.method = URLRequestMethod.POST;
        request.data = vars;

        if (loader != null)
        {
            loader.removeEventListener(Event.COMPLETE, pageLoaded);
        }

        loader = new URLLoader();
        loader.dataFormat = URLLoaderDataFormat.TEXT;
        loader.load(request);
        loader.addEventListener(Event.COMPLETE, pageLoaded);
    }

    private static function pageLoaded(e:Event):void
    {
        trace("PAGE LOADED\n============================");
        FlashConnect.trace(loader.data);
        trace("============================");
    }

    private static function completeHandler(event:Event):void
    {
        var loader:URLLoader = URLLoader(event.target);
        FlashConnect.trace(loader.data.dayNames);
    }

    // Server info not received
    private function onIOError(e:Event):void
    {
        trace ("Error loading URL");
    }
}

}

Смена его на исходный код работала до следующего дня доэто перестало работать.

Мне удалось заставить его работать с временным исправлением, включив скрипт базы данных в скрипт индекса, а затем вызвав его из Flash.

Это просто перестало работать.Очевидно, это сводит меня с ума.Включение database.php в index.php даже сейчас trace правильно отображает информацию JSON, но она не загружается в игру.

Со стороны Flash я подключил еедо кнопки, чтобы я мог позвонить и увидеть возвращение, и это, казалось, работало нормально.Я никогда не получаю сообщения об ошибках, когда он не загружает информацию об игроке, из-за которой устраняются неполадки в этом методе проб и ошибок, а также исследования.

Любая помощь будет принята с благодарностью.Я потратил слишком много времени на адаптацию сценариев и исследования в этот момент, когда есть кто-то, кто знает, что происходит.

1 Ответ

0 голосов
/ 08 ноября 2011

Это была проблема с доменом Facebook, иногда он вызывал мой домен с помощью ssl, который отличался от незащищенного домена. Решено, заставив его и мое приложение вызвать безопасный домен.

...