SlideShare une entreprise Scribd logo
1  sur  68
Télécharger pour lire hors ligne
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
Perchè PayPal




                Confidential and Proprietary
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
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
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
Perchè PayPal

     Accettare PayPal vi permette di raggiungere una
      community di acquirenti che altrimenti
      escludereste dal vostro business.


Acquirenti




Esercenti




                                      Confidential and Proprietary   6
Confidential and Proprietary   7
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
Cosa significa Pagare con PayPal




                                   Confidential and Proprietary   9
Cosa significa Pagare con PayPal




                               Confidential and Proprietary   10
Cosa significa Pagare con PayPal




                                   Confidential and Proprietary   11
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
Accettare PayPal




                   Confidential and Proprietary
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
Prodotti PayPal




                  Confidential and Proprietary
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
Integrare PayPal




                   Confidential and Proprietary
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
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
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
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
E’ fondamentale costruire un’esperienza d’acquisto fruibile e
                          positiva!




                                          Confidential and Proprietary   22
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
Iniziare l’Integrazione




                          Confidential and Proprietary   24
Iniziare l’Integrazione




                          Confidential and Proprietary   25
Iniziare l’Integrazione




                          Confidential and Proprietary   26
PayPal Website Payment
Standard




                     Confidential and Proprietary
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
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
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
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
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
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
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
Payment Data Transfer – WPS

Flusso di pagamento WPS + PDT




                                Confidential and Proprietary   35
Payment Data Transfer – WPS




                              Confidential and Proprietary   36
Payment Data Transfer – WPS




                              Confidential and Proprietary   37
PayPal Express Checkout




                     Confidential and Proprietary
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
Express Checkout – API
Infrastruttura API di Express Checkout:




                                          Confidential and Proprietary   40
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
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
SetExpressCheckout




                     Confidential and Proprietary
Express Checkout – SetExpressCheckout




Attraverso la SetEC è possibile ottenere il token necessario alla
  redirezione e settare alcuni parametri opzionali.




                                             Confidential and Proprietary   44
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
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
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
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
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
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
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
GetExpressCheckoutDetails




                     Confidential and Proprietary
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
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
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
DoExpressCheckoutPayment




                   Confidential and Proprietary
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
Express Checkout Shortcut




                      Confidential and Proprietary
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
Express Checkout Shortcut




                            Confidential and Proprietary   60
Order Authorization & Capture




                       Confidential and Proprietary
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
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
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
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
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
THANK YOU FOR YOUR TIME
 Domande?




                          Confidential and Proprietary   67
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

Contenu connexe

Similaire à PayPal e PHP

L’opportunità di integrare pagoPA: la digitalizzazione dei processi attravers...
L’opportunità di integrare pagoPA: la digitalizzazione dei processi attravers...L’opportunità di integrare pagoPA: la digitalizzazione dei processi attravers...
L’opportunità di integrare pagoPA: la digitalizzazione dei processi attravers...Team per la Trasformazione Digitale
 
Il digital commerce tra social media ed evoluzione dei metodi di pagamento | ...
Il digital commerce tra social media ed evoluzione dei metodi di pagamento | ...Il digital commerce tra social media ed evoluzione dei metodi di pagamento | ...
Il digital commerce tra social media ed evoluzione dei metodi di pagamento | ...FrancoAngeli
 
Manualetto GlobalPubliCash
Manualetto GlobalPubliCashManualetto GlobalPubliCash
Manualetto GlobalPubliCashMauro Lorini
 
Compass al Politecnico di Milano presenta soluzioni di pagamento per e-commer...
Compass al Politecnico di Milano presenta soluzioni di pagamento per e-commer...Compass al Politecnico di Milano presenta soluzioni di pagamento per e-commer...
Compass al Politecnico di Milano presenta soluzioni di pagamento per e-commer...Compass For You
 
Smau Bologna 2015 - Telecom Italia Digital Solutions
Smau Bologna 2015 - Telecom Italia Digital SolutionsSmau Bologna 2015 - Telecom Italia Digital Solutions
Smau Bologna 2015 - Telecom Italia Digital SolutionsSMAU
 
Digital Marketing ed e-commerce - Parte 2
Digital Marketing ed e-commerce - Parte 2Digital Marketing ed e-commerce - Parte 2
Digital Marketing ed e-commerce - Parte 2Luca Pelati
 
