[RESOLU] Paypal, fsockopen, SSL, ports 80 et 443

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : [RESOLU] Paypal, fsockopen, SSL, ports 80 et 443

Re: Paypal, fsockopen, SSL, ports 80 et 443

par finipe » 14 mai 2016, 01:31

Bienheureux sois tu Twister :priere:
Moi j'ai pas les bonnes versions de Curl pour pouvoir utiliser ce script.

En tout cas, je le passe quand même en résolu au cas où une autre âme égarée passerait par là avec un problème similaire !

Re: Paypal, fsockopen, SSL, ports 80 et 443

par Twister » 12 mai 2016, 20:32

Re,

j'avoue l'avoir énormément vu ce code après toutes mes recherches...mais vu que j'ai commencé à utiliser la fonction $fp = fsockopen('tls://www.sandbox.paypal.com', 443, $errno, $errstr, 30); je suis resté sur ce cas.
D’ailleurs, il me semble que sur github il y a également un modèle de ce code ci-dessus.

Finalement, cela m'a pris quelques seconde de copié/collé le code en remplaçant deux/trois petites choses et la BIMMM ça marche !!!
De plus, en tapant un bout de code sur google, j'ai également pu trouver la doc. officiel sur Paypal sur ce morceau de code :
https://developer.paypal.com/docs/classic/ipn/ht_ipn/ :)

Par contre, je me demande...quelle est la différence entre ouvrir un socket avec fsockopen et curl ?

J'étais trop entêté à vouloir utiliser cette méthode...
Merci à toi, il suffit d'en parler pour que je fasse le saut !!

Re: Paypal, fsockopen, SSL, ports 80 et 443

par @rthur » 12 mai 2016, 08:36

Oui, j'ai déjà intégré paypal de nombreuses fois et ça marche très bien.

Regarde dans les logs de ton serveur pour voir les messages d'erreur.

Et sinon, utilise la lib officielle :
https://github.com/paypal/ipn-code-samp ... al_ipn.php

Re: Paypal, fsockopen, SSL, ports 80 et 443

par Twister » 12 mai 2016, 00:42

Bonjour @rthur,

Oui, j'ai bien lu ton post plus haut et bien d'accord qu'il est préférable d'utiliser leur doc. Malheureusement, j'utilise la documentation officiel de Paypal. :(
Le code ci-dessous est bien utilisé dans la documentation de Paypal :
$fp = fsockopen('tls://www.sandbox.paypal.com', 443, $errno, $errstr, 30);

https://developer.paypal.com/docs/class ... ent_status
https://developer.paypal.com/docs/classic/ipn/ht_ipn/

As-tu déjà utilisé la librairie Paypal ? Cela pourrait m'aider si tu as une idée/vue du problème que nous avons ?

Apparemment après des jours de recherche, je remarque qu’énormément de personnes tombent sur le même problème...grosse mise à jour côté Paypal et de sa sandbox depuis ce début d'année 2016...

Re: Paypal, fsockopen, SSL, ports 80 et 443

par finipe » 11 mai 2016, 13:15

En ce qui me concerne, et de guerre lasse, je me suis faite une raison et j'ai laissé tomber PayPal.
J'ai convaincu le copain pour lequel je fais le site de signer chez Paybox, et c'est ultra plus simple d'utilisation. Et ils proposent de rajouter paypal à la liste des moyens de paiement.

En fait, j'ai l'impression que Paypal n'a pas trop envie qu'on utilise leur solution tellement c'est le bordel à mettre en place...

Re: Paypal, fsockopen, SSL, ports 80 et 443

par @rthur » 11 mai 2016, 11:35

Bonjour,

As-tu regardé mon post plus haut ?
Il est préférable d'utiliser la librairie officielle qui est tenue à jour directement par Paypal :)

Surtout pour un système de paiement, c'est préférable de s'appuyer sur du code fiable et documenté.

Re: Paypal, fsockopen, SSL, ports 80 et 443

par Twister » 11 mai 2016, 00:25

Bonjour,

je me retrouve avec le même problème et le même code que toi finipe.
la fonction suivante : fsockopen('www.sandbox.paypal.com', 443, $errno, $errstr, 30); me renvoie rien.

par contre à l'inverse de toi, la fonction avec le port 80 me renvoie bien un retour...mais ce n'est pas super pro d'envoyer des info. en clair. Se serait bien que cela fonctionne avec le port 443.

J'ai fait le tour d'Internet...j'ai limite était content en tombant sur ton problème :twisted: , je pensais que j'étais seul dans ce cas.
Je dois certainement mal me débrouiller mais je ne vois pas où. :cry:

Dans l'attente que quelqu'un puisse nous aider.
Cordialement,
Twister.

Re: Paypal, fsockopen, SSL, ports 80 et 443

par finipe » 09 févr. 2016, 20:15

Effectivement, je suis en PHP 5.4.45 et CURL 7.21.0... et un des messages indique qu'il faut PHP 5.5.19+ et curl 7.29+
Donc je suis marron pour ce script !

Alors je reviens au précédent ? Avec le même problème de fsockopen ?

Quoiqu'il en soit, merci pour vos réponses !

