Search by

webrteu / revolut

webrteu

Revolut Merchant API driver for webrteu/payments (Laravel)

v1.0.0 2026-11-04 05:09 UTC

This package is auto-updated.

Last update: 2026-11-04 05:10:13 UTC


README

PHP Laravel Licență MIT Packagist

Integrare Laravel pentru Revolut Merchant API (plăți online pentru conturi Revolut Business): pagina de checkout Revolut, webhook semnat HMAC-SHA256 confirmat prin API, captură, anulare și refund. Implementează Gateway, Refundable, Capturable și ConfirmsWebhooks din webrteu/payments.

Nu este un pachet oficial Revolut.

Cerințe

  • PHP ^8.2, Laravel 12–13
  • cont Revolut Business cu Merchant activat
  • webrteu/payments

Instalare

composer require webrteu/revolut
php artisan vendor:publish --tag=revolut-config
php artisan revolut:webhook:create --url=https://site.ro/webhooks/payments/revolut

Configurare

REVOLUT_SANDBOX=true
REVOLUT_SECRET_KEY=            # Revolut Business → Merchant → API (cheie separată pentru sandbox)
REVOLUT_API_VERSION=2026-04-20
REVOLUT_WEBHOOK_SECRETS=       # wsk_..., mai multe separate prin virgulă în timpul rotației
REVOLUT_CAPTURE_MODE=automatic # automatic | manual
REVOLUT_TIMEOUT=20

Versiunea API e fixată, ca o schimbare la Revolut să nu strice pachetul neanunțat. ⚠️ Câmpurile comenzilor și căile de captură / refund se confirmă pe versiunea fixată.

Utilizare

$redirect = Payments::start('revolut', $paymentRequest, payable: $order);   // POST /api/orders, amount în bani
return $redirect->toResponse();                                             // checkout_url

$redirect->fields['token'] conține token-ul comenzii, pentru widget-ul Revolut Checkout JS (opțional).

Metodă Revolut
status($id) GET /api/orders/{id}
Revolut::capture($id, $bani) POST /api/orders/{id}/capture
Revolut::void($id) POST /api/orders/{id}/cancel
Revolut::refund($id, $bani) POST /api/orders/{id}/refund

Webhook

php artisan revolut:webhook:create --url=https://site.ro/webhooks/payments/revolut
php artisan revolut:webhook:list
php artisan revolut:webhook:rotate {id} --expiration=PT24H

create și rotate afișează signing_secret o singură dată și nu scriu nimic în fișiere: îl pui tu în REVOLUT_WEBHOOK_SECRETS. La rotație păstrezi ambele secrete până expiră cel vechi.

Verificare: Revolut-Signature = v1= + HMAC-SHA256(v1.{Revolut-Request-Timestamp}.{corp brut}), comparat cu toate semnăturile din header și cu toate secretele; timestamp-ul (în milisecunde) trebuie să fie în toleranța de 300 s. Notificarea e doar un semnal: jobul cere GET /api/orders/{id} și folosește state de acolo. Răspuns: HTTP 204.

Revolut reîncearcă doar de 3 ori, la 10 minute: programează payments:reconcile.

Statusuri

state PaymentStatus
pending, processing Pending
authorised Authorized (la capture_mode=manual)
completed Paid
failed Failed
cancelled Cancelled

Ce nu face pachetul

  • nu include componenta Blade pentru widget-ul Revolut Checkout (doar token-ul)
  • nu scrie secretele webhook-urilor în .env

Testare

composer test
REVOLUT_SANDBOX_SECRET_KEY=... vendor/bin/pest --group=sandbox

Vectorul de semnătură e calculat după schema documentată. De înlocuit cu exemplul oficial Revolut.

Changelog

Vezi CHANGELOG.md.

Autor

WeBRTeu

Licență

MIT. Vezi LICENSE.md.