Tutoriel Vidéo PayPal PHP Paypal Express Checkout

Télécharger la vidéo Télécharger les sources

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.