webrteu / euplatesc
EuPlatesc.ro driver for webrteu/payments (Laravel, Romania)
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 EuPlatesc.ro (EuroPayment Services): plată pe pagina găzduită EuPlatesc printr-un formular
POST semnat HMAC-MD5 (fp_hash), confirmare prin Silent URL. Implementează Gateway din webrteu/payments.
Nu este un pachet oficial EuPlatesc.
Cerințe
- PHP
^8.2, Laravel 12–13 - contract EuPlatesc (Merchant ID + cheie secretă hex)
webrteu/payments
Instalare
composer require webrteu/euplatesc php artisan vendor:publish --tag=euplatesc-config
Configurare
EUPLATESC_MERCHANT_ID= EUPLATESC_SECRET_KEY= # cheia hex primită de la EuPlatesc EUPLATESC_CURRENCY=RON EUPLATESC_LANG=ro EUPLATESC_SEND_URLS=false # true = trimite ExtraData[successurl/failedurl/silenturl] per tranzacție ⚠️
Contul nou e în mod test până la activare. ⚠️ Nu există un URL de sandbox separat (de confirmat cu EuPlatesc).
Utilizare
$redirect = Payments::start('euplatesc', new PaymentRequestData( orderId: "{$order->id}-{$attempt}", // invoice_id, unic per încercare amount: 14170, // trimis ca "141.70" description: "Comanda {$order->id}", // trimisă fără diacritice customer: new CustomerData($order->email, $order->first_name, $order->last_name), returnUrl: route('checkout.return', $order), ), payable: $order); return $redirect->toResponse(); // pagină cu <x-payments::auto-submit-form>, trimisă automat
sau în propriul view: <x-payments::auto-submit-form :redirect="$redirect" />.
Semnătura folosește LengthPrefixedHmac din core: câmpurile amount, curr, invoice_id, order_desc, merch_id, timestamp, nonce, în această ordine; timestamp = gmdate('YmdHis'). Descrierea se trimite fără diacritice, pentru că strlen
numără octeți.
Pagina de return, doar pentru afișare: EuPlatesc::verifyReturn($request->post(), $payment->amount).
Webhook (Silent URL)
- în panoul EuPlatesc, la Silent URL:
https://site.ro/webhooks/payments/euplatesc - verificare:
fp_hashpeamount, curr, invoice_id, ep_id, merch_id, action, message, approval, timestamp, nonce⚠️ (ordinea se confirmă cu documentația de la contract), apoimerch_id, iar suma e verificată de core - idempotență:
ep_id+action - răspuns: HTTP 200
OK⚠️
action |
PaymentStatus |
|---|---|
0 |
Paid |
| altceva | Failed (motivul în raw.message) |
Comenzi Artisan
payments:reconcile nu funcționează pentru EuPlatesc: fără API de operații, status() aruncă
UnsupportedOperationException. Sursa adevărului rămâne Silent URL-ul.
Ce nu face pachetul
- nu implementează API-ul de operații (captură, anulare, refund, status) ⚠️ disponibil doar pe anumite conturi
- nu marchează comanda plătită din pagina de return
Testare
composer test
EUPLATESC_SANDBOX_MERCHANT_ID=... EUPLATESC_SANDBOX_SECRET_KEY=... vendor/bin/pest --group=sandbox
Vectorul fp_hash din teste e calculat cu implementarea din core. De înlocuit cu exemplul oficial EuPlatesc.
Changelog
Vezi CHANGELOG.md.
Autor
Licență
MIT. Vezi LICENSE.md.