martedì 5 maggio 2009

Gestione di un acquisto PayPal

Creare innanzitutto da Sandbox (http://developer.paypal.com) un account Business ed uno Personal (personalmente ho preferito creare manualmente due utenti italiani, visto che nei preimpostati al momento non è possibile farlo), attivare email ed associare una carta di credito fittizia oppure un conto. Nell'utente Business, andare su profile->website payment preferences, attivare Auto-Return, inserire l'indirizzo di ritorno PDT (es.: http://pdt.php) e attivare Payment Data Transfer e segnarsi l'id.
Poi su profile -> Instant Payment Notification abilitare l'opzione ed inserire l'url che gestirà l'IPN (es: http://...../ipn.php).
Poi andare su merchant services e creare un bottone di acquisto e copiarne ed incollarne il codice in una pagina Web (es: payWithPayPal.php), aggiungendo se necessario un campo hidden chiamato "custom" e valorizzato con un valore di cui si vuole tenere traccia (max 255 caratteri). Questo è necessario se voglio per esempio salvare su database l'andamento della transazione se andata a buon fine ed associarla all'utente salvato in sessione: essendo fatte su ipn.php solo chiamate asincrone, l'istruzione $_SESSION non funziona come ci si aspetterebbe. Passandogli invece la variabile custom, posso riceverla comunque in ipn.php e farci tutte le operazioni che desidero.
Ecco i codici di esempio delle due pagine:

payWithPayPal.php











ipn.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";

$sandbox = isset($_POST['test_ipn']) ? true : false;

if ($sandbox) {
$fp = fsockopen ('www.sandbox.paypal.com', 80, $errno, $errstr, 30);
} else {
$fp = fsockopen ('ssl://www.paypal.com', 443, $errno, $errstr, 30);
}

// assign posted variables to local variables
$custom = $_POST['custom'];

if (!$fp) {
// HTTP ERROR
} else {
fputs ($fp, $header . $req);
while (!feof($fp)) {
$res = fgets ($fp, 1024);
if (strcmp ($res, "VERIFIED") == 0) {


if(isset($_POST['payment_status'])){
if ($_POST['payment_status']=="Completed"){
//mettere qui la logica di inserimento di dati nel db
}
}

}
}
fclose($fp);
}

?>




infine, ecco il codice della pagina se si vuole utilizzare pdt.php:


$tx = $_GET['tx'];

/*
Probabilmente è sufficiente usare PDT: qui la pagina capisce che proviene da paypal e quindi posso salvare
nel DB l'abbonamento che ha scelto l'utente
*/
/*
$refe=$_SERVER['HTTP_REFERER'];//Estraggo la pagina di provenienza del navigatore
$ip=$_SERVER['REMOTE_ADDR'];//Estraggo l'IP del navigatore
*/
?>
grazie per aver effettuato il pagamento. La transazione è stata completata e una ricevuta dell'acquisto è stata inviata al tuo indirizzo email. Per visualizzare i dettagli sulla transazione effettua l'accesso al tuo conto dall'indirizzo www.sandbox.paypal.com/it.



cmd:


ID transazione: ">


Token identità (quella che imposto attivando PDT sul sito del venditore):