Insertion des données paypal dans la base de données en php [Résolu]

Messages postés
71
Date d'inscription
vendredi 13 janvier 2017
Statut
Membre
Dernière intervention
19 août 2019
- - Dernière réponse : Programming_018
Messages postés
71
Date d'inscription
vendredi 13 janvier 2017
Statut
Membre
Dernière intervention
19 août 2019
- 19 août 2019 à 10:51
Bonjour,

J'ai un petit soucis je programme un site internet en php, html, css, jquery, mysql pour faire un site internet jusqu'à la j'ai réussi à faire tout ce qui est inscription/connexion du client, l'affichage des articles dans ma boutique à partir de mysql mais lorsque je veux faire en sorte que quand le client paye les informations se stocke sur ma base de données j'ai une erreur.
Je précise je me sert d'un formulaire paypal avec la fonction notif_ipn auquel dedans j'ai mis le script pour que cela s'ajoute bien dans ma base de données.

Voici les scripts :


Le formulaire :

<form action="https://www.sandbox.paypal.com/cgi-bin/webscr" method="post" id="paypal">
            <input type='hidden' value="<?php echo $paiementpaypal; ?>" name="amount" />  <!-- somme -->
            <input name="currency_code" type="hidden" value="EUR" />
            <input name="shipping" type="hidden" value="0.00" /><!-- frais de port -->
            <input name="tax" type="hidden" value="0.00" /> <!-- tax -->
            <!-- script pour succes -->
            <input name="return" type="hidden" value="http://lien_du_site/pagesupprimer.php?viderPanier" />
            <!-- script en cas d'annulation -->
            <input name="cancel_return" type="hidden" value="http://lien_du_site/pagepanier.php" />
            <!-- url pour IPN notification de paiement -->
            <input name="notify_url" type="hidden" value="http://lien_du_site/pagenotif_IPN.php" />
          
            <!-- compte du vendeur -->
            <input name="business" type="hidden" value="sb-aeqf287615@business.example.com" />

            <input type="hidden" name="upload" value="1" />
            <input type="hidden" name="cmd" value="_cart" />
            <!-- la liste des produits dans le panier -->
            <?php 
            $i=1;
            foreach ($produits as $p): ?>
                <input name="item_name_<?php echo $i ?>" type="hidden" value="<?php echo $p->name; ?>" />
                <input name="item_number_<?php echo $i ?>" type="hidden" value="<?php echo $p->id; ?>" />
                <input name="quantity_<?php echo $i; ?>" type="hidden" value="<?php echo $panier->getQte($p->id); ?>"/>
                <input name="amount_<?php echo $i ?>" type="hidden" value="<?php echo $p->price * 1.2;?>" />
            <?php 
            $i++;
            endforeach ?>
          

            

            <input name="no_note" type="hidden" value="1" />
            <input name="lc" type="hidden" value="FR" />
            <input name="bn" type="hidden" value="PP-BuyNowBF" />
            <input name="custom" type="hidden" value="user_id=<?php echo $_SESSION['user']['id'] ?>" />
            <input alt="Effectuez vos paiements via PayPal " name="submit"  type="submit" value="Payer"/>
          </form>



Code de la page pagenotif_IPN.php :

<?php
file_put_contents('log', print_r($_POST,true));

// fonction pour vérifier l'unicité de txn_id
function VerifIXNID($txn_id){
			file_put_contents('log','Vérification txn_id ');
			$db = new PDO("mysql:host=lien_serveur;dbname=bdd","user","mdp");
         	$nbreponse = $db->query("SELECT COUNT(*) FROM commandes WHERE txn_id=".$txn_id)->fetchColumn();

           if($nbreponse > 0 ){
               return 1;
           }else{
              return 0;
          }
      }
/**-----------------------------------------------
* Email
-------------------------------------------------**/

$emailto = $_POST['payer_email'];;
$emailfrom = "sb-aeqf287615@business.example.com";
$sujetprefix = "[PAYPAL]";
$charset = "utf-8";

$fichier_log = fopen('log.txt', 'w+');
$log = fgets($fichier_log);
$log .="(".date('Y-m-d')." ".date('H:i') .") - Le script est executé.";
fputs($fichier_log, $log);
$log = fgets($fichier_log);

// Adresse Email de la boutique
$email_account="sb-aeqf287615@business.example.com";

