Insertion BDD formulaire + paypal

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 : Insertion BDD formulaire + paypal

Re: Insertion BDD formulaire + paypal

par cindy381 » 10 juil. 2014, 17:24

Salut tt le monde bon j'ai un peu avancé et enfin trouvé mon problème lais je ne sais pas comment le solutionner.....
Mon problème vien du début du formulaire

<form action="https://www.sandbox.paypal.com/cgi-bin/webscr" method="post" enctype="multipart/form-data">

Je suis obligé de passé par cette action pour pouvoir faire l'interaction avec paypal mais en faisant ça je ne reçois pas en bbd les renseignement demandé (titre,ville,rue,codepostal,téléphone,photo)
Si je met dans action "ma_pub.php" ( qui est le nom de ma page ) je les recois en bdd mais du coup aucune transaction n'a était faite avec paypal..... plutôt ennuyeux :(

Je vous fait par du code complet
formulaire.php
<?php session_start();?>
<?php $page = "profil";?>
<!-------------- BDD ACCES PAGE + ANNONCES ---------------->


<?php

try
{
$bdd = new PDO('mysql:*********;dbname=******','***********','*********);
$bdd->exec('SET NAMES utf8');

}
 
catch(Exception $e)
{
        echo 'Une erreur est survenue !';
        die();
}



// Même chose que error_reporting(E_ALL);
ini_set('error_reporting', E_ALL);


?>


<?php
   
   $erreurs = array();   //tableau contenant des messages d'erreurs

 /* traitement des erreurs
 * tous les champs du formulaire non remplis seront placés
 * dans le tableau des erreurs $erreurs.A la fin du traitement
 * ce tableau sera soit vide, auquel cas on exécute la requête insert
 * pour inserer les données en bd, soit ce tableau n'est pas vide(champs non remplis) on invite
 * l'utilisateur à remplir tous les champs

 */
  if(!empty($_POST)) {//soumission du formulaire
   //Verification titre
  if(empty($_POST['titre']))
  {

   $erreurs['titre'] = 'Renseigner un nom de sortie';
  }
 
   //Verification ville
  if(empty($_POST['city']))
  {

    $erreurs['city'] = 'Renseigner une ville';
  }
 
   //Verification code postal
  if(empty($_POST['postcode']))
  {

    $erreurs['postcode'] = 'Renseigner un code postal';
  }
 

  
  /////////
  
  
// Testons si le fichier a bien été envoyé et s'il n'y a pas d'erreur
  

$dossier = 'img/annonce/';
$fichier = basename($_FILES['photo']['name']);
$taille_maxi = 1000000;
$taille = filesize($_FILES['photo']['tmp_name']);
$extensions = array('.png', '.gif', '.jpg', '.jpeg');
$extension = strrchr($_FILES['photo']['name'], '.'); 
//Début des vérifications de sécurité...
if(!in_array($extension, $extensions)) //Si l'extension n'est pas dans le tableau
{
     $erreur = 'Veuillez vérifier que le format de votre photo soit de type png, gif, jpg, jpeg, ';
}
if($taille>$taille_maxi)
{
     $erreur = 'Le fichier est trop gros...';
}
if(!isset($erreur)) //S'il n'y a pas d'erreur, on upload
{
     //On formate le nom du fichier ici...
     $fichier = strtr($fichier, 
          'ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðòóôõöùúûüýÿ', 
          'AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy');
     $fichier = preg_replace('/([^.a-z0-9]+)/i', '-', $fichier);
     if(move_uploaded_file($_FILES['photo']['tmp_name'], $dossier . $fichier)) //Si la fonction renvoie TRUE, c'est que ça a fonctionné...
     {
          echo 'Téléchargement effectué avec succès !';
     }
     else //Sinon (la fonction renvoie FALSE).
     {
          echo 'Echec du téléchargement !';
     }
}
else
{
     echo $erreur;
}


  
//fin traitement des erreurs


//s'il y a  problème, procède au debogage en decommentant les 2 lignes çi-dessus:
//var_dump($_POST);
//die('fin debogage');



//le tableau d'erreurs est vide alors on insère les données
if( empty( $erreurs)  ){




   $req = $bdd->prepare('INSERT INTO orders ( photo, titre, phone, street, postcode, city)
 
  VALUES (:photo, :titre, :phone, :street, :postcode, :city)');
   
   
   
     $retour= $req->execute(array(
          'photo'=>$_FILES['photo']['name'],
          'titre'=>$_POST['titre'],
          'phone'=>$_POST['phone'],
          'street'=>$_POST['street'],
          'postcode'=>$_POST['postcode'],
          'city'=>$_POST['city']
          
    ));
if( $retour ===false) echo "Problème lors de l'insertion";
       
}else{//le tableau ne contient
 echo "<p> renseignez les champs vides</p>";
}

}//fin de la soumission du formulaire


?>

<form action="https://www.sandbox.paypal.com/cgi-bin/webscr" method="post" enctype="multipart/form-data">

   

     <!-- titre de la sortie -->
     <label>titre :</label>
     <input class="form-control" type="text" name="titre" value="<?php if(isset($_POST['titre'])) echo $_POST['titre'];?>" />
     <div class="error"><?php if(isset($erreurs['titre'])) echo $erreurs['titre'];?></div>
 
     
      <!-- Ville de la sortie -->
      <label>Ville *</label>
      <input class="form-control" type="text" name="city" value="<?php if(isset($_POST['city'])) echo $_POST['city'];?>" />
      <div class="error"><?php if(isset($erreurs['city'])) echo $erreurs['city'];?></div>
     
     
       <!-- Ville de la sortie -->
      <label>Rue</label>
      <input class="form-control" type="text" name="street" value="<?php if(isset($_POST['street'])) echo $_POST['street'];?>" />
      <div class="error"><?php if(isset($erreurs['street'])) echo $erreurs['street'];?></div>
     
      <!-- Code postal de la sortie -->
      <label>Code postal *</label>
      <input class="form-control" type="text" name="postcode" value="<?php if(isset($_POST['postcode'])) echo $_POST['postcode'];?>" />
      <div class="error"><?php if(isset($erreurs['postcode'])) echo $erreurs['postcode'];?></div>
     

       <label>Télephone</label>
      <input class="form-control" type="text" name="phone" value="<?php if(isset($_POST['phone'])) echo $_POST['phone'];?>" />
       <div class="error"><?php if(isset($erreurs['phone'])) echo $erreurs['phone'];?></div>
             

      <label>Photo</label>
      <input  name="photo" type="file"/> 

<select name="amount">
<?php
$req = $bdd->query('SELECT * FROM offers');
while($d = $req->fetch(PDO::FETCH_ASSOC)){
        ?>
    <option value="<?php echo $d['price']; ?>"><?php echo $d['name'];?> -<?php echo $d['price'];?> Euros</option>
        <?php
}
?>
</select>

<input name="currency_code" type="hidden" value="EUR" />
<input name="shipping" type="hidden" value="0.00" />
<input name="tax" type="hidden" value="0.00" />
<input name="return" type="hidden" value="http://www.*******/succes.php" />
<input name="cancel_return" type="hidden" value="URL_ANNULATION" />
<input name="notify_url" type="hidden" value="http://www.******/ipn.php" />
<input name="cmd" type="hidden" value="_xclick" />
<input name="business" type="hidden" value="*********" />
<input name="item_name" type="hidden" value="offre publicitaire" />
<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 type="submit" value="S'abonner" class="btn primary">
    </form>

Page ipn.php
<?php session_start (); ?>

<?php echo var_dump($_SESSION); ?>
<?php
//permet de traiter le retour ipn de paypal
$email_account = "**********";
$req = 'cmd=_notify-validate';
 
foreach ($_POST as $key => $value) {
$value = urlencode(stripslashes($value));
$req .= "&$key=$value";
}
 // renvoyer au systeme 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);
$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'];
$first_name = $_POST['first_name'];

$receiver_email = $_POST['receiver_email'];
$payer_email = $_POST['payer_email'];
parse_str($_POST['custom'],$custom);



if (!$fp) {
 
} else {
fputs ($fp, $header . $req);
while (!feof($fp)) {
$res = fgets ($fp, 1024);
if (strcmp ($res, "VERIFIED") == 0) {
// vérifier que payment_status a la valeur Completed
if ( $payment_status == "Completed") {
if ( $email_account == $receiver_email) {
/**
* C'EST LA QUE TOUT SE PASSE
* PS : tjrs penser à vérifier la somme !!
*/
 
 file_put_contents('log', print_r($_POST,true));
 
$db = new PDO('mysql:host=*************;dbname=***********','***********','******');
$req = $db->query('SELECT * FROM offers WHERE price='.$payment_amount.' LIMIT 1');
$d = $req->fetch(PDO::FETCH_ASSOC);
if(!empty($d)){
	
	$duration = $d['duration'];
	$uid = $custom['user_id'];
	$data = serialize($_POST);
	
	//On met à jour la date d'expiration
	$db->query('UPDATE users SET expiration = DATE_ADD(NOW(), INTERVAL '.$duration.' MONTH) WHERE id = '.$uid);
	


	
	//En mettant ici cette requete ça ne marche pas je ne recois pas en bdd : titre,phone,postcode,city,street mais je recois le reste
	$db->query("INSERT INTO orders (user_id,amount,created,datas,txn_id,titre,phone,postcode,city,street) VALUES(".$uid.",".$payment_amount.",NOW(),'".$data."','".$txn_id."','".$_SESSION['titre']."','".$_SESSION['phone']."','".$_SESSION['postcode']."','".$_SESSION['city']."','".$_SESSION['street']."')");
	
	file_put_contents('log','Le paiement à bien était confirmé');
}else{
	file_put_contents('log','Le paiement ne correspond à aucune offre');
}

/**
* FIN CODE
*/
}
}
else {
// Statut de paiement: Echec
}
exit();
}
else if (strcmp ($res, "INVALID") == 0) {
// Transaction invalide
}
}
fclose ($fp);
}	

Re: Insertion BDD formulaire + paypal

par damien_55 » 10 juil. 2014, 00:02

Je t'ai répondu en mp pour skype.

Dans ta session tu as plein de résultats mais il en manque et tu 2 fois ville par exemple.

C'est pas terrible ça. Mais bon.

Re: Insertion BDD formulaire + paypal

par cindy381 » 09 juil. 2014, 23:55

Les SESSIONS affiche

array(5) { ["panier"]=> array(0) { } ["user"]=> array(12) { ["id"]=> string(1) "6" ["name"]=> NULL ["expiration"]=> NULL ["nom"]=> string(6) "azerty" ["password"]=> string(40) "5aea35f2b83b3b68f81ba1b6216e7bf919fb825a" ["email"]=> string(22) "[email protected]" ["adresse"]=> string(4) "zaza" ["ville"]=> string(5) "zazaz" ["codepostale"]=> string(5) "38500" ["token"]=> string(40) "8a672661e29e560f52d83d375e767fc2d6ac1f69" ["active"]=> string(1) "1" ["role"]=> NULL } ["messasge"]=> string(44) "Bienvenue , Vous êtes maintenant conncté ." ["User"]=> array(12) { ["id"]=> string(1) "1" ["name"]=> string(9) "grafikart" ["expiration"]=> string(19) "2014-10-09 19:35:52" ["nom"]=> string(0) "" ["password"]=> string(0) "" ["email"]=> string(0) "" ["adresse"]=> string(0) "" ["ville"]=> string(0) "" ["codepostale"]=> string(1) "0" ["token"]=> string(0) "" ["active"]=> string(1) "0" ["role"]=> NULL } ["erruer"]=> string(39) " Utilisateur inconnu dans notre base !." }

Ca devient compliqué ....
Aurais tu skype stp ?

Re: Insertion BDD formulaire + paypal

par damien_55 » 09 juil. 2014, 23:50

Tu as bien activer les sessions sur tes pages:

session_start(); en haut de pages en premier.

tu le mets sur ta page formualire et sur ta page ip.php.

Pour vérifier tu fais par exemple sur ta page ip.php

echo var_dump($_SESSION);

Tu regardes ce qui s'afffiche. Si des données s'affiche c'est que cela fonctionne si il en manque revérifie ton code quand tu rentre les valeurs. Logiquement cela doit fonctionner.

Re: Insertion BDD formulaire + paypal

par cindy381 » 09 juil. 2014, 23:44

Rien à faire ça ne marches pas....

Re: Insertion BDD formulaire + paypal

par damien_55 » 09 juil. 2014, 22:43

Passes les données envoyé en variables de session (il faut que les sessions soit activées sur tes pages)

Sur le formulaire:

$_SESSION['photo] = $_FILES['photo'];
$_SESSION['titre'] = $_POST['titre'];
$_SESSION['phone] = $_POST['phone'];
$_SESSION['postcode'] = $_POST['postcode'];
$_SESSION['street'] = $_POST['street'];
$_SESSION['street'] = $_POST['street'];

Et sur ta page ip.php

Si la transaction est valide

Insert .... '".mysql_real_escape_string($_SESSION['street'])."' etc....

P.S: protege tes injections sql mysql_real_escape_string, les pirates passent par là. D'autant plus que tu as des achats et paiements sur ton site.

Re: Insertion BDD formulaire + paypal

par cindy381 » 09 juil. 2014, 22:34

Le formulaire marche c'est sur je l'utilise sur d'autre projets
mais je ne vois pas comment faire pour inserer en bdd maitenant

Sinan oui tu a bien compris mon but
formulaire.php -> ip.php -> bdd

Un exemple pour la solution stp ?

Re: Insertion BDD formulaire + paypal

par damien_55 » 09 juil. 2014, 22:24

sur ta page page ip.php

Fais un var_dump($_POST) ou print($_POST) et tu verras bien ce qui il y a dans ton POST si les informations que tu veux ni sont pas c'est quelles ne sont pas postées au départ donc sur la page formulaire.

Si je suis bien ce que tu veux faire c'est:

Formulaire.php -> ip.php -> bdd

Je ne sais plus si tu peux ajouter des variables a partir de ton formulaire vers paypal et les recuperer sur la page de retour de paypal.

A noter en passer autant, a confirmer dans la doc paypal mais peut etre qu'il t'autorise seulement a passer un ou deux parametres supplémentaires.

1/ Si c'est le cas, il te faut concatener ta chaine en ajoutant par exemple un caracteres specifiques entre tes valeurs et faire un explode à la sortie sur la variable supplémentaire à paypal.

Ou alors stocker tes valeurs dans une variable ou des varibles de sessions et les recupéré si la transaction est validée.

Re: Insertion BDD formulaire + paypal

par cindy381 » 09 juil. 2014, 22:06

Ma page ip.php
J'ai mis toute la page dessous mais ds le code on y verra ce que j'ai fait c'est à dire:
Mais je ne recois pas en bdd photo, titre ,phone,postcode ,city ,street
// ON Y MET LE PAQUET mais ça marche pas ..................................................
$photo = $_FILES['photo'];
$titre = $_POST['titre'];
$phone = $_POST['phone'];
$postcode = $_POST['postcode'];
$city = $_POST['city'];
$street = $_POST['street'];
//La j'aimerais récupérer en plus donc photo, titre ,phone,postcode ,city ,street mais je n'y arrive pas			
							$db->query("INSERT INTO orders (user_id,amount,created,datas,txn_id,photo,titre,phone,postcode,city,street) VALUES(".$uid.",".$payment_amount.",NOW(),'".$data."','".$txn_id."','".$photo."','".$titre."','".$phone."','".$postcode."','".$city."','".$street."')");
<?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=*********;dbname=***********","**************","********************");
         	$nbreponse = $db->query("SELECT COUNT(*) FROM orders WHERE txn_id=".$txn_id)->fetchColumn();

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

$emailto = $_POST['payer_email'];;
$emailfrom = "[email protected]";
$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 = "adressemail";

$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'];

// ON Y MET LE PAQUET mais ça marche pas ..................................................
$photo = $_FILES['photo'];
$titre = $_POST['titre'];
$phone = $_POST['phone'];
$postcode = $_POST['postcode'];
$city = $_POST['city'];
$street = $_POST['street'];

//	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=*************;dbname=*****************','**************','*************');
							$req = $db->query('SELECT * FROM offers WHERE price='.$payment_amount.' LIMIT 1');
							$d = $req->fetch(PDO::FETCH_ASSOC);
							if(!empty($d)){
								
								$duration = $d['duration'];
								$uid = $custom['user_id'];
								$data = serialize($_POST);
								
								//On met à jour la date d'expiration
							$db->query('UPDATE users SET expiration = DATE_ADD(NOW(), INTERVAL '.$duration.' MONTH) WHERE id = '.$uid);
							
							//La j'aimerais récupérer en plus donc photo, titre ,phone,postcode ,city ,street mais je n'y arrive pas			
							$db->query("INSERT INTO orders (user_id,amount,created,datas,txn_id,photo,titre,phone,postcode,city,street) VALUES(".$uid.",".$payment_amount.",NOW(),'".$data."','".$txn_id."','".$photo."','".$titre."','".$phone."','".$postcode."','".$city."','".$street."')");

							file_put_contents('log','Le paiement à bien était confirmé');
							}else{
								file_put_contents('log','Le paiement ne correspond à aucune offre');
							}

							// Envoi du mail
							 $mail_To = $emailto;
							 $mail_Subject = "Votre commande sur notre boutique";
							 $entetes  = "From: ".$emailfrom."\n"; 
							 $entetes .= "Reply-To: ".$emailfrom."\n";
							 $entetes .= "MIME-Version: 1.0 \n";
							 $entetes .= "Content-Transfer-Encoding: 8bit \n";
							 $entetes .= "Content-type: text/plain; charset=".$charset."\n";
							
							 

							 $mail_Body = "Bonjour,<br\>Merci d'avoir choisi notre site pour faire vos achats, Votre commande partira dans les plus brèfs délais.";
							// $mail_Body .= "\n";
							// $mail_Body .= "\n---------------------------------------------------------------------------------";						
							// $mail_Body .= "\n" . "Nombre d'objets dans le panier: " . $num_cart_items;
							// if (strlen($item_name1) > 1) { $mail_Body .= "\n\n" . "1er objet en commande: " . $item_name1 . "\n" . "Numéro de l'objet 1: " . $item_number1 . " - " . "Quantité: " . $quantity1; }
							// if (strlen($item_name2) > 1) { $mail_Body .= "\n\n" . "2e objet en commande: " . $item_name2 . "\n" . "Numéro de l'objet 2: " . $item_number2 . " - " . "Quantité: " . $quantity2; }
							// if (strlen($item_name3) > 1) { $mail_Body .= "\n\n" . "3e objet en commande: " . $item_name3 . "\n" . "Numéro de l'objet 3: " . $item_number3 . " - " . "Quantité: " . $quantity3; }
							// if (strlen($item_name4) > 1) { $mail_Body .= "\n\n" . "4e objet en commande: " . $item_name4 . "\n" . "Numéro de l'objet 4: " . $item_number4 . " - " . "Quantité: " . $quantity4; }
							// if (strlen($item_name5) > 1) { $mail_Body .= "\n\n" . "5e objet en commande: " . $item_name5 . "\n" . "Numéro de l'objet 5: " . $item_number5 . " - " . "Quantité: " . $quantity5; }
							// if (strlen($item_name) > 1) {
							// $mail_Body .= "\n" . "Objet en commande: " . $item_name;
							// $mail_Body .= "\n" . "Numéro de l'objet: " . $item_number;
							// $mail_Body .= "\n" . "Quantité: " . $quantity;
							// }
							// $mail_Body .= "\n";

							// $mail_Body .= "\n---------------------------------------------------------------------------------";	
							// $mail_Body .= "\n";
							// $mail_Body .= "Equipe de ....";
							
							 mail($mail_To, $mail_Subject, $mail_Body, $entetes);
							// }

					 	// }else{
					 	// 	file_put_contents('log','Transaction déja éffectué ');
					 	// }

					}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);
}
?>

Re: Insertion BDD formulaire + paypal

par damien_55 » 09 juil. 2014, 21:42

Re,

Dans ton fichier page ip.php, ta variable:
$photo = $_FILES['photo'];
n'est pas défini.

Les autres variables proviennent sont bien défini et transmises par POST mais pas $photo donc en fait $photo est vide.
$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'];
Donc ton insert sur le champ photo, la valeur est vide.

Tu devrais recupérer la valeur dans ton fichiers page formulaire:

Exemple:
$dossier = 'img/annonce/'.$fichier;
et transmettre aussi cette valeur avec les autres POST. et ainsi tu recuperes la valeur de ton champ photo.

Insertion BDD formulaire + paypal

par cindy381 » 09 juil. 2014, 21:10

J'aimerais récupérer en bdd photo, titre,phone,postcode et street mais je ne vois pas trop comment ....
Vous retrouvez la req que j'ai essayer de faire plus bas dans mon code mais la voici quand même:
Elle marche mais par exemple je ne récupère par en bdd la variable photo mais le reste oui ....
//La j'aimerais récupérer en plus donc photo, titre ,phone,postcode ,city ,street mais je n'y arrive pas			
							$db->query("INSERT INTO orders (user_id,amount,created,datas,txn_id,photo) VALUES(".$uid.",".$payment_amount.",NOW(),'".$data."','".$txn_id."','".$photo."')");
Page formulaire.php
<?php session_start (); ?>

<?php

try
{
$bdd = new PDO('mysql:host=**********;dbname=***********','*************','**************');
$bdd->exec('SET NAMES utf8');

}
 
catch(Exception $e)
{
        echo 'Une erreur est survenue !';
        die();
}



// Même chose que error_reporting(E_ALL);
ini_set('error_reporting', E_ALL);


?>
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Document sans titre</title>
<link rel="stylesheet" href="css/bootstrap.css">
<link rel="stylesheet" href="css/bootstrap.min.css">
<link rel="stylesheet" href="css/font-awesome.min.css">
<link rel="Stylesheet" type="text/css" href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.9/themes/base/jquery-ui.css" />
</head>

<body>

<div class="container">

<nav><?php if (isset($_SESSION['user'])): ?>
            <li><a href="profil.php" title="S'inscrire">Bienvenue,<?php echo $_SESSION['user']['email']; ?></a></li>
            <li><a href="login.php?logout" title="Se connecter">Logout</a></li>
<?php endif ?>
<h1>Choisir une formule d'abonement</h1>









<?php
   
   $erreurs = array();   //tableau contenant des messages d'erreurs

 /* traitement des erreurs
 * tous les champs du formulaire non remplis seront placés
 * dans le tableau des erreurs $erreurs.A la fin du traitement
 * ce tableau sera soit vide, auquel cas on exécute la requête insert
 * pour inserer les données en bd, soit ce tableau n'est pas vide(champs non remplis) on invite
 * l'utilisateur à remplir tous les champs

 */
  if(!empty($_POST)) {//soumission du formulaire
   //Verification titre
  if(empty($_POST['titre']))
  {

   $erreurs['titre'] = 'Renseigner un nom de sortie';
  }
 
   //Verification ville
  if(empty($_POST['city']))
  {

    $erreurs['city'] = 'Renseigner une ville';
  }
 
   //Verification code postal
  if(empty($_POST['postcode']))
  {

    $erreurs['postcode'] = 'Renseigner un code postal';
  }
 

  //Verification description
  if(empty($_POST['email']))
  {
    $erreurs['email'] = 'verifier';
  }

  
  /////////
  
  
// Testons si le fichier a bien été envoyé et s'il n'y a pas d'erreur
  

$dossier = 'img/annonce/';
$fichier = basename($_FILES['photo']['name']);
$taille_maxi = 1000000;
$taille = filesize($_FILES['photo']['tmp_name']);
$extensions = array('.png', '.gif', '.jpg', '.jpeg');
$extension = strrchr($_FILES['photo']['name'], '.'); 
//Début des vérifications de sécurité...
if(!in_array($extension, $extensions)) //Si l'extension n'est pas dans le tableau
{
     $erreur = 'Veuillez vérifier que le format de votre photo soit de type png, gif, jpg, jpeg, ';
}
if($taille>$taille_maxi)
{
     $erreur = 'Le fichier est trop gros...';
}
if(!isset($erreur)) //S'il n'y a pas d'erreur, on upload
{
     //On formate le nom du fichier ici...
     $fichier = strtr($fichier, 
          'ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðòóôõöùúûüýÿ', 
          'AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy');
     $fichier = preg_replace('/([^.a-z0-9]+)/i', '-', $fichier);
     if(move_uploaded_file($_FILES['photo']['tmp_name'], $dossier . $fichier)) //Si la fonction renvoie TRUE, c'est que ça a fonctionné...
     {
          echo 'Téléchargement effectué avec succès !';
     }
     else //Sinon (la fonction renvoie FALSE).
     {
          echo 'Echec du téléchargement !';
     }
}
else
{
     echo $erreur;
}


  
//fin traitement des erreurs


//s'il y a  problème, procède au debogage en decommentant les 2 lignes çi-dessus:
//var_dump($_POST);
//die('fin debogage');



//le tableau d'erreurs est vide alors on insère les données
if( empty( $erreurs)  ){


   $req = $bdd->prepare('INSERT INTO orders (  photo, titre, phone, street, postcode, city)
 
  VALUES (:photo, :titre, :phone, :street, :postcode, :city, )');
   
   
   
     $retour= $req->execute(array(
          'photo'=>$_FILES['photo']['name'],
          'titre'=>$_POST['titre'],
          'phone'=>$_POST['phone'],
          'street'=>$_POST['street'],
          'postcode'=>$_POST['postcode'],
          'city'=>$_POST['city']
    ));
if( $retour ===false) echo "Problème lors de l'insertion";
       
}else{//le tableau ne contient
 echo "<p> renseignez les champs vides</p>";
}

}//fin de la soumission du formulaire


?>





<form action="https://www.sandbox.paypal.com/cgi-bin/webscr" method="post" enctype="multipart/form-data">

   

     <!-- titre de la sortie -->
     <label>titre :</label>
     <input class="form-control" type="text" name="titre" value="<?php if(isset($_POST['titre'])) echo $_POST['titre'];?>" />
     <div class="error"><?php if(isset($erreurs['titre'])) echo $erreurs['titre'];?></div>
 
     
      <!-- Ville de la sortie -->
      <label>Ville *</label>
      <input class="form-control" type="text" name="city" value="<?php if(isset($_POST['city'])) echo $_POST['city'];?>" />
      <div class="error"><?php if(isset($erreurs['city'])) echo $erreurs['city'];?></div>
     
     
       <!-- Ville de la sortie -->
      <label>Rue</label>
      <input class="form-control" type="text" name="street" value="<?php if(isset($_POST['street'])) echo $_POST['street'];?>" />
      <div class="error"><?php if(isset($erreurs['street'])) echo $erreurs['street'];?></div>
     
      <!-- Code postal de la sortie -->
      <label>Code postal *</label>
      <input class="form-control" type="text" name="postcode" value="<?php if(isset($_POST['postcode'])) echo $_POST['postcode'];?>" />
      <div class="error"><?php if(isset($erreurs['postcode'])) echo $erreurs['postcode'];?></div>
     

       <label>Télephone</label>
      <input class="form-control" type="text" name="phone" value="<?php if(isset($_POST['phone'])) echo $_POST['phone'];?>" />
       <div class="error"><?php if(isset($erreurs['phone'])) echo $erreurs['phone'];?></div>
             
      <label>Photo</label>
      <input  name="photo" type="file"/> 


<select name="amount">
<?php
$req = $db->query('SELECT * FROM offers');
while($d = $req->fetch(PDO::FETCH_ASSOC)){
	?>
    <option value="<?php echo $d['price']; ?>"><?php echo $d['name'];?> -<?php echo $d['price'];?> Euros</option>
	<?php
}
?>
</select>
<input name="currency_code" type="hidden" value="EUR" />
<input name="shipping" type="hidden" value="0.00" />
<input name="tax" type="hidden" value="0.00" />
<input name="return" type="hidden" value="http://www.url/succes.php" />
<input name="cancel_return" type="hidden" value="URL_ANNULATION" />
<input name="notify_url" type="hidden" value="http://www.url/ipn.php" />
<input name="cmd" type="hidden" value="_xclick" />
<input name="business" type="hidden" value="l'adresse_vendeur" />
<input name="item_name" type="hidden" value="offre publicitaire" />
<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 type="submit" value="S'abonner" class="btn primary">
</form>

</div>



</body>
<script src="js/jquery.js"></script>
<script type="text/javascript" src="js/bootstrap.js"></script>
<script type="text/javascript" src="js/bootstrap.min.js"></script>
</html>
Page ip.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=*****;dbname=******","********","**************");
         	$nbreponse = $db->query("SELECT COUNT(*) FROM orders WHERE txn_id=".$txn_id)->fetchColumn();

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

$emailto = $_POST['payer_email'];;
$emailfrom = "[email protected]";
$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 = "[email protected]";

$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: http://www.sandbox.paypal.com\r\n";  // http://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'];

// ON Y MET LE PAQUET mais ça marche pas ...
$photo = $_FILES['photo'];

//	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=*******;dbname=**********','**************','***************');
							$req = $db->query('SELECT * FROM offers WHERE price='.$payment_amount.' LIMIT 1');
							$d = $req->fetch(PDO::FETCH_ASSOC);
							if(!empty($d)){
								
								$duration = $d['duration'];
								$uid = $custom['user_id'];
								$data = serialize($_POST);
								
								//On met à jour la date d'expiration
							$db->query('UPDATE users SET expiration = DATE_ADD(NOW(), INTERVAL '.$duration.' MONTH) WHERE id = '.$uid);
							
							//La j'aimerais récupérer en plus donc photo, titre ,phone,postcode ,city ,street mais je n'y arrive pas			
							$db->query("INSERT INTO orders (user_id,amount,created,datas,txn_id,photo) VALUES(".$uid.",".$payment_amount.",NOW(),'".$data."','".$txn_id."','".$photo."')");

							file_put_contents('log','Le paiement à bien était confirmé');
							}else{
								file_put_contents('log','Le paiement ne correspond à aucune offre');
							}

							// Envoi du mail
							 $mail_To = $emailto;
							 $mail_Subject = "Votre commande sur notre boutique";
							 $entetes  = "From: ".$emailfrom."\n"; 
							 $entetes .= "Reply-To: ".$emailfrom."\n";
							 $entetes .= "MIME-Version: 1.0 \n";
							 $entetes .= "Content-Transfer-Encoding: 8bit \n";
							 $entetes .= "Content-type: text/plain; charset=".$charset."\n";
							
							 

							 $mail_Body = "Bonjour,<br\>Merci d'avoir choisi notre site pour faire vos achats, Votre commande partira dans les plus brèfs délais.";
							// $mail_Body .= "\n";
							// $mail_Body .= "\n---------------------------------------------------------------------------------";						
							// $mail_Body .= "\n" . "Nombre d'objets dans le panier: " . $num_cart_items;
							// if (strlen($item_name1) > 1) { $mail_Body .= "\n\n" . "1er objet en commande: " . $item_name1 . "\n" . "Numéro de l'objet 1: " . $item_number1 . " - " . "Quantité: " . $quantity1; }
							// if (strlen($item_name2) > 1) { $mail_Body .= "\n\n" . "2e objet en commande: " . $item_name2 . "\n" . "Numéro de l'objet 2: " . $item_number2 . " - " . "Quantité: " . $quantity2; }
							// if (strlen($item_name3) > 1) { $mail_Body .= "\n\n" . "3e objet en commande: " . $item_name3 . "\n" . "Numéro de l'objet 3: " . $item_number3 . " - " . "Quantité: " . $quantity3; }
							// if (strlen($item_name4) > 1) { $mail_Body .= "\n\n" . "4e objet en commande: " . $item_name4 . "\n" . "Numéro de l'objet 4: " . $item_number4 . " - " . "Quantité: " . $quantity4; }
							// if (strlen($item_name5) > 1) { $mail_Body .= "\n\n" . "5e objet en commande: " . $item_name5 . "\n" . "Numéro de l'objet 5: " . $item_number5 . " - " . "Quantité: " . $quantity5; }
							// if (strlen($item_name) > 1) {
							// $mail_Body .= "\n" . "Objet en commande: " . $item_name;
							// $mail_Body .= "\n" . "Numéro de l'objet: " . $item_number;
							// $mail_Body .= "\n" . "Quantité: " . $quantity;
							// }
							// $mail_Body .= "\n";

							// $mail_Body .= "\n---------------------------------------------------------------------------------";	
							// $mail_Body .= "\n";
							// $mail_Body .= "Equipe de ....";
							
							 mail($mail_To, $mail_Subject, $mail_Body, $entetes);
							// }

					 	// }else{
					 	// 	file_put_contents('log','Transaction déja éffectué ');
					 	// }

					}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);
}
?>