Studio e sviluppo di un’applicazione mhp per la gestione dei pagamenti median...
Studio e sviluppo di un’applicazione mhp per la gestione dei pagamenti median...Studio e sviluppo di un’applicazione mhp per la gestione dei pagamenti median...
Studio e sviluppo di un’applicazione mhp per la gestione dei pagamenti median...ICL - Image Communication Laboratory
 
Compass all'E-commerce Forum presenta: "e-Commerce e strumenti di pagamento. ...
Compass all'E-commerce Forum presenta: "e-Commerce e strumenti di pagamento. ...Compass all'E-commerce Forum presenta: "e-Commerce e strumenti di pagamento. ...
Compass all'E-commerce Forum presenta: "e-Commerce e strumenti di pagamento. ...Compass For You
 
Avviare un e commerce con WordPress e Woocommerce
Avviare un e commerce con WordPress e WoocommerceAvviare un e commerce con WordPress e Woocommerce
Avviare un e commerce con WordPress e WoocommerceMarco De Sangro
 
Presentazione SwarmSociety
Presentazione SwarmSocietyPresentazione SwarmSociety
Presentazione SwarmSocietycargix
 
Smau Firenze 2015 - Telecom Italia Digital Solutions
Smau Firenze 2015 - Telecom Italia Digital SolutionsSmau Firenze 2015 - Telecom Italia Digital Solutions
Smau Firenze 2015 - Telecom Italia Digital SolutionsSMAU
 
Smau Padova 2015 - Telecom Italia Digital Solutions
Smau Padova 2015 - Telecom Italia Digital SolutionsSmau Padova 2015 - Telecom Italia Digital Solutions
Smau Padova 2015 - Telecom Italia Digital SolutionsSMAU
 
eCommerce - Pablo Bonucci
eCommerce - Pablo BonuccieCommerce - Pablo Bonucci
eCommerce - Pablo BonucciPablo Bonucci
 
Caso Giesse Per Unindustria
Caso Giesse Per UnindustriaCaso Giesse Per Unindustria
Caso Giesse Per UnindustriaTwinergy
 
Shopify per agenzie e freelence tutte le opportunità del programma partnersh...
Shopify per agenzie e freelence tutte le opportunità del programma partnersh...Shopify per agenzie e freelence tutte le opportunità del programma partnersh...
Shopify per agenzie e freelence tutte le opportunità del programma partnersh...Ecommerce HUB
 
ExcellentNet è il network di scambio mutlilaterale per le aziende b2b in Italia
ExcellentNet è il network di scambio mutlilaterale per le aziende b2b in ItaliaExcellentNet è il network di scambio mutlilaterale per le aziende b2b in Italia
ExcellentNet è il network di scambio mutlilaterale per le aziende b2b in ItaliaExcellentNet
 
It ci guide-q1_2020_vv for fd 2
It   ci guide-q1_2020_vv for fd 2It   ci guide-q1_2020_vv for fd 2
It ci guide-q1_2020_vv for fd 2KarynForsyth
 
L'integrazione di PagoPA - Giuseppe Virgone, Pagamenti Digitali del Team per ...
L'integrazione di PagoPA - Giuseppe Virgone, Pagamenti Digitali del Team per ...L'integrazione di PagoPA - Giuseppe Virgone, Pagamenti Digitali del Team per ...
L'integrazione di PagoPA - Giuseppe Virgone, Pagamenti Digitali del Team per ...Team per la Trasformazione Digitale
 

Similaire à PayPal e PHP (20)

L’opportunità di integrare pagoPA: la digitalizzazione dei processi attravers...
L’opportunità di integrare pagoPA: la digitalizzazione dei processi attravers...L’opportunità di integrare pagoPA: la digitalizzazione dei processi attravers...
L’opportunità di integrare pagoPA: la digitalizzazione dei processi attravers...
 
Il digital commerce tra social media ed evoluzione dei metodi di pagamento | ...
Il digital commerce tra social media ed evoluzione dei metodi di pagamento | ...Il digital commerce tra social media ed evoluzione dei metodi di pagamento | ...
Il digital commerce tra social media ed evoluzione dei metodi di pagamento | ...
 
Manualetto GlobalPubliCash
Manualetto GlobalPubliCashManualetto GlobalPubliCash
Manualetto GlobalPubliCash
 