Re: Paypal, fsockopen, SSL, ports 80 et 443

par or 1 » 09 févr. 2016, 20:03

http://stackoverflow.com/questions/3479 ... -alert-han
de ce que j'ai survolé, il faut une version récente de php sur son serveur.

Re: Paypal, fsockopen, SSL, ports 80 et 443

par finipe » 09 févr. 2016, 19:47

J'ai installé le fichier cacert.pem et décommenté les lignes, mais rien de neuf, l'erreur reste toujours :

Code : Tout sélectionner

Can't connect to PayPal to validate IPN message: error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure

Re: fsockopen, SSL, ports 80 et 443

par finipe » 09 févr. 2016, 12:45

Merci pour la doc @rthur, j'avais vu ce truc, mais c'est teeeeellement différent du script qui court partout sur le web que j'avais passé mon tour. Je commençais à peine à comprendre comment ça fonctionnait, tant pis, je reprends à zéro :lol:

J'ai décortiqué le script fourni sur GitHub, mais n'étant pas un pro du code, c'est même pas du chinois pour moi, c'est du martien !


- Qu'est ce que c'est cURL ? (j'ai regardé sur wikipédia, ça ne m'a pas beaucoup avancé)
- Et le fichier "cacert.pem" qu'ils disent de télécharger, c'est quoi ? C'est indispensable ?
- Lors d'un achat par PayPal ou quand je vais directement sur ma page nip.php, j'ai la ligne suivante dans le log : "[2016-02-09 11:38 Europe/Paris] Can't connect to PayPal to validate IPN message: error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure"


En tout cas, on n'a pas l'impression que PayPal souhaite qu'on utilise ses services, tant c'est obscur :-k

Re: fsockopen, SSL, ports 80 et 443

par @rthur » 09 févr. 2016, 10:18

D'où sors tu cette url : "ssl://www.sandbox.paypal.com" ?

Car il faut croire que tu n'as pas lu la bonne doc car j'ai été incapable de la retrouver sur la doc de paypal ! ;)
https://www.paypal.com/fr/cgi-bin/websc ... fo-outside
https://developer.paypal.com/docs/class ... mentation/

Par ailleurs, Paypal met à disposition des développeurs des exemples de scripts IPN qui fonctionnent sans avoir rien à modifier :
https://github.com/paypal/ipn-code-samples

Re: fsockopen, SSL, ports 80 et 443

par finipe » 09 févr. 2016, 03:56

J'avais essayé entre temps, et cette ligne là permet au script de passer le fsockopen (en contradiction avec tout ce que j'ai pu lire sur le Net, et j'en ai lu des kilomètres sur le sujet de cette satanée NIP !)

Si le cap du fsockopen passe désormais (même si je ne sais pas pourquoi), la suite n'est pas concluante... Je me permets un peu de code (je sais que le sujet a été traité des milliards de fois sur les différents forums, mais je n'ai trouvé aucune réponse claire, concise, précise, je crois que c'est la première fois que ça m'arrive !) :

Code : Tout sélectionner

<?php ///////////////////////////////////////////////////// // INCLUDES ///////////////////////////////////////////////////// require_once("_inc.configuration.php"); require_once("_inc.etatcommande.php"); require_once("_inc.fonctions.php"); $DEBUG = TRUE; // DEBUG : Ouverture du log if($DEBUG == TRUE) { $log = fopen('lognip.txt', 'r+'); // Vide le fichier et remet le curseur au début ftruncate($log, 0); fseek($log, 0); } $req = 'cmd=_notify-validate'; foreach($_POST as $key => $value) { $value = urlencode(stripslashes($value)); $req .= "&$key=$value"; } // Renvoyer au système PayPal pour validation $header = "POST /cgi-bin/webscr HTTP/1.0\r\n"; //$header .= "Host: ipnpb.paypal.com:443\r\n"; $header .= "Host: www.sandbox.paypal.com:443\r\n"; $header .= "Content-Type: application/x-www-form-urlencoded\r\n"; $header .= "Content-Length: ".strlen($req)."\r\n\r\n"; //$fp = fsockopen('ssl://ipnpb.paypal.com', 443, $errno, $errstr, 30); $fp = fsockopen("www.sandbox.paypal.com", 443, $errnum, $errstr, 30); if($fp == FALSE) { // -------- DEBUG --------- if($DEBUG == TRUE) fputs($log, "fsockopen = FALSE - Erreur : ".$errstr." (".$errno.")\r\n"); } else { // -------- DEBUG --------- fputs($log, $header.$req."\r\n\r\n"); fputs($fp, $header.$req); while(!feof($fp)) { $res = fgets($fp, 1024); $res = trim($res); // -------- DEBUG --------- if($DEBUG == TRUE) fputs($log, "res = ".$res."\r\n"); ///////////////////////////////////////////////////// // TRANSACTION VERIFIEE ///////////////////////////////////////////////////// if(strcmp($res, "VERIFIED") == 0) { // Ici, plein de code pour vérifier l'état de la commande, le stock, envoyer des mails, etc. // Mais le script ne passe pas cette étape ! } ///////////////////////////////////////////////////// // TRANSACTION NON VERIFIEE ///////////////////////////////////////////////////// else { // -------- DEBUG --------- if($DEBUG == TRUE) fputs($log, "NON VERIFIE\r\n"); } ///////////////////////////////////////////////////// // TRANSACTION INVALIDE ///////////////////////////////////////////////////// if(strcmp($res, "INVALID") == 0) { // -------- DEBUG --------- if($DEBUG == TRUE) fputs($log, "INVALIDE\r\n"); } } fclose($fp); } // Fermeture du fichier log if($DEBUG == TRUE) fclose($log); mysql_close(); ?>
Je crois avoir essayé toutes les combinaisons possibles dans les lignes de code du début :

