Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Nell'articolo precedente di questa serie abbiamo visto, ragionando con una logica ad
oggetti, quello che dovremo realizzare ora nella pratica. In questo articolo vedremo
come implementare la classe parent (che chiameremo IPNListener). Questa classe
la potremo utilizzare per qualsiasi nostro progetto che prevede
l'implementazione di un pagamento.
Array<?phpArray//systemArraydefine("SIMULATION",
1);Arraydefine("SIMULATION_URL",
"www.sandbox.paypal.com");Arraydefine("PRODUCTION_URL",
"www.paypal.com");Arraydefine("PRIMARY_PAYPAL_EMAIL",
"email@sito.com");Arraydefine("PRIMARY_SANDBOX_EMAIL",
"admin_1284367352_biz@bluewin.ch");ArrayArray//dbArraydefine("
HOST", "localhost");Arraydefine("DB_USER",
"root");Arraydefine("DB_NAME",
"paypal");Arraydefine("DB_PASSWORD",
"*******");ArrayArray//messagesArraydefine("ADMIN_MAIL",
"maurizio.tarchini@bluewin.ch");Arraydefine("NO_REPLY",
"no_reply@site.com");ArrayArraydefine("AMMOUNT",
50);Array?>Array
• vai in Sandbox;
• seleziona l'account amministrativo;
• loggati all'account amministrativo;
• clicca su profilo;
• clicca su email
Se hai creato l'account come descritto nel primo articolo, sarà anche l'unico indirizzo
email.
Seguono i dati di connessione al database, il mio email, l'email di risposta per i
messaggi di sistema, ed infine il costo del servizio.
La classe IPNListener
Array<?phpArrayrequire_once 'pp_config.php';ArrayArrayabstract
class IPNListenerArray{Array
Come vedi inseriremo i valori nella variabile $req. Iniziamo con l'inserire il parametro
aggiuntivo (cmd=_notify-validate) ed in seguito con un ciclo foreach scorriamo
l'array POST ed inseriamo le coppie chiave valore nella variabile $req.
A questo punto siamo pronti per preparare gli headers della richiesta che faremo a
PayPal. Ma siccome in questi headers è anche contenuto l'url (che sarà PayPal in
produzione o Sandbox in simulazione), prima verifichiamo appunto in che
circostanza siamo.
Arrayif(SIMULATION)Array{Array $url =
SIMULATION_URL;Array}ArrayelseArray{Array $url =
PRODUCTION_URL;Array}Array
All'inizio, controlliamo che il soket sia stato veramente aperto. In caso contrario
troveremo delle indicazioni nelle variabili $errstr e $errno. Nota che stamparle a
video sarà perfettamente inutile; questa pagina infatti non sarà visualizzata da
nessuno. Eventualmente è possibile farci recapitare tramite email i valori di queste
variabili.
Noi semplicemente, utilizzeremo il metodo sendReport() che ci indicherà che la
notifica di una certa transazione ha avuto dei problemi. In seguito potremo verificare
dall'account di PayPal se vi è stato veramente il pagamento; se è tutto ok potremo
attivare manualmente l'account.
Quindi implementiamo i due metodi molto simili per verificare che la transazione sia
completa (isCompleted) e che l'email corrisponda all'email primario di PayPal (
isPrimaryEmail)
PRIMARY_PAYPAL_EMAIL;Array }ArrayArray
if(trim($_POST['receiver_email']) === $email)Array {Array
return TRUE;Array }Array return FALSE;Array}Array
Come puoi vedere sono molto semplici. Nota che nel secondo metodo,
verifichiamo se si tratta di una simulazione o meno e a dipendenza dell'esito
procediamo con il confronto del giusto email.
Andiamo ora ad inserire i due metodi astratti, in questo modo:
Ed ora non ci resta che definire il metodo che darà l'ok per l'attivazione dell'account
(in questo caso, più in generale darà l'autorizzazione a procedere).
Questo metodo dovrà verificare che tutti i controlli abbiano dato esito positivo.
Array<?phpArrayrequire_once 'pp_config.php';ArrayArrayabstract
class IPNListenerArray{Array private function
isVerifiedIPN()Array {Array $req =
'cmd=_notify-validate';Array foreach ($_POST as $key =>
$value)Array {Array $value =
urlencode(stripslashes($value));Array $req .=
"&$key=$value";Array }ArrayArray //Modificando
la costante SIMULATION nel file di configurazioneArray
//è possibile passare dall'ambiente di simulazione a quello di
produzioneArray if(SIMULATION)Array {Array
$url = SIMULATION_URL;Array }Array
elseArray {Array $url = PRODUCTION_URL;Array
}ArrayArray $header = "POST /cgi-bin/webscr
HTTP/1.0\r\n";Array $header .= "Host:
$url:443\r\n";Array $header .= "Content-Type:
application/x-www-form-urlencoded\r\n";Array $header .=
"Content-Length: " . strlen($req) . "\r\n\r\n";ArrayArray
$fp = fsockopen ("ssl://$url", 443, $errno, $errstr,
30);ArrayArray if (!$fp)Array {Array
// HTTP ERRORArray // $errstr - $errnoArray
$this->sendReport();Array return FALSE;Array
}Array elseArray {Array fputs
($fp, $header . $req);Array while (!feof($fp))Array
{Array $res = fgets ($fp,
1024);Array if (strcmp($res, "VERIFIED") ==
0)Array {Array fclose
($fp);Array return TRUE;Array
}Array else if (strcmp ($res, "INVALID") ==
0)Array {Array //se la
procedura non è legittima invia un email
all'amministratoreArray
$this->sendReport();Array fclose
($fp);Array return FALSE;Array
}Array }Array }Array }ArrayArray
private function sendReport()Array {Array
if(SIMULATION)Array {Array $add = "-
SIMULAZIONE -";Array }Array elseArray
{Array $add = "";Array }Array
//messaggio all'amministratoreArray $subject = "$add
Problema IPN";Array $message = "Si è verificato un
problema nella seguente transazione:\r\n\r\n";Array
$message .= "Nome: " . $_POST['first_name'] . ' ' .
$_POST['last_name'] . "\r\n";Array $message .= "email:
" . $_POST['payer_email'] . "\r\n";Array $message .=
"id transazione: " . $_POST['txn_id'] . "\r\n";Array
$message .= "oggetto: " .
$_POST['transaction_subject'];ArrayArray
mail(ADMIN_MAIL,$subject,$message,"From: " . NO_REPLY);Array
Pagina 7 di 9
Conclusione
1. Preparazione
2. Chiarirsi le idee
3. Le procedure generali
4. Le procedure specifiche
Pagina 8 di 9
5. Testare l'applicazione
6. Creare dinamicamente i pulsanti di pagamento