Raga siccome ho fatto un sito di eCommerce (per il progetto di basi di dati) adesso, al di là del progetto, voglio concretizzare la fase di acquisto della merce proponendo metodi di pagamento OnLine quali PayPal e Carta di Credito.
Riguardo PayPal ho scelto di usare il metodo di "Notifica Immediata di Pagamento" ovvero IPN ho fatto una marea di test e credo di aver raggiunto qualche risultato, finalmente, cercando un po qua ed un po la, vorrei solo dei consigli su alcune cose e magari sapere se ho proceduto bene.
Ecco quindi la procedura che ho usato:
1) Il cliente sceglie il metodo di pagamento PayPal e di conseguenza il pulsante "Acquista" (per finalizzare l'acquisto) avrà questo codice:
codice:
<form action="https://www.sandbox.paypal.com/it/cgi-bin/webscr" method="post">
<input type="hidden" name="cmd" value="_cart">
<input type="hidden" name="upload" value="1">
<input type="hidden" name="business" value="...INDIRIZZO PRIMARIO PAYPALL...">
<input type="hidden" name="item_name_1" value="...Nome prodotto 1...">
<input type="hidden" name="item_count_1" value="...ID prodotto 1...">
<input type="hidden" name="item_number_1" value="...ID prodotto 1...">
<input type="hidden" name="quantity_1" value="...Quantita 1...">
<input type="hidden" name="amount_1" value="...Prezzo 1...">
<input type="hidden" name="item_name_X" value="...Nome prodotto X...">
<input type="hidden" name="item_count_X" value="...ID prodotto X...">
<input type="hidden" name="item_number_X" value="...ID prodotto X...">
<input type="hidden" name="quantity_X" value="...quantita X...">
<input type="hidden" name="amount_X" value="...prezzo X...">
<input type="hidden" name="currency_code" value="EUR">
<input type="hidden" name="shipping_1" value="...Costo Spedizione...">
<input type="hidden" name="return" value="http://www.miosito.com/get_paypal.php?id=...SESSIONE...">
<input type="hidden" name="cancel_return" value="http://www.miosito.com/get_paypal.php?id=...SESSIONE...">
<input type="hidden" name="notify_url" value="http://www.miosito.com/get_paypal.php?id=...SESSIONE...">
<input type="image" src="http://www.sandbox.paypal.com/it_IT/i/btn/x-click-but01.gif" name="submit" alt="Effettua i tuoi pagamenti con PayPal. È un sistema rapido, gratuito e sicuro.">
</form>
E la pagina GET_PAYPAL.PHP invece contiene il codice preso da esempio su PayPal:
Codice PHP:
<?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 ('www.sandbox.paypal.com', 80, $errno, $errstr, 30);
// 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 ($fp, 1024);
if (strcmp ($res, "VERIFIED") == 0) {
// Verifica che payment_status è "Completed"
// Verifica che non hai già processato txn_id
// Verifica che receiver_email è la tua email primaria PayPal
// Verifica che payment_amount/payment_currency sono corretti
// Prosegui col pagamento
if ( strcmp ($payment_status, "COMPLETED") == 0 ) {
// Pagamento Completato
//.....
}
}
else if (strcmp ($res, "INVALID") == 0) {
// log per una investigazione manuale
// Invio email di avviso
$mail_From = "From: [email]mycommerce@noreply.com[/email]";
$mail_To = "";
$mail_Subject = "INVALID IPN";
$mail_Body = $req;
foreach ($_POST as $key => $value){
$emailtext .= $key . " = " .$value ."\n\n";
}
mail($mail_To, $mail_Subject, $emailtext . "\n\n" . $mail_Body, $mail_From);
}
}
fclose ($fp);
}
?>
Ora le mie domande sono:
1) Mi conviene usare il metodo "_CART" passando quindi tutti i prodotti acquistati oppure usare "_XCLICK" passando un Titolo identificativo dello specifico ordine? (la seconda è più semplice...però la prima è più carina anche perchè permette di avere un buono storico anche su PayPal sia per il cliente che per me)
2) Questo codice è completamente sicuro? Come può essere migliorato?
3) Siccome dovrei gestire più metodi di pagamento come mi consigliate di strutturare la parte finale del carrello per fare in modo da standardizzare l'uso di un qualsiasi metodo?