Gestiona pagaments recurrents amb Redsys i Laravel. Laravel Redsys v2.0.

David
16 May 2023

Després d'uns mesos de desenvolupaments i proves, avui publiquem la versió 2.0 del paquet per Laravel, laravel-redsys.

Aquesta nova versió està totalment reescrita per convertir-se en el paquet més complert per Redsys. Incorpora les següents funcionalitats:

  • Integració amb els mètodes de redirecció i REST
  • Relacionar pagaments/requests amb models Eloquent
  • Emmagatzemar i relacionar targetes amb models Eloquent de manera segura
  • Gestió automàtica de les notificacions de Redsys (confirmació de pagament)
  • Capacitat per crear peticions Redsys totalment personalitzades i permetre implementar qualsevol funcionalitat de Redsys
  • Simulador local de pàgina de pagament per proves en local

Però el que és més important, a diferència de la v1, està a punt per incorporar més funcionalitat o novetats en l'API de Redsys.

Una altra novetat important respecte la v1, és que permet crear pagaments no relacionat amb models Eloquent, cobrint així tots els escenaris que com a desenvolupadors podem trobar.

Crear un pagament amb Redsys és tant senzill com això:

// Configurar el model
use Creagia\LaravelRedsys\Concerns\CanCreateRedsysRequests;
use Creagia\LaravelRedsys\Contracts\RedsysPayable;

class YourModel extends Model implements RedsysPayable
{
    use CanCreateRedsysRequests;

    public function getTotalAmount(): int
    {
        return 199_99;
    }

    public function paidWithRedsys(): void
    {
        // Notify user, change status to paid, ...
    }
}

// Crear la request
use Creagia\Redsys\Enums\PayMethod;

$redsysRequest = $yourModel->createRedsysRequest(
    productDescription: 'Product description',
    payMethod: PayMethod::Card,
);

Recordeu que si voleu fer una implementació totalment personalitzada, podeu fer servir directament la nostra llibreria redsys-php, que recentment també ha estat actualitzada amb una nova versió.

A continuació repasem un parell de novetats importants d'aquesta nova versió.

Operacions no relacionades a models Eloquent

Tot i que en la documentació del paquet trobareu detallat com relacionar operacions a models Eloquent, aquesta nova versió permet crear pagaments o operacions no relacionades.

use Creagia\LaravelRedsys\RequestBuilder;

$redsysRequestBuilder = RequestBuilder::newRequest(
    new \Creagia\Redsys\Support\RequestParameters(
        transactionType: \Creagia\Redsys\Enums\TransactionType::Autorizacion,
        productDescription: 'Description',
        amountInCents: 123_12,
        currency: Currency::EUR,
        payMethods: \Creagia\Redsys\Enums\PayMethod::Card,
    )
);

D'aquesta manera, a més a més, es poden crear operacions totalment personalitzades afegint els paràmetres que es vulguin a l'objecte RequestParameters.

Operacions Credential-On-File o pagament per referència

Una operació CoF és la qual, un cop autoritzada, Redsys ens retorna un token de referència que després podem fer servir per realitzar més operacions sense interacció del client.

Per crear una operació CoF, primer cal preparar el model que volem que quedi relacionat amb la targeta. Això acostumarà a ser un model User, Team o Subscription, per exemple.

use Creagia\LaravelRedsys\Concerns\InteractsWithRedsysCards;

class Team extends Model
{
    use InteractsWithRedsysCards;

    ...
}

I amb això ja podem fer la request inicial:

use Creagia\Redsys\Enums\CofType;
use Creagia\Redsys\Enums\PayMethod;

public function initialRequest()
{
    $redsysRequest = $yourProductModel->createRedsysRequest(
        productDescription: 'Product description',
        payMethod: PayMethod::Card,
    )->requestingCardToken(
        CofType::Recurring
    )->storeCardOnModel(
        $yourPayingModel // User, Team, ...
    );
    
    return $redsysRequest->redirect();
}

Un cop l'operació estigui confirmada, podrem realitzar nous pagaments fent servir la referència de targeta:

use Creagia\Redsys\Enums\Currency;
use Creagia\Redsys\Enums\TransactionType;
use Creagia\LaravelRedsys\RequestBuilder;
use Illuminate\Database\Eloquent\Model;
use Creagia\Redsys\Enums\CofType;

public function renewSubscription(Model $yourProductModel, Model $yourPayingModel)
{
    $redsysCard = $yourPayingModel->redsysCards->last();  // User, Team, ...
    
    $redsysRequest = RequestBuilder::newRequest(new RequestParameters(
        amountInCents: $yourProductModel->getTotalAmount(),
        currency: Currency::EUR,
        transactionType: TransactionType::Autorizacion,
    ))
        ->associateWithModel(
            $yourProductModel
        )->usingCard(
            CofType::Recurring, 
            $redsysCard,
        );

    return $redsysRequest->post();
}