Bonjour,

J'ai un problème j'ai suivi le tutoriel sur le paiement avec paypal mais j'ai un soucis c'est que ça n’exécute pas les requête on dirait que ça passe pas dedans !

<?php 
//permet de traiter le retour ipn de paypal
$email_account = "SellC_1320141432_biz@gmail.com";
$req = 'cmd=_notify-validate';
foreach ($_POST as $key => $value) {
    $value = urlencode(stripslashes($value));
    $req .= "&$key=$value";
}
$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 ('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 !!
                 */
                 $db = new PDO("mysql:host=localhost;dbname=name","user","pass");
                 file_put_contents('log', print_r($_POST, true));
                 $data = $db ->query("SELECT * FROM offers WHERE price =$payment_amount LIMIT 1");
                 $d = $data->fetch(PDO::FETCH_ASSOC);
                 if(!empty($d))
                 {
                    $duration = $d'duration'];
                    $uid = $custom'user_id'];

                    // On met à jour la table user correspondant à l'utilisateur //
                    $db->query("UPDATE users SET expiration = DATE_ADD(NOW(),INTERVAL 12 MONTH) WHERE id=$uid");

                    // On sauvegarde la transaction //
                    $dp->query("INSERT INTO orders SET user_id=$uid, amount=$payment_amount, created = NOW()");          
                 }
                 else
                 {
                    // la formule ne correspond à aucune offres
                 }
                /**
                 * FIN CODE
                 */
               }
        }
        else {
                // Statut de paiement: Echec
        }
        exit();
   }
    else if (strcmp ($res, "INVALID") == 0) {
        // Transaction invalide
    }
}
fclose ($fp);
}

Formulaire :

<form action="https://www.sandbox.paypal.com/cgi-bin/webscr" method="post">
                        <select name="amount">
                        <?
                            $data = $this->connexion->query('SELECT * FROM offers');
                            while($d = $data->fetch(PDO::FETCH_ASSOC))
                            {
                                ?>
                                <option value="<?php echo $d'price']; ?>"><?php echo $d'name']; ?> - <?php echo $d'price']; ?>€</option>
                                <?              
                            }
                        ?>
                        </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="success.php" />
                        <input name="cancel_return" type="hidden" value="http://www.monsite.com/new/success.php" />
                        <input name="notify_url" type="hidden" value="http://www.monsite.com/new/ipn.php" />
                        <input name="cmd" type="hidden" value="_xclick" />
                        <input name="business" type="hidden" value="SellC_1320141432_biz@gmail.com" />
                        <input name="item_name" type="hidden" value="Formule Premium" />
                        <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'idM']; ?>" />
                        <input class="submit" type="submit" value="S'abonner" class="btn primary">
                    </form>

Dans la base pas la moindre trace d'un changement ! si vous pouviez m'aider ça serait super merci

10 réponses


cbtraize
Auteur
Réponse acceptée

J'ai trouver c'est tout bête je vous explique donc j'ai créer un compte Seller et un compte Buy mon soucis c'etais que le compte vendeur avais comme localisation United State et le Buy France du coup ça marchais pas !!!! :) si ça arrive à d'autre !

Fait comme dans le tuto met des fwrite pour écrire des fichiers pour voir si le script est bien appellé et si oui où ça plante.

cbtraize
Auteur
<?php 
//permet de traiter le retour ipn de paypal
$email_account = "SellC_1320141432_biz@gmail.com";
$req = 'cmd=_notify-validate';
foreach ($_POST as $key => $value) {
    $value = urlencode(stripslashes($value));
    $req .= "&$key=$value";
}
$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 ('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 !!
                 */
                 $db = new PDO("mysql:host=localhost;dbname=name","user","pass");
                 $data = $db->query("SELECT * FROM offers WHERE price =$payment_amount LIMIT 1");
                 $d = $data->fetch(PDO::FETCH_ASSOC);
                 if(!empty($d))
                 {
                    $duration = $d'duration'];
                    $uid = $custom'user_id'];

                    // On met à jour la table user correspondant à l'utilisateur //
                    $db->query("UPDATE users SET expiration = DATE_ADD(NOW(),INTERVAL 12 MONTH) WHERE id=$uid");

                    // On sauvegarde la transaction //
                    $dp->query("INSERT INTO orders SET user_id=$uid, amount=$payment_amount, created = NOW()");

                    $fpd = fopen('data.txt', 'w');
                    fwrite($fpd, "ça se passe bien");

                 }
                 else
                 {
                    $fpd = fopen('data.txt', 'w');
                    fwrite($fpd, "La formule ne correspond à aucune offres");
                    // la formule ne correspond à aucune offres
                 }
                /**
                 * FIN CODE
                 */
               }
        }
        else {
                $fpd = fopen('data.txt', 'w');
                fwrite($fpd, "Echec du paiement");
                // Statut de paiement: Echec
        }
        exit();
   }
    else if (strcmp ($res, "INVALID") == 0) {
        // Transaction invalide
        $fpd = fopen('data.txt', 'w');
        fwrite($fpd, "Transaction invalide");
    }
}
fclose ($fp);
}

Résultat du fwrite -> Echec du Paiement !
ça peut venir d'ou ce problème ?

Merci de ton aide !

Si je lis ton code ça veut dire que $payment_status n'est pas à "Completed"
Après il faut avoir un minimum d'autonomie et apprendre à debugger ton script parceque là tu va demander "pourquoi payment_status n'est pas à "completed".

cbtraize
Auteur

je vais voir ce que contient $payment_status

bien :)

cbtraize
Auteur

Paiement status contient pending je pense que ça doit venir du compte devellopeur non ? qu'en pense tu ?

sur paypal le status c'est marquer "Non récupéré"

J'ai rechercher sur internet mais c'est vraiment bizarre ce soucis !

Tu as bien créer un compte avec les options par défauts ?

cbtraize
Auteur

Oui pourtant et donc il y avais un compte FR et un compte US j'ai mis les deux Compte FR et ça marche ! Merci

Bonjour,

Pouvons nous mettre ce code sur le tuto du panier php

cordialement