$req = 'cmd=_notify-validate';

foreach ($_POST as $key => $value) {
	$value = urlencode(stripslashes($value));
	$req .= "&$key=$value";
}

// post back to PayPal system to validate
// renvoyer a paypal pour validation

$header .= "POST /cgi-bin/webscr HTTP/1.0\r\n";
$header .= "Content-Type: application/x-www-form-urlencoded\r\n";
$header .= "Host: www.sandbox.paypal.com\r\n";  // www.paypal.com for a live site
$header .= "Content-Length: " . strlen($req) . "\r\n\r\n";
$fp = fsockopen ('ssl://www.sandbox.paypal.com', 443, $errno, $errstr, 30);

// assign posted variables to local variables
// Affecter les variables postées aux variables locales

$item_name = $_POST['item_name'];
$item_number = $_POST['item_number'];
$payment_status = $_POST['payment_status'];
$payment_amount = $_POST['mc_gross'];
$payment_currency = $_POST['mc_currency'];
$txn_id = $_POST['txn_id'];
$receiver_email = $_POST['receiver_email'];
$payer_email = $_POST['payer_email'];


$num_cart_items = intval($_POST['num_cart_items']);


// numero de transaction
$txn_id = $_POST['txn_id'];

//	parser la variable custom
parse_str($_POST['custom'],$custom);
/* $custom['user_id] = 1*/

if (!$fp) {
// HTTP ERROR

} else {	
	fputs ($fp, $header . $req);
	while (!feof($fp)) {
		$res = fgets ($fp, 1024);
		if (strcmp ($res, "VERIFIED") == 0) {
			
			// check the payment_status is Completed
			if($payment_status == "Completed"){
			 file_put_contents('log','status completed');
			 	// check that receiver_email is your Primary PayPal email
				if($email_account == $receiver_email){
					file_put_contents('log','email confirmée ');
						// check that txn_id has not been previously processed

						// if (VerifIXNID($txn_id) == 0) {

							file_put_contents('log','txn_id vérifier ');
							// check that payment_amount/payment_currency are correct

							// process payment						 
							 $uid = $custom['user_id'];

							// sauvegarder la commande  
							$data=serialize($_POST);

							/*sauvegarde des infos dans un fichier log*/
							file_put_contents('log_'.$txn_id, print_r($_POST,true));

							// connexion a la base de données
							$db = new PDO("mysql:host=serveur;dbname=bdd","user","mdp");
												
							$db->query("INSERT INTO commandes (user_id,amount,created,datas,txn_id) VALUES (".$uid.",".$payment_amount.",NOW(),'".$data."','".$txn_id."')");

							file_put_contents('log','le paiement a bien été confirmé');

							// Envoi du mail
							$mail_To = $emailto;
				            $header ="MIME-Version: 1.0\r\n";
				            $header.='FROM:"titre"<adressemail'."\n";
				            $header.='Content-Type:text/html; charset="utf-8"'."\n";
				            $header.='Content-Transfert-Encoding: 8bit';

				            $messagemail='
				            <html>
				              <body leftmargin="0" topmargin="0" marginwidth="0" marginheight="0">
				                <table width="100%" style="text-align: center;">
				                  <tbody>
				                    <tr>
				                      <td>
				                        Bonjour,<br\>
				                      </td>
				                    </tr>
				                    <tr>
				                      <td>
				                         
				                      </td>
				                    </tr>
				                    <tr>
				                      <td>
				                        Merci d\'avoir choisi notre site pour faire vos achats, Votre commande partira dans les plus brefs délais.
				                      </td>
				                    </tr>
				                  </tbody>
				                </table>
				              </body>
				            </html>
				            '; 
				          mail($mail_To, "Votre commande à bien été prise en compte", $messagemail, $header);
					}else{
				 		file_put_contents('log','le paiement ne correspond a aucune offre');
				 	}			
			}else{
				// problème sur le statut de paiement
				file_put_contents('log','Il y a un problème sur le statut de paiement');
			}
			exit();		
		}
		else if (strcmp ($res, "INVALID") == 0) {
				// log for manual investigation
				// transaction invalide
			file_put_contents('log','Transaction invalide');
		}
	}
fclose ($fp);
}
?>



