Il pagamento è un momento critico che può fare la differenza tra un sito di successo ed uno che non genera abbastanza business.
Attraverso vari strumenti PayPal offre la possibilità di poter gestire in tutta sicurezza gli incassi nel mondo online. In questo intervento verranno presentate le differenti modalità di integrazione dei prodotti PayPal illustrando i vari step (dalla sandbox al rilascio in produzione) necessari a creare rapidamente un’integrazione di successo.
1. PayPal e PHP
Verona 15 Maggio 2009
Giulio de Taddeo
“…fare denaro è un’arte. Lavorare è un arte. Un buon affare è il massimo delle arti.”
Confidential and Proprietary
3. Diffusione di PayPal nel Mondo
Più di 184 milioni di conti registrati nel mondo
Più di 184 milioni di conti registrati nel mondo
Disponibile in 190 Paesi e territori e 17 valute
Disponibile in 190 Paesi e territori e 17 valute
$ 14 miliardi volume totale di pagamenti nel mondo nel 2007
$ 14 miliardi volume totale di pagamenti nel mondo nel 2007
$ 563 milioni di ricavi nel 2007 (+35% YoY)
$ 563 milioni di ricavi nel 2007 (+35% YoY)
Confidential and Proprietary 3
4. Come Funziona PayPal
Con PayPal accetti pagamenti in 17 valute:
È inoltre possibile effettuare la conversione in altre 13 valute per le quali è
disponibile il DCC (Dynamic Currency Conversion) se l’acquirente ha una carta
di credito operante in quella valuta.
Confidential and Proprietary 4
5. Più valore con PayPal
3 milioni di conti in Italia
Sales lift Survey ‘07
Il 36% non avrebbe effettuato
l’acquisto in assenza di PayPal:
Principali motivi:
39%
SOLO con Sicurezza
61% Convenienza
Ricerca IPSOS (02/06)
Confidential and Proprietary 5
6. Perchè PayPal
Accettare PayPal vi permette di raggiungere una
community di acquirenti che altrimenti
escludereste dal vostro business.
Acquirenti
Esercenti
Confidential and Proprietary 6
8. Cosa significa Pagare con PayPal
Dal punto di vista dell’utente pagare con PayPal
significa affrontare un flusso che incorpora
almeno due schermate (hostate da PayPal.com)
che sono nei loro elementi principali invarianti
ovunque il buyer operi l’acquisto.
Confidential and Proprietary 8
12. Perchè Pagare con PayPal
E’ anche utile tenere presente i principali driver
d’uso di PayPal per la nostra community:
– Sicurezza che i propri dati finanziari non vengono
condivisi con il venditore.
– Esperienza d’acquisto facile e veloce.
– Praticità.
– Sicuro.
Confidential and Proprietary 12
14. Accettare Pagamenti sui Vostri Siti Internet
Esistono differenti soluzioni che permettono di
accettare pagamenti su una piattaforma e-
Commerce:
1. PayPal come unica soluzione per gestire tutti gli incassi
generati dal vostro sito (Sole Solution).
2. PayPal come metodo di Pagamento Aggiuntivo.
Confidential and Proprietary 14
16. Prodotti
In Italia sono disponibili due diversi prodotti
integrabili sulle vostre piattaforme di e-
Commerce:
1. Express Checkout (Pagamento Express)
2. Website Payment Standard (Pagamento Standard)
Confidential and Proprietary 16
18. Prima di Cominciare
Per supportare e velocizzare il lavoro di integrazione
PayPal mette a disposizione diversi tool:
• Sandbox (https://developer.paypal.com) – E’ un ambiente
che permette di effettuare test di integrazione
implementando pagamenti tra account fittizi.
• Integration Center (https://cms.paypal.com) – E’ il sito di
supporto per gli sviluppatori.
• Centro Logo (https://www.paypal.com/it/logo) – E’ il
punto in cui si possono trovare i loghi/bottoni PayPal
necessari per completare l’integrazione.
• Blog Tecnico (http://developer.paypal-
portal.com/pdn/board?board.id=it) – E’ il blog degli
sviluppatori PayPal.
Confidential and Proprietary 18
19. PayPal SDK
Un ottimo facilitatore per le integrazioni sono gli SDK
disponibili per gli sviluppatori.
Ovviamente sono disponibili diversi SDK in funzione della
tecnologia già presente sulle proprie piattaforme oppure
in funzione del linguaggio che meglio si conosce.
Percorso PayPal Developer Central -> Library -> SDKs
Confidential and Proprietary 19
20. Perchè il Layout è Importante
• Dare la giusta visibilità a PayPal sul vostro sito
informa gli utenti PayPal che il loro metodo di
pagamento preferito è accettato.
• PayPal consiglia di inserire il logo PayPal sulla
HP, nella pagina di descrizione prodotto e
nella pagina dedicata ai metodi di pagamento.
Confidential and Proprietary 20
21. Aumentare il Vostro Fatturato
Consentire agli utenti di pagare senza registrarsi
sul vostro sito di e-Commerce.
E’ dimostrato che tanto più è rapido il flusso di pagamento
(con meno schermate e form da riempire) quanto è più
piacevole l’acquisto. Sussistono quindi maggiori
probabilità che un visitatore occasionale diventi un
cliente abituale.
Confidential and Proprietary 21
22. E’ fondamentale costruire un’esperienza d’acquisto fruibile e
positiva!
Confidential and Proprietary 22
23. Iniziare l’Integrazione
Il primo passo a supporto di qualunque
integrazione è la creazione di un account
Sandbox in modo da poter testare il codice via
via che verrà scritto.
Confidential and Proprietary 23
28. Website Payment Standard (WPS)
• Il prodotto WebsitePaymentStandard è un
prodotto HTML based che ha nella semplicità di
integrazione il suo atout principale.
• E’ un prodotto alla portata anche di chi non ha
approfondite competenze di programmazione
(facili wizard permettono la creazione automatica
del codice relativo a pulsanti di pagamento).
• WPS permette di gestire agevolmente contenuti
volumi transazionali.
Confidential and Proprietary 28
29. Website Payment Standard (WPS)
• Il flusso di pagamento è il seguente:
Choose Pay CC Provide Bill to CC
Add Item(s) Provide Ship
Method and Pay Review Order Order
to Shopping To
Visa, MC, Method Summary Confirmation
Cart Information
PayPal Information
PP PP
Login to Agree to Transaction
PayPal Transaction Confirmation
• Dato che il pagamento avviene sui server di
PayPal è necessario ottenere i dettagli dell’esito
della transazione. Per tale motivo è necessario
processare gli IPN.
Confidential and Proprietary 29
30. Instant Payment Notification – WPS
Gli IPN sono script (asincroni) e sono utili per aggiornare il
vostro DB.
Per processare correttamente gli IPN è necessario costruire un
listener che permetta di processare il messaggio:
1. Le URL di provenienza sono le seguenti (per evitare spoof):
– URL di produzione: https://www.paypal.com/cgi-bin/webscr
– URL Sandbox: https://www.sandbox.paypal.com/cgi-bin/webscr
2. Parte del codice serve per recepire le variabili inviate dai server
PayPal in modo da updatare il proprio DB.
3. E’ necessario convalidare la notifica ai server di PayPal: bisogna
postare tutte le variabili (nel medesimo ordine) aggiungendo una
variabile cmd=_notify-validate.
4. PayPal restituisce una singola Word VERIFIED oppure INVALID a
cui bisogna rispondere con un post 200 OK.
Confidential and Proprietary 30
31. Instant Payment Notification – WPS
5. Prima di processare l’ordine è consigliabile eseguire
i seguenti test:
– Payment_status sia Completed (gli IPN sono inviati anche
per transazioni in Pending o in altri stati)
– Txn_id sia univoco (per prevenire frodi)
– Receiver_email sia un proprio indirizzo valido
– Se utilizzati verificare che i campo custom o Invoice siano
corretti
Confidential and Proprietary 31
32. Instant Payment Notification – WPS
E’ infine necessario definire l’indirizzo del listener IPN
all’interno dell’account business PayPal (Account ->
Profilo -> Preferenze per Notifica immediata del
pagamento) oppure specificando l’indirizzo nella
variabile notify_url.
Confidential and Proprietary 32
33. Instant Payment Notification – WPS
// leggi il post del sistema PayPal e aggiungi cmd
$txn_id = $_POST['txn_id'];
$req = 'cmd=_notify-validate'; $receiver_email = $_POST['receiver_email'];
$payer_email = $_POST['payer_email'];
foreach ($_POST as $key => $value) {
$value = urlencode(stripslashes($value)); if (!$fp) {
// HTTP ERROR
$req .= quot;&$key=$valuequot;; } else {
fputs ($fp, $header . $req);
} while (!feof($fp)) {
$res = fgets ($fp, 1024);
if (strcmp ($res, quot;VERIFIEDquot;) == 0) {
// check payment_status == Completed?
// reinvia al sistema PayPal per la convalida
// txn_id è già elaborato?
$header .= quot;POST /cgi-bin/webscr HTTP/1.0rnquot;; // receiver_email è il tuo indirizzo?
// payment_amount/payment_currency corretti?
$header .= quot;Content-Type: application/x-www-form-urlencodedrnquot;;
// elabora pagamento
$header .= quot;Content-Length: quot; . strlen($req) . quot;rnrnquot;; }
else if (strcmp ($res, quot;INVALIDquot;) == 0) {
$fp = fsockopen ('ssl://www.paypal.com', 443, $errno, $errstr, 30); // registra indagine manuale
}
}
// assegna variabili inviate a variabili locali fclose ($fp);
}
$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'];
Confidential and Proprietary 33
34. Payment Data Transfer – WPS
PDT è una comunicazione sincrona dipendente da azioni dell’utente.
PDT è un metodo per ottenere i dettagli della transazione in modo da
costruire sul vostro sito una pagina riassuntiva del pagamento
precedentemente avvenuto su PayPal.com
Dopo un pagamento PayPal trasmette la TransactionID ad un’indirizzo
definito nel profilo dell’Account (Account -> Profilo -> Preferenze per
i pagamenti su sito web).
Alla ricezione del TransactionID bisogna postare una FORM a PayPal
che includa la TrasactionID ed il proprio Identity Token
SUCCESS
<form method=post action=quot;https://www.paypal.com/cgi-bin/webscrquot;> first_name=Paolino+Paperino
<input type=quot;hiddenquot; name=quot;cmdquot; value=quot;_notify-synchquot;> last_name=De Paperi
<input type=quot;hiddenquot; name=quot;txquot; value=quot;TransactionIDquot;> payment_status=Completed
<input type=quot;hiddenquot; name=quot;atquot; value=quot;YourIdentityTokenquot;> payer_email=paperino%40hotmail.com
<input type=quot;submitquot; value=quot;PDTquot;> payment_gross=5
</form> mc_currency=EUR
custom=
...
Confidential and Proprietary 34
35. Payment Data Transfer – WPS
Flusso di pagamento WPS + PDT
Confidential and Proprietary 35
39. Express Checkout
Express Checkout è un prodotto API based.
Express Checkout permette di adattare
completamente il flusso di pagamento alle
proprie esigenze.
Express Checkout permette di gestire in modo
sincrono il flusso di pagamento.
Grazie alla DoExpressCheckoutPayment Express
Checkout offre la possibilità di gestire l’incasso
con una API call invece che tramite
messaggistica asincrona.
Confidential and Proprietary 39
40. Express Checkout – API
Infrastruttura API di Express Checkout:
Confidential and Proprietary 40
41. Express Checkout – Flussi
I flussi di pagamento principali sono i seguenti:
1. Express Checkout Mark
– Adattamento del flusso di pagamento PayPal ad un
flusso di pagamento esistente.
– Performante, ma si perde parte dei possibili benefici
che sarebbe possibile cogliere proponendo PayPal
Express Checkout.
Choose Pay CC Provide Bill to
Add Item(s) Provide Ship
Method and Pay Review Order Order
to Shopping To
Visa, MC, Method Summary Confirmation
Cart Information
PayPal Information
PP
Login to Transaction
PayPal Confirmation
Confidential and Proprietary 41
42. Express Checkout – Flussi
2. Express Checkout Shortcut
• Gli acquirenti possono acquistare anche senza
essersi preventivamente registrati presso il negozio
(acquisto emozionale). La registrazione può essere
proposta a valle del processo prefillando molti campi.
• Stessa infrastruttura di prodotto.
Choose Pay CC Provide Bill to
Add Item(s) Provide Ship
Method and Pay Review Order Order
to Shopping To
Visa, MC, Method Summary Confirmation
Cart Information
PayPal Information
PP PP
Login to Transaction
PayPal Confirmation
Confidential and Proprietary 42
44. Express Checkout – SetExpressCheckout
Attraverso la SetEC è possibile ottenere il token necessario alla
redirezione e settare alcuni parametri opzionali.
Confidential and Proprietary 44
45. Express Checkout – SetExpressCheckout
// Set request-specific fields.
function PPHttpPost($methodName_, $nvpStr_) { $paymentAmount = urlencode('example_payment_amuont');
//Prepara la req $currencyID = urlencode(‘EUR');
$nvpreq=quot;METHOD=$methodName_&VERSION=$version&PWD= $paymentType = urlencode('Sale');
$API_Password&USE // or 'Sale' or 'Order' 'Authorization'
R=$API_UserName&SIGNATURE=$API_Signature$nvpStr_quot;;
$returnURL = urlencode(quot;return_urlquot;);
// Set the request as a POST FIELD for curl. $cancelURL = urlencode('cancel_url');
curl_setopt($ch, CURLOPT_POSTFIELDS, $nvpreq);
$nvpStr =
// Get response from the server. quot;&Amt=$paymentAmount&ReturnUrl=$returnURL&CANCELURL=$cancelURL&PA
$httpResponse = curl_exec($ch); YMENTACTION=$paymentType&CURRENCYCODE=$currencyIDquot;;
if(!$httpResponse) { $httpParsedResponseAr = PPHttpPost('SetExpressCheckout', $nvpStr);
exit(quot;$methodName_ failed:
quot;.curl_error($ch).'('.curl_errno($ch).')'); if(quot;Successquot; == $httpParsedResponseAr[quot;ACKquot;]) {
} // Redirect to paypal.com.
$token = urldecode($httpParsedResponseAr[quot;TOKENquot;]);
// Extract the response details. $payPalURL = quot;https://www.paypal.com/webscr&cmd=_express-
$httpResponseAr = explode(quot;", $httpResponse); checkout&token=$tokenquot;;
if(quot;sandboxquot; === $environment || quot;beta-sandboxquot; ===
$httpParsedResponseAr = array(); $environment) {
foreach ($httpResponseAr as $i => $value) { $payPalURL =
$tmpAr = explode(quot;=quot;, $value); quot;https://www.$environment.paypal.com/webscr&cmd=_express-
if(sizeof($tmpAr) > 1) { checkout&token=$tokenquot;;
}
$httpParsedResponseAr[$tmpAr[0]] = $tmpAr[1]; header(quot;Location: $payPalURLquot;);
} exit;
} } else {
return $httpParsedResponseAr; exit('SetExpressCheckout failed: ' .
} print_r($httpParsedResponseAr, true));
}
Confidential and Proprietary 45
46. Express Checkout – SetExpressCheckout
// Set request-specific fields.
function PPHttpPost($methodName_, $nvpStr_) { $paymentAmount = urlencode('example_payment_amuont');
//Prepara la req $currencyID = urlencode(‘EUR');
$nvpreq=quot;METHOD=$methodName_&VERSION=$version&PWD= $paymentType = urlencode('Sale');
$API_Password&USE // or 'Sale' or 'Order' 'Authorization'
R=$API_UserName&SIGNATURE=$API_Signature$nvpStr_quot;; Definizione delle credenziali
$returnURL = urlencode(quot;return_urlquot;);
// Set the request as a POST FIELD for curl. $cancelURL = urlencode('cancel_url');
curl_setopt($ch, CURLOPT_POSTFIELDS, $nvpreq);
Le$nvpStr =
variabili obbligatorie da passare
quot;&Amt=$paymentAmount&ReturnUrl=$returnURL&CANCELURL=$cancelURL&PA
// Get response from the server.
$httpResponse = curl_exec($ch); nella SetEC sono:
YMENTACTION=$paymentType&CURRENCYCODE=$currencyIDquot;;
if(!$httpResponse) { VERSION = 57.0= PPHttpPost('SetExpressCheckout', $nvpStr);
$httpParsedResponseAr
exit(quot;$methodName_ failed:
quot;.curl_error($ch).'('.curl_errno($ch).')');
METHOD == $httpParsedResponseAr[quot;ACKquot;]) {
if(quot;Successquot; = SetExpressCheckout
// Redirect to paypal.com.
} RETURNURL = = urldecode($httpParsedResponseAr[quot;TOKENquot;]);
$token
// Extract the response details. http://www.tuosito/pagina_di_ritorno.php
$payPalURL = quot;https://www.paypal.com/webscr&cmd=_express-
checkout&token=$tokenquot;;
$httpResponseAr = explode(quot;", $httpResponse);
CANCELURL = if(quot;sandboxquot; === $environment || quot;beta-sandboxquot; ===
$httpParsedResponseAr = array(); $environment) {
foreach ($httpResponseAr as $i => $value) { http://www.tuosito/pagina_di_abbandono.php
$payPalURL =
$tmpAr = explode(quot;=quot;, $value); quot;https://www.$environment.paypal.com/webscr&cmd=_express-
if(sizeof($tmpAr) > 1) {
AMT = 0.01
checkout&token=$tokenquot;;
}
$httpParsedResponseAr[$tmpAr[0]] = $tmpAr[1]; header(quot;Location: $payPalURLquot;);
} exit;
} } else {
return $httpParsedResponseAr; exit('SetExpressCheckout failed: ' .
} print_r($httpParsedResponseAr, true));
}
Confidential and Proprietary 46
47. Express Checkout – SetExpressCheckout
// Set request-specific fields.
function PPHttpPost($methodName_, $nvpStr_) { $paymentAmount = urlencode('example_payment_amuont');
//Prepara la req $currencyID = urlencode(‘EUR');
$nvpreq=quot;METHOD=$methodName_&VERSION=$version&PWD= $paymentType = urlencode('Sale');
$API_Password&USE // or 'Sale' or 'Order' 'Authorization'
R=$API_UserName&SIGNATURE=$API_Signature$nvpStr_quot;;
$returnURL = urlencode(quot;return_urlquot;);
// Set the request as a POST FIELD for curl. $cancelURL = urlencode('cancel_url');
curl_setopt($ch, CURLOPT_POSTFIELDS, $nvpreq);
$nvpStr =
// Get response from the server. quot;&Amt=$paymentAmount&ReturnUrl=$returnURL&CANCELURL=$cancelURL&PA
$httpResponse = curl_exec($ch); YMENTACTION=$paymentType&CURRENCYCODE=$currencyIDquot;;
Definizione dei parametri di pagamento e del tipo di $nvpStr);
$httpParsedResponseAr = PPHttpPost('SetExpressCheckout',
if(!$httpResponse) {
pagamento (contestuale o order+auth+capt)
exit(quot;$methodName_ failed:
if(quot;Successquot; == $httpParsedResponseAr[quot;ACKquot;]) {
quot;.curl_error($ch).'('.curl_errno($ch).')');
} // Redirect to paypal.com.
$token = urldecode($httpParsedResponseAr[quot;TOKENquot;]);
// Extract the response details. $payPalURL = quot;https://www.paypal.com/webscr&cmd=_express-
$httpResponseAr = explode(quot;", $httpResponse); checkout&token=$tokenquot;;
if(quot;sandboxquot; === $environment || quot;beta-sandboxquot; ===
$httpParsedResponseAr = array(); $environment) {
foreach ($httpResponseAr as $i => $value) { $payPalURL =
$tmpAr = explode(quot;=quot;, $value); quot;https://www.$environment.paypal.com/webscr&cmd=_express-
if(sizeof($tmpAr) > 1) { checkout&token=$tokenquot;;
}
$httpParsedResponseAr[$tmpAr[0]] = $tmpAr[1]; header(quot;Location: $payPalURLquot;);
} exit;
} } else {
return $httpParsedResponseAr; exit('SetExpressCheckout failed: ' .
} print_r($httpParsedResponseAr, true));
}
Confidential and Proprietary 47
48. Express Checkout – SetExpressCheckout
// Set request-specific fields.
function PPHttpPost($methodName_, $nvpStr_) { $paymentAmount = urlencode('example_payment_amuont');
//Prepara la req $currencyID = urlencode(‘EUR');
$nvpreq=quot;METHOD=$methodName_&VERSION=$version&PWD= $paymentType = urlencode('Sale');
$API_Password&USE // or 'Sale' or 'Order' 'Authorization'
R=$API_UserName&SIGNATURE=$API_Signature$nvpStr_quot;;
$returnURL = urlencode(quot;return_urlquot;);
// Set the request as a POST FIELD for curl. $cancelURL = urlencode('cancel_url');
curl_setopt($ch, CURLOPT_POSTFIELDS, $nvpreq);
$nvpStr =
// Get response from the server. quot;&Amt=$paymentAmount&ReturnUrl=$returnURL&CANCELURL=$cancelURL&PA
$httpResponse = curl_exec($ch); YMENTACTION=$paymentType&CURRENCYCODE=$currencyIDquot;;
if(!$httpResponse) { $httpParsedResponseAr = PPHttpPost('SetExpressCheckout', $nvpStr);
exit(quot;$methodName_ failed:
quot;.curl_error($ch).'('.curl_errno($ch).')'); if(quot;Successquot; == $httpParsedResponseAr[quot;ACKquot;]) {
} // Redirect to paypal.com.
Gestione del token
// Extract the response details.
$token = urldecode($httpParsedResponseAr[quot;TOKENquot;]);
$payPalURL = quot;https://www.paypal.com/webscr&cmd=_express-
$httpResponseAr = explode(quot;", $httpResponse); checkout&token=$tokenquot;;
if(quot;sandboxquot; === $environment || quot;beta-sandboxquot; ===
$httpParsedResponseAr = array(); $environment) {
foreach ($httpResponseAr as $i => $value) { $payPalURL =
$tmpAr = explode(quot;=quot;, $value); quot;https://www.$environment.paypal.com/webscr&cmd=_express-
if(sizeof($tmpAr) > 1) { checkout&token=$tokenquot;;
}
$httpParsedResponseAr[$tmpAr[0]] = $tmpAr[1]; header(quot;Location: $payPalURLquot;);
}
}
Redirezione } else {
exit;
return $httpParsedResponseAr; exit('SetExpressCheckout failed: ' .
} print_r($httpParsedResponseAr, true));
}
Confidential and Proprietary 48
49. Express Checkout – SetExpressCheckout
E’ possibile customizzare alcuni elementi delle pagine di Checkout
hostate da PayPal.com
E’ buona norma per esempio utilizzare un logo nella pagina di
pagamento (è consigliabile che sia hostato su server https).
Se la piattaforma di e-Commerce ha già provveduto a raccogliere
l’indirizzo di spedizione è importante operare l’override dell’indirizzo
dell’utente (ADDRESSOVERRIDE=1).
...
&METHOD=SetExpressCheckout
&RETURNURL=https://...
&CANCELURL=https://...
&AMT=10.00&CURRENCYCODE=EUR
&PAYMENTACTION=Sale&
&HDRIMG=https://www.test.it/website-logo.gif
ADDRESSOVERRIDE=1
&SHIPTOSTREET=Via vai 1
SHIPTOSTREET2=
&SHIPTOCITY=Milano
&SHIPTOSTATE=MI
&SHIPTOCOUNTRYCODE=IT
&SHIPTOZIP=20124
&PHONENUM=02-22222222
...
Confidential and Proprietary 49
50. Express Checkout – SetExpressCheckout
Usualmente per facilitare i processi contabili di quadratura
si utilizza la variabile invnum che permette di accoppiare
alla transazione un proprio univoco (codice fattura).
Laddove si stia vendendo un bene/servizio digitale è
consigliabile oscurare la sezione relativa all’indirizzo di
spedizione con il parametro noshipping=1
In una piattaforma di e-Commerce multilingua è
necessario utilizzare la variabile localecode per
impostare la lingua nelle pagine di pagamento hostate su
PayPal.com
Confidential and Proprietary 50
51. Express Checkout – Sole Solution
E’ possibile anche con Express Checkout avvalersi della
possibilità di accettare anche pagamenti provenienti da
carte di credito.
Per abilitare tale servizio si utilizzano i parametri:
landingpage=billing e solutiontype=sole.
Nel caso la vostra piattaforma utilizzi già un gateway
bancario per l’addebito delle carte di credito si può
forzare da codice la possibilità di accettare solo
pagamenti provenienti da account PayPal.
In tal caso si useranno i seguenti settaggi:
landingpage=login e solutiontype=mark
Confidential and Proprietary 51
53. Express Checkout – GetExpressCheckoutDetails
GetECDetails è una chiamata opzionale.
Permette di retrivare dettagli dell’account che sta
per completare l’acquisto.
GetECDetails diventa una chiamata obbligatoria
quando si sta implementando un flusso di
pagamento che prevede la vendita anche ad
utenti non registrati.
Confidential and Proprietary 53
54. Express Checkout – GetExpressCheckoutDetails
function PPHttpPost($methodName_, $nvpStr_) {
.
.
// Obtain the token from PayPal.
.
if(!array_key_exists('token', $_REQUEST)) {
$nvpreq =
exit('Token is not received.');
quot;METHOD=$methodName_&VERSION=$version&PWD=$API_Password&U
}
SER=$API_UserName&SIGNATURE=$API_Signature$nvpStr_quot;;
$token = urlencode(htmlspecialchars($_REQUEST['token']));
// Set the request as a POST FIELD for curl.
$nvpStr = quot;&TOKEN=$tokenquot;;
curl_setopt($ch, CURLOPT_POSTFIELDS, $nvpreq);
// Get response from the server.
// Chiamata API GetEC
$httpResponse = curl_exec($ch);
$httpParsedResponseAr = PPHttpPost('GetExpressCheckoutDetails', $nvpStr);
if(!$httpResponse) {
exit('$methodName_ failed:
if(quot;Successquot; == $httpParsedResponseAr[quot;ACKquot;]) {
'.curl_error($ch).'('.curl_errno($ch).')');
// Extract the response details.
}
$payerID = $httpParsedResponseAr['PAYERID'];
$street1 = $httpParsedResponseAr[quot;SHIPTOSTREETquot;];
// Extract the response details.
if(array_key_exists(quot;SHIPTOSTREET2quot;,
$httpResponseAr = explode(quot;", $httpResponse);
$httpParsedResponseAr)) {
$street2 =
$httpParsedResponseAr = array();
$httpParsedResponseAr[quot;SHIPTOSTREET2quot;];
foreach ($httpResponseAr as $i => $value) {
}
$tmpAr = explode(quot;=quot;, $value);
$city_name = $httpParsedResponseAr[quot;SHIPTOCITYquot;];
if(sizeof($tmpAr) > 1) {
$state_province = $httpParsedResponseAr[quot;SHIPTOSTATEquot;];
$postal_code = $httpParsedResponseAr[quot;SHIPTOZIPquot;];
$httpParsedResponseAr[$tmpAr[0]] = $tmpAr[1];
$country_code =
}
$httpParsedResponseAr[quot;SHIPTOCOUNTRYCODEquot;];
}
exit('Get Express Checkout Details Completed Successfully:
if((0 == sizeof($httpParsedResponseAr)) ||
'.print_r($httpParsedResponseAr, true));
!array_key_exists('ACK', $httpParsedResponseAr)) {
} else {
exit(quot;Invalid HTTP Response for POST
exit('GetExpressCheckoutDetails failed: ' .
request($nvpreq) to $API_Endpoint.quot;);
print_r($httpParsedResponseAr, true));
}
}
return $httpParsedResponseAr;
}
Confidential and Proprietary 54
55. Express Checkout – GetExpressCheckoutDetails
function PPHttpPost($methodName_, $nvpStr_) {
.
.
// Obtain the token from PayPal.
.
if(!array_key_exists('token', $_REQUEST)) {
$nvpreq =
exit('Token is not received.');
quot;METHOD=$methodName_&VERSION=$version&PWD=$API_Password&U
}
SER=$API_UserName&SIGNATURE=$API_Signature$nvpStr_quot;;
$token = urlencode(htmlspecialchars($_REQUEST['token']));
// Set the request as a POST FIELD for curl.
$nvpStr = quot;&TOKEN=$tokenquot;;
curl_setopt($ch, CURLOPT_POSTFIELDS, $nvpreq);
// Get response from the server.
// Chiamata API GetEC
$httpResponse = curl_exec($ch);
$httpParsedResponseAr = PPHttpPost('GetExpressCheckoutDetails', $nvpStr);
if(!$httpResponse) {
Raccolta dei dettagli dell’acquirente
exit('$methodName_ failed:
if(quot;Successquot; == $httpParsedResponseAr[quot;ACKquot;]) {
'.curl_error($ch).'('.curl_errno($ch).')');
// Extract the response details.
}
$payerID = $httpParsedResponseAr['PAYERID'];
$street1 = $httpParsedResponseAr[quot;SHIPTOSTREETquot;];
// Extract the response details.
if(array_key_exists(quot;SHIPTOSTREET2quot;,
$httpResponseAr = explode(quot;", $httpResponse);
$httpParsedResponseAr)) {
$street2 =
$httpParsedResponseAr = array();
$httpParsedResponseAr[quot;SHIPTOSTREET2quot;];
foreach ($httpResponseAr as $i => $value) {
}
$tmpAr = explode(quot;=quot;, $value);
$city_name = $httpParsedResponseAr[quot;SHIPTOCITYquot;];
if(sizeof($tmpAr) > 1) {
$state_province = $httpParsedResponseAr[quot;SHIPTOSTATEquot;];
$postal_code = $httpParsedResponseAr[quot;SHIPTOZIPquot;];
$httpParsedResponseAr[$tmpAr[0]] = $tmpAr[1];
$country_code =
}
$httpParsedResponseAr[quot;SHIPTOCOUNTRYCODEquot;];
}
exit('Get Express Checkout Details Completed Successfully:
if((0 == sizeof($httpParsedResponseAr)) ||
'.print_r($httpParsedResponseAr, true));
!array_key_exists('ACK', $httpParsedResponseAr)) {
} else {
exit(quot;Invalid HTTP Response for POST
exit('GetExpressCheckoutDetails failed: ' .
request($nvpreq) to $API_Endpoint.quot;);
print_r($httpParsedResponseAr, true));
}
}
return $httpParsedResponseAr;
}
Confidential and Proprietary 55
57. Express Checkout – DoExpressCheckoutPayment
DoECPayament è la chiamata cardine di ExpressCheckout
perchè è la funzione che da’ luogo se successful
all’incasso vero e proprio (se PAYMENTACTION=Sale).
$payerID = urlencode(quot;payer_idquot;);
$token = urlencode(quot;tokenquot;);
$paymentType = urlencode(quot;Authorizationquot;);
// or 'Sale' or 'Order'
$paymentAmount = urlencode(quot;payment_amountquot;);
Parametri principali $currencyID = urlencode(“EURquot;);
$nvpStr =
quot;&TOKEN=$token&PAYERID=$payerID&PAYMENTACTION=$paymentType
&AMT=$paymentAmount&CURRENCYCODE=$currencyIDquot;;
// API call
$httpParsedResponseAr = PPHttpPost('DoExpressCheckoutPayment',
$nvpStr);
if(quot;Successquot; == $httpParsedResponseAr[quot;ACKquot;]) {
exit('Express Checkout Payment Completed Successfully:
'.print_r($httpParsedResponseAr, true));
} else {
exit('DoExpressCheckoutPayment failed: ' .
print_r($httpParsedResponseAr, true));
}
Confidential and Proprietary 57
59. Express Checkout Shortcut
Per poter ridurre il flusso di pagamento al
massimo è buona norma operare quanto segue:
• Valorizzare nella SetEC almeno il campo desc
inviando il dettaglio del Totale da addebitare.
• Accodare all’URL insieme al token
useraction=commit (non passarla come variabile
nella stringa NVP)
In tal modo il vostro acquirente nella seconda
pagina del pagamento avrà visione del totale da
pagare e avrà la percezione di essere addebitato
a seguito del click sul bottone Paga Ora.
Confidential and Proprietary 59
62. Order – Authorization – Capture
Oltre a pagamenti contestuali è possibile fruire di
una modalità di pagamento che prevede 3
distinte fasi:
1. Order
2. Authorization – Allocazione di fondi da plafond.
3. Capture – Cattura dei fondi precedentemente
riservati.
Confidential and Proprietary 62
63. Express Checkout – Order
Una chiamata order successful apre una finestra
temporale di 29 giorni all’interno della quale è
possibile effettuare successive autorizzazioni.
Per poter implementare un order è sufficiente
impostare il seguente parametro
paymentaction=order nella
DoExpressCheckout
Confidential and Proprietary 63
64. Express Checkout – DoAuthorization
Se la vostra piattaforma di e-Commerce ha effettuato con
successo un order è possibile invocare un’autorizzazione
con l’API DoAuthorization.
L’autorizzazione provvede a verificare la disponibilità dei fondi
richiesti e se possibile ne richiede il blocco.
TransactionID ritornato dalla DoEC diventa l’AuthorizationID
$transactionID = urlencode('example_transaction_id');
$amount = urlencode('example_amount');
$currency = urlencode(‘EUR');
$nvpStr=quot;&TRANSACTIONID=$transactionID&AMT=$amount&CURRENCYC
ODE=$currencyquot;;
// Execute the API
$httpParsedResponseAr = PPHttpPost('DoAuthorization', $nvpStr);
if(quot;Successquot; == $httpParsedResponseAr[quot;ACKquot;]) {
exit('DoAuthorization Completed Successfully:
'.print_r($httpParsedResponseAr, true));
} else {
exit('DoAuthorization failed: ' .
print_r($httpParsedResponseAr, true));
}
Confidential and Proprietary 64
65. Express Checkout – DoCaptureOrder
Se una chiamata DoAuthorization ha avuto
successo si apre una finestra temporale di 3
giorni* per poter effettuare una chiamata
DoCapture.
$authorizationID = urlencode('example_authorization_id');
CompleteType=Complete indica che il Capture
$amount = urlencode('example_amount');
$currency = urlencode(‘EUR');
invocato è l’ultimo
$completeCodeType = urlencode('Complete');
$invoiceID = urlencode('example_invoice_id');
$nvpStr=quot;&AUTHORIZATIONID=$authorizationID&AMT=$amount&COMPLE
TETYPE=$completeCodeType&CURRENCYCODE=$currencyquot;;
// Execute the API operation;
$httpParsedResponseAr = PPHttpPost('DoCapture', $nvpStr);
if(quot;Successquot; == $httpParsedResponseAr[quot;ACKquot;]) {
exit('Capture Completed Successfully:
'.print_r($httpParsedResponseAr, true));
} else {
exit('DoCapture failed: ' . print_r($httpParsedResponseAr,
true));
}
*Valore standard
Confidential and Proprietary 65
66. Express Checkout – DoVoid
Se per qualche motivo di business non si intende
chiudere le chiamate, è necessario utilizzare la
chiamata DoVoid per effettuare l’annullamento
della precedente operazione di Authorization.
$authorizationID = urlencode('authorization_id');
$nvpStr=quot;&AUTHORIZATIONID=$authorizationIDquot;;
// Execute the API
$httpParsedResponseAr = PPHttpPost('DOVoid', $nvpStr);
if(quot;Successquot; == $httpParsedResponseAr[quot;ACKquot;]) {
exit('Void Completed Successfully:
'.print_r($httpParsedResponseAr, true));
} else {
exit('DoVoid failed: ' . print_r($httpParsedResponseAr, true));
}
*Valore standard
Confidential and Proprietary 66
67. THANK YOU FOR YOUR TIME
Domande?
Confidential and Proprietary 67
68. PayPal e PHP
Verona 15 Maggio 2009
Giulio de Taddeo
“…fare denaro è un’arte. Lavorare è un arte. Un buon affare è il massimo delle arti.”
Confidential and Proprietary