Bonjour,

Voici mon problème, lorsque j'achète avec la sandbox paypal tout ce passe bien (les comptes sont bien débités et crédités), j'ai bien les infos qui sont envoyés sur ma page IPN que j'ai défini dans les préférences du seller mais le soucis c'est qu'il me marque a chaque fois dans le fichier de log "transaction invalide"...

Je fais mes test à partir d'un mutualisé OVH perso, je ne sais pas si le problème peux venir de là ?

Voici le code que j'emploie pour mon ipn.php:

IPN.php:

<?php 
if(isset($_POST)){
    file_put_contents('logPOST.txt', print_r($_POST,true));
}
//permet de traiter le retour ipn de paypal
$email_account = "sell_1318248819_biz@skynet.be";
$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); // je vais essayer de tester avec le port 80 on ne sait jamais
$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) {
    file_put_contents('log.txt', 'Erreur de socket ssl');
} 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) {
                    if( $mc_currency == "EUR" ){
                        /**
                         * C'EST LA QUE TOUT SE PASSE
                         * PS : tjrs penser à vérifier la somme !!
                         */
                        file_put_contents('log.txt', print_r($_POST,true));
                        $dns = 'mysql:host=XXX;dbname=XXX';
                        $utilisateur = 'XXXX';
                        $motDePasse = 'XXXX';
                        $db = new PDO( $dns, $utilisateur, $motDePasse );
                        $req = $db->query('SELECT * FROM offers WHERE price = '.$payment_amount.' LIMIT 1');
                        $d = $req->fetch(PDO::FETCH_ASSOC);
                        if(!empty($d)){
                            $uid=$custom'id'];
                            $data=serialize($_POST);
                            $req = $db->query('SELECT * FROM iConomy WHERE id = '.$custom'iConomy_id'].' LIMIT 1');
                            $c = $req->fetch(PDO::FETCH_ASSOC);
                            $balance = $c'balance'] + $d'quantite'];
                            //on mets à jour la balance du joueur
                            $db->query('UPDATE iConomy SET balance='.$balance.' WHERE id='.$custom'iConomy_id'].'');
                            //On sauvegarde la commande
                            $db->query("INSERT INTO orders SET user_id=$uid, amount=$payment_amount, created=NOW(), datas=$data");
                            file_put_contents('log.txt', 'Le payement a bien été confirmé');
                            $to = 'XXX@XXX.com';
                            $subject = 'Payement réussi';
                            $message = 'Le payement Paypal a réussi';
                            $headers = 'From: XXX@XXX.XXX' . "\r\n" .
                                'Reply-To: XXX@XXX.XXX' . "\r\n" .
                                'X-Mailer: PHP/' . phpversion();
                            mail($to, $subject, $message, $headers);
                        }else{
                            file_put_contents('log.txt', 'Le payement ne correspond à aucune offre');
                        }
                        /**
                         * FIN CODE
                         */
                    }
               }
        }
        else {
                // Statut de paiement: Echec
                file_put_contents('log.txt', 'Echec du payement');
        }
        exit();
   }
    else if (strcmp ($res, "INVALID") == 0) {
        // Transaction invalide
        file_put_contents('log.txt', 'Transaction invalide'); // J'arrive donc toujours ici
        file_put_contents('log2.txt', print_r($_POST,true));
    }
}
fclose ($fp);
}

Appel paypal:
Je ne mets pas le chemin vers Ipn car je l'ai réglé dans les préférences du seller et sa fonctionne parfaitement.

<form action="https://www.sandbox.paypal.com/cgi-bin/webscr" method="post">
    <select name="amount">
    <?php 
        $db = connect();
        $req = $db->query('SELECT * FROM offers');
        while($d = $req->fetch(PDO::FETCH_ASSOC)){
            ?>
            <option value="<?php echo $d'price']; ?>"><?php echo $d'quantite']; ?> Minecrédits - <?php echo $d'price']; ?>€</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://XXXX/index.php?module=Success">
    <input name="cancel_return" type="hidden" value="http://XXX/index.php?module=Cancel">

    <input name="cmd" type="hidden" value="_xclick">
    <input name="business" type="hidden" value="sell_1318248819_biz@skynet.be">
    <input name="item_name" type="hidden" value="Minecredits Minecraft sur le serveur Lx4.be">
    <input name="no_note" type="hidden" value="1">
    <input name="lc" type="hidden" value="FR">
    <input type="hidden" name="rm" value="2">
    <input name="bn" type="hidden" value="PP-BuyNowBF">
    <input name="custom" type="hidden" value="iConomy_id=<?php echo $_SESSION'id_iConomy']; ?>&id=<?php echo $_SESSION'id']; ?>">
    <input type="submit" value="Acheter" class="btn primary">
</form>

Un immense MERCI si jamais vous trouvez quelque chose d’intéressant :) sinon merci d'avoir essayer.
Car je dois reconnaître que je ne sais vraiment plus ce qui cloche dans ce code...

1 réponse


frans2526
Auteur
Réponse acceptée

A force de chercher on trouve :)

Voici d'ou venait le problème: "if( $payment_currency == "EUR" )" et non "if( $mc_currency == "EUR" )" et maintenant tout fonctionne Youpi :happy:

Merci à Grafikart pour le tuto :)