ezsystems/payment-core-bundle
JMSPaymentCoreBundle provides a unified Symfony API for integrating multiple payment backends. It handles payment and transaction persistence, retries, sensitive-data encryption, and supports many providers out of the box.
Architecture fit. Poor. Despite the Composer package name, ezsystems/payment-core-bundle (published as jms/payment-core-bundle) is a Symfony bundle, not a framework-agnostic library. It ships a JMSPaymentCoreBundle class extending Symfony\Component\HttpKernel\Bundle\Bundle, Doctrine ORM entities (Payment, Transaction, Credit, FinancialTransaction), Symfony DI service definitions, and an event-dispatcher-driven transaction workflow. Laravel has no bundle kernel, no services.yml container compilation, and a different ORM and event model. There is no service provider, facade, config file, or Laravel test coverage. "Installing" it via Composer will succeed; booting it will not.
Integration feasibility. Effectively zero without a port. A viable integration would require reimplementing the domain model as Eloquent/Doctrine-independent entities, rewriting the payment workflow state machine against Laravel's container and events, replacing Symfony Form/Validator/security plumbing, and re-validating every gateway adapter. That is a rewrite wearing an integration's clothes. The package is also archived with 2 stars and 0 dependents — no upstream patches, no maintainer response, no compatibility work for PHP 8.x, Symfony 6/7, or Laravel 10/11.
Technical risk. High and asymmetric.
mcrypt (removed in PHP 7.2) or deprecated openssl modes, and archived payment code receives no CVE backports.composer.json.Key questions.
Stack fit. None directly. Treat this package as a reference architecture, not a dependency. The transferable ideas are: a Payment/Transaction state machine, retry semantics, gateway-agnostic request/response DTOs, and persistence of transaction history. Those are worth ~1–2 days of design study and zero lines of copied code.
Migration path. Recommended path is a thin, first-party abstraction:
App\Payments\Contracts\Gateway with authorize, capture, refund, void, plus a PaymentIntent value object and normalized Result.config/payments.php and env/KMS-held secrets.payments, payment_events, and webhook_events tables with idempotency keys; never store PAN/CVV — store PSP tokens only.If a framework-agnostic abstraction is genuinely mandated, evaluate league/omnipay (actively used, Laravel-friendly) or a provider-agnostic layer like Laravel Cashier for Stripe/Paddle. Both are maintained; this bundle is not.
Compatibility. Assume PHP 8.x, Laravel 10/11, MySQL 8/Postgres. The package's Symfony 2/3-era constraints will not resolve. Any attempt to force it creates a composer.json conflict surface that blocks future framework upgrades — an unrecoverable position for a payments subsystem.
Sequencing.
Maintenance. If adopted, we own the code outright: no upstream fixes, no security releases, no PHP/framework compatibility work. Budget ongoing fork maintenance or accept a frozen, unpatchable subsystem sitting in the payment path — the highest-consequence place to freeze code. Recommended path (first-party abstraction over a maintained SDK) shifts maintenance to the PSP vendor.
Support. Zero vendor support, 2 stars, 0 dependents means no community to triage issues, no Stack Overflow corpus, no known-issue database. Incident response falls entirely on our on-call engineers debugging unfamiliar Symfony/Doctrine internals during a revenue-impacting outage.
Scaling. Persistence-heavy transaction model with Doctrine entities is fine at moderate volume but adds a Doctrine/Symfony-shaped resource profile to an otherwise Eloquent application — two ORMs, two migration systems, two connection pools, doubled cognitive load. Webhook throughput and retry storms need explicit queue/backpressure design regardless of library.
Failure modes to design for.
Ramp-up. Any engineer touching this needs Symfony bundle/DI/Doctrine fluency plus payments domain knowledge — a rare and expensive combination, and the opposite of the Laravel team's existing skill set. Realistic ramp-up on the legacy code is weeks for basic literacy and months for confident incident response. By contrast, a 500-line first-party abstraction over a documented SDK is reviewable in an afternoon by any senior Laravel engineer.
TPM recommendation. Do not adopt. Record the decision, harvest the domain model as design input, and build a thin internal gateway abstraction over a maintained PSP SDK. The unified-API premise is sound; this specific artifact is archived, Symfony-only, PCI-expanding, and unmaintained — all four disqualifying for a payments path.
How can I help you explore Laravel packages today?