2010-06-24 1 views
3

Je fais une classe pour communiquer avec notre API d'entreprise ... J'utilise curl pour publier des données et récupérer la réponse dans json. Dans la dernière partie du code (après la classe), je connecte l'utilisateur dans le serveur (il donne vrai), mais quand j'essaie de me connecter à nouveau avec curl, il dit que je ne suis pas connecté! J'ai déjà fait une recherche google et ajouté le curl_setopt ($ ch, CURLOPT_COOKIE, $ this-> Session_Cookie); ligne.PHP cURL ne stocke pas le cookie de session ... Comment résoudre ce problème?

Quelqu'un peut-il me donner un éclairage à ce sujet?

Merci à l'avance;)

if(!class_exists("Microdual")) { 
class Microdual{ 

    // No caso de a sessão não estar iniciada, iniciar aqui a sessão 


    ################ 
    ################ 
    ################ 
    ################ Iniciar funcoes privadas ################ 

    private function Extra_LoadSession($varname,$otherwise){ 
    return (!empty($_SESSION[$this->Session_Prefix . $varname])) ? $_SESSION[$this->Session_Prefix . $varname] : $otherwise; 
    } 
    private function Extra_SaveSession($varname,$value){ 
    $_SESSION[$this->Session_Prefix . $varname] = $value; 
    return true; 
    } 

    /** 
    * $this->API_Comunicate() "Comunicar comandos com os servidores Microdual (enviar e receber)" 
    * 
    * @param data array "Colocar as variaveis que deseja passar à plataforma (Ver Lista completa de variaveis no Inicio)" 
    * 
    * @return array or void (false) 
    */ 
    private function API_Comunicate($_data){ 

    // Converter o array em string (serialize) 
    $data = array();  
    while(list($n,$v) = each($_data)){ 
    $data[] = "$n=$v"; 
    } 
    $data = implode('&', $data); 
    // format --> test1=a&test2=b etc. 

    $ch = curl_init(); 
    curl_setopt($ch,CURLOPT_URL,$this->Geral_URLAPI); 
    curl_setopt($ch,CURLOPT_POST,count($_data)); 
    curl_setopt($ch,CURLOPT_COOKIE,$this->Session_Cookie); 
    curl_setopt($ch,CURLOPT_POSTFIELDS,$data); 
    curl_setopt($ch,CURLOPT_RETURNTRANSFER,1); 
    $content = curl_exec($ch); 
    curl_close($ch); 

    if(($content !== false) && (!empty($content))){ 
    return json_decode($content, true); 
    }else{ 
    return false; 
    } 
    } 


    ################ 
    ################ 
    ################ 
    ################ Iniciar funcoes Públicas ################ 

    public function Debug_VarDump($varname){ 
    $string = "<pre>"; 
    $string .= var_dump($varname); 
    $string .= "</pre>"; 
    return $string; 
    exit; 
    } 
    /** 
    * $this->IsLogged() "Verificar se está autenticado no servidor (primeiro localmente, e depois liga ao servidor)" 
    * 
    * @return void 
    */ 
    public function IsLogged(){ 
    if($logged) return true; 
    $logged = $this->Extra_LoadSession("Login_Logged",false); 
    if($logged){ 
    return true; 
    }else{ 
    // Conectar ao servidor 
    $dados = $this->API_Comunicate(array()); 
    if($dados!==false){ 
    if(!empty($dados['auth']['logged'])){ 
     return $dados['auth']['logged']; 
    }else{ 
     return false; 
    } 
    }else{ 
    return false; 
    } 
    } 
    } 

    /** 
    * $this->Login() "Executar o Login nos servidores Microdual" 
    * 
    * @param username string "Colocar aqui o nome de utilizador da sua conta em www.microdual.com" 
    * @param password string "Colocar aqui a password da sua conta em www.microdual.com" 
    * 
    * @return void 
    */ 
    public function Login($username,$password){ 
    if(empty($username) || empty($password)) return false; 
    if($this->IsLogged()) return true; 

    $receive = $this->API_Comunicate(array(
    "type" => "auth", 
    "action" => "add", 
    "auth_username" => $username, 
    "auth_password" => $password 
    )); 

    if($receive["auth"]["status"] && $receive["auth"]["logged"]){ 
    $this->Extra_SaveSession("Login_Logged",true); 
    $this->Login_Logged = true; 
    return true; 
    }else{ 
    return false; 
    } 
    } 
    /** 
    * $this->SMS_Send() "Executar o Login nos servidores Microdual" 
    * 
    * @param number string "Colocar aqui o numero do telemovel para enviar sms" 
    * 
    * @return void 
    */ 
    public function SMS_Send($number,$msg){ 
    // Guardar apenas os numeros 
    $number = preg_replace("/[^0-9]/", "", $number); 
    $msg = trim($msg); 

    $receive = $this->API_Comunicate(array(
    "type" => "sms", 
    "action" => "add", 
    "sms_to" => $number, 
    "sms_msg" => $msg 
    )); 
    return $receive; 
    } 

    ################ 
    ################ 
    ################ 
    ################ Iniciar variaveis da class ################ 

    private $Session_Prefix; 
    private $Session_Cookie; 
    private $Geral_URLAPI; 
    private $Login_Logged; 




    ################ 
    ################ 
    ################ 
    ################ Iniciar dados da class ################ 

    function __construct(){ 
    $this->Session_Prefix = "MYCMSAPI_"; 
    $this->Session_Cookie = "PHPSESSID=".$_COOKIE['PHPSESSID']."; path=/"; 
    $this->Geral_URLAPI = "http://www.MYCOMPANY.com/MyapiURL"; 
    $this->Login_Logged = $this->Extra_LoadSession("Login_Logged",false); 
    } 
} 
} 

$Microdual = new Microdual(); 
if($Microdual->Login("usernamehere","password")){ 
$Microdual->Debug_VarDump($Microdual->SMS_Send("93211254","Teste Test Hi :)")); 
}else{ 
echo "Login com erro"; 
} 

Répondre

5

L'option CURLOPT_COOKIE est d'envoyer un cookie particulier à l'aide CURL. Les options que vous recherchez sont CURLOPT_COOKIEFILE et CURLOPT_COOKIEJAR, qui spécifient un fichier dans lequel enregistrer et charger le cookie.

Vous aurez à faire quelque chose comme ceci:

curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookies.txt'); 
curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookies.txt'); 
+0

il ne fonctionne pas! ce fichier est-il placé dans le même dossier du script? – CuSS

+0

Comment ça ne marche pas? La valeur de l'option est simplement le chemin vers l'endroit où vous voulez stocker vos cookies. Chaque fois que vous voulez utiliser ces cookies, il vous suffit d'utiliser un fichier comme ça. PHP va le créer s'il n'existe pas déjà. –

+0

J'avais déjà essayé le CURLOPT_COOKIEJAR et CURLOPT_COOKIEFILE avant de demander ici. Mais maintenant cela fonctionne, CURLOPT_COOKIESESSION était vrai, et c'était l'iniciating une nouvelle session de cookie dans chaque conection. Je vous remercie ;) – CuSS