PayPal: la pagina di ritorno, PDT e IPN | ALTRI capitoli | |
Negli articoli precedenti, abbiamo visto che PayPal vi permette di impostare una pagina di ritorno. Dovete ricordare che la transazione finanziaria avviene interamente sul server HTTPS di PayPal, e non sul vostro server HTTP. Una volta conclusa la transazione, quindi, il vostro utente si ritrova, normalmente, in una pagina di PayPal che lo informa sull'esito della transazione stessa. A questo punto, PayPal ha già inviato, al vostro utente e a voi, il commerciante, un messaggio e-mail, contenente le informazioni relative al pagamento online appena concluso. Senza ulteriori disposizioni, da parte vostra, il lavoro del server HTTPS di PayPal è terminato. La pagina di ritorno è un metodo attraverso il quale PayPal vi offre la possibilità di alzare il grado di integrazione tra il vostro server HTTP ed il server HTTPS di PayPal. Potreste desiderare di impostare una pagina di ritorno per due validi, ma distinti, motivi:
PayPal mette a vostra disposizione ben tre pagine di ritorno differenti. Tutte e tre le pagine di ritorno prevedono la possibilità di chiedere l'invio dei dati della transazione, ma nessuna delle tre pagine di ritorno previste può soddisfare, da sola, entrambe le esigenze appena esposte. Le tre pagine di ritorno, messe a disposizione da PayPal, sono:
Credo sia buona cosa ricordare che tutti e tre i metodi appena esposti hanno una caratteristica in comune: essi vengono attivati solo a transazione finanziaria conclusa. Quindi, anche se rilevaste un errore di programmazione, per esempio, nel vostro CGI di IPN, quell'errore potrebbe, al limite, riversarsi solo sulla fase di modifica del vostro database, ma mai sulla transazione PayPal. Questo perchè il server PayPal, prima di chiamare un qualsiasi vostro programma o pagina, chiude il processo di pagamento online con il vostro utente ed invia, all'utente e a voi, il messaggio email ( che riceverete sempre e comunque ) di fine transazione. Potrete eseguire i test delle impostazioni che vedremo nei paragrafi successivi, utilizzando l'ambiente virtuale Sandbox di PayPal, che abbiamo visto nel secondo articolo di questa guida. Ricordate sempre che le form HTML vanno inviate a due indirizzi internet ( URL ) differenti, a seconda che stiate utilizzando l'ambiente virtuale Sandbox, oppure che vi troviate ad operare in ambiente reale PayPal. Per Sandbox, utilizzate sempre l'indirizzo:
Quando, invece, vi trovate in PayPal, utilizzate sempre l'indirizzo:
Ricordate, inoltre, che il campo, contenuto nella vostra form di invio:
indica al server HTTPS di PayPal il nome dell'account sul quale versare i soldi, frutto della transazione. L'identificativo dell'account virtuale Sandbox è diverso dall'identificativo dell'account reale PayPal, naturalmente. Iniziamo con il creare una semplice pagina di ritorno in HTML.
Si tratta di una pagina HTML un pochino primitiva, ma eccellente per i nostri scopi. Arricchitela secondo le vostre esigenze, naturalmente. Ora copiate questo codice in una pagina HTML e salvate il file con il nome "grazie.htm". Trattandosi di una pagina HTML, quindi statica, PayPal ci offre la possibilità di crearne un'altra, differente, da mostrare nel caso la transazione fallisse o venisse, comunque, interrotta. Creiamo, dunque, questa seconda pagina:
Copiate questo codice in una pagina HTML e salvate il file con il nome "peccato.htm". Ora, installate queste due pagine sul server che ospita il vostro sito, memorizzando il percorso in cui si trova. Poi, accedete al vostro account PayPal ( o Sandbox ) e tornate alla pagina di creazione dei bottoni:
Inserite i dati del vostro articolo in vendita:
Ora, andate alla scheda "Passaggio 3. Personalizza le funzioni avanzate (opzionale)" e selezionate le due voci:
Ricordatevi di deselezionare la voce "Salva il pulsante su PayPal", nella scheda "Passaggio 2. Gestisci le giacenze di magazzino, i profitti e le perdite (opzionale)". Quindi, premete il bottone "Crea pulsante". A questo punto, vedrete il codice HTML della form, in forma criptata ( è la modalità di default di PayPal, nel caso in cui venga escluso il salvataggio del codice sul server Paypal ), ma vedrete anche un link, subito sopra il codice, con scritto: "Rimuovi protezione codice". Cliccate e vedrete apparire il codice HTML in chiaro. Copiate quel codice su una pagina HTML del vostro sito. Quando il vostro utente premerà il bottone "Paga adesso", generato da questo codice HTML, verrà reinstradato sul server HTTPS di PayPal, per completare il pagamento. Una volta terminata la transazione, PayPal aprirà una pagina di fine transazione, invitando l'utente a tornare sul vostro sito. Se l'utente deciderà di cliccare sul link pubblicato da PayPal, atterrerà sulla vostra pagina "grazie.htm", se la transazione è andata a buon fine, sulla pagina "peccato.htm", in caso contrario.
Rivediamo, ora, i campi della nostra form, che hanno determinato questo comportamento, da parte del server HTTPS di PayPal:
Come abbiamo già visto nel primo articolo di questa guida, la variabile
Da questa breve esposizione, risulta evidente che, se desiderate ricevere tutti i dati della transazione appena avvenuta, dal server HTTPS di PayPal, dovrete impostare la variabile
La form utilizzata, dal vostro sito web, nell'ultimo nostro esempio, utilizzava, per la trasmissione dei vostri dati, dal vostro server HTTP al server HTTPS di PayPal, il metodo POST:
Nella stessa form, venivano specificati una serie di dati da inviare ( di cui abbiamo già visto il significato nel primo articolo di questa guida ):
Il protocollo HTTP prevede che tutti questi campi vengano inviati al server concatenati tra loro, con un carattere "&". Per esempio:
Il server HTTPS di PayPal, a fine transazione, invia al vostro server HTTP, una differente serie di dati, ovviamente, ma impacchettati nello stesso identico formato. PHP elabora, automaticamente, tutti i dati ricevuti via POST, memorizzando le singole variabili in un hash, o associative array, una struttura di dati composta, appunto, da una serie di coppie:
Perl, invece, riceve la stringa di dati, senza scompattarla ( con i campi concatenati l'uno all'altro ), lasciando a noi questa incombenza. Vediamo, ora, il differente codice da utilizzare, a seconda che si usi un linguaggio o l'altro. Partiamo con PHP. Intanto, dovendo ripetere l'esperimento precedente, ricopiate, nella pagina del vostro sito web, lo stesso codice HTML, usato nell'ultimo esempio, della form di creazione del bottone "Paga adesso", modificando solo i tre campi relativi alle pagine di ritorno:
Abbiamo modificato il campo
Ora, installate sul vostro server HTTP questo nuovo file PHP, con lo stesso percorso dato come valore delle variabili
Il programma in PHP ha eseguito esattamente le istruzioni che gli avete impartito nel file "grazie.php". Il linguaggio PHP, come abbiamo già detto, cattura tutti i dati POST, inviati dal server HTTPS di PayPal, in un array associativo, chiamato, di default,
mentre un array associativo è una lista di coppie di dati, proprio come i dati inviati via POST:
Il primo dato di una coppia di dati, viene definito "chiave", mentre il secondo dato della stessa coppia di dati viene definito "valore". Quindi, nel nostro ultimo esempio, "tenaglia" è il valore della chiave "arca". La sintassi per accedere al valore di una chiave è la seguente:
Il valore di questa variabile è, esattamente, "tenaglia". Nel nostro file "grazie.php", la prima operazione eseguita è la verifica del valore della chiave "payment_status", una informazione essenziale, attraverso la quale il server HTTPS di PayPal ci informa se la transazione appena eseguita è andata a buon fine. Se il suo valore è "Completed", la transazione è stata completata con successo. In questo caso, il nostro programma stampa a video il messaggio di ringraziamento.
In caso contrario,
La seconda parte del nostro programma PHP stampa a video il valore di tutte le coppie chiave - valore, inviateci dal server HTTPS di PayPal:
La funzione
E' il suo comportamento di default, visto che la direttiva PHP
mentre, usando la funzione
Nel nostro esempio, abbiamo preferito stampare a video tutte le variabili inviate dal server HTTPS di PayPal. Naturalmente, nel mondo reale, ben difficilmente saremo portati a mostrare al nostro utente tutti i campi ricevuti. In questo caso, sarà sufficiente selezionare i campi che vogliamo pubblicare. Per farlo, è necessario specificare la chiave di cui desideriamo stampare il valore. Per esempio:
stamperebbe a video, nel nostro caso, il testo:
un messaggio certamente efficace, anche se un po' brutale. Un'ultima precisazione dedicata a coloro che non sono abituati a PHP: le righe
indicano l'inizio e la fine di una sezione dedicata al codice di programmazione. Ora, vediamo come creare una pagina di ritorno identica a quella appena vista, ma scritta in Perl ( alcuni carrelli elettronici in circolazione sono scritti in Perl, altri in PHP ). Come prima cosa, modifichiamo il codice HTML della nostra form di invio, nei due campi che identificano il file sul quale reinstradare l'utente, una volta completata la transazione finanziaria. Dovete ricordare che, normalmente, i file Perl, sui server, devono essere installati in una particolare directory:
che, normalmente, si trova all'interno della cartella principale del vostro sito.
Modificati questi soli due campi, copiate il codice completo della form HTML in una pagina web del vostro sito. Prima di premere il nuovo bottone "Paga adesso", così generato, dobbiamo creare il file Perl "grazie.pl".
Installate il vostro Perl "grazie.pl" sul vostro server e premete il nuovo bottone "Paga adesso". Vediamo, ora, riga per riga, le operazioni che vengono eseguite, ogni volta in cui il server HTTPS di PayPal chiama questo file. Innanzitutto, nella prima riga, troviamo il percorso, sul vostro server HTTP, del programma interprete di Perl ( obbligatorio sui sistemi Unix e Linux ), associato ad una opzione di esecuzione:
L'opzione
dicono a Perl di caricare i due "pragma" specificati:
se il pragma
Questa piccola correzione dice al compilatore che la variabile
invia al server una riga necessaria affinchè una transazione HTTP possa avere luogo. Un messaggio HTTP, infatti, è sempre composto da due parti: una intestazione ( una serie di informazioni che la macchina che invia deve allegare al messaggio vero e proprio per spiegare alla macchina di destinazione cosa sta ricevendo ) ed il corpo ( il messaggio vero e proprio: nel nostro caso, la lista delle variabili inviateci dal server HTTPS di PayPal ). L'intestazione, alla quale potremmo pensare come una sorta di "comunicazione di servizio", deve sempre precedere il messaggio. Come può, il server, sapere quando termina l'intestazione ed inizia il messaggio? Il protocollo HTTP stabilisce che tra intestazione e messaggio devono esserci due caratteri "a capo", quindi, una riga vuota. I due caratteri "a capo", in Perl, vengono rappresentati dai caratteri:
Da questo, possiamo dedurre che il testo prima di questi due caratteri faccia ancora parte dell'intestazione. In effetti, questa riga dice al nostro browser ( questo programma verrà eseguito sul vostro server HTTP, ma il suo output verrà inviato al browser dell'utente, visto che stiamo impostando la pagina di ritorno ) che il messaggio, contenuto nelle righe seguenti l'intestazione, contiene dati di tipo testuale. In una transazione HTTP, questa riga è obbligatoria. Se nel programma PHP non l'avete vista, è solo perchè PHP la aggiunge automaticamente. Da questo punto in poi, inizia il programma vero e proprio, con la dichiarazione di due variabili, che ci saranno utili nelle righe successive:
Nel linguaggio di programmazione Perl, il simbolo posto all'inizio di un nome di variabile ci dice di che tipo di variabile si tratti:
Abbiamo già accennato, in precedenza, al fatto che i dati POST vengono spediti concatenati l'uno all'altro, in un'unica stringa di testo. Questa stringa di testo rappresenta il corpo del messaggio. Questa stringa di testo possiede, ovviamente, una lunghezza. La sua lunghezza viene memorizzata nella variabile d'ambiente che Perl chiama:
dove
il messaggio è vuoto. Mentre PHP cattura questa stringa e la "scompone" nella lista di coppie di variabili originaria, in modo automatico ( salvandone il contenuto nell'array associativo
La funzione Perl
concatenate fra loro con il carattere
La riga:
separa le coppie chiave/valore, memorizzandole, temporaneamente, nell'array ( una semplice lista )
La funzione Perl
preleva una coppia chiave/valore alla volta, memorizza, temporaneamente, la coppia chiave/valore prelevata nella variabile
Per separare, in ciascuna delle coppie, la chiave dal valore, è sufficiente rieseguire uno
Ora che abbiamo, per una coppia, il contenuto della chiave ed il valore di quella chiave, siamo in grado di memorizzare quei due valori all'interno dell'array associativo
Il simbolo, usato da Perl, per rappresentare il valore di un solo elemento di una lista o di un array associativo, è sempre
Avrete notato che, prima di memorizzare ciascuna coppia di chiave/valore nell'array associativo
Queste due righe di codice eseguono una serie di operazioni, sulla stringa
Tempo addietro, l'invio dei dati HTTP veniva effettuato "attaccando" quei dati alla URL ( indirizzo internet ) del file al quale erano destinati. Questo meccanismo è il meccanismo utilizzato, ancora oggi, dal metodo HTTP GET. Il problema è che un indirizzo internet non può contenere alcuni caratteri, all'interno della stringa di dati attaccati alla URL vera e propria, quali lo spazio vuoto, la slash (
Questo Perl non lo sa. Siamo noi che dobbiamo dirglielo. E questo è ciò che diciamo a Perl nella riga:
che significa: "sostituisci tutti i + con uno spazio vuoto". L'operatore
La virgola, allo stesso modo, va sostituita ad ogni sequenza
Ed eccoci tornati alla stringa originale. Invece di agire su ogni carattere "proibito", ripetendo per n volte la stessa operazione, grazie alle espressioni regolari, è possibile eseguire tutte queste sostituzioni con una sola riga di codice:
E' difficile spiegare, a coloro che non conoscono le espressioni regolari, la perfetta semplicità ed efficacia di un simile costrutto, ma ci proverò. Questa sola riga esegue diverse operazioni. Normalmente, una espressione regolare serve a trovare una determinata sequenza di caratteri, all'interno di una stringa di testo. Nel nostro caso, abbiamo:
Questa espressione regolare, cerca, all'interno di
Quindi, la nostra espressione regolare:
cerca una sequenza di caratteri che, all'interno dei valori dei campi POST, rappresenta uno qualsiasi dei caratteri "proibiti":
Quando Perl trova una sequenza di caratteri che corrisponde alla sequenza rappresentata all'interno della nostra espressione regolare, interrompe la ricerca. Ma, nel nostro caso, questo non è quello che vogliamo. In questo modo, infatti, Perl non troverebbe tutti i caratteri "proibiti". Per estendere la ricerca all'intera stringa
Queste lettere, poste alla fine della espressione regolare, vengono chiamate "modificatori", poichè modificano i criteri della ricerca. Il modificatore
Ma noi non dobbiamo solo trovare queste sequenze di caratteri: abbiamo bisogno che ogni sequenza venga sostituita dal carattere corrispondente nella tabella ASCII. La sintassi per le sostituzioni, nelle espressioni regolari, è la seguente:
Quindi, l'espressione regolare
sostituirebbe tutte le sequenze di caratteri appena trattate con la sequenza fissa "MMM". Noi abbiamo un problema in più: per ogni sequenza di caratteri trovata, dobbiamo trovare il carattere ASCII rappresentato da quella sequenza, per poi dire a Perl di sostituire quella sequenza con quel carattere. Perl mette a disposizione una funzione che, ricevuto un numero decimale, restituisce il carattere ASCII corripondente. Così:
restituisce, come risultato, il carattere virgola (
restituisce, come risultato, lo stesso numero, ma espresso in notazione decimale: 44. Quindi, per passare da un numero esadecimale al carattere ASCII corrispondente, devo eseguire queste due ultime funzioni. Così:
restituisce, come risultato, il carattere virgola (
Questa è l'espressione regolare completa, che abbiamo inserito nel file "grazie.pl". Il modificatore
La funzione Perl
E' possibile anche dire a
In questo esempio, stiamo dicendo a Perl: stampa tutto quello che trovi tra la riga:
e la riga:
START è solo un mercatore. Quindi, è possibile utilizzare un nome qualsiasi.
A questo punto, siete in grado di catturare e salvare tutte le variabili che il server HTTPS di PayPal invia al vostro server HTTP, una volta concluso il pagamento online del vostro utente. Il processo di acquisizione di queste variabili è sempre lo stesso, sia che stiate utilizzando la pagina di ritorno ( come nel nostro caso ), sia che stiate utilizzando PDT ( Payment Data Transfer ), sia che stiate utilizzando IPN ( Instant Payment Notification ). Le variabili così acquisite potrebbero essere utilizzate dal vostro programma per contattare il database del vostro catalogo, residente sul vostro server HTTP, e verificare la correttezza dei dati ricevuti o per modificare alcuni campi delle tabelle che compongono il vostro database. Dovete, però, ricordare che questa pagina di ritorno viene chiamata dal server HTTPS di PayPal solo se il vostro utente decide di voler ritornare sul vostro sito. Con questa premessa, è davvero difficile immaginare di utilizzare questa pagina di ritorno come strumento di aggiornamento del vostro database, visto che, in alcuni casi, il vostro utente non sceglierà di tornare al vostro sito. Ecco perchè, nei nostri esempi, ci siamo semplicemente limitati a stampare a video tutte o alcune di queste variabili. Per conoscere il significato di ciascuna variabile ricevuta dal server HTTPS di PayPal è sufficiente consultare la pagina di PayPal dedicata alle variabili IPN e PDT. Con il tempo e con i test, raggiungerete una certa familiarità con queste variabili e con il significato di ciascuna di esse, tanto da comprendere quali potranno esservi utili e di quali, invece, potreste tranquillamente fare a meno.
|
||
PayPal: la pagina di ritorno, PDT e IPN | Le guide di .bit: contenuto originale |