[PHP] cURL et session

Fermé
smellems Messages postés 135 Date d'inscription vendredi 28 avril 2006 Statut Membre Dernière intervention 4 mai 2012 - 27 oct. 2006 à 21:04
 Klydde - 10 déc. 2010 à 00:16
Bonjour à tous...

j'ai un problème avec mon site web, ou une fonction en particulier...

j'explique...

j'utilise aitsafe pour gérer les paniers d'achats et la collect de donnée des clients (carte de crédit, tel, ...). mais au lieu de POSTer mes donnée directement sur ce site je l'envoie à un script que j'ai écrit (en php) qui vérifie que l'item voulu est disponible. si c'est OK le scipt refait alors le POST sur atisafe et affiche la page résulante.

comme ceci
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, "http://ww7.aitsafe.com/");
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $post_data);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$page = curl_exec($curl);
curl_close($curl);
print($page);

le problème est que comme c'est mon serveur qui fait le POST et pas le client, aitsafe ne peut pas savoir quel client fait la commande.

en gros, j'ai un seul panier pour tout le monde...

le site: http://www.mamankangourou.com/boutique1.php

et le script dont je parle est chkqte.php qui est appeler lorsque on ajoute un item au panier

il est possible d'ajouter un item à partir d'un ordinateur et d'en ajouter un autre à partir d'un autre poste.

je sais pas... si quelqu'un a une idée ou commentaire je veux savoir parce que je ne vois pas comment régler le problème. j'aime bien (et mon patron aussi) le fait que je puisse vérifier si l'item est en stock avant de compléter la transaction...

merci de votre aide

5 réponses

Salut,

Bon, je sais pas si tu as toujours ce problème, mais voici la solution que j'utilise : en fait il faut rajouter une option à CURL pour lui dire de passer l'identifiant de session de l'internaute en tant que cookie :

session_start(); // ICI on active les variables de session (si ce n'est pas déjà fait)
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, "http://ww7.aitsafe.com/");
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $post_data);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_COOKIE, session_name() . '=' . session_id()); // ICI on rajoute le cookie session_id
$page = curl_exec($curl);
curl_close($curl);
print($page);

Cela fonctionnera si le serveur de destination accepte les identifiants de session par cookie (cde qui est en principe le cas par défaut). Sinon, si le serveur est configuré pour accepter les identifiants de session par URL, il faut rajouter le champs mais dans l'URL :


session_start(); // ICI on active les variables de session (si ce n'est pas déjà fait)
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, "http://ww7.aitsafe.com/...?".session_name() . '=' . session_id()); // ICI on passe le session_id par URL
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $post_data);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$page = curl_exec($curl);
curl_close($curl);
print($page);

Voilà, cela devrait résoudre ton problème. Il y a juste un problème qui peut se poser si jamais l'url du serveur de destination est le serveur lui-même (une requête HTTP "interne") : dans ce cas, il faut savoir que le fichier de session est par défaut ouvert en mode exclusif, ce qui fait que tu auras un joli timeout à première vue inexplicable... Si cela arrive, il te suffit de rajouter la commande suivante juste avant le curl_exec() :

session_write_close();

Ceci à pour effet de sauvegarder et fermer le fichier de session courant (malheureusement, cela rend la session inutilisable pour la suite du script...), donc lorsque CURL fera sa requête HTTP, il pourra "se faire passer" pour la même session sans problème.

Sinon, j'ai une question, vous pourrez peut-être m'aider : est-il possible d'initialiser CURL et de le détruire (close) une seule fois tout en faisant plusieurs exec au milieu ?

Merci, @+
8
super bien vu le "session_write_close(); " !!!
Merci à toi
0
LoLoBeF Messages postés 128 Date d'inscription jeudi 10 mai 2007 Statut Membre Dernière intervention 14 août 2007 40
10 mai 2007 à 10:46
Fait un <input type="hidden"> contenant l'id de l'internaute sur ta 1ère form et que tu repassera avec CURL.
Comme ça, tu peux identifier le visiteur qui a fait la requête dans le script de traitement.
-1
Re,

Bon, en fait je viens de tester plusieurs curl_exec() au milieu d'un curl_init() ... curl_close() et çà fonctionne...Sur l'action j'ai un peu trollé...

@+
-1
xbb Messages postés 49 Date d'inscription dimanche 24 septembre 2006 Statut Membre Dernière intervention 10 mai 2007 1
30 oct. 2006 à 11:54
Normalement si le script de vérification de disponibilité refait à l'identique le POST, il n'y a pas de raison que aitsafe voie la différence (lui il reçoit une liste de variables, c'est tout).

C'est dans chkqte.php qu'il doit y avoir un problème : le script ne reproduit peut-être pas à l'identique l'ensemble des variables POST qu'il reçoit...
-2

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
smellems Messages postés 135 Date d'inscription vendredi 28 avril 2006 Statut Membre Dernière intervention 4 mai 2012 46
31 oct. 2006 à 21:19
oui oui...

j'ai fais des tests et aitsafe crée un cookie sur l'ordinateur du client pour savoir qui est qui (sessions). Mais moi, puisque c'est le chkqte.php qui fait le POST, c'est comme si cest toujoiurs le serveur mamankangourou.com qui fait le POST et donc un seul panier pour tous le monde.

mais en cherchant je crois que j'ai trouvé... avec curl c'est possible de simuler le passage d'un cookie: envoyer un cookie avec le POST et recevoir le cookie. ensuite je pourrais juste le mettre sur le client...

je vais essayer de faire ça demain...
-2