Nous allons découvrir aujourd'hui comment utiliser la nouvelle version de Paypal Express Checkout basée sur l'API REST. La précédente méthode, basée sur NVP/SOAP, a été dépréciée en Janvier 2017 sans toutefois annoncer de date de coupure (pour le moment). Le principe reste cependant le même.
Créer un paiement
La première étape consiste à créer un paiement en appelant en POST /v1/payments/payment avec plusieurs paramètres. Cela permettra ensuite de rediriger l'utilisateur afin qu'il accepte le paiement. Si vous utilisez le SDK PHP :
<?php
namespace Grafikart;
use PayPal\Api\Transaction;
class TransactionFactory
{
static function fromBasket(Basket $basket, float $vatRate = 0): Transaction
{
$list = new \PayPal\Api\ItemList();
foreach ($basket->getProducts() as $product) {
$item = (new \PayPal\Api\Item())
->setName($product->getName())
->setPrice($product->getPrice())
->setCurrency('EUR')
->setQuantity(1);
$list->addItem($item);
}
$details = (new \PayPal\Api\Details())
->setTax($basket->getVatPrice($vatRate))
->setSubtotal($basket->getPrice());
$amount = (new \PayPal\Api\Amount())
->setTotal($basket->getPrice() + $basket->getVatPrice($vatRate))
->setCurrency("EUR")
->setDetails($details);
return (new \PayPal\Api\Transaction())
->setItemList($list)
->setDescription('Achat sur monsite.fr')
->setAmount($amount)
->setCustom('demo-1');
}
}
$ids = require('config.php');
$basket = \Grafikart\Basket::fake();
$apiContext = new \PayPal\Rest\ApiContext(
new \PayPal\Auth\OAuthTokenCredential(
$ids['id'],
$ids['secret']
)
);
$payment = new \PayPal\Api\Payment();
$payment->addTransaction(\Grafikart\TransactionFactory::fromBasket($basket));
$payment->setIntent('sale');
$redirectUrls = (new \PayPal\Api\RedirectUrls())
->setReturnUrl('http://localhost:8000/pay.php')
->setCancelUrl('http://localhost:8000/index.php');
$payment->setRedirectUrls($redirectUrls);
$payment->setPayer((new \PayPal\Api\Payer())->setPaymentMethod('paypal'));
try {
$payment->create($apiContext);
header('Location: ' . $payment->getApprovalLink());
} catch (\PayPal\Exception\PayPalConnectionException $e) {
var_dump(json_decode($e->getData()));
}
L'utilisateur sera alors redirigé vers la page de paiement paypal avec le récapitulatif des éléments à acheter. Une fois qu'il valide ses informations il sera redirigé vers la page $redirectUrls
avec le paymentId et le payerID.
Exécuter le paiement
Une fois le paiement approuvé il est possible de l'éxécuter en appelant en POST /v1/payments/payment/payment_id/execute.
$apiContext = new \PayPal\Rest\ApiContext(
new \PayPal\Auth\OAuthTokenCredential(
$config['id'],
$config['secret']
)
);
$basket = \Grafikart\Basket::fake();
$payment = \PayPal\Api\Payment::get($_GET['paymentId'], $apiContext);
$execution = (new \PayPal\Api\PaymentExecution())
->setPayerId($_GET['payerID'])
->addTransaction(\Grafikart\TransactionFactory::fromBasket($basket, 0.2));
try {
$payment->execute($execution, $apiContext);
echo 'Merci pour votre paiement';
} catch (\PayPal\Exception\PayPalConnectionException $e) {
header('HTTP 500 Internal Server Error', true, 500);
var_dump(json_decode($e->getData()));
}
Lors de cette étape vous pouvez modifier le contenu dans la transaction pour rajouter des frais de port ou des taxes.