Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2010
    Messaggi
    48

    problema ricezione IPN Paypal

    Salve a tutti,
    ho un sito tipo e-commerce che permette all'utente di pagare tramite paypal.
    voglio memorizzare l'ordine in un database solo quando ho ricevuto conferma dell'avvenuto pagamento, e per questo ho visto che è disponibile IPN, fornito da paypal stesso.
    ho attivato la funzione nel mio profilo paypal, e implemento il tutto nel modo seguente:

    innanzitutto il form del pulsante paga con paypal:
    Codice PHP:
    <form action="https://www.paypal.com/cgi-bin/webscr" method="post">
    <input type="hidden" name="cmd" value="_xclick">
    <input type="hidden" name="business" value="mia mail">
    <input type="hidden" name="lc" value="IT">
    <?php echo '<input type="hidden" name="item_name" value="'.$nome_tipologia.'">'?>
    <?php 
    echo '<input type="hidden" name="amount" value="'.$_SESSION["costo_tot"].'">'?>
    <input type="hidden" name="currency_code" value="EUR">
    <input type="hidden" name="button_subtype" value="services">
    <input type="hidden" name="no_note" value="1">
    <input type="hidden" name="no_shipping" value="2">
    <input type="hidden" name="rm" value="1">
    <input type="hidden" name="return" value="mio url">
    <input type="hidden" name="cancel_return" value="mio url">
    <input type="hidden" name="notify_url" value="http://URL/ordine_completato.php">
    <input type="hidden" name="bn" value="PP-BuyNowBF:btn_buynowCC_LG.gif:NonHosted">
    <input type="image" src="https://www.paypalobjects.com/it_IT/IT/i/btn/btn_buynowCC_LG.gif" border="0" name="submit" alt="PayPal - Il sistema di pagamento online più facile e sicuro!">
    [img]https://www.paypalobjects.com/it_IT/i/scr/pixel.gif[/img]
    </form>
    poi lo script che deve comunicare col server per gestire l'IPN. ho semplicemente copiato il codice fornito da paypal, aggiungendo l'invio dell'email (quando riesco a farlo funzionare farò vari controlli e operazioni):
    Codice PHP:
    // read the post from PayPal system and add 'cmd'
    $req 'cmd=_notify-validate';

    foreach (
    $_POST as $key => $value
    {
        
    $value urlencode(stripslashes($value));
        
    $req .= "&$key=$value";
    }

    // post back to PayPal system to validate
    $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.paypal.com'443$errno$errstr30);

    // assign posted variables to local variables
    $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'];

    if (!
    $fp
    {
    // HTTP ERROR

    else 
    {
        
    fputs ($fp$header $req);
        while (!
    feof($fp)) 
        {
            
    $res fgets ($fp1024);
            if (
    strcmp ($res"VERIFIED") == 0
            {
                
    // check the payment_status is Completed
                // check that txn_id has not been previously processed
                // check that receiver_email is your Primary PayPal email
                // check that payment_amount/payment_currency are correct
                // process payment

                
    @mail("ind@dom.it","prova","ciao");
            }
            else if (
    strcmp ($res"INVALID") == 0
            {
                
    // log for manual investigation
            
    }
        }
    fclose ($fp);

    questo script per adesso è su un mio spazio Altervista (lo dico perchè magari è il motivo del non funzionamento).

    la cosa non funziona, infatti se vado sul mio profilo paypal, nella cronologia dei messaggi IPN, i 2 messaggi per i pagamenti di prova che ho effettuato sono ancora in invio, con già una decina di tentatativi effettuati.
    dove sbaglio?
    grazie

  2. #2
    Utente di HTML.it L'avatar di bubi1
    Registrato dal
    Dec 2009
    Messaggi
    1,230
    a) controlla se il tuo hoster ti permette di aprire connessioni in uscita sulla 443
    b) fai un po' di debug, tipo dopo ogni blocco importante scrivi qualcosa in un file, per capire dove si ferma e perche'

  3. #3
    Utente di HTML.it
    Registrato dal
    Jun 2010
    Messaggi
    48
    allora credo proprio che dovrò aspettare di avere l'hosting "ufficiale" per poterlo testare (per ora è tutto in locale a parte lo script dedicato a IPN che è su uno spazio altervista)

  4. #4
    Utente di HTML.it L'avatar di bubi1
    Registrato dal
    Dec 2009
    Messaggi
    1,230
    Devi solo essere consapevole che paypal chiama lo script per i dati IPN "in background", cioe' lo script non viene chiamato dal browser di chi naviga. Il che significa che non puoi fare debug con echo a video e roba simile. Devi per forza scrivere in un file per capire cosa non va in quello script.
    una roba tipo
    codice:
    if (!$fp) 
    {
    scrivi_nel_file('morto 1');
    } 
    else 
    {
        scrivi_nel_file('morto 2');
        fputs ($fp, $header . $req);
        while (!feof($fp)) 
        {
            $res = fgets ($fp, 1024);
            scrivi_nel_file('morto 3');
            if (strcmp ($res, "VERIFIED") == 0) 
            { 
               scrivi_nel_file('morto 4');

    .... e cosi via
    cosi' facendo capisci esattamente cos'e' che non va nello script.

  5. #5
    Utente di HTML.it
    Registrato dal
    Jun 2010
    Messaggi
    48
    ho provato a fare come dici e mettere scritture su file in ogni punto del codice ma niente. il file non viene neanche creato, e il fopen è la prima riga di codice.
    evidentemente paypal non riesce neanche a contattare il server, il che mi sembra molto strano dato che la comunicazione avviene tramite post http...

  6. #6
    Utente di HTML.it L'avatar di bubi1
    Registrato dal
    Dec 2009
    Messaggi
    1,230
    ma se lo chiami tu direttamente l'ipn con il browser - scrive qualcosa nel file di log?

  7. #7
    Utente di HTML.it
    Registrato dal
    Jun 2010
    Messaggi
    48
    Originariamente inviato da bubi1
    ma se lo chiami tu direttamente l'ipn con il browser - scrive qualcosa nel file di log?
    si.
    come mi aspettavo non scrive nei punti:

    Codice PHP:
    foreach ($_POST as $key => $value
    {
        
    $value urlencode(stripslashes($value));
        
    $req .= "&$key=$value";
        
        
    fwrite($fi,"sono entrato nel foreach");

    e
    Codice PHP:
    if (strcmp ($res"VERIFIED") == 0
            {
                
    fwrite($fi,"sono nel verified");
                
    // check the payment_status is Completed
                // check that txn_id has not been previously processed
                // check that receiver_email is your Primary PayPal email
                // check that payment_amount/payment_currency are correct
                // process payment

            
    }
            else if (
    strcmp ($res"INVALID") == 0
            {
                
    fwrite($fi,"sono nell'invalid");
                
    // log for manual investigation
            

    nel resto del codice si

  8. #8
    Utente di HTML.it L'avatar di bubi1
    Registrato dal
    Dec 2009
    Messaggi
    1,230
    Originariamente inviato da Filuz
    si.
    come mi aspettavo non scrive nei punti:
    [...]
    vabbe', quello e' normale, ovviamente quando lo chiami tu, non c'e' nessun post, e nessun verified.

    il resto e' strano.

    guarda un attimo nel log degli accessi, per vedere se ci sono stati hits dagli ip di paypal verso il tuo script ipn.

    e magari simula un nuovo pagamento, per non confonderti con quelli dove non avevi il debug.

  9. #9
    Utente di HTML.it
    Registrato dal
    Jun 2010
    Messaggi
    48
    guardando le impostazioni di altervista mi sono accorto che la comunicazione server to server era limitata ad una white list.
    ho disattivato questa limitazione ed ho riprovato ma niente...
    magari la modifica non è ancora attiva, riproverò tra un po' di tempo.
    intanto grazie

  10. #10
    Utente di HTML.it L'avatar di bubi1
    Registrato dal
    Dec 2009
    Messaggi
    1,230
    se il problema fosse solo quello (che tra l'altro ti ho detto di verificare gia' nella prima risposta), semplicemente non sarebbe entrato nel blocco relativo al fsockopen, invece lo script sarebbe stato comunque chiamato da paypal.

    io ti proporrei di rifare tutto da 0:
    controlla che nel pulsante il parametro notify_url punti alla url corretta dello script che processa l'ipn
    nello script fai debug di tutto quello che succede
    simula di nuovo una transazione sul sandbox di paypal

    una volta superato questo, concentrati sulla parte server2server, etc

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.