Skip to content

Commit

Permalink
Add cancel action to return from Pagolight and ensure the cancel of t…
Browse files Browse the repository at this point in the history
…he payment
  • Loading branch information
lruozzi9 committed Jan 30, 2024
1 parent fb0a20c commit d0daef7
Show file tree
Hide file tree
Showing 6 changed files with 80 additions and 9 deletions.
8 changes: 4 additions & 4 deletions adr/flusso.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,14 @@
Abbiamo deciso di utilizzare il webhook come unico metodo per conoscere il metodo di pagamento.
Per fare questo sono necessarie le seguenti operazioni:

- La cancel url deve essere la cancel action di Payum per essere certi che il pagamento venga cancellato in maniera
- [x] La cancel url deve essere la cancel action di Payum per essere certi che il pagamento venga cancellato in maniera
istantanea
- La capture action non si occuperà più di chiedere lo stato dell'esito del pagamento, ma mostrerà una pagina che
- [ ] La capture action non si occuperà più di chiedere lo stato dell'esito del pagamento, ma mostrerà una pagina che
conterrà un JS
che invierà una richiesta in polling a una rotta custom che dirà se il pagamento è stato catturato. Quando il
pagamento è stato catturato allora
farà un redirect automatico alla rotta after url del token (?).
- La rotta custom che viene chiamata in polling deve essere in grado di capire se il pagamento è stato catturato o meno
- [ ] La rotta custom che viene chiamata in polling deve essere in grado di capire se il pagamento è stato catturato o meno
e di ritornare un json con il risultato
- Deve essere implementata la notify action che verrà chiamata dal webhook di pagolight e che si occuperà di aggiornare
- [ ] Deve essere implementata la notify action che verrà chiamata dal webhook di pagolight e che si occuperà di aggiornare
lo stato del pagamento
8 changes: 6 additions & 2 deletions config/services/action.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,10 @@

namespace Symfony\Component\DependencyInjection\Loader\Configurator;

use Webgriffe\SyliusPagolightPlugin\Infrastructure\Payum\Action\CancelAction;
use Webgriffe\SyliusPagolightPlugin\Infrastructure\Payum\Action\FailAction;
use Webgriffe\SyliusPagolightPlugin\Payum\Action\Api\ApplicationStatusAction;
use Webgriffe\SyliusPagolightPlugin\Payum\Action\Api\AuthAction;
use Webgriffe\SyliusPagolightPlugin\Payum\Action\Api\CreateContractAction;
use Webgriffe\SyliusPagolightPlugin\Payum\Action\CancelAction;
use Webgriffe\SyliusPagolightPlugin\Payum\Action\CaptureAction;
use Webgriffe\SyliusPagolightPlugin\Payum\Action\ConvertPaymentToContractAction;
use Webgriffe\SyliusPagolightPlugin\Payum\Action\StatusAction;
Expand All @@ -25,6 +24,11 @@
->public()
;

$services->set('webgriffe_sylius_pagolight.payum.action.cancel', CancelAction::class)
->public()
->tag('payum.action', ['factory' => 'pagolight', 'alias' => 'payum.action.cancel'])
;

$services->set('webgriffe_sylius_pagolight.payum.action.convert_payment_to_contract', ConvertPaymentToContractAction::class)
->public()
->args([
Expand Down
11 changes: 11 additions & 0 deletions config/shop_routing.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<?php

declare(strict_types=1);

use Symfony\Component\Routing\Loader\Configurator\RoutingConfigurator;

return static function (RoutingConfigurator $routes): void {
$routes->import('@PayumBundle/Resources/config/routing/cancel.xml');


};
48 changes: 48 additions & 0 deletions src/Payum/Action/CancelAction.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
<?php

declare(strict_types=1);

namespace Webgriffe\SyliusPagolightPlugin\Payum\Action;

use Payum\Core\Action\ActionInterface;
use Payum\Core\Exception\RequestNotSupportedException;
use Payum\Core\Request\Cancel;
use Sylius\Component\Core\Model\PaymentInterface as SyliusPaymentInterface;
use Webgriffe\SyliusPagolightPlugin\Client\PaymentState;
use Webgriffe\SyliusPagolightPlugin\PaymentDetailsHelper;
use Webmozart\Assert\Assert;

/**
* @psalm-type PaymentDetails array{contract_uuid: string, redirect_url: string, created_at: string, expire_at: string, status?: string}
*/
final class CancelAction implements ActionInterface
{
/**
* @param Cancel|mixed $request
*/
public function execute($request): void
{
RequestNotSupportedException::assertSupports($this, $request);
Assert::isInstanceOf($request, Cancel::class);

$payment = $request->getModel();
Assert::isInstanceOf($payment, SyliusPaymentInterface::class);

/** @var PaymentDetails $paymentDetails */
$paymentDetails = $payment->getDetails();
PaymentDetailsHelper::assertPaymentDetailsAreValid($paymentDetails);

$paymentDetails = PaymentDetailsHelper::addPaymentStatus(
$paymentDetails,
PaymentState::CANCELLED,
);
$payment->setDetails($paymentDetails);
}

public function supports($request): bool
{
return $request instanceof Cancel &&
$request->getModel() instanceof SyliusPaymentInterface
;
}
}
12 changes: 9 additions & 3 deletions src/Payum/Action/CaptureAction.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@
use Payum\Core\GatewayAwareTrait;
use Payum\Core\Reply\HttpRedirect;
use Payum\Core\Request\Capture;
use Payum\Core\Security\GenericTokenFactoryAwareInterface;
use Payum\Core\Security\GenericTokenFactoryAwareTrait;
use Payum\Core\Security\TokenInterface;
use Sylius\Component\Core\Model\PaymentInterface as SyliusPaymentInterface;
use Webgriffe\SyliusPagolightPlugin\Client\Exception\ClientException;
Expand All @@ -27,9 +29,9 @@
*
* @psalm-suppress PropertyNotSetInConstructor Api and gateway are injected via container configuration
*/
final class CaptureAction implements ActionInterface, GatewayAwareInterface
final class CaptureAction implements ActionInterface, GatewayAwareInterface, GenericTokenFactoryAwareInterface
{
use GatewayAwareTrait;
use GatewayAwareTrait, GenericTokenFactoryAwareTrait;

/**
* @param Capture|mixed $request
Expand Down Expand Up @@ -71,7 +73,11 @@ public function execute($request): void
}

$captureUrl = $token->getTargetUrl();
$convertPaymentToContract = new ConvertPaymentToContract($payment, $captureUrl, $captureUrl, $captureUrl);

$cancelToken = $this->tokenFactory->createToken($token->getGatewayName(), $token->getDetails(), 'payum_cancel_do', [], $token->getAfterUrl());
$cancelUrl = $cancelToken->getTargetUrl();

$convertPaymentToContract = new ConvertPaymentToContract($payment, $captureUrl, $cancelUrl, $cancelUrl);
$this->gateway->execute($convertPaymentToContract);
$contract = $convertPaymentToContract->getContract();
Assert::isInstanceOf($contract, Contract::class);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
webgriffe_sylius_pagolight_plugin:
resource: "@WebgriffeSyliusPagolightPlugin/config/shop_routing.php"

0 comments on commit d0daef7

Please sign in to comment.