• User

    Problemi IPN Paypal recupero dati transazione e inserimento nel database

    Salve, avrei bisogno di un' aiutino se è possibile. Ho preparato il file IPN seguendo la guida che ho trovato sul vostro sito ma non riesco a venirne fuori. Praticamente non riesco a recuperare le variabili della transazione e a inserirle nel database dopo che il cliente ha pagato. Non parte neppure la mail di avviso. Posto il codice in maniera tale che chi è più esperto di me, magari trovi qualche errore. Ahhhhh preciso anche che non ho ben capito se questo fiile vada accompagnato anche da un altro file .class.php per funzionare.Dove ci sono gli **** li ho inseriti perchè non posso mettere i link attivi non essendo premium.
    Il mio file ipn-php è questo:
    <?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-w*w-form-urlencoded\r\n";
    $header .= "Content-Length: " . strlen($req) . "\r\n\r\n";

    // apre una connessione al socket PayPal
    $fp = fsockopen ('hts:/ww.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);

    // 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) {

    // controllo sull'email del venditore
    if($receiver_email == "[email protected]"){

    // connessione a MySQL tramite istanza
    $mysqli = new mysqli("mio host", "username", "password", "nome_database");
    $count = $mysqli->query("SELECT id_ordini FROM notifiche WHERE txn_id = '$txn_id'");

    // controllo sull'identificatore della transazione
    if ($mysqli->affected_rows == 0){
    // query per l'inserimento dei dati
    $result = $mysqli->query("INSERT INTO notifiche (txn_id, payment_status, payer_email, first_name, last_name, address_street, address_city, address_state, address_zip, amount) VALUES ('$txn_id', '$payment_status', '$payer_email', '$first_name', '$last_name', '$address_street', '$address_city', '$address_state', '$address_zip', $amount)");
    }

    // liberazione della memoria dal risultato della query
    $count->close();

    // chiusura della connessione
    $mysqli->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);
    }

    ?>

    Può esservi utile anche la pagina che viene prima di questa? In quella pagina ho il form paypal che vi incollo solo perchè magari sbaglio li qualcosa!!!

    <form method="post" name="paypal_form" action="hts:/ww.sandbox.paypal.com/cgi-bin/webscr">
    <input type="hidden" name="business" value="[email protected]" />
    <input type="hidden" name="cmd" value="_xclick" />

    <!-- informazioni sulla transazione -->
    <input type="hidden" name="return" value="<?php echo "ht:/".$_SERVER['HTTP_HOST']; ?>/miacartella/conferma_pagamento.php" />
    <input type="hidden" name="cancel_return" value="<?php echo "h
    t*:/".$_SERVER['HTTP_HOST']; ?>/miacartella/cancella.php" />
    <input type="hidden" name="notify_url" value="<?php echo "h
    t*:*/".$_SERVER['HTTP_HOST']; ?>/miacartella/ipn.php" />
    <input type="hidden" name="rm" value="2" />
    <input type="hidden" name="currency_code" value="EUR" />
    <input type="hidden" name="lc" value="IT" />
    <input type="hidden" name="cbt" value="Continua" />

    <!-- informazioni sul prodotto -->
    <input type="hidden" name="item_name" value="Telegramma Online La Nuova Posta Vetralla" />
    <input type="hidden" name="amount" value="<?php echo $prezzo ?>" />

    <!-- informazioni sulla vendita -->
    <input type="hidden" name="custom" value="ABR24" />

    <!-- informazioni sull'acquirente -->
    <input type="hidden" name="first_name" />
    <input type="hidden" name="last_name" />
    <input type="hidden" name="address1" />
    <input type="hidden" name="city" />
    <input type="hidden" name="state" />
    <input type="hidden" name="zip" />
    <input type="hidden" name="email" />

    <!-- pulsante pagamento -->
    <input type="image" src="ht:/ww.paypal.com/it_IT/i/btn/x-click-but01.gif" border="0" name="submit" alt="Paga subito con PayPal" />
    </form>

    Ringrazio anticipatamente chiunque possa delucidarmi....perchè inizio a darci di matto!!! :- ( ((((((


  • Moderatore

    Ciao Giannix,
    non posso debuggure tutto il codice che hai postato ma ad occhio non mi sembra sbagliato.
    Quello che forse stai sbagliando è la gestione in paypal dello script.

    Per ricevere il feedback con l'IPN transazione, devi configurare l'account paypal del venditore per fare in modo che chiami il tuo script a transazione effettuata.

    Tieni presente quindi che paypal (o la relativa sandbox) non possono chiamare il tuo computer locale e che quindi non puoi realizzare lo script se sei in localhost. Le prove le dovrai fare postando il tuo script su qualche spazio web e farlo chiamare dalla sandbox di paypal.

    Spero di essere stato utile.
    Saluti


  • User

    Salve Shad e innanzitutto grazie della risposta. Il file e su uno spazio web mio....non è in locale :smile5:. IPN Simulator trova il file sullo spazio web.
    Instant Payment Notification (IPN) simulator

    **IPN sent successfully
    **
    Quello che non riesco a capire è come mai non succede niente anche se il simulatore trova il file. E' come se il file non riuscisse a intercettare le variabili paypal. E ti giuro che ci sto dando di matto con questo problema. Ho letto 10000 guide in italiano - inglese - spagnolo oltre a tutta la documentazione paypal ma non riesco a farlo funzionare. Praticamente ho una posta provata e questo che sto creando mi serve per consentire ai miei clienti di inviare i telegrammi online tramite pagamento paypal. Quindi preferire avere un archivio nel database con i dati di chi paga etc. Per quanto riguarda il pulsante funziona perche su sandbox vedo i pagamenti inviati. Mi sto bruciando l' ultimo bricciolo di cervello che mi è rimasto con sta cosa!!!! 😢 help me °______° please


  • User

    Shad, hai qualcosa in mente che può far funzionare sto maledetto file? :-(((


  • Moderatore

    Calma, da quello che descrivi hai quasi risolto il problema. Devi solo ragionarci con calma.
    Purtroppo non posso darti "grandi consigli" in quanto bisognerebbe entrare nel dettaglio per capire bene cosa non va.

    Ti posso dire come procederei io.

    1. mi assicurerei che il mio script viene chiamato e che scriva nel DB. Questo lo farei ignorando temporaneamente eventuali parametri passati da paypal e scrivendo valori fissi
    2. passerei a recuperare uno per volta i vari parametri per assicurarmi di inserire tutti correttamente nel DB
    3. una volta che la sandbox risultasse correttamente funzionante sposterei tutto in produzione ricordandomi però di andare ad adeguare lo script e la parte di configurazione su paypal per quello che mi serve.

    Mi spiace non poter andare olte, ma dovrei prendermi carico del lavoro e fare prove concrete per risolvere il problema e al momento non ne avrei proprio il tempo.

    Resto a disposizione se posso in qualche modo aiutarti.
    Saluti


  • User

    Ciao Shad e grazie ancora del tuo intervento. Posso assicurarti che lo script scrive i dati nel database perchè è lo stesso script che scrive alcuni dati nel database dal form precedente a quello di PayPal.
    Quindi quando il cliente inserisce dati mittente e destinatario nel form precedente questi dati vengono scritti nel database. La query è praticamente la stessa. Comunque ora provo a fare qualche altra modifica e vedo se riesco a cavarne piede.
    Ti ringrazio della disponibilità e tornerò a scrivere in caso avessi bisogno. Ti auguro una buona domenica.
    Saluti


  • User

    Cosa molto strana.....ho tolto i controlli e ho dato la query diretta al rientro dal form di pagamento. Ho provato a lasciare solo txn_id come dato da inserire e riesce a inserirlo. Pero se richiedo di inserire altri dati come payer_mail, amount etc non li inserisce. Ora non riesco a spiegarmi il perchè !!!


  • User

    Inserito anche il prezzo pagato......inizia a tornarmi il buon' umore °____°


  • User

    ok aggiornamento....sono riuscito a far inserire i valori che voglio.....problema sull' inserimento del prezzo. Il mio form non ha un prezzo fisso, infatti il prezzo va in base al numero di parole che un utente inserisce nel form. Quindi varia in questo modo....fino a 20 parole 4,40 € da 21 a 50 6,75 € etc etc. Ho provato a recuperare la variabile "amount" ma non riesce a recuperarla e nel database la stringa "amount" resta vuota. Qualche suggerimento?


  • User

    Se abilito il controllo prima della query......non inserisce nessun valore nel database. Ora mi chiedo .....com'è possibile? Senza controllo la query parte e funziona, con il controllo non funziona niente che @@


  • User

    Per spiegarmi meglio incollo i due pezzi di codice. Cosi funziona tutto senza controllo:

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

    $query = "INSERT INTO notifiche ( txn_id, payer_status, payer_email, first_name, last_name, address_street, address_city, address_state, address_zip, amount) VALUES ('$txn_id', '$payer_status', '$payer_email', '$first_name', '$last_name', '$address_street', '$address_city', '$address_state', '$address_zip', '$mc_gross')";
    if (@mysql_query($query)) {
    }

    Cosi NON funziona niente quando abilito il controllo:

    // 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) {           
    
                // controllo sull'email del venditore
                if($receiver_email == "[email protected]"){
                
    
                    // controllo sull'identificatore della transazione
                  if (mysqli_num_rows == 0){
                        // query per l'inserimento dei dati
                        $result = $mysqli->query("INSERT INTO  notifiche (`txn_id`, payer_status, payer_email, first_name, last_name,  address_street, address_city, address_state, address_zip, `amount`) VALUES ('$txn_id', '$payer_status', '$payer_email', '$first_name',  '$last_name', '$address_street', '$address_city', '$address_state',  '$address_zip', '$mc_gross')");
                    }
    
                    // liberazione della memoria dal risultato della query
                    $count->close();
    
                    // chiusura della connessione
                    $mysqli->close();

  • User

    Shad credi comporti qualcosa se non abilito la verifica? Tanto nel database vedo se il pagamento è stato completato o meno....mi inserisce lo stato di pagamento tramite la variabile "payer_status". Pensi possa bastare per essere sicuri del pagamento? Io credo di si visto che è una variabile che proviene da Paypal giusto?. Una domanda....se voglio ricevere una mail di avviso quando un utente ha richiesto il servizio come faccio? Puoi scrivermi un codicino?....se non chiedo troppo ovviamente.....mi basta anche un buon link su cui buttarci gli occhi °___° e studiccchiare un po.


  • Moderatore

    Ciao,
    un controllo lo farei lo stesso. Non dare per scontato che lo script sia chiamato da paypal. Se per qualche motivo si individuasse come chiamare lo script lo si potrebbe fare da un sito diverso passandoti le stesse informazioni che richiedi a paypal.

    Per ricevere la mail di avviso basta usare la funzione mail di PHP nello script che inserisce la conferma di pagamento nel DB.

    Occhio che la configurazione della funzione può cambiare da server a server.

    Una piccola ricerca di partenza su google potrebbe essere questa:
    https://www.google.it/#q=php+invio+mail

    Saluti


  • User

    Ok proverò a sistemare questa cosa del controllo Shad. Grazie del link, ora ci do uno sguardo

    Saluti


  • User

    Shad scusa se rompo ancora e "approffitto" del tuo sapere.
    Non riesco a risolvere il problema. Se tolgo la verifica funziona tutto alla grande.
    Ora mi chiedo, ma la funzione fsockopen può dare problemi su TopHost? Credo di no....ma inizio a dubitare e chiederò delucidazioni al loro staff domani.
    Inizio a deprimermi...per la frustrazione.
    Mi consigli di fare una prova togliendo sandbox ed eseguendo una transazione da 0,01 € in ambiente "reale" paypal, per vedere se la verifica funzionia in ambiente "reale"?
    Per quanto riguarda la funzione mail ho dato uno sguardo a quel link e implementarla nello script non è difficile. Ma se non risolvo questo problema della verifca....tutto il lavoro andra buttato al vento....e mi rodeeeeee. Se qualcun' altro leggesse e ha un' idea....gradirei leggerla almeno non scasso le @@ a Shad :x.
    Buonanotte ai lettori!!!


  • Moderatore

    Non ti preoccupare, nessun fastidio.
    La fsockopen a mio parere può dare problemi. Per verificarlo fai una pagina dove usi solo quella funzione e vedi che succede.

    Sconsiglio invece di fare prove "reali" in quanto la sandbox di paypal è la perfetta riproduzione simulata dell'ambiente di produzione. In altre parole se non ti funziona in sandbox è inutile provare in produzione.


  • User

    Ciao Shad, ho verificato la funzione....e gira tutto. Il problema me lo da questo pezzo di codice che incollo sotto. Se tolgo questo pezzo funziona tutto.
    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) {         
    
                // controllo sull'email del venditore
                if($receiver_email == "[email protected]"){
    

    Quindi partendo da // verifica l'apertura della connessione al socket
    if (!$fp) {
    e inserendo subito la query tutto gira a meraviglia.
    Ma che diamine può essere? Più spremo il cervello e più mi va a fuoco.....sono 15 gg che combatto con questo script!!!
    Ma in tutti i 6723467236473268 forum e pagine web che ho visitato questo pezzo di codice esiste ...sarà meglio chiamare un prete e farmi liberare dal diavolo che sta crescendo in me? :bho::quote:


  • User

    Shad, ma se l' account business su sandbox è Unverified puo darsi che sia questo il problema? Come posso metterlo in VERIFIED su sandbox? Questo e cio che mi dice sull account e risulta Unverified guarda su Status:

    [h=2]Account information Email ID: miamail(chiocciola)mailbusiness.it

    Password:  Change Password
    
    
    
    
    Account type:    Business-Pro  
    
    
     
    Status:   Unverified 
    

    Country: IT


  • Moderatore

    No Gianni, non credo sia quello il problema. Poi non so', magari fai qualche ricerca sul web.

    Scusa il ritardo della risposta ma sono stato un po' impegnato in questi giorni.

    Saluti


  • User Newbie

    Ciao Gianix,ho letto il tuo post dell annoscorso ho problemi con questo file ipn, se hai risolto potresti postare un codice funzionante ? Ame serve solo di inserire i dati in un database,Ti sarei Grato.....