PayPal permette di creare un pagamento il cui completamento, ossia il prelievo e la ricezione del denaro, avverrà in un secondo momento. In questo articolo verrà spiegato come utilizzare questa funzionalità in una applicazione Web utilizzando PHP.
Prima di poter utilizzare le API di PayPal bisogna effettuare la installazione dell’SDK di PayPal che consiste nel suo download dal seguente link PayPal SDK, nello scompattare nella cartella dell’applicazione, inizializzare l’SDK andando a includere il sequente file
require FCPATH . '/PayPal-PHP-SDK/autoload.php';
e nel richiamare i vari oggetti utilizzati all’inizio del file PHP attraverso una direttiva di questo tipo
use PayPal\Api\Payer;
Affinche si possa utilizzare questa funzionalità bisogna compiere due passi, creare l’oggetto che rappresenta il pagamento e fare il redirect sul sistema di PayPal in modo che l’acquirente fornisca l’autorizzazione.
Per creare l’oggetto è necessario prima creare l’istanza delle api, specificando Il ClientID e il ClientSecret che si ricavano dall’area developer di PayPal dopo la creazione di un progetto https://www.paypal.com/signin?intent=developer
$apiContext = new \PayPal\Rest\ApiContext(
new \PayPal\Auth\OAuthTokenCredential(
'ClientID', // ClientID
'ClientSecret' // ClientSecret
)
);
e una serie di istanze di classi di PayPal:
$payer = new Payer();
$payer -> setPaymentMethod("paypal");
$payee = new Payee();
$payee->setEmail("venditore@example.com");
$amount = new Amount();
$amount->setCurrency("EUR")->setTotal("25.00");
$transaction = new Transaction();
$transaction->setAmount($amount)->setDescription("Pagamento per camera Basic")->setCustom("Pagamento 001")->setPayee($payee);
$redirectUrls = new RedirectUrls();
$redirectUrls->setReturnUrl("http://www.example.com/success")->setCancelUrl("http://www.example.com/failed");
Infine si può creare il pagamento futuro
$payment = new FuturePayment();
$payment->setIntent("authorize")
->setPayer($payer)
->setRedirectUrls($redirectUrls)
->setTransactions(array($transaction));
$payment->create($apiContext);
Il codice complessivo è
$apiContext = new \PayPal\Rest\ApiContext(
new \PayPal\Auth\OAuthTokenCredential(
'ClientID', // ClientID
'ClientSecret' // ClientSecret
)
);
$payer = new Payer();
$payer->setPaymentMethod("paypal");
$payee = new Payee();
$payee->setEmail("venditore@example.com");
$amount = new Amount();
$amount->setCurrency("EUR")->setTotal("25.00");
$transaction = new Transaction();
$transaction->setAmount($amount)->setDescription("Pagamento per camera Basic")->setCustom("Pagamento 001")->setPayee($payee);
$redirectUrls = new RedirectUrls();
$redirectUrls->setReturnUrl("http://www.example.com/success")->setCancelUrl("http://www.example.com/failed");
$payment = new FuturePayment();
$payment->setIntent("authorize")
->setPayer($payer)
->setRedirectUrls($redirectUrls)
->setTransactions(array($transaction));
$payment->create($apiContext);
Dopo la creazione del pagamento è necessario effettuare il redirect al sito di PayPal in modo tale che l’acquirente fornisca l’autorizzazione per il pagamento. L’url lo si ricava attraverso il seguente metodo
$payment->getApprovalLink();
Anche per poter procedere alla chiusura in positivo del pagamento e, di conseguenza, alla sua ricezione è necessario creare un’istanza delle api, che evitiamo di ripetere, e una serie di oggetti:
$payment = Payment::get("PAYID-AF46441464AF", $apiContext);
$execution = new PaymentExecution();
$execution->setPayerId("ADAFSD3443CS3");
try {
$result = $payment->execute($execution, $apiContext);
$authorization = $result->getTransactions()[0]->getRelatedResources()[0]->getAuthorization();
} catch (Exception $ex) {
print_r($ex);
}
$authorizationId = $authorization->getId();
$total = $authorization->getAmount()->getTotal();
$authorization = Authorization::get($authorizationId, $apiContext);
$amt = new Amount();
$amt->setCurrency("EUR")->setTotal($total);
$capture = new Capture();
$capture->setAmount($amt);
Dopo aver effettuato questo il pagamento può essere concluso e il denaro ricevuto
$capture = $authorization->capture($capture, $apiContext);
Funzione completa
$payment = Payment::get("PAYID-AF46441464AF", $apiContext);
$execution = new PaymentExecution();
$execution->setPayerId("ADAFSD3443CS3");
$authorization = null;
try {
$result = $payment->execute($execution, $apiContext);
$authorization = $result->getTransactions()[0]->getRelatedResources()[0]->getAuthorization();
} catch (Exception $ex) {
print_r($ex);
}
$authorizationId = $authorization->getId();
$total = $authorization->getAmount()->getTotal();
$authorization = Authorization::get($authorizationId, $apiContext);
$amt = new Amount();
$amt->setCurrency("EUR")->setTotal($total);
$capture = new Capture();
$capture->setAmount($amt);
$capture = $authorization->capture($capture, $apiContext);
Per poter cancellare la transazione è necessario creare un’istanza delle api, che evitiamo di ripetere, e una serie di istanze di classi di PayPal:
$payment = Payment::get("PAYID-AF46441464AF", $apiContext);
$execution = new PaymentExecution();
$execution->setPayerId("ADAFSD3443CS3");
try {
$result = $payment->execute($execution, $apiContext);
$authorization = $result->getTransactions()[0]->getRelatedResources()[0]->getAuthorization();
} catch (Exception $ex) {
print_r($ex);
}
$authorizationId = $authorization->getId();
$authorization = Authorization::get($authorizationId, $apiContext);
Dopo aver effettuato questo il pagamento può essere annullato
$authorization->void($apiContext);
Funzione completa
$payment = Payment::get("PAYID-AF46441464AF", $apiContext);
$execution = new PaymentExecution();
$execution->setPayerId("ADAFSD3443CS3");
$authorization = null;
try {
$result = $payment->execute($execution, $apiContext);
$authorization = $result->getTransactions()[0]->getRelatedResources()[0]->getAuthorization();
} catch (Exception $ex) {
print_r($ex);
}
$authorizationId = $authorization->getId();
$authorization = Authorization::get($authorizationId, $apiContext);
$authorization->void($apiContext);