lensmedia/symfony-ideal
Symfony bundle from Lensmedia for integrating iDEAL payments into your application, with configurable payment flows, simple service setup, and a developer-friendly API for initiating and handling transactions securely. It helps add online payment support to Symfony projects with minimal configuratio...
symfony/framework-bundle, DI container, config tree, bundle autoregistration). Laravel does not ship framework-bundle, and its pinned Symfony components (http-foundation, console, process, routing) will typically conflict with the bundle's transitive requirements. Run composer why-not lensmedia/symfony-ideal in a throwaway branch before you commit to any integration design — expect a hard conflict.src/ — is the iDEAL logic separable from the container glue, or is it entangled with AbstractController / container-aware services?Resources/config/services.* — the real service IDs and dependencies.Configuration class — the actual config keys (acquirer URL, merchant ID, sub-ID, certificate paths, test mode, return URL). README/config docs are secondary; for a package with 0 stars and one release, src/ is authoritative.composer require lensmedia/symfony-ideal, register the bundle if Flex doesn't, create config/packages/<alias>.yaml with credentials from .env/secrets (never committed), then verify wiring with debug:container | grep -i ideal, debug:router | grep -i ideal, and config:dump-reference <alias>.composer require. Vendor the underlying payment client into app/Domain/Payments/Providers/Ideal, strip DI/controller coupling, and replace the Symfony HTTP client with Laravel's Http facade or Guzzle. Wrap it behind a first-party PaymentGateway interface (createPayment / getStatus / refund / handleCallback).payments row (order id, amount in cents, currency, description, status, provider transaction id, created/updated timestamps) before calling the provider. You need it for reconciliation and for the case where a callback arrives before your redirect response has rendered.$payment = Payment::create([...]); // local record, status=pending
$txn = $gateway->createPayment($payment); // returns issuer redirect URL + txn id
$payment->update(['provider_txn_id' => $txn->id]);
return redirect()->away($txn->redirectUrl);
getStatus() server-side, and only then transition pending → paid. Verify any signature/checksum the provider sends; treat the browser redirect as a trigger to check, not as authority.PaymentGateway with DTOs at the boundary; nothing from this package should leak into controllers or models. This is what makes the inevitable swap to Mollie/Stripe/Adyen a config change rather than a rewrite, and it's the only sane way to adopt a zero-signal package.pending payments older than N minutes and re-queries status handles the "user paid but callback never arrived" case. Never rely on the return redirect alone.PaymentPaid/PaymentFailed events and handle order fulfilment in queued listeners, not in the callback controller.PaymentGateway interface with a fake/fixture provider for feature tests, so the redirect/return/status loop is covered without hitting sandbox.open/pending/paid/expired/cancelled) from the provider docs and assert it in tests — don't trust the bundled table.framework-bundle is unbootable in Laravel. No amount of version alignment fixes a missing bundle. Extraction, not installation, is the only path on Laravel.debug:router/route registration (Symfony) or your own route (Laravel); dump the provider request/response at the HTTP client boundary; verify return URL is fully qualified and matches what's registered; confirm the sandbox/test toggle is actually being read from config; check the status conversion table if a status looks wrong.LICENSE file — a private-sounding "private bundle" description may mean it was never intended for external use.How can I help you explore Laravel packages today?