[RESOLU] Récupérer une Session grâce à son ID

Petit nouveau ! | 4 Messages

13 févr. 2019, 12:08

Bonjour à tous,

J'ai un souci que je n'arrive pas à résoudre. J'ai fait un petit site avec un panier. L'ensemble du panier est stocké dans une session.
Tout fonctionne bien.

Le souci que j'ai c'est que mon moyen de paiement (Paybox - qui m'a été imposé) renvoi l'autorisation du paiement de serveur à serveur. Le problème que j'ai c'est qu'au moment où le serveur de Paybox appelle ma page d'autorisation (c'est sur cette page que je créé la commande si paiement ok) il n'a pas les informations de Session pour pouvoir créer la commande (à partir de la session panier).

Je m'étais dit que j'aurai pu recréer la session par son id mais visiblement cela ne fonctionne que si on a le Cookie. Cela parait logique.

Du coup je me demande s'il y a un moyen de récupérer la session panier de l'utilisateur, quand Paybox appelle ma page de création de commande.

Est-ce que quelqu'un aurait une idée ?

Sinon auriez vous une idée plus générale afin de bien gérer cet aspect des choses entre la session créée pour le panier et Paybox qui appelle de manière indépendante la page de création de la commande de serveur à serveur ?

Je précise que l'on peut préciser des variables à Paybox (ex: Id de session) qu'il nous renverra en POST au moment de l'appel de la page création de commande.

Par avance merci à tous.

Mammouth du PHP | 1134 Messages

13 févr. 2019, 15:25

à un moment, il faut sauver les données de la commande en dur, généralement en base de donnée. cette sauvegarde aboutit à un numéro de commande, on passe ce numéro de commande à paybox qui le renvoie avec les données du paiement et il est possible alors de savoir ce qu'il y a dans la commande dans la base de donnée.

Petit nouveau ! | 4 Messages

14 févr. 2019, 09:40

Bonjour,

Merci pour votre message. Effectivement j'avais pensé à cette solution qui parait être la plus fiable. Je vais donc faire comme cela. L'idée de pouvoir récupérer la session était moins fastidieuse. Mais je pense que cela n'est pas possible comme je le disais à cause du cookie.

Merci pour votre aide.

P.S : je ne passe pas le sujet en résolu car nous n'avons pas de certitude que récupérer une session (voir 1er post) est possible ou non. Si quelqu'un passe par là et a la réponse ;-)

Avatar du membre
Mammouth du PHP | 951 Messages

14 févr. 2019, 11:26

Salut, normalement avec les versions récentes de php il y a des sécurités au niveau de la session pour éviter le "vole" de session. Je pense que la session ne peut pas être partagée au serveur bancaire avec cette sécurité...?

Tu peux toujours essayer de transmettre le session id au serveur bancaire et dans la page de confirmation définir le session id avant de la démarrer, grâce à la fonction session_id pour voir si ça fonctionne.

Mais la bonne manière de faire est à priori celle proposée par or 1. Tu devrais normalement créer une commande en base de données et transmettre son numéro au serveur bancaire pour qu'il te le renvoies lors de la validation et que tu puisses mettre à jour le status de la commande.
Modifié en dernier par Saian le 14 févr. 2019, 13:05, modifié 1 fois.
J'édite souvent mon message après avoir répondu pour le corriger où y apporter des informations complémentaires alors n'hésitez pas à y jeter un nouveau coup d'oeil ^^

Petit nouveau ! | 4 Messages

14 févr. 2019, 11:57

Merci Saian,

J'ai essayé de transmettre l'ID de session au serveur bancaire afin de le redéfinir quand le serveur bancaire interroge ma page. Cela n'a pas fonctionné. Je pense que PHP essaye de recouper l'info avec un cookie et comme le serveur bancaire n'a pas le cookie ça ne fonctionne pas.
Je ne suis pas sur que cela soit vraiment ça mais se qui est sûr c'est que ça ne fonctionne pas.

A priori pas possible de récupérer une session par son ID.

Avatar du membre
Mammouth du PHP | 951 Messages

14 févr. 2019, 12:54

Bon ben pourtant je viens de faire un test qui fonctionne.

Dans firefox j'appelle une page sessionset.php
session_start();
echo session_id().'<br/>';
$_SESSION['value'] = 'hello world!';
print_r($_SESSION);

Puis dans chrome j'appelle une page sessionget.php où j'ai défini l'id de session en reprenant celui retourné par la page sessionset.php
session_id('intsa6mvb6idfoukt4724r2mj9');
session_start();
print_r($_SESSION);
Et le print_r($_SESSION) m'affiche bien les données de la session... les cookies étant activés dans chrome quid s'ils ne le sont pas ? je n'ai pas testé et je ne sais pas si le serveur bancaire en tant que client gère ou pas les cookies.

En poussant le vice tu pourrais même récupérer le contenu du fichier de session si tu sais où il est stocké
echo $content = file_get_contents('/var/lib/php/sessions/sess_intsa6mvb6idfoukt4724r2mj9');
Mais dans ce cas il faut être capable de convertir son contenu en variables php. Peut être du côté de la fonction session_decode ou peut être tu peux trouver un parser de session php ou coder le tien.

Ceci dit je te conseille vivement de privilégier une approche base de données.
J'édite souvent mon message après avoir répondu pour le corriger où y apporter des informations complémentaires alors n'hésitez pas à y jeter un nouveau coup d'oeil ^^

Mammouth du PHP | 559 Messages

14 févr. 2019, 14:43

Le souci que j'ai c'est que mon moyen de paiement (Paybox - qui m'a été imposé) renvoi l'autorisation du paiement de serveur à serveur. Le problème que j'ai c'est qu'au moment où le serveur de Paybox appelle ma page d'autorisation (c'est sur cette page que je créé la commande si paiement ok) il n'a pas les informations de Session pour pouvoir créer la commande (à partir de la session panier).
L'id de session est envoyé au client(navigateur , mobile ...) par un cookie. Or le cookie est propre à un domaine(et/ou ses sous-domaines) c-a-d seul le serveur émetteur a connaissance du cookie donc de l'id de session.
tu peux récupérer les données mises en session puis les transmettre à Paybox à l'aide d'une requête HTTP de type POST. Dans la même requête tu peux aussi transmettre l'url de la validation de la commande(IPN). Cette url sera appelée par Paybox à l'issue du paiement.
<?php
$params=['clientId'=>100, 'totalPrice'=>299.99, 'PBX_REPONDRE_A'=>'http://mon-serveur.fr/ipn.php' ];

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://www.serveur-de-labanque.fr');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($params));
$response = curl_exec($ch);
var_export($response);
curl_close($curl);
?>
Pour se protéger d'un cas de vol de l'id de session encore appelé attaque par fixation de session, comme mentionné dans les messages précédents, on utilise la fonction session_regenerate_id() qui a pour rôle de régénérer un nouvel identifiant de session tout en gardant la session actuelle. cette fonction tu peux la placer au moment de l'authentification par exemple juste après session_start()

Petit nouveau ! | 4 Messages

14 févr. 2019, 15:05

Ok, ok,

Donc Saian tu as tout à fait raison. J'ai fait le même test que toi est cela a l'air de fonctionner chez moi également. Cela ne marchait pas auparavant, car mon cerveau était formaté pour écrire session_start() avant de faire quoi que ce soi avec les sessions. Je définissais donc le session_id() après le session_start()...
J'ai fait un test également en n'autorisant pas les cookies sur mon navigateur et cela fonctionne bien également.

Donc on a la réponse : on peut bel et bien récupérer une session par son ID grâce à la méthode de Saian.

Pour autant, suivant les conseils d'un peu tout le monde, j'ai opté pour le passage en BDD avec envoi de l'ID à Paybox et récupération quand Paybox renvoi l'autorisation. Cela parait plus fiable.

Merci à tous !