IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

E-Commerce Discussion :

IPN Non exécuté


Sujet :

E-Commerce

  1. #1
    Membre régulier Avatar de The Molo
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    240
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2007
    Messages : 240
    Points : 99
    Points
    99
    Par défaut IPN Non exécuté
    Bonjour,

    Nous avons décidé d'implémenter Paypal sur notre site.

    Nous avons donc testé notre code en sandbox : Tout fonctionne mis à part l'exécution de l'IPN.

    Ayant lu sur certains posts que la sandbox pouvait ne pas avoir les dernières mises à jour, nous avons créé un vrai compte paypal et avons testé :


    - le paiement est bien effectué sur le compte.

    - nous recevons bien un e-mail de confirmation sur l'adresse du vendeur.

    - mais l'IPN n'est toujours pas exécuté ce qui implique que je n'ai aucune traces des paiements dans notre base de données.

    (Pour info : nous avons bien activé l'exécution de l'IPN dans notre compte)


    Voici notre code :

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
     
    <?
    include "functions/conn.php";
     
    function VerifIXNID($txn_id)
    {
    	include "functions/conn.php";
    	$req = mysql_query("select txnid from paypal_payment_info where txnid='".$txn_id."'");
    	$nbr = mysql_num_rows($req); 
     
    	if ($nbr == 0)
    	{
    		return 0;
    	}
    	else
    	{
    		return 1;
    	}
    }
    ?>
    <?
     
    // Lire le formulaire provenant du système PayPal et ajouter 'cmd' 
     
     $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.0rn";     
    $header .= "Content-Type: application/x-www-form-urlencodedrn";     
    $header .= "Content-Length: " . strlen($req) . "rnrn";     
    $fp = fsockopen ('www.paypal.com', 80, $errno, $errstr, 30);  
     
     
    $item_name = $_POST['item_name'];     
    $item_number = $_POST['item_number'];     
    $payment_status = $_POST['payment_status'];     
    $mc_gross = $_POST['mc_gross']; // payment_amount
    $payment_currency = $_POST['mc_currency']; // Devise de paiement
    $txn_id = $_POST['txn_id'];     
    $receiver_email = $_POST['receiver_email'];     
    $payer_email = $_POST['payer_email'];     
    $custom = $_POST['custom'];  //id_user
     
     
    $first_name = $_POST['first_name'];
    $last_name = $_POST['last_name'];
    $address_street = $_POST['address_street'];
    $address_city = $_POST['address_city'];
    $address_state = $_POST['address_state'];
    $address_zip = $_POST['address_zip'];
    $address_country = $_POST['address_country'];
    $mc_fee = $_POST['mc_fee'];
    $memo = $_POST['memo'];
    $payment_type = $_POST['payment_type'];
    $payment_date = $_POST['payment_date'];
    $pending_reason = $_POST['pending_reason']; // Raison pour laquelle le paiement a été placé en attente.
    $reason_code = $_POST['reason_code'];
    $tax = $_POST['tax'];
    $fecha = date("m")."/".date("d")."/".date("Y");
     
     
    if (!$fp) 
    {     
    	// ERREUR HTTP     
    } 
    else 
    {       
    	fputs ($fp, $header . $req);         
    	while (!feof($fp)) 
    	{             
    		$res = fgets ($fp, 1024);            
    		if (strcmp ($res, "VERIFIED") == 0) 
    		{                 
    			// transaction valide 
     
                   // vérifier que payment_status a la valeur Completed                 
    					if ( $payment_status == "Completed") 
    					{  
    						// vérifier que txn_id n'a pas été précédemment traité: Créez une fonction qui va interroger votre base de données 
    						if (VerifIXNID($txn_id) == 0) 
    						{      
    							// vérifier que receiver_email est votre adresse email PayPal principale                         
    							if ( "xxx@xxxxxxxxxx.be" == $receiver_email) 
    							{     
    								// vérifier que payment_amount et payment_currency sont corrects                             
    								// Traiter le paiement       
    								$strQuery = mysql_query("INSERT INTO paypal_payment_info(paymentstatus, buyer_email, firstname, lastname, street, city,state, zipcode, country, mc_gross, mc_fee, memo, paymenttype, paymentdate, txnid, pendingreason, reasoncode, tax, datecreation, custom) 
    								VALUES ('".$payment_status."','".$payer_email."','".$first_name."','".$last_name."','".$address_street."','".$address_city."','".$address_state."','".$address_zip."','".$address_country."','".$mc_gross."','".$mc_fee."','".$memo."','".$payment_type."','".$payment_date."','".$txn_id."','".$pending_reason."','".$reason_code."','".$tax."','".$fecha."','".$custom."')");
    							} 
    							else 
    							{ 
    								// Mauvaise adresse email paypal 
    							} 
    						}
    						else 
    						{ 
    							// ID de transaction déjà utilisé 
    						} 
    					} 
    					else 
    					{ 
    						// Statut de paiement: Echec 
    					}  
            }           
    		else 
    		{
    			if (strcmp ($res, "INVALID") == 0) 
    			{                 
    				// Transaction invalide 
    			} 
    		}         
    		fclose ($fp);     
    	}  
     
        if (!$fp) 
    	{     
    		// ERREUR HTTP    
    	} 
    	else 
    	{         
    		fputs ($fp, $header . $req);         
    		while (!feof($fp)) 
    		{             
    			$res = fgets ($fp, 1024);             
    			if (strcmp ($res, "VERIFIED") == 0) 
    			{                 
    				// transaction valide             
    			}            
    			else 
    			{
    				if (strcmp ($res, "INVALID") == 0) 
    				{                 
    					// Transaction invalide                           
    				}        
    			}        
    			fclose ($fp);     
    		}
    	}
     
    }
     
    ?>


    Auriez-vous une idée d'où vient le problème ?

    Merci d'avance...
    The Molo

  2. #2
    Membre confirmé

    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 464
    Points : 474
    Points
    474
    Par défaut
    Il y a une variable POST qui force le retour IPN quelque soit la configuration d'IPN dans le compte Paypal : notify_url
    A essayer.

  3. #3
    Membre régulier Avatar de The Molo
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    240
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2007
    Messages : 240
    Points : 99
    Points
    99
    Par défaut
    Merci de votre réponse...

    Je l'avais déjà mise dans mon formulaire donc le problème ne vient pas de là...

    A mon avis, il y a un problème dans le code mais lequel ???
    The Molo

  4. #4
    Membre confirmé

    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 464
    Points : 474
    Points
    474
    Par défaut
    Euh rien à voir avec le problème, mais cela pourrait être mieux quand il y aura beaucoup de transaction :
    $req = mysql_query("select txnid from paypal_payment_info where txnid='".$txn_id." LIMIT 1'");

    include "functions/conn.php"; est repété. C'est peut-être ça le probème, le script plante lors de l'appel à la fonction VerifIXNID.

    Que donne les logs Apache, est ce qu'IPN arrive bien sur le serveur ?
    Je pose la question car il m'est arrivé parfois que cela ne soit pas le cas et ça vaut peut-être le cout de vérifier.

    Si la réponse IPN arrive bien, quel(s) "if" est utilisé ? A mon avis pour y répondre, il faut mettre quelque chose pour logger chaque clause. Ca permettra de voir les valeurs de variables au fil de l'exécution.

    Bon courage !

  5. #5
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 938
    Points : 4 359
    Points
    4 359
    Par défaut
    1. comme déjà dit, les 2 include
    2. fsockopen n'est essayé qu'une seule fois… c'est un peu jouer à la roulette…
    mettez un nombre d'essais et faites une boucle avec un sleep entre chaque essai, et considérez que paypal ne peut être contacté que si le nombre max d'essais est atteint sans succès…
    3. votre deuxième "if (!$fp) { // ERREUR HTTP }" ne sera jamais exécuté… vous êtes déjà dans une branche où $fp != null et où il n'est jamais modifié…
    en plus ce bloc "if else endif" est un doublon de celui qui le contient…
    4. pas certain que ce ne soit votre copier-coller qui ait foiré, alors vérifiez que les lignes de headers se terminent bien par "\r\n" en PHP et non rn comme cela apparaît dans votre post…

  6. #6
    Membre régulier Avatar de The Molo
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    240
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2007
    Messages : 240
    Points : 99
    Points
    99
    Par défaut
    Merci beaucoup pour vos réponses...

    J'ai effectué les modifications...

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
     
    <?
    include "functions/conn.php";
     
    // Lire le formulaire provenant du système PayPal et ajouter 'cmd' 
     $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 .= "Content-Type: application/x-www-form-urlencoded\r\n";     
    $header .= "Content-Length: " . strlen($req) . "\r\n\r\n";     
    $fp = fsockopen ('www.paypal.com', 80, $errno, $errstr, 30);  
     
    // Récupération des données de la transaction
    $item_name = $_POST['item_name'];     
    $item_number = $_POST['item_number'];     
    $payment_status = $_POST['payment_status'];     
    $mc_gross = $_POST['mc_gross']; // payment_amount
    $payment_currency = $_POST['mc_currency']; // Devise de paiement
    $txn_id = $_POST['txn_id'];     
    $receiver_email = $_POST['receiver_email'];     
    $payer_email = $_POST['payer_email'];     
    $custom = $_POST['custom'];  //id_user
    $first_name = $_POST['first_name'];
    $last_name = $_POST['last_name'];
    $address_street = $_POST['address_street'];
    $address_city = $_POST['address_city'];
    $address_state = $_POST['address_state'];
    $address_zip = $_POST['address_zip'];
    $address_country = $_POST['address_country'];
    $mc_fee = $_POST['mc_fee'];
    $memo = $_POST['memo'];
    $payment_type = $_POST['payment_type'];
    $payment_date = $_POST['payment_date'];
    $pending_reason = $_POST['pending_reason']; // Raison pour laquelle le paiement a été placé en attente.
    $reason_code = $_POST['reason_code'];
    $tax = $_POST['tax'];
    $fecha = date("m")."/".date("d")."/".date("Y");
     
    //TEST
    if (!$fp) 
    {     
    	// ERREUR HTTP     
    } 
    else 
    {       
    	fputs ($fp, $header . $req);         
    	while (!feof($fp)) 
    	{             
    		$res = fgets ($fp, 1024);            
    		if (strcmp ($res, "VERIFIED") == 0) 
    		{                 
    			// transaction valide 
     
                   // vérifier que payment_status a la valeur Completed                 
    					if ( $payment_status == "Completed") 
    					{  
    						// vérifier que txn_id n'a pas été précédemment traité
    						$req = mysql_query("select txnid from paypal_payment_info where txnid='".$txn_id."'");
    						$res = mysql_num_rows($req); 
     
    						if ($res == 0) 
    						{      
    							// vérifier que receiver_email est votre adresse email PayPal principale                         
    							if ( "xxxxxxxx@xxxxx.xx" == $receiver_email) 
    							{     
    								// vérifier que payment_amount et payment_currency sont corrects                             
    								// Traiter le paiement       
    								$strQuery = mysql_query("INSERT INTO paypal_payment_info(paymentstatus, buyer_email, firstname, lastname, street, city,state, zipcode, country, mc_gross, mc_fee, memo, paymenttype, paymentdate, txnid, pendingreason, reasoncode, tax, datecreation, custom) 
    								VALUES ('".$payment_status."','".$payer_email."','".$first_name."','".$last_name."','".$address_street."','".$address_city."','".$address_state."','".$address_zip."','".$address_country."','".$mc_gross."','".$mc_fee."','".$memo."','".$payment_type."','".$payment_date."','".$txn_id."','".$pending_reason."','".$reason_code."','".$tax."','".$fecha."','".$custom."')");
    							} 
    							else 
    							{ 
    								// Mauvaise adresse email paypal 
    							} 
    						}
    						else 
    						{ 
    							// ID de transaction déjà utilisé 
    						} 
    					} 
    					else 
    					{ 
    						// Statut de paiement: Echec 
    					}  
            }           
    		else 
    		{
    			if (strcmp ($res, "INVALID") == 0) 
    			{                 
    				// Transaction invalide 
    			} 
    		}         
    		fclose ($fp);     
    	}  
     
        if ($fp) 
    	{        
    		fputs ($fp, $header . $req);         
    		while (!feof($fp)) 
    		{             
    			$res = fgets ($fp, 1024);             
    			if (strcmp ($res, "VERIFIED") == 0) 
    			{                 
    				// transaction valide             
    			}            
    			else 
    			{
    				if (strcmp ($res, "INVALID") == 0) 
    				{                 
    					// Transaction invalide                           
    				}        
    			}        
    			fclose ($fp);     
    		}
    	}
     
    }
     
    ?>

    Est-ce correcte maintenant pour les "\r\n" ?

    Par contre, je ne comprends pas bien ce que vous voulez dire JeitEmgie pour le fsockopen... Pourquoi devrais-je essayer de contacter Paypal plusieurs fois ? Cela ne marche pas à tous les coups ?

    Merci !
    The Molo

  7. #7
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 938
    Points : 4 359
    Points
    4 359
    Par défaut
    Citation Envoyé par The Molo Voir le message
    Merci beaucoup pour vos réponses...

    J'ai effectué les modifications...


    Est-ce correcte maintenant pour les "\r\n" ?
    non

    TOUTES les lignes header !!!
    vous n'avez modifié que la dernière…

    Citation Envoyé par The Molo Voir le message
    Par contre, je ne comprends pas bien ce que vous voulez dire JeitEmgie pour le fsockopen... Pourquoi devrais-je essayer de contacter Paypal plusieurs fois ? Cela ne marche pas à tous les coups ?
    non ça ne marche pas à tous les coups !

    et votre logique des if ($fp) est toujours erronée…

  8. #8
    Membre régulier Avatar de The Molo
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    240
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2007
    Messages : 240
    Points : 99
    Points
    99
    Par défaut
    Merci pour votre patience!!!

    J'ai enlevé le if-else-end if ... et corrigé les /n/r ...

    J'ai fait des tests et en fait, c'est dans le while que ça coince :

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    while (!feof($fp)) 
    { 
        $res = fgets ($fp, 1024);   
        if (strcmp ($res, "VERIFIED") == 0) 
        {
           //...  
         }
    }

    La variable $res contient ceci : HTTP/1.1 200 OK
    C'est normal qu'il ne rentre pas dans le if...

    Avez-vous une idée de ce que signifie ce code ?
    Auriez-vous de la documentation la dessus ?

    Merci !
    The Molo

  9. #9
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 938
    Points : 4 359
    Points
    4 359
    Par défaut
    Citation Envoyé par The Molo Voir le message
    Merci pour votre patience!!!

    J'ai enlevé le if-else-end if ... et corrigé les /n/r ...

    J'ai fait des tests et en fait, c'est dans le while que ça coince :

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    while (!feof($fp)) 
    { 
        $res = fgets ($fp, 1024);   
        if (strcmp ($res, "VERIFIED") == 0) 
        {
           //...  
         }
    }

    La variable $res contient ceci : HTTP/1.1 200 OK
    C'est normal qu'il ne rentre pas dans le if...

    Avez-vous une idée de ce que signifie ce code ?
    Auriez-vous de la documentation la dessus ?

    Merci !
    évidemment : vous fermez le socket dans le while !
    donc vous ne lisez jamais que la première ligne…
    déplacez le fclose($fp) après le } du bloc while…

  10. #10
    Membre régulier Avatar de The Molo
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    240
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2007
    Messages : 240
    Points : 99
    Points
    99
    Par défaut
    Merci beaucoup !

    C'était bien ça...
    The Molo

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. IPN paypal non exécuté
    Par anonyme! dans le forum E-Commerce
    Réponses: 0
    Dernier message: 04/07/2009, 23h21
  2. Non exécution d'une méthode repaint()
    Par Flophx dans le forum AWT/Swing
    Réponses: 7
    Dernier message: 05/05/2006, 18h04
  3. [MySQL] Requête non exécutée
    Par harlock59 dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 03/05/2006, 15h42
  4. On error goto Err : goto non exécutée au 2ème appel
    Par charliejo dans le forum Access
    Réponses: 1
    Dernier message: 11/04/2006, 15h00
  5. INCLUDE non exécuté
    Par Sadneth dans le forum ASP
    Réponses: 3
    Dernier message: 07/09/2003, 00h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo