Salut,
voilà j'ai fait un code pour faire une insertion en bdd ( paypal nous permet de retracer des historique de commande mais mois je préfère comme ça ).
Mon soucis est que en bdd je devrais avoir un trace dans ma table
orders mais aucune insertion en bdd, Le paiement est bien effectué.
J'ai mis mes tables en bas de page peut être que le problème viens de là, je pense
Voici le formulaire,
page pub.php
<?php session_start (); ?>
<?php
$db = new PDO('mysql:host=***************;dbname=**********','****','******');
$db->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_WARNING);
$req = $db->query('SELECT * FROM users WHERE id=1');
while($d = $req->fetch(PDO::FETCH_ASSOC)){
$_SESSION['User'] =$d;
}
?>
<!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>Connecté en tant que <?php echo $_SESSION['User']['name']; ?></nav>
<h1>Choisir une formule d'abonement</h1>
<form action="https://www.sandbox.paypal.com/cgi-bin/webscr" method="post">
<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.lasortie.fr/succes.php" />
<input name="cancel_return" type="hidden" value="URL_ANNULATION" />
<input name="notify_url" type="hidden" value="URL_NOTIFICATION_PAIEMENT" />
<input name="cmd" type="hidden" value="_xclick" />
<input name="business" type="hidden" value="[email protected]" />
<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=1" />
<input type="submit" value="S'abonner" class="btn primary">
</form>
</div>
</body>
[javascript]<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>[/javascript]
Page
ipn.php
<?php
//permet de traiter le retour ipn de paypal
$email_account = "mon_adresse_@";
$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: 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);
$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'];
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);
//On sauvegarde la commande
$db->query("INSERT INTO orders SET user_id=$uid, amount=$payment_amount, created=NOW(), datas='$data'");
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);
}
MES TABLES DANS PHP MY ADMIN
Voiçi ma table orders:
1 id int(11) UNSIGNED Non Aucune AUTO_INCREMENT
2 id_user int(11) Oui NULL
3 ammount int(11) Oui NULL
4 created datetime Oui NULL
5 datas text latin1_swedish_ci Oui NULL
Voiçi ma table offers
1 id int(11) Non Aucune
2 name varchar(255) latin1_swedish_ci Non Aucune
3 duration text latin1_swedish_ci Non Aucune
4 price text latin1_swedish_ci Non Aucune
Voiçi ma table users
1 id int(11) Non Aucune AUTO_INCREMENT
2 name varchar(255) latin1_swedish_ci Oui NULL
3 expiration datetime Oui NULL
Salut,
voilà j'ai fait un code pour faire une insertion en bdd ( paypal nous permet de retracer des historique de commande mais mois je préfère comme ça ).
Mon soucis est que en bdd je devrais avoir un trace dans ma table[b] orders[/b] mais aucune insertion en bdd, Le paiement est bien effectué.
J'ai mis mes tables en bas de page peut être que le problème viens de là, je pense
Voici le formulaire, [b]page pub.php[/b]
[php]<?php session_start (); ?>
<?php
$db = new PDO('mysql:host=***************;dbname=**********','****','******');
$db->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_WARNING);
$req = $db->query('SELECT * FROM users WHERE id=1');
while($d = $req->fetch(PDO::FETCH_ASSOC)){
$_SESSION['User'] =$d;
}
?>[/php]
[html]
<!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>Connecté en tant que <?php echo $_SESSION['User']['name']; ?></nav>
<h1>Choisir une formule d'abonement</h1>
<form action="https://www.sandbox.paypal.com/cgi-bin/webscr" method="post">
<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.lasortie.fr/succes.php" />
<input name="cancel_return" type="hidden" value="URL_ANNULATION" />
<input name="notify_url" type="hidden" value="URL_NOTIFICATION_PAIEMENT" />
<input name="cmd" type="hidden" value="_xclick" />
<input name="business" type="hidden" value="
[email protected]" />
<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=1" />
<input type="submit" value="S'abonner" class="btn primary">
</form>
</div>
</body>[/html]
[javascript]<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>[/javascript]
Page[b] ipn.php[/b]
[php]<?php
//permet de traiter le retour ipn de paypal
$email_account = "mon_adresse_@";
$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: 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);
$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'];
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);
//On sauvegarde la commande
$db->query("INSERT INTO orders SET user_id=$uid, amount=$payment_amount, created=NOW(), datas='$data'");
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);
} [/php]
[u]MES TABLES DANS PHP MY ADMIN[/u]
[b]Voiçi ma table orders:[/b]
1 id int(11) UNSIGNED Non Aucune AUTO_INCREMENT
2 id_user int(11) Oui NULL
3 ammount int(11) Oui NULL
4 created datetime Oui NULL
5 datas text latin1_swedish_ci Oui NULL
[b]Voiçi ma table offers[/b]
1 id int(11) Non Aucune
2 name varchar(255) latin1_swedish_ci Non Aucune
3 duration text latin1_swedish_ci Non Aucune
4 price text latin1_swedish_ci Non Aucune
[b]Voiçi ma table users[/b]
1 id int(11) Non Aucune AUTO_INCREMENT
2 name varchar(255) latin1_swedish_ci Oui NULL
3 expiration datetime Oui NULL