• User

    PayPal IPN: correzione codice bottone e IPN listener

    Ciao a tutti!!
    Ho creato un account developer su paypal, e due account test (seller+buyer). Ho attivato l'IPN nell'account seller, caricato sul sito la pagina con il bottone e quella con l'ipn listener. (Dopo parecchi tentativi) NON FUNZIONA :arrabbiato:
    Vi chiedo aiuto sul codice dell'IPN listener (preso da html.it e modificato leggermente)

    [PHP]
    // intercetta le variabili IPN inviate da PayPal
    $req = 'cmd=_notify-validate';

    // legge l'intero contenuto dell'array POST
    foreach ($_POST as $key => $value) {
    $value = urlencode(stripslashes($value));
    $req .= "&$key=$value";
    }

    // intestazione, prepara le variabili PayPal per la validazione
    $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";

    // apre una connessione al socket PayPal
    $fp = fsockopen ('ssl://url.sandbox.paypal.com', 443, $errno, $errstr, 30);

    // converte le variabili inviate da IPN in variabili locali
    $txn_id = filter_var($_POST['txn_id'], FILTER_SANITIZE_STRING);
    $payment_status = filter_var($_POST['payment_status'], FILTER_SANITIZE_STRING);
    $receiver_email = filter_var($_POST['receiver_email'], FILTER_SANITIZE_EMAIL);
    $payer_email = filter_var($_POST['payer_email'], FILTER_SANITIZE_EMAIL);
    $first_name = filter_var($_POST['first_name'], FILTER_SANITIZE_STRING);
    $last_name = filter_var($_POST['last_name'], FILTER_SANITIZE_STRING);
    $address_street = filter_var($_POST['address_street'], FILTER_SANITIZE_STRING);
    $address_city = filter_var($_POST['address_city'], FILTER_SANITIZE_STRING);
    $address_state = filter_var($_POST['address_state'], FILTER_SANITIZE_STRING);
    $address_zip = filter_var($_POST['address_zip'], FILTER_SANITIZE_STRING);
    $payment_date = filter_var($_POST['payment_date'], FILTER_SANITIZE_STRING);
    $item_name = filter_var($_POST['item_name'], FILTER_SANITIZE_STRING);

    // verifica l'apertura della connessione al socket
    if (!$fp) {

    // se la connessione non avviene l'esecuzione dello script viene bloccata
    exit();

    // in alternativa è per esempio possibile inviare un'email al venditore
    } else {

    // elaborazione delle informazioni
    fputs ($fp, $header . $req);
    while (!feof($fp)) {
    $res = fgets ($fp, 1024);

    // azioni in caso di risposta positiva da parte di PayPal
    if (strcmp ($res, "VERIFIED") == 0) {

       if ($payment_status == "Completed") {                 
    
            // controllo sull'email del venditore                
            if($receiver_email == "[email protected]"){                                                             
       
            require_once('Connections/altermysql.php');                     
             mysql_select_db($database_altermysql, $altermysql);                                        
            $controllo= mysql_query("SELECT first_name FROM notifiche WHERE txn_id = '$txn_id'");                                        
            if(mysql_num_rows($controllo) == 1)                    
            {                    
             exit();                    }                    
            else                    
            {  
                          
              mysql_query("INSERT INTO notifiche (tnx_id, payment_status, receiver_email, payer_email, first_name, last_name, address_street, address_city, address_state, address_zip, payment_date)    
              VALUES    ('$tnx_id', '$payment_status' , '$receiver_email', '$payer_email' , '$first_name' , '$last_name' , '$address_street' , '$address_city' , '$address_state' , '$address_zip' , '$payment_date')");                                                    }                                                                 
    

    // liberazione della memoria dal risultato della query
    $count->close();
    }
    }
    }
    // azione in caso di risposta negativa da parte di PayPal else
    if (strcmp ($res, "INVALID") == 0) {
    // è possibile eseguire qualsiasi operazione
    // per esempio compilare un log degli errori o inviare una mail al venditore
    }
    }
    // chiusura della sorgente di dati
    fclose($fp);
    }
    [/PHP]

    Riuscite a trovare qualche errore?
    P.s. Preciso subito che url.sandbox..etc... l'ho cambiato solo qui perchè il forum non mi permette ancora di postare link.


  • User

    ***LEGGETE QUI
    ***Tanto per capirci qualcosa ho provato a creare un semplice IPN Listener che mi manda una mail quando viene chiamata la pagina.
    Così:
    [PHP]
    $to = "[email protected]";
    $subject = "Test mail";
    $message = "IPN ha chiamato la pagina con successo.";
    $from = "[email protected]";
    $headers = "From:" . $from;
    mail($to,$subject,$message,$headers);?>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "...">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>Documento senza titolo</title>
    </head>
    <body></body></html>
    [/PHP]

    Se visito la pagina normalmente la mail arriva perfettamente, invece impostandola come link IPN nell'account PayPal e facendo una prova di acquisto.... NON arriva nessuna email. Perchè?????