Aller au contenu principal
Version: v1

Méthodes de paiements

CLIENTXCMS introduit un système pour gérer les paiements facilement selon la passerelle de paiements avec les interface ClientX\Payment\PaymentTypeInterface et ClientX\Payment\PaymentManagerInterface

Liste des passerelles de paiement supportées

  • PayPal
  • Dedipass
  • Stripe
  • Paysafecard

L'interface PaymentTypeInterface

L'interface PaymentTypeInterface est une interface qui définit les méthodes pour définir le type de paiement pris en charge dans l'application CLIENTXCMS. Les classes implémentant cette interface représentent différents types de paiement, tels que PayPal, Stripe, etc.

Méthodes

getName(): string

Cette méthode retourne le nom du type de paiement. Par exemple, pour PayPal, cette méthode renverra "paypal".

getTitle(): ?string

Cette méthode retourne le titre du type de paiement, c'est-à-dire une version lisible par l'homme du nom du type de paiement. Par exemple, pour PayPal, cette méthode renverra "PayPal".

getManager(): string

Cette méthode retourne le nom de la classe du gestionnaire de paiement associé à ce type de paiement. Le gestionnaire de paiement est une implémentation de la PaymentManagerInterface.

getLogPath(): string

Cette méthode retourne le chemin vers les fichiers de journalisation des transactions pour ce type de paiement. Par exemple 'admin.example.payment',

getIcon(): string

Cette méthode retourne le nom de l'icône utilisée pour représenter ce type de paiement, par exemple "fab fa-paypal" pour PayPal.

canPayWith(): bool

Cette méthode retourne un booléen indiquant si le paiement peut être effectué via le processus de paiement standard (checkout). Exemple Dedipass : false, PayPal : true

Action de journalisation

CLIENTXCMS récupére les types et les affiches directement dans le menu d'administration avec les autres types de paiement pour accéder facilement à la page de journalisations

Route

Pour ajouter l'action dans votre module :

use ClientX\Router;
use Psr\Container\ContainerInterface;
use App\Example\Actions\ExamplePaymentAction;

class ExampleModule extends \ClientX\Module
{
const UUID = "example";
const NAME = "Example";
....

public function __construct(Router $router, ContainerInterface $container)
{
if ($container->has('admin.prefix')) {

$prefix = $container->get('admin.prefix');
$router->crud($prefix . '/example/payment/[i:id]', ExamplePaymentAction::class, 'admin.example.payment');
// même nom de route que dans le getLogPath()
}

}

Actions

CLIENTXCMS permet de facilement rendre une vue avec la liste des transactions faites via votre moyen de paiement grâce à la classe ClientX\Actions\Payment\PaymentAdminAction. Elle s'occupera automatiquement de la recherche et du rendu de la page HTML

<?php

namespace App\Example\Actions;

use ClientX\Actions\Payment\PaymentAdminAction;

class ExamplePaymentAction extends PaymentAdminAction {

protected $routePrefix = "admin.example.payment";

protected $paymenttype = "example";

}

L'interface PaymentManagerInterface

L'interface PaymentManagerInterface est une interface qui définit les méthodes pour gérer le processus de paiement, l'exécution des paiements . Les classes implémentant cette interface sont responsables du traitement des paiements pour un type de paiement spécifique, tel que PayPal, Stripe, etc.

Méthodes

process(Transaction $transaction, ServerRequestInterface $request, User $user): mixed

Cette méthode gère le processus de paiement pour une transaction donnée. Elle prend en paramètre l'objet Transaction, l'objet Request et l'objet User associés au paiement. Prenons un exemple concrets, c'est cette méthode qui va demander à Stripe ou paypal de créer le paiement avec les détails de la transactions (prix, produits, etc). Où ils vont vous donner un lien de paiement qui sera utilisé par le client pour payer.

execute(Transaction $transaction, ServerRequestInterface $request, User $user): void

Cette méthode exécute le paiement pour une transaction donnée. Elle prend en paramètre l'objet Transaction, l'objet Request et l'objet User associés au paiement.

refund(array $items): bool

N'est pas encore implémenté dans le coeur de CMS, vous pouvez renvoyer false d'office.

Example d'implémentation du manager

<?php

namespace App\Example\Payment;

use App\Account\User;
use App\Account\User as UserAccount;
use App\Basket\Basket;
use App\Shop\Entity\Invoice;
use App\Shop\Entity\Transaction;
use App\Shop\Entity\TransactionItem;
use App\Shop\Services\TransactionService;
use ClientX\Auth;
use ClientX\Database\NoRecordException;
use ClientX\Helpers\Str;
use ClientX\Payment\PaymentManagerInterface;
use ClientX\Response\RedirectResponse;
use ClientX\Router;
use Psr\Http\Message\ServerRequestInterface as Request;

class ExamplePaymentManager extends AbstractPaymentManager implements PaymentManagerInterface

{


public function __construct(Router $router, Auth $auth, TransactionService $service) {

parent::__construct($router, $auth, $service);

}



public function process(Transaction $transaction, Request $request, User $user) {

$user = $this->getUser();

if ($user === null) {

return;

}

$transactionId = Str::random(10);

$transaction->setTransactionId($transactionId);

$this->service->updateTransactionId($transaction);

$links = $this->getRedirectsLinks($request, $transaction);

$return = $links['return'];

$cancel = $links['cancel'];

// Donne les deux liens de return et de cancel

/** @var TransactionItem */

$items = $transaction->getItems();

collect($items)->map(function(TransactionItem $item){

return ['price' => $item->getPrice(), 'label' => $item->getName()];

})->toArray();

// URL que donne la passerelle de paiement



$url = "https://clientxcms.com/fake?trans_id=" . $transactionId;

return new RedirectResponse($url);

}



public function execute(Transaction $transaction, Request $request, User $user){



/** @var UserAccount */

$user = $this->getUser();

if ($user === null) {

return new RedirectResponse($this->getRedirectsLinks($request, $transaction)['cancel']);

}

$transId = $request->getQueryParams()['trans_id'];

try {

if ($transId !== $transaction->getTransactionId()) {

return new RedirectResponse($this->getRedirectsLinks($request, $transaction)['cancel']);

}

$success = true;

// le paiement est bien valider

if ($success) {

// on complete la transaction puis livre les items

$this->service->complete($transaction);

foreach ($transaction->getItems() as $item) {

$this->service->delivre($item);

}

return $transaction;

}

$reason = "Card invalid";

$transaction->setState($transaction::REFUSED);

$transaction->setReason($reason);

$this->service->changeState($transaction);

$this->service->setReason($transaction);

return $transaction;

} catch (NoRecordException $e) {

return new RedirectResponse($this->getRedirectsLinks($request, $transaction)['cancel']);

}

}



public function refund(array $items): bool {

return false;

}

}
## Intégration dans le conteneur

Pour utiliser les classes implémentant l' interface `PaymentTypeInterface` vous devez les ajouter dans le conteneur sous la clé `'payments.type'` avec les noms de classes associés.

Exemple de configuration dans le fichier du conteneur du module :

```php
<?php
use function \DI\get;
use function \DI\add;
return [
// ...
'payments.type' => [
add(get(\App\Example\ExamplePaymentType::class)),
// Ajoutez d'autres types de paiement ici...
],
// ...
];