"Sono stato bocciato a parecchi esami. Un mio amico invece, li ha passati tutti a pieni voti. Ora è ingegnere e lavora in Microsoft. Io sono il proprietario."  - Bill Gates  •  "Se riesco a fare qualcosa in 10 minuti, è perché ho passato anni a studiarlo."  - Bill Gates  •  "Il vostro lavoro riempirà gran parte della vostra vita, e l'unico modo per essere veramente soddisfatti è fare ciò che ritenete sia un grande lavoro."  - Steve Jobs  •  "Siate affamati. Siate folli."  - Steve Jobs  •  

cinque 

ZERO

PHP

Gestire pagamenti con API Paypal

home / php /

Lucio Paolo Asciolla

Senior Full Stack Developer

Autorizzazione e Acquisizione

Per gestire una carta di pagamento a garanzia con PayPal, le funzionalità principali che puoi utilizzare sono:

  1. Autorizzazione e Acquisizione (Authorization and Capture):
    • Scopo: Ti permette di autorizzare un pagamento (bloccare i fondi sulla carta del cliente) senza addebitarlo immediatamente. In seguito, potrai acquisire (addebitare) l'importo autorizzato.
    • Utilizzo: Utile quando devi verificare la validità della carta e la disponibilità dei fondi prima di fornire un servizio o spedire un prodotto. Ad esempio, potresti autorizzare un importo per una prenotazione alberghiera e addebitarlo solo dopo il soggiorno.
    • Funzionamento:
      • Il cliente autorizza il pagamento.
      • I fondi vengono temporaneamente bloccati sul suo conto.
      • Hai un periodo di tempo (generalmente 29 giorni, con un periodo "raccomandato" di 3 giorni per l'acquisizione) per acquisire l'importo.
      • Se non acquisisci entro il periodo, l'autorizzazione scade e i fondi vengono sbloccati.
      • Puoi anche acquisire un importo parziale o annullare l'autorizzazione.
    • Implementazione: Questa funzionalità è disponibile tramite le API di PayPal. Se utilizzi piattaforme di e-commerce, spesso hanno integrazioni predefinite per l'autorizzazione e l'acquisizione.
  2. Accordi di Fatturazione (Billing Agreements):
    • Scopo: Permettono a un cliente di autorizzare pagamenti futuri senza dover inserire le proprie credenziali ogni volta.
    • Utilizzo: Ideale per abbonamenti, pagamenti ricorrenti o quando prevedi addebiti variabili in futuro. Il cliente concede un'autorizzazione generale per addebitare il suo metodo di pagamento secondo i termini concordati.
    • Funzionamento:
      • Il cliente approva un accordo di fatturazione con la tua attività.
      • Ricevi un "ID Accordo di Fatturazione".
      • Utilizzando questo ID, puoi avviare addebiti futuri (singoli o ricorrenti) sul metodo di pagamento del cliente senza che debba autenticarsi ogni volta.
      • Il cliente può solitamente gestire o cancellare gli accordi di fatturazione direttamente dal proprio conto PayPal.
    • Implementazione: Gli accordi di fatturazione possono essere implementati tramite le API di PayPal. Molte piattaforme di e-commerce e sistemi di gestione degli abbonamenti supportano questa funzionalità.

Panoramica della Soluzione:

A seconda del tuo caso d'uso specifico, potresti scegliere uno di questi approcci o una combinazione.

  • Verifica della carta e addebito successivo: Utilizza l'Autorizzazione e Acquisizione. Autorizza un piccolo importo (anche solo 1€) per verificare la carta e poi acquisisci l'importo effettivo quando necessario.
  • Addebiti futuri non ricorrenti (es. per danni): Potresti utilizzare l'Autorizzazione e Acquisizione se conosci un importo massimo stimato. In alternativa, potresti informare il cliente che in caso di danni verrà effettuato un addebito sulla carta registrata tramite PayPal, ma questo richiederebbe un'autorizzazione esplicita al momento dell'addebito (a meno che non utilizzi un Accordo di Fatturazione).
  • Abbonamenti o pagamenti ricorrenti: Utilizza gli Accordi di Fatturazione.

Un esempio di come utilizzare la funzionalità di Autorizzazione e Acquisizione con le API di PayPal con PHP. Tieni presente che questo è un esempio semplificato per illustrare il concetto. L'implementazione reale richiederà l'installazione della libreria SDK di PayPal per PHP e una gestione degli errori più robusta.

Panoramica:

L'esempio che ti mostrerò simula i seguenti passaggi:

  1. Configurazione: Imposta le credenziali API di PayPal.
  2. Creazione dell'Autorizzazione: Invia una richiesta a PayPal per autorizzare un pagamento per un determinato importo.
  3. Acquisizione dell'Autorizzazione: Dopo che l'autorizzazione è avvenuta con successo, invia un'altra richiesta per acquisire (addebitare) i fondi.

Prerequisiti:

  • Un account sviluppatore PayPal (puoi crearne uno gratuitamente su developer.paypal.com).
  • Le credenziali API (Client ID e Secret) per la tua applicazione Sandbox (per i test) o Live.
  • L'SDK di PayPal per PHP installato nel tuo progetto. Puoi installarlo tramite Composer
composer require paypal/rest-api-sdk-php
<?php

require 'vendor/autoload.php';

// *** CONFIGURAZIONE ***
$clientId = 'IL_TUO_CLIENT_ID'; // Sostituisci con il tuo Client ID
$clientSecret = 'IL_TUO_CLIENT_SECRET'; // Sostituisci con il tuo Client Secret

// Imposta l'ambiente (sandbox o live)
$apiContext = new \PayPal\Rest\ApiContext(
    new \PayPal\Auth\OAuthTokenCredential(
        $clientId,
        $clientSecret
    )
);

// Per l'ambiente Sandbox, imposta:
$apiContext->setConfig(
    array(
        'mode' => 'sandbox'
    )
);
// Per l'ambiente Live, rimuovi o commenta la riga sopra.

// *** CREAZIONE DELL'AUTORIZZAZIONE ***
$payer = new \PayPal\Api\Payer();
$payer->setPaymentMethod("paypal"); // Puoi usare "credit_card" se hai i dettagli della carta

$amount = new \PayPal\Api\Amount();
$amount->setCurrency("EUR") // Sostituisci con la tua valuta
       ->setTotal("25.00"); // L'importo da autorizzare

$transaction = new \PayPal\Api\Transaction();
$transaction->setAmount($amount)
            ->setDescription("Autorizzazione per un ordine.");

$redirectUrls = new \PayPal\Api\RedirectUrls();
$redirectUrls->setReturnUrl("http://localhost:8000/execute-payment.php?success=true") // URL di ritorno dopo l'approvazione
             ->setCancelUrl("http://localhost:8000/execute-payment.php?success=false"); // URL di cancellazione

$payment = new \PayPal\Api\Payment();
$payment->setIntent("authorize") // Imposta l'intent su "authorize"
        ->setPayer($payer)
        ->setRedirectUrls($redirectUrls)
        ->setTransactions(array($transaction));

try {
    $payment->create($apiContext);
    $approvalUrl = $payment->getApprovalLink();
    echo "Per favore, approva il pagamento a questo URL: <a href='" . $approvalUrl . "'>" . $approvalUrl . "</a>\n";
    // Reindirizza l'utente a $approvalUrl per autorizzare il pagamento.
    // Dopo l'approvazione o la cancellazione, PayPal reindirizzerà agli URL specificati in $redirectUrls.
} catch (\PayPal\Exception\PayPalConnectionException $ex) {
    echo $ex->getData();
    die($ex);
} catch (\Exception $ex) {
    die($ex);
}

// execute-payment.php (file separato per gestire il ritorno da PayPal)
<?php

require 'vendor/autoload.php';

// *** CONFIGURAZIONE (come nel file precedente) ***
$clientId = 'IL_TUO_CLIENT_ID';
$clientSecret = 'IL_TUO_CLIENT_SECRET';

$apiContext = new \PayPal\Rest\ApiContext(
    new \PayPal\Auth\OAuthTokenCredential(
        $clientId,
        $clientSecret
    )
);

$apiContext->setConfig(
    array(
        'mode' => 'sandbox'
    )
);

if (isset($_GET['success']) && $_GET['success'] == 'true' && isset($_GET['paymentId']) && isset($_GET['token']) && isset($_GET['PayerID'])) {
    $paymentId = $_GET['paymentId'];
    $payment = \PayPal\Api\Payment::get($paymentId, $apiContext);

    $execution = new \PayPal\Api\PaymentExecution();
    $execution->setPayerId($_GET['PayerID']);

    try {
        $result = $payment->execute($execution, $apiContext);

        // Ora il pagamento è stato approvato. Puoi procedere con l'acquisizione.
        $payment = \PayPal\Api\Payment::get($paymentId, $apiContext);
        $transactions = $payment->getTransactions();
        $authorization = $transactions[0]->getRelatedResources()[0]->getAuthorization();
        $authorizationId = $authorization->getId();

        // *** ACQUISIZIONE DELL'AUTORIZZAZIONE ***
        $amount = new \PayPal\Api\Amount();
        $amount->setCurrency("EUR") // Assicurati che sia la stessa valuta dell'autorizzazione
               ->setTotal("25.00"); // L'importo da acquisire (può essere inferiore all'autorizzazione)

        $capture = new \PayPal\Api\Capture();
        $capture->setAmount($amount);

        try {
            $capture = $authorization->capture($capture, $apiContext);
            echo "Autorizzazione acquisita con successo. ID Acquisizione: " . $capture->getId() . "\n";
            // Qui puoi salvare l'ID di acquisizione nel tuo database e completare l'ordine.
        } catch (\PayPal\Exception\PayPalConnectionException $ex) {
            echo $ex->getData();
            die($ex);
        } catch (\Exception $ex) {
            die($ex);
        }

    } catch (\PayPal\Exception\PayPalConnectionException $ex) {
        echo $ex->getData();
        die($ex);
    } catch (\Exception $ex) {
        die($ex);
    }
} else {
    echo "L'autorizzazione è stata annullata.\n";
}

?>

Spiegazione dei Passaggi:

  1. Configurazione:
    • Includiamo l'autoloader di Composer per caricare le classi dell'SDK di PayPal.
    • Forniamo il tuo Client ID e Client Secret di PayPal.
    • Creiamo un oggetto ApiContext che contiene le tue credenziali e specifica l'ambiente (sandbox per i test).
  2. Creazione dell'Autorizzazione (primo script):
    • Creiamo un oggetto Payer e impostiamo il metodo di pagamento su "paypal" (per reindirizzare l'utente al suo conto PayPal). Se avessi i dettagli della carta di credito, potresti utilizzare "credit_card" e fornire i dettagli.
    • Definiamo l'Amount da autorizzare, specificando la valuta e l'importo totale.
    • Creiamo un oggetto Transaction che include l'importo e una descrizione (opzionale).
    • Impostiamo gli RedirectUrls:
      • ReturnUrl: L'URL a cui PayPal reindirizzerà l'utente dopo aver approvato il pagamento.
      • CancelUrl: L'URL a cui PayPal reindirizzerà l'utente se annulla il pagamento.
    • Creiamo un oggetto Payment e impostiamo l'intent su "authorize". Questo indica a PayPal che vogliamo solo autorizzare i fondi, non addebitarli immediatamente.
    • Chiamiamo il metodo create() sull'oggetto $payment per inviare la richiesta a PayPal.
    • Se la creazione ha successo, otteniamo l'approvalUrl da cui l'utente deve essere reindirizzato per accedere al suo conto PayPal e approvare l'autorizzazione.
  3. Acquisizione dell'Autorizzazione (secondo script - execute-payment.php):
    • Questo script viene chiamato quando l'utente viene reindirizzato da PayPal al ReturnUrl.
    • Verifichiamo che i parametri success, paymentId, token e PayerID siano presenti nella query string.
    • Otteniamo i dettagli del pagamento utilizzando l'paymentId.
    • Creiamo un oggetto PaymentExecution e impostiamo il PayerID.
    • Eseguiamo il pagamento utilizzando il metodo execute(). Questo completa la parte di "approvazione" del flusso.
    • Dopo l'esecuzione, recuperiamo nuovamente i dettagli del pagamento per ottenere l'oggetto Authorization correlato.
    • Otteniamo l'authorizationId dall'oggetto Authorization.
    • Creiamo un nuovo oggetto Amount per specificare l'importo da acquisire (potrebbe essere lo stesso dell'autorizzazione o un importo inferiore).
    • Creiamo un oggetto Capture e impostiamo l'importo.
    • Chiamiamo il metodo capture() sull'oggetto $authorization per addebitare effettivamente i fondi.
    • Se l'acquisizione ha successo, otteniamo l'ID Acquisizione. Questo ID è importante per tracciare la transazione.

Come Utilizzare Questo Esempio:

  1. Installa l'SDK: Assicurati di aver installato l'SDK di PayPal per PHP utilizzando Composer.
  2. Sostituisci le Credenziali: Nel codice PHP, sostituisci 'IL_TUO_CLIENT_ID' e 'IL_TUO_CLIENT_SECRET' con le tue credenziali API di PayPal Sandbox.
  3. Imposta gli URL di Ritorno e Annullamento: Modifica gli URL in $redirectUrls in modo che corrispondano agli URL del tuo server di sviluppo.
  4. Crea i File: Salva il primo blocco di codice come un file PHP (ad esempio, authorize-payment.php) e il secondo blocco come execute-payment.php nella stessa directory (o configura il tuo server web di conseguenza).
  5. Avvia il Server di Sviluppo: Avvia un server web PHP (ad esempio, utilizzando il comando php -S localhost:8000 nella directory contenente i file).
  6. Accedi al Primo Script: Apri il tuo browser e vai all'URL del primo script (ad esempio, http://localhost:8000/authorize-payment.php).
  7. Segui il Flusso: Sarai reindirizzato a PayPal per approvare il pagamento. Dopo l'approvazione (o la cancellazione), sarai reindirizzato all'URL specificato in ReturnUrl o CancelUrl. Se l'approvazione ha successo, lo script execute-payment.php tenterà di acquisire l'autorizzazione.

Punti Importanti:

  • Gestione degli Errori: L'esempio include una semplice gestione degli errori con blocchi try...catch. In un'applicazione reale, dovresti implementare una gestione degli errori più dettagliata e registrare le informazioni rilevanti.
  • Sicurezza: Assicurati di proteggere le tue credenziali API e di utilizzare HTTPS per tutte le comunicazioni con PayPal.
  • Stato delle Transazioni: Dovresti salvare gli ID di autorizzazione e acquisizione nel tuo database e tenere traccia dello stato delle transazioni.
  • Annullamento dell'Autorizzazione: Potresti anche voler implementare la funzionalità per annullare un'autorizzazione se necessario (prima dell'acquisizione).
  • SDK di PayPal: L'SDK di PayPal per PHP fornisce molte altre funzionalità e opzioni di configurazione. Consulta la documentazione ufficiale per ulteriori dettagli.

Spero che questo esempio ti sia utile per capire come utilizzare la funzionalità di Autorizzazione e Acquisizione con le API di PayPal e PHP! Se hai domande su passaggi specifici o su come adattare questo esempio al tuo progetto, non esitare a chiedere.

No-show

Gestire un "no-show" utilizzando le funzionalità di PayPal che abbiamo discusso (Autorizzazione e Acquisizione, Accordi di Fatturazione) richiede un approccio leggermente diverso a seconda di come hai impostato il processo di prenotazione o servizio. Ecco alcune strategie e come potresti implementarle:

Scenario 1: Utilizzo dell'Autorizzazione e Acquisizione

Se al momento della prenotazione hai autorizzato un importo sulla carta del cliente, hai diverse opzioni per gestire un "no-show":

  1. Acquisizione Parziale o Totale:
    • Se la tua politica prevede un addebito in caso di "no-show" (ad esempio, una percentuale dell'importo totale o un importo fisso), puoi procedere con l'acquisizione dell'importo dovuto dall'autorizzazione esistente.Se l'importo del "no-show" è inferiore all'importo autorizzato, puoi acquisire solo l'importo specifico. L'importo rimanente dell'autorizzazione scadrà dopo un certo periodo (generalmente 29 giorni).Se l'importo del "no-show" è pari all'importo autorizzato, puoi acquisire l'intera autorizzazione.
    Implementazione (seguendo l'esempio PHP precedente):
  • Nel tuo sistema, identifica l'authorizationId associato alla prenotazione del cliente che non si è presentato.
  • Determina l'importo da addebitare per il "no-show" in base alla tua politica.
  • Crea un nuovo oggetto Amount con l'importo del "no-show".
  • Crea un oggetto Capture e imposta l'importo.
  • Chiama il metodo capture() sull'oggetto $authorization utilizzando l'authorizationId precedentemente salvato.
    <?php
    // ... (configurazione API come prima) ...
    
    $authorizationId = 'ID_AUTORIZZAZIONE_DEL_CLIENTE_NO_SHOW'; // Recupera l'ID dal tuo database
    $importoNoShow = '15.00'; // Importo da addebitare per il no-show
    $valuta = 'EUR'; // La valuta dell'autorizzazione
    
    $amount = new \PayPal\Api\Amount();
    $amount->setCurrency($valuta)
           ->setTotal($importoNoShow);
    
    $capture = new \PayPal\Api\Capture();
    $capture->setAmount($amount);
    
    try {
        $authorization = new \PayPal\Api\Authorization();
        $authorization->setId($authorizationId);
        $capturedPayment = $authorization->capture($capture, $apiContext);
        echo "Addebito per no-show effettuato con ID Acquisizione: " . $capturedPayment->getId() . "\n";
        // Aggiorna il tuo database per riflettere l'addebito per il no-show.
    } catch (\PayPal\Exception\PayPalConnectionException $ex) {
        echo $ex->getData();
        die($ex);
    } catch (\Exception $ex) {
        die($ex);
    }
    ?>

    2. Nessuna Acquisizione (e potenziale addebito successivo):

    • Se la tua politica prevede un addebito per "no-show" ma non hai autorizzato un importo specifico in anticipo, o se l'autorizzazione è scaduta, non potrai utilizzare direttamente l'autorizzazione.
    • In questo caso, potresti dover contattare il cliente per richiedere il pagamento del costo del "no-show" tramite altri mezzi (ad esempio, inviando una richiesta di pagamento PayPal separata).

      Scenario 2: Utilizzo degli Accordi di Fatturazione

      Se hai impostato un Accordo di Fatturazione con il cliente, hai più flessibilità per gestire i "no-show":

      1. Addebito di un Importo Specifico:
        • Puoi utilizzare l'ID dell'Accordo di Fatturazione per addebitare un importo specifico al cliente in base alla tua politica sui "no-show". Questo ti permette di addebitare anche se non avevi un'autorizzazione preventiva per quell'importo esatto.
        Implementazione (esempio PHP):
      <?php
      // ... (configurazione API come prima) ...
      
      $billingAgreementId = 'ID_ACCORDO_DI_FATTURAZIONE_DEL_CLIENTE_NO_SHOW'; // Recupera l'ID dal tuo database
      $importoNoShow = '20.00'; // Importo da addebitare per il no-show
      $descrizione = 'Addebito per no-show.';
      $valuta = 'EUR';
      
      $agreement = new \PayPal\Api\BillingAgreement();
      $agreement->setId($billingAgreementId);
      
      $chargeModel = new \PayPal\Api\ChargeModel();
      $chargeModel->setType('STANDALONE')
                  ->setAmount(new \PayPal\Api\Currency(array('value' => $importoNoShow, 'currency' => $valuta)));
      
      $billingInfo = new \PayPal\Api\BillingInfo();
      $billingInfo->setOutstandingBalance(new \PayPal\Api\Currency(array('value' => $importoNoShow, 'currency' => $valuta)))
                  ->setNextPaymentDate(date('Y-m-d\TH:i:s\Z', time())); // Puoi impostare una data futura o attuale
      
      $payment = new \PayPal\Api\Payment();
      $payment->setIntent('sale') // L'intent 'sale' esegue direttamente l'addebito
              ->setPayer(new \PayPal\Api\Payer())
              ->setTransactions(array((new \PayPal\Api\Transaction())
                  ->setAmount(new \PayPal\Api\Amount()
                      ->setCurrency($valuta)
                      ->setTotal($importoNoShow))
                  ->setDescription($descrizione)))
              ->setBillingAgreementId($billingAgreementId);
      
      try {
          $payment->create($apiContext);
          echo "Addebito per no-show effettuato con ID Transazione: " . $payment->getId() . "\n";
          // Aggiorna il tuo database.
      } catch (\PayPal\Exception\PayPalConnectionException $ex) {
          echo $ex->getData();
          die($ex);
      } catch (\Exception $ex) {
          die($ex);
      }
      ?>

      Considerazioni Importanti per la Gestione dei "No-Show":

      • Politica Chiara: Devi avere una politica sui "no-show" chiara e comunicarla ai tuoi clienti al momento della prenotazione. Questo dovrebbe includere l'importo dell'addebito (se presente) e le condizioni in cui viene applicato.
      • Consenso del Cliente: Se utilizzi Accordi di Fatturazione, il cliente ha già fornito il consenso per addebiti futuri secondo i termini dell'accordo. Per l'Autorizzazione e Acquisizione, l'autorizzazione iniziale copre l'addebito successivo (totale o parziale).
      • Notifiche: Potrebbe essere utile inviare una notifica al cliente in caso di "no-show" e informarlo dell'addebito effettuato o che verrà effettuato.
      • Trasparenza: Sii trasparente con i tuoi clienti riguardo alle tue politiche e agli addebiti.
      • Gestione delle Contestazioni: Tieni presente che i clienti potrebbero contestare gli addebiti per "no-show". Assicurati di avere prove della prenotazione e della tua politica per poter rispondere a eventuali contestazioni di PayPal.