Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13

Discussione: PHP IPN Listener

  1. #1

    PHP IPN Listener

    Salve a tutti, seguendo la guida del sito ho provato a implementare un semplice script php per creare il listener php dell'IPN di paypal... ovviamente con scarsi risultati.
    codice:
    <?php
    $posted_data = print_r($_POST,true);
    file_put_contents('IPN_data.txt',$posted_data);
        // 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.1\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://www.sandbox.paypal.com', 443, $errno, $errstr, 30);
     
        // converte le variabili inviate da IPN in variabili locali
        $reflink = $_POST['custom'];
        $refnum  = $_POST['item_number'];
        $receiver_email = $_POST['receiver_email'];
        
     
        // 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 == "aguiari.diego-facilitator@gmail.com"){
                         
                // connessione a MySQL tramite istanza
                        $mysqli = new mysqli("localhost", "username", "", "my_database");
                       
                        // controllo sull'identificatore della transazione
                        
                            // query per l'inserimento dei dati
                            $result = $mysqli->query("INSERT INTO utenti (reflink, numref) VALUES ('$reflink', '$refnum')");
    
    
                           
                        
     
                        // liberazione della memoria dal risultato della query
                       
     
                        // 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);
        }
        ?>
    Cosa c'è di sbagliato? Son quasi sicuro fallisca il controllo
    codice:
    if (strcmp ($res, "VERIFIED") == 0) {
    E' tutto il giorno che ci sto impazzendo

    Grazie in anticipo!

  2. #2
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    12,505
    Benvenuto,
    spiegare il problema che riscontri sarebbe una buona idea, altrimenti non sappiamo da che parte cominciare.

  3. #3
    Effettivamente, scusate sono veramente fuso xD

    Praticamente non salva i dati nel database, la transazione va a buon fine, nessuno problema su quel lato... ma il database non vuole collaborare .-.

    Ho provato a spostare il codice del database in alto prima di tutti i controlli in modo che venisse eseguito per forza, e a forzare una query inserendo dati predefiniti e funziona, quindi temo venga fallito un controllo nel mezzo e non eseguito il codice. Per privacy non ho messo username psw e nome del database

  4. #4
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    12,505
    Anche questo potrebbe ssere sbagliato
    if($receiver_email == "aguiari.diego-facilitator@gmail.com"){

    è scritta giusta l'email? Sei sicuro che in $receiver_email ci sia lo stesso indirizzo?
    Prova a stampare i dati con un echo e verificalo.

  5. #5
    Quello è il risultato dei nmila tentativi che ho fatto, prima era una mail normale "aguiari.diego@gmail.com" poi ho provato ad usare una mail di test di paypal, che è quella. Inoltre
    codice:
    $receiver_email = $_POST['receiver_email'];
    prima era
    codice:
    $receiver_email= filter_var($_POST['receiver_email'], FILTER_SANITIZE_EMAIL);
    quindi direi di sì, sono abbastanza sicuro che quel pezzo non dia problemi, comunque nel dubbio avevo anche provato a togliere il controllo e non funzionava lo stesso.

  6. #6
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    12,505
    Non devi "pensare" di essere sicuro, "devi essere" sicuro.
    Stampa quella variabile $receiver_email e vedi cosa contiene.

    Modifica quel pezzo di codice così
    Codice PHP:
    if (strcmp ($res"VERIFIED") == 0) {
        
        echo 
    "strcmp ha dato esito positivo, vediamo se l'indirizzo email va bene<br />";
        echo 
    "Sono uguali?<br />aguiari.diego-facilitator@gmail.com<br />".$receiver_email."<br />";
        exit;

        
    // controllo sull'email del venditore
        
    if($receiver_email == "aguiari.diego-facilitator@gmail.com") { 

  7. #7
    Ho un solo problema, come faccio a testare la pagina? Nel senso quella pagina viene richiamata da questo form qui
    codice:
    <form method="post" name="paypal_form" action="https://www.sandbox.paypal.com/cgi-bin/webscr"><input type="hidden" name="business" value="aguiari.diego-facilitator@gmail.com" />
    <input type="hidden" name="cmd" value="_xclick" />
         
    <!-- informazioni sulla transazione -->
    <input type="hidden" name="return" value="http://prololdeals.altervista.org/success.html" />
    <input type="hidden" name="cancel_return" value="http://prololdeals.altervista.org/error.html" />
    <input type="hidden" name="notify_url" value="http://prololdeals.altervista.org/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 pagamento -->
    <input type="hidden" name="shipping" value="0.00" />
    <input type="hidden" name="cs" value="1" />
         
    <!-- informazioni sul prodotto -->
    <input type="hidden" name="item_name" value="Referral 10" />
    <input type="hidden" name="item_number" value="ref10" />
    <input type="hidden" name="amount" value="5.00" />
         
    <!-- informazioni sulla vendita -->
    <input type="hidden" name="custom" value="10" />
    <input type="hidden" name="on0" value="Referral Link"><strong>Referral Link:</strong> <input id="reflink" type="text" name="custom" maxlength="200" placeholder="...leagueoflegends.com/?ref=4ab86cd5221g4" required>
     
    <!-- pulsante pagamento -->
    <input type="image" src="http://www.paypal.com/it_IT/i/btn/x-click-but01.gif" border="0" name="submit" alt="Paga subito con PayPal" />
    </form>
    E viene processata tramite paypal, in poche parole io non posso vedere cosa stampa a schermo, c'è un modo per creare un log al posto dell'echo?

  8. #8
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    12,505
    L'exit dovrebbe proprio servire a bloccare il flusso del codice e farti vedere i 2 echo che ci sono subito prima.

  9. #9
    Uhm allora non viene visualizzato niente

  10. #10
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    12,505
    Prima di if(strcmp...) metti questo

    echo "sto per eseguire strcmp...<br />";


    Esce niente?

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.