Je m'excuse que cela soit un peu n'importe quoi en terme de la mise en place des lignes dans mon code dans mon logiciel cela n'est pas comme ça.

Merci d'avance,
Cordialement.
Afficher la suite 

2 réponses

Messages postés
8708
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
15 octobre 2019
435
0
Merci
bonjour, as-tu une question?
Programming_018
Messages postés
71
Date d'inscription
vendredi 13 janvier 2017
Statut
Membre
Dernière intervention
19 août 2019
1 -
Et bien mon problème en étant plus bref c'est est ce que quelqu'un serait comment faire avec un notif ipn de paypal une fois que cela soit valider sa enregistre la commande dans une base de donnée mysql ?
yg_be
Messages postés
8708
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
15 octobre 2019
435 > Programming_018
Messages postés
71
Date d'inscription
vendredi 13 janvier 2017
Statut
Membre
Dernière intervention
19 août 2019
-
ce que tu as réalisé ne fonctionne pas?
il est recommandé de vérifier que chaque commande PDO fonctionne bien: https://www.commentcamarche.net/faq/46512-pdo-gerer-les-erreurs
Programming_018
Messages postés
71
Date d'inscription
vendredi 13 janvier 2017
Statut
Membre
Dernière intervention
19 août 2019
1 -
En fait mon soucis je ne pense pas qu'il provienne de l'insertion dans ma base de données car j'utilise la même chose pour l'inscription et cela fonctionne à merveille.

Ce que j'ai l'impression c'est que paypal n'accède pas à ma page pagenotif_ipn.php car j'ai même pas de log qui se fait.

Merci en tout cas de vos réponses ;

Cordialement.
jordane45
Messages postés
26513
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
15 octobre 2019
1829 > Programming_018
Messages postés
71
Date d'inscription
vendredi 13 janvier 2017
Statut
Membre
Dernière intervention
19 août 2019
-
Bonjour,
Si tu penses que c'est l'IPN qui ne fonctionne pas... applique ce qui est indiqué dans la documentation officielle de paypal.
https://developer.paypal.com/docs/classic/products/instant-payment-notification/#use-ipn-in-your-checkout-flow
Programming_018
Messages postés
71
Date d'inscription
vendredi 13 janvier 2017
Statut
Membre
Dernière intervention
19 août 2019
1 -
Bonjour,

Merci pour vos réponses.

Bonne journée,
Cordialement.
Commenter la réponse de yg_be
Messages postés
71
Date d'inscription
vendredi 13 janvier 2017
Statut
Membre
Dernière intervention
19 août 2019
1
0
Merci
Rebonjour j'ai trouvé ce qu'il se passe en réalité ce n'est même pas un problème de paypal c'est juste le formulaire en lui même qui à un soucis dès lors que je clique sur le bouton payer cela me redirige sur paypal car le lien de redirection est stocké dans la méthode action du formulaire :

<form action="https://www.paypal.com/cgi-bin/webscr" method="post" id="paypal">


Or moi je voudrais que quand je clique sur le bouton payer cela fasse deux choses ce qu'il y a dans mon panier ça le rajoute dans ma base de données mais en plus de cela que ça redirige vers paypal.


        if(isset($_POST['submit'])){
          // connexion a la base de données
          $db = new PDO("mysql:host=lien_serveur;dbname=bdd","user","mdp");
          $db->query("INSERT INTO commandes (user_id,amount,created,articles,quantiter) VALUES (".$_SESSION['user']['id'].",".$panier->total() * 1.2.",NOW(),'".$p->name."','".$panier->getQte($p->id)."')");
        }



Sachant que quand j'enlève la redirection tout s'ajoute correctement dans la base de données cela devient donc un problème du formulaire qui gère en premier l'action au lieu du php


Merci de votre réponse,
Cordialement.
jordane45
Messages postés
26513
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
15 octobre 2019
1829 -
Et bien tu fais le traitement puis la redirection vers paypal en CURL,ça devrait le faire
Programming_018
Messages postés
71
Date d'inscription
vendredi 13 janvier 2017
Statut
Membre
Dernière intervention
19 août 2019
1 -
Merci mais le soucis c'est que si le client au final ne confirme pas sur le site de paypal dans ce cas je vais me retrouver avec une commande stocké dans ma base de données sans paiement effectuée non ?

Cordialement.
Commenter la réponse de Programming_018