PayPal e PHP

2,919 views

Published on

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.

Published in: Technology, Economy & Finance
0 Comments
3 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
2,919
On SlideShare
0
From Embeds
0
Number of Embeds
108
Actions
Shares
0
Downloads
77
Comments
0
Likes
3
Embeds 0
No embeds

No notes for slide

PayPal e PHP

  1. 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
  2. 2. Perchè PayPal Confidential and Proprietary
  3. 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. 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. 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. 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
  7. 7. Confidential and Proprietary 7
  8. 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
  9. 9. Cosa significa Pagare con PayPal Confidential and Proprietary 9
  10. 10. Cosa significa Pagare con PayPal Confidential and Proprietary 10
  11. 11. Cosa significa Pagare con PayPal Confidential and Proprietary 11
  12. 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
  13. 13. Accettare PayPal Confidential and Proprietary
  14. 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
  15. 15. Prodotti PayPal Confidential and Proprietary
  16. 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
  17. 17. Integrare PayPal Confidential and Proprietary
  18. 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. 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. 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. 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. 22. E’ fondamentale costruire un’esperienza d’acquisto fruibile e positiva! Confidential and Proprietary 22
  23. 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
  24. 24. Iniziare l’Integrazione Confidential and Proprietary 24
  25. 25. Iniziare l’Integrazione Confidential and Proprietary 25
  26. 26. Iniziare l’Integrazione Confidential and Proprietary 26
  27. 27. PayPal Website Payment Standard Confidential and Proprietary
  28. 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. 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. 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. 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. 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. 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. 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. 35. Payment Data Transfer – WPS Flusso di pagamento WPS + PDT Confidential and Proprietary 35
  36. 36. Payment Data Transfer – WPS Confidential and Proprietary 36
  37. 37. Payment Data Transfer – WPS Confidential and Proprietary 37
  38. 38. PayPal Express Checkout Confidential and Proprietary
  39. 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. 40. Express Checkout – API Infrastruttura API di Express Checkout: Confidential and Proprietary 40
  41. 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. 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
  43. 43. SetExpressCheckout Confidential and Proprietary
  44. 44. Express Checkout – SetExpressCheckout Attraverso la SetEC è possibile ottenere il token necessario alla redirezione e settare alcuni parametri opzionali. Confidential and Proprietary 44
  45. 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;&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. 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;&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. 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;&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. 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;&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. 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. 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. 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
  52. 52. GetExpressCheckoutDetails Confidential and Proprietary
  53. 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. 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;&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. 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;&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
  56. 56. DoExpressCheckoutPayment Confidential and Proprietary
  57. 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
  58. 58. Express Checkout Shortcut Confidential and Proprietary
  59. 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
  60. 60. Express Checkout Shortcut Confidential and Proprietary 60
  61. 61. Order Authorization & Capture Confidential and Proprietary
  62. 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. 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. 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. 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. 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. 67. THANK YOU FOR YOUR TIME Domande? Confidential and Proprietary 67
  68. 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

×