t3xdeveloper/stripe-payment-jms
Laravel package that connects Stripe payments with JMS, giving PHP developers a simple, configurable way to create charges, process webhooks, and manage payment flows. Lightweight integration with minimal setup, ideal for quickly adding Stripe checkout to Laravel applications.
Architecture fit. Despite being framed as a "Laravel/PHP package," the package is explicitly built on JMSPaymentCoreBundle, which is a Symfony bundle (not a Laravel package). Laravel does not natively load Symfony bundles, does not use the Symfony bundle/container loading convention, and does not share the Doctrine + EventDispatcher + PaymentCoreBundle abstraction that this package almost certainly depends on. In practice this is a Symfony (likely Symfony 4/5-era) payment bridge — not a Laravel integration. For a Laravel codebase, the architecture fit is poor: adopting it means bringing a foreign service-container layer, a foreign payment abstraction, and a legacy bundle's assumptions into an application that already has idiomatic payment paths (laravel/cashier, direct stripe/stripe-php, or a thin internal wrapper). The one architectural idea worth preserving is the abstraction: a PaymentProvider-style seam between the app and Stripe, which is good design regardless of source package.
Integration feasibility. Feasibility is low-to-moderate and highly stack-dependent. On a Symfony 4/5 stack that already runs JMSPaymentCoreBundle, the composer constraints, service registration, and routing for Stripe webhooks could plausibly be wired up in a spike. On Laravel, the package offers no service provider, no facade, no config publish, and no queue-friendly event flow — the integration work would largely be reimplementation using the package as a reference, which defeats the purpose of adopting it. Two feasibility gates dominate: (1) does composer require resolve cleanly against the target PHP/Symfony/Laravel versions, and (2) does it target modern Stripe semantics (PaymentIntents, SCA/3DS, idempotency keys) or legacy Charges? The 2023-03-15 release predates several Stripe API and SDK changes and likely pins an old stripe/stripe-php major.
Technical risk. High. Signals: 0 stars, 0 dependents, single-maintainer, single 2023 release, and dependence on JMSPaymentCoreBundle (itself effectively legacy). The absence of dependents means no peer review, no ecosystem validation, and no downstream bug reports to learn from. Stripe's API versioning is a moving target; an old SDK in a payments path is a security and compliance liability (webhook signature verification, secret handling, TLS/SDK hygiene). Abandonment risk is near-certain, so the true cost is "adopt + fork + own," not "adopt + depend." Bus factor of one on a payment path is unacceptable for production without a funded internal owner.
Key questions. (1) Are we actually a Symfony shop or a Laravel shop — and does this package match the runtime we ship on? (2) What PHP/Symfony/Laravel/Doctrine version range does composer.json allow, and does it resolve today? (3) Which Stripe objects does it handle — Charges vs PaymentIntents — and does it support SCA/3DS, 3D Secure redirects, and off_session/setup_future_usage flows? (4) How are webhooks received, verified (signing secret), idempotently processed, and queued? (5) What is the test coverage, and is there any CI? (6) Who owns this internally if we adopt it, and what is the funded maintenance commitment? (7) Is there any real IP/licensing ambiguity in a thinly-forked JMS bundle, given MIT is claimed?
Stack fit. Treat as a Symfony-only candidate, not a Laravel package. If the target is Laravel, stop here and evaluate laravel/cashier or a thin internal adapter over stripe/stripe-php; this package is not the right tool. If the target is Symfony 4/5 + JMSPaymentCoreBundle, proceed to a bounded spike, but only after confirming the composer constraint matrix resolves. If the target is Symfony 6/7, expect friction: JMSPaymentCoreBundle and this bridge are unlikely to have been updated for modern Symfony, so this is a fork-and-port exercise.
Migration path. Do not "migrate to" this package. Two viable paths: (a) if already on JMSPaymentCoreBundle, use it as a reference implementation for the Stripe provider adapter and plan an exit from the JMS abstraction rather than deepening the dependency; (b) if greenfield, define an internal PaymentProvider interface in the application, implement it directly against stripe/stripe-php, and keep Stripe-specific types out of the domain layer. Either way, isolate all third-party code behind the interface so a later swap is contained. Migrating off is the recommendation, not migrating on.
Compatibility. Pin and vendor: exact stripe/stripe-php version, exact Stripe API version, PHP and Symfony constraint ranges, and the Doctrine/EventDispatcher transitive graph. Run a compatibility matrix against the application's pinned PHP and Symfony/Laravel versions. Add an explicit Stripe API version header and a smoke test against Stripe test mode. Treat the package's composer.json as authoritative for the maximum it supports, not the minimum the app needs.
Sequencing. (1) Stack/version confirmation — resolve composer require in an isolated branch. (2) Two-day spike: one successful PaymentIntent with SCA/3DS, one webhook verified and idempotently processed, one refund. (3) Security review of secret handling, webhook signature verification, and logging. (4) Build-vs-adopt decision gate with explicit scoring on maintainability, feature coverage, and ownership cost. (5) If adopting, fork to internal ownership, add CI, and write contract tests. (6) Ship behind a feature flag with a kill switch back to the current provider. (7) Decommission or archive the spike branch.
Maintenance. Effectively zero upstream maintenance. The package will be maintained by whoever on your team adopts it; budget internal fork ownership from day one. Payment dependency drift (Stripe SDK, Stripe API version, PHP/Symfony) means a recurring, unbudgeted upgrade cadence — at least one planned maintenance window per major PHP or Stripe SDK bump. The dependency on JMSPaymentCoreBundle compounds this: any upgrade to either layer ripples.
Support. No vendor support, no active community, and 0 dependents means no Stack Overflow corpus. Support is Stripe's own documentation plus internal engineer time. Incident response for payment bugs falls entirely on the internal owner, with no upstream backstop.
Scaling. The package is a thin provider adapter; runtime overhead is negligible and Stripe absorbs transactional scale. The real scaling risks are operational: webhook throughput and retries need a queue-backed consumer with dedupe/idempotency, and reconciliation logic must be owned internally (the package won't provide it). Do not assume the package's abstractions scale to multi-currency, multi-account (Stripe Connect), or subscription complexity without additional in-house work.
Failure modes. Stripe API/SDK deprecations silently breaking charges; webhook signature verification gaps or missing idempotency causing duplicate fulfillment or missed payments; SCA/3DS flow regressions causing EU/UK card declines; PHP/Symfony upgrades breaking the JMS event pipeline; secret leakage via legacy logging patterns; abandoned package receiving no security patches; and — the highest-risk mode — the maintainer disappearing with no forkable knowledge transfer, leaving an undocumented payments path. Each of these is amplified by the 0-star, 0-dependent, single-maintainer footprint.
Ramp-up. Expect 1–2 engineer-weeks to reach working fluency in the JMS payment abstraction plus the Stripe provider plus the package's non-standard wiring — more if the team is Laravel-native and has to learn Symfony bundle mechanics. Documentation is likely sparse; knowledge transfer will come from reading source. Ongoing ramp-up cost for new hires is real and should be factored into the decision.
Recommendation. Do not adopt in production as a dependency. Use the package as a reference for provider abstraction at most, and build a thin, internally owned integration over stripe/stripe-php (or laravel/cashier on Laravel). If a spike validates it on a Symfony legacy stack, gate adoption on a funded internal owner, a fork with CI and contract tests, and a documented exit path to the internal adapter.
How can I help you explore Laravel packages today?