Code : Tout sélectionner

<?php // Pour le header... $header .= "Host: www.sandbox.paypal.com:443\r\n"; $header .= "Host: www.sandbox.paypal.com\r\n"; $header .= "Host: ipnpb.paypal.com:443\r\n"; $header .= "Host: ipnpb.paypal.com\r\n"; // Pour le fsockopen... $fp = fsockopen("www.sandbox.paypal.com", 443, $errnum, $errstr, 30); $fp = fsockopen("ssl://www.sandbox.paypal.com", 443, $errnum, $errstr, 30); $fp = fsockopen("tls://www.sandbox.paypal.com", 443, $errnum, $errstr, 30); $fp = fsockopen("www.sandbox.paypal.com", 80, $errnum, $errstr, 30); ?>
Et au mieux, je récupère le log suivant :

Code : Tout sélectionner

POST /cgi-bin/webscr HTTP/1.0 Host: www.sandbox.paypal.com Content-Type: application/x-www-form-urlencoded Content-Length: 799 cmd=_notify-validate&mc_gross=13.87&protection_eligibility=Ineligible&payer_id=68NNNB7AKU3C2&tax=0.00&payment_date=17%3A53%3A13+Feb+08%2C+2016+PST&payment_status=Completed&charset=windows-1252&first_name=test&mc_fee=0.72&notify_version=3.8&custom=7&payer_status=verified&business=xxxxxx-facilitator%40free.fr&quantity=1&verify_sign=AoIlwP.cbXyRSnpgjFfIYtfb677IAwuE5Kt20F4B7rXty6vXR1t9uN85&payer_email=xxxxxx-buyer%40free.fr&txn_id=8DF95096V53977023&payment_type=instant&last_name=buyer&receiver_email=xxxxxx-facilitator%40free.fr&payment_fee=&receiver_id=BJBG36JFMA9RJ&txn_type=web_accept&item_name=Commande&mc_currency=EUR&item_number=&residence_country=FR&test_ipn=1&handling_amount=0.00&transaction_subject=7&payment_gross=&shipping=0.00&ipn_track_id=9121b4b352de0 res = HTTP/1.0 302 Found NON VERIFIE res = Location: https://www.sandbox.paypal.com NON VERIFIE res = Server: BigIP NON VERIFIE res = Connection: close NON VERIFIE res = Content-Length: 0 NON VERIFIE res = NON VERIFIE

Bref, une bonne journée de vacances passée à se prendre la tête devant un écran #-o

Re: fsockopen, SSL, ports 80 et 443

par or 1 » 09 févr. 2016, 02:20

que donne :
$fp = fsockopen('www.sandbox.paypal.com', 443, $errno, $errstr, 30);
?

Paypal, fsockopen, SSL, ports 80 et 443

par finipe » 09 févr. 2016, 01:10

Bonjour à tous,

J'essaye de mettre en place un paiement paypal sur le site d'un copain, avec Notification Instantanée de Paiement, tout bien comme ils disent sur la doc de PayPal.

Ça n'a pas marché pendant... très longtemps :D
Ça ne marche toujours pas d'ailleurs, mais je crois que j'ai trouvé pourquoi. Quand j'essaie la commande suivante :

Code : Tout sélectionner

$fp = fsockopen('ssl://www.sandbox.paypal.com', 443, $errno, $errstr, 30);
...aucun retour, le fsockopen me renvoie FALSE (j'ai installé un genre de log pour m'en apercevoir).
En revanche, quand je mets :

Code : Tout sélectionner

$fp = fsockopen('www.sandbox.paypal.com', 80, $errno, $errstr, 30);
...alors là c'est ok, le fsockopen passe.

Je dois à cet instant vous confesser que je ne comprends pas grand chose aux protocoles, sinon qu'il semblerait que SSL soit un truc sécurisé, qui passe par le port 443 (je ne sais pas vraiment c'est qu'est un port, au passage). J'ai vu aussi qu'on pouvait utiliser TLS... J'ai navigué pendant des heures sur les forums pour trouver des réponses, j'ai vérifié chez l'hébergeur (OVH mutualisé) si le SSL est bien activé, la réponse est oui (enabled partout).

La question est donc la suivante : c'est grave docteur si je passe pas par SSL pour ma NIP ? Et si c'est grave, comment je fais pour utiliser le SSL qui ne semble pas vouloir fonctionner dans mon fichier NIP ?

Merci pour votre aide !