Add Paynet (Moldova) payment gateway

PaymentSettings:
- New "🇲🇩 Paynet" section: enabled toggle, mode (test/live), merchant_code,
  service_id, user, password, secret (HMAC), webhook URL hint
- Webhook URL: https://service.mir.md/payments/paynet/webhook

PaymentController:
- startPaynet() — builds Paynet redirect (stub mode prints flow)
- paynetWebhook() — verifies HMAC-SHA256 signature canonical
  Merchant_Code|Order_ID|Amount|Status, marks subscription paid on Status=OK,
  matches by invoice_number = Order_ID
- availableMethods() includes paynet

Tenant /billing:
- 4th payment button "🇲🇩 Paynet" — visible only when configured.
  Description: Card MAIB / MICB / Victoriabank, MD Cash, e-money

Routes:
- POST /payments/paynet/webhook (CSRF excluded)
This commit is contained in:
2026-05-08 06:20:11 +00:00
parent 827bf12d89
commit 93a69dd826
4 changed files with 141 additions and 3 deletions
+17 -1
View File
@@ -140,6 +140,22 @@
</form>
@endif
@if ($methods['paynet'])
<form method="POST" action="{{ route('pay.start', ['subscription' => $inv->id]) }}" class="method-form">
@csrf
<input type="hidden" name="method" value="paynet">
<button class="method-btn">
<div class="method">
<div class="icon">🇲🇩</div>
<div>
<div class="label">Paynet</div>
<div class="desc">Card MAIB / MICB / Victoriabank, MD Cash, e-money</div>
</div>
</div>
</button>
</form>
@endif
@if ($methods['bank'])
<form method="POST" action="{{ route('pay.start', ['subscription' => $inv->id]) }}" class="method-form">
@csrf
@@ -156,7 +172,7 @@
</form>
@endif
@if (! $methods['stripe'] && ! $methods['paypal'] && ! $methods['bank'])
@if (! $methods['stripe'] && ! $methods['paypal'] && ! $methods['paynet'] && ! $methods['bank'])
<div style="text-align:center;color:#9ca3af;padding:32px 16px;font-size:13px;">
Nicio metodă de plată configurată. Contactează operatorul.
</div>