Paypal Express Checkout

Voir la vidéo

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.

Publié
Technologies utilisées
Auteur :
Grafikart
Partager