Compass al Politecnico di Milano presenta soluzioni di pagamento per e-commer...
Compass al Politecnico di Milano presenta soluzioni di pagamento per e-commer...Compass al Politecnico di Milano presenta soluzioni di pagamento per e-commer...
Compass al Politecnico di Milano presenta soluzioni di pagamento per e-commer...
 
Smau Bologna 2015 - Telecom Italia Digital Solutions
Smau Bologna 2015 - Telecom Italia Digital SolutionsSmau Bologna 2015 - Telecom Italia Digital Solutions
Smau Bologna 2015 - Telecom Italia Digital Solutions
 
Digital Marketing ed e-commerce - Parte 2
Digital Marketing ed e-commerce - Parte 2Digital Marketing ed e-commerce - Parte 2
Digital Marketing ed e-commerce - Parte 2
 
Studio e sviluppo di un’applicazione mhp per la gestione dei pagamenti median...
Studio e sviluppo di un’applicazione mhp per la gestione dei pagamenti median...Studio e sviluppo di un’applicazione mhp per la gestione dei pagamenti median...
Studio e sviluppo di un’applicazione mhp per la gestione dei pagamenti median...
 
Compass all'E-commerce Forum presenta: "e-Commerce e strumenti di pagamento. ...
Compass all'E-commerce Forum presenta: "e-Commerce e strumenti di pagamento. ...Compass all'E-commerce Forum presenta: "e-Commerce e strumenti di pagamento. ...
Compass all'E-commerce Forum presenta: "e-Commerce e strumenti di pagamento. ...
 
Avviare un e commerce con WordPress e Woocommerce
Avviare un e commerce con WordPress e WoocommerceAvviare un e commerce con WordPress e Woocommerce
Avviare un e commerce con WordPress e Woocommerce
 
Presentazione SwarmSociety
Presentazione SwarmSocietyPresentazione SwarmSociety
Presentazione SwarmSociety
 
Smau Firenze 2015 - Telecom Italia Digital Solutions
Smau Firenze 2015 - Telecom Italia Digital SolutionsSmau Firenze 2015 - Telecom Italia Digital Solutions
Smau Firenze 2015 - Telecom Italia Digital Solutions
 
Smau Padova 2015 - Telecom Italia Digital Solutions
Smau Padova 2015 - Telecom Italia Digital SolutionsSmau Padova 2015 - Telecom Italia Digital Solutions
Smau Padova 2015 - Telecom Italia Digital Solutions
 
eCommerce - Pablo Bonucci
eCommerce - Pablo BonuccieCommerce - Pablo Bonucci
eCommerce - Pablo Bonucci
 
E commerce 1.1
E commerce 1.1E commerce 1.1
E commerce 1.1
 
Caso Giesse Per Unindustria
Caso Giesse Per UnindustriaCaso Giesse Per Unindustria
Caso Giesse Per Unindustria
 
Shopify per agenzie e freelence tutte le opportunità del programma partnersh...
Shopify per agenzie e freelence tutte le opportunità del programma partnersh...Shopify per agenzie e freelence tutte le opportunità del programma partnersh...
Shopify per agenzie e freelence tutte le opportunità del programma partnersh...
 
ExcellentNet è il network di scambio mutlilaterale per le aziende b2b in Italia
ExcellentNet è il network di scambio mutlilaterale per le aziende b2b in ItaliaExcellentNet è il network di scambio mutlilaterale per le aziende b2b in Italia
ExcellentNet è il network di scambio mutlilaterale per le aziende b2b in Italia
 
It ci guide-q1_2020_vv for fd 2
It   ci guide-q1_2020_vv for fd 2It   ci guide-q1_2020_vv for fd 2
It ci guide-q1_2020_vv for fd 2
 
Tips and Tricks 2013
Tips and Tricks 2013 Tips and Tricks 2013
Tips and Tricks 2013
 
L'integrazione di PagoPA - Giuseppe Virgone, Pagamenti Digitali del Team per ...
L'integrazione di PagoPA - Giuseppe Virgone, Pagamenti Digitali del Team per ...L'integrazione di PagoPA - Giuseppe Virgone, Pagamenti Digitali del Team per ...
L'integrazione di PagoPA - Giuseppe Virgone, Pagamenti Digitali del Team per ...
 

Plus de GrUSP

REST e Resource Oriented Architectures
REST e Resource Oriented ArchitecturesREST e Resource Oriented Architectures
REST e Resource Oriented ArchitecturesGrUSP
 
Drupal come framework di sviluppo
Drupal come framework di sviluppoDrupal come framework di sviluppo
Drupal come framework di sviluppoGrUSP
 
Zend Server
Zend ServerZend Server
Zend ServerGrUSP
 
Zend Dojo
Zend DojoZend Dojo
Zend DojoGrUSP
 
PHP & IBM i
PHP & IBM iPHP & IBM i
PHP & IBM iGrUSP
 
Programmazione Ad Eventi In Php
Programmazione Ad Eventi In PhpProgrammazione Ad Eventi In Php
Programmazione Ad Eventi In PhpGrUSP
 
Joomla! 1.5: CMS a mani tese verso gli sviluppatori
Joomla! 1.5: CMS a mani tese verso gli sviluppatoriJoomla! 1.5: CMS a mani tese verso gli sviluppatori
Joomla! 1.5: CMS a mani tese verso gli sviluppatoriGrUSP
 
Symfony 2.0
Symfony 2.0Symfony 2.0
Symfony 2.0GrUSP
 
Memi Beltrame Collaborative Design
Memi Beltrame Collaborative DesignMemi Beltrame Collaborative Design
Memi Beltrame Collaborative DesignGrUSP
 
Mocking Objects Practices
Mocking Objects PracticesMocking Objects Practices
Mocking Objects PracticesGrUSP
 

Plus de GrUSP (10)

REST e Resource Oriented Architectures
REST e Resource Oriented ArchitecturesREST e Resource Oriented Architectures
REST e Resource Oriented Architectures
 
Drupal come framework di sviluppo
Drupal come framework di sviluppoDrupal come framework di sviluppo
Drupal come framework di sviluppo
 
Zend Server
Zend ServerZend Server
Zend Server
 
Zend Dojo
Zend DojoZend Dojo
Zend Dojo
 
PHP & IBM i
PHP & IBM iPHP & IBM i
PHP & IBM i
 
Programmazione Ad Eventi In Php
Programmazione Ad Eventi In PhpProgrammazione Ad Eventi In Php
Programmazione Ad Eventi In Php
 
Joomla! 1.5: CMS a mani tese verso gli sviluppatori
Joomla! 1.5: CMS a mani tese verso gli sviluppatoriJoomla! 1.5: CMS a mani tese verso gli sviluppatori
Joomla! 1.5: CMS a mani tese verso gli sviluppatori
 
Symfony 2.0
Symfony 2.0Symfony 2.0
Symfony 2.0
 
Memi Beltrame Collaborative Design
Memi Beltrame Collaborative DesignMemi Beltrame Collaborative Design
Memi Beltrame Collaborative Design
 
Mocking Objects Practices
Mocking Objects PracticesMocking Objects Practices
Mocking Objects Practices
 

PayPal e PHP

  • 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. Perchè PayPal 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
  • 9. Cosa significa Pagare con PayPal Confidential and Proprietary 9
  • 10. Cosa significa Pagare con PayPal Confidential and Proprietary 10
  • 11. Cosa significa Pagare con PayPal Confidential and Proprietary 11
  • 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. Accettare PayPal Confidential and Proprietary
  • 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. Prodotti PayPal Confidential and Proprietary
  • 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. Integrare PayPal Confidential and Proprietary
  • 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
  • 24. Iniziare l’Integrazione Confidential and Proprietary 24
  • 25. Iniziare l’Integrazione Confidential and Proprietary 25
  • 26. Iniziare l’Integrazione Confidential and Proprietary 26
  • 27. PayPal Website Payment Standard Confidential and Proprietary
  • 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
  • 36. Payment Data Transfer – WPS Confidential and Proprietary 36
  • 37. Payment Data Transfer – WPS Confidential and Proprietary 37
  • 38. PayPal Express Checkout Confidential and Proprietary
  • 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
  • 43. SetExpressCheckout Confidential and Proprietary
  • 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;&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;&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;&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;&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
  • 52. GetExpressCheckoutDetails Confidential and Proprietary
  • 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;&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;&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. DoExpressCheckoutPayment Confidential and Proprietary
  • 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. Express Checkout Shortcut Confidential and Proprietary
  • 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. Express Checkout Shortcut Confidential and Proprietary 60
  • 61. Order Authorization & Capture Confidential and Proprietary
  • 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