webrteu / revolut
Revolut Merchant API driver for webrteu/payments (Laravel)
Requires
- php: ^8.2
- illuminate/console: ^12.0|^13.0
- illuminate/http: ^12.0|^13.0
- illuminate/support: ^12.0|^13.0
- webrteu/payments: ^1.0
Requires (Dev)
- larastan/larastan: ^3.13
- laravel/pint: ^1.32
- orchestra/testbench: ^10.0|^11.0
- peckphp/peck: ^0.3
- pestphp/pest: ^3.8|^4.7
- pestphp/pest-plugin-laravel: ^3.2|^4.1
- pestphp/pest-plugin-type-coverage: ^3.6|^4.0.4
- phpstan/phpstan: ^2.3.3,!=2.3.4
- rector/rector: ^2.8
Suggests
None
Provides
None
Conflicts
None
Replaces
None
README
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
Licență
MIT. Vezi LICENSE.md.