Stiamo aiutando Andrea, fotografo dilettante ma appassionato, a vendere le proprie fotografie attraverso il suo sito.
Nello scorso articolo abbiamo posto le basi per creare dinamicamente i bottoni “Paga ora” di paypal, dovremmo però ancora testare il sistema e renderlo sicuro.
PayPal mette a nostra disposizione sandbox, un ambiente progettato appositamente per testare le nostre applicazioni.
In cosa consiste
sandbox.paypal.com è praticamente una copia 1:1 di paypal.com compresi i pannelli utente e soprattutto le API. Questo ci da la certezza che un applicazione che funziona senza problemi in sandbox funzionerà anche al di fuori di questo ambiente.
Come possiamo usare sandbox?
Per prima cosa dobbiamo avere un account paypal developer, e possiamo aprirne facilmente uno da qui: https://developer.paypal.com/
Dopodichè su Application > Sandbox accounts andremo a creare i nostri account sandbox.
Io solitamente ne creo uno cliente ed uno negozio, vi consiglio di usare come indirizzo mail dell’utente una formula del tipo: “mioindirizzomail-cliente@miodominio.it”
Ora su https://www.sandbox.paypal.com/ potremmo fare login con gli account sandbox che abbiamo creato, vi troveremo il budget inserito durante la creazione, noteremo che è esattamente come un vero account paypal, ma il denaro e le transazioni sono virtuali.
Avendo in mente le credenziali del nostro account sandbox possiamo testare la nostra applicazione: http://labs.webcrafter.it/paypal-test/
Una volta provato sappiamo che i nostri bottoni funzioneranno e che Andrea riceverà i pagamenti senza problemi. Ma sicuri che non possiamo fare di meglio?
Dopotutto allo stato attuale delle cose, Andrea dovrebbe loggarsi al proprio pannello paypal per verificare se ci sono stati acquisti e poi abilitare manualmente l’utente a scaricare la foto o addirittura mandargli la foto per mail. come possiamo evitarglielo?
IPN instant payment notification
Vi ricordate lo schema che vi ho mostrato all’inizio dell’articolo precedente? Se no, andatevelo a rivedere. Ad ogni modo in quello schema si vede come il nostro obbiettivo è che Paypal reindirizzi l’utente ad una pagina del nostro sito (che decidiamo popolando il parametro return) ed allo stesso tempo mandi una notifica ad un altra url (che decidiamo popolando il parametro notify_url).
In cosa consiste la notifica? Comprende molte informazioni tra le più importanti:
- payment_status: ci rivela lo stato della transazione, è bene conoscere almeno le possibilità più frequenti:
- Completed: pagamento completato con successo
- Denied: pagamento negato
- Failed: pagamento fallito
- Pending: pagamento in sospeso
- Expired: l’autorizzazione è scaduta
- mc_currency: la valuta con la quale è stata effettuata la transazione
- mc_gross_x: l’importo totale nella valuta indicata da mc_currency
- mc_gross: l’importo totale in dollari
- payment_date: riporta la data della transazione
- item_number: il codice identificativo del prodotto (o dell’ordine) che abbiamo inviato attraverso il bottone nel passaggio precedente.
Per una panoramica completa delle informazioni che Paypal potrebbe inviarci nelle notifiche possiamo visitare la documentazione ufficiale al seguente indirizzo:
https://developer.paypal.com/docs/classic/ipn/integration-guide/IPNandPDTVariables/
Qualora lo stato del pagamento cambiasse, Paypal provvederebbe a reinviarci una notifica alla medesima url.
Andiamo quindi a creare il file miofile_ipn.php, che in seguito prepareremo a ricevere le notifiche, ma per ora popoliamo il parametro notify_url al momento della preparazione del nostro bottone inserendo la url del file (es. http://miosito.it/miofile_ipn.php).
<?php $url='https://www.paypal.com/cgi-bin/webscr' .'?cmd='.$cmd .'&business='.$busisness .'&lc='.$lc .'¤cy_code='.$currency_code .'&no_note='.$no_note .'&bn='.$bn .'&return='.$return .'&cbt='.$cbt .'&rm='.$rm .'&item_name='.$item_name .'&item_number='.$item_number .'&amount='.$amount .'¬ify_url=http://miosito.it/miofile_ipn.php'; ?>
Quindi di cosa deve occuparsi il nostro sito qualora riceva una notifica? Senz’altro dovrebbe salvare le informazioni, vediamo come fare.
Per prima apriremo miofile_ipn.php, al suo interno non faremo altro che prendere le informazioni che paypal ci invia con metodo POST e salvarle sul database.
<?php $ipn=$_POST; funzione_che_salva_sul_database($ipn); ?>
O potremmo decidere di salvare solo le informazioni più importanti, in questi casi comunque consiglio di serializzare tutto l’array e salvarlo sul database:
<?php $ipn=array(); $ipn['importo']=$_POST['']; $ipn['stato']=$_POST['payment_status']; $ipn['valuta']=$_POST['mc_currency']; $ipn['data']=$_POST['payment_date']; $ipn['id_prodotto']=$_POST['item_number']; // qui serializzo tutto l’array per poterlo salvare $ipn['serialize']=serialize($_POST); // per l’importo devo fare un operazione in più if($_POST['mc_gross_x']){ $ipn['importo']=$_POST['mc_gross_x']; }else{ $ipn['importo']=$_POST['mc_gross']; } // ora salvo la mia notifica funzione_che_salva_sul_database($ipn); ?>
Possiamo fare di più, infatti se scrivessimo una funzione che abiliti l’utente a scaricare una data foto potremmo usarla come segue:
<?php if($_POST['payment_status']=='Completed') { funzione_che_abilita_a_scaricare_foto($utente, $foto); } ?>
A questo punto il nostro amico Andrea non deve fare assolutamente nulla di più che caricare le proprie foto e pregare che qualcuno le acquisti.
Possiamo anche testare il tutto usando i nostri account sandbox, scopriremo che funziona tutto alla perfezione…
MA
Siamo davvero al sicuro? Avendo automatizzato tutto non c’è pericolo che qualcuno riesca a scaricare le foto senza pagarle? Come possiamo rendere il nostro sistema a prova di “imbroglioni”?