cartalyst/stripe-laravel
Laravel integration for the Stripe PHP SDK, providing a service provider, configuration file, and a Stripe facade for convenient access to Stripe's API—customers, charges, subscriptions, webhooks, and more—from within your Laravel application.
What we are actually evaluating. Despite a description that still says "Laravel 8 integration," the current line (v17.0.0, released 2025-02-28) targets Laravel 12. Functionally the package is a thin Laravel adapter over stripe/stripe-php: a service provider, a Stripe facade, a publishable config file for API keys, and multi-account/connection support. It adds no payment logic of its own — no subscription lifecycle, no webhook plumbing, no dunning, no proration. That framing drives everything below: the decision is not "buy a payments platform," it is "buy a few hundred lines of container wiring and inherit an upstream cadence."
Architecture fit. High in principle. It composes through the service container and Composer and adds no runtime, no daemon, no schema, and no network surface of its own. Any Laravel service already using framework config and facade idioms absorbs it with near-zero architectural change. Because the facade passes through to the full Stripe PHP API, the wrapper imposes no capability ceiling — customers, charges, subscriptions, invoices, and payment intents are all reachable.
Integration feasibility. Mechanically trivial: one Composer constraint, a published config file, and env/secret-sourced credentials. Real feasibility is gated by our own platform position. On Laravel 12 this is a constraint bump; below Laravel 12 it is inapplicable and reframes as a framework-upgrade project, not a payments-integration project. The second gate is credential handling — the package's model is config-file-driven, so we must confirm keys flow from a secrets manager or environment and never from a committed config.
Technical risk.
stripe-php, exit cost is a mechanical refactor: instantiate StripeClient directly, replace facade calls. This is a genuinely favorable risk profile and should be weighed against alternatives that own more surface.composer.json and the changelog as source of truth.stripe-php majors plus Stripe's dated API versions. Neither is optional. This is the dominant recurring cost, not the initial integration.Key questions.
v17 — Laravel 12 only, or 11 + 12? Which PHP floor and ext-* requirements?stripe-php major does the current line pin, and how quickly does the package follow stripe-php majors?Stack fit. Standard Laravel application or service, Composer with a committed lockfile, credentials in env/secrets. Fit is high wherever the framework version matches. The gating question is not "does it fit" but "are we on Laravel 12, and is this the only payments abstraction the team will use?"
Migration path.
composer.json for framework and PHP constraints rather than inferring from the release note. Confirm additive versus 12-only before planning anything else.composer update.stripe-mock): customer creation, charge, subscription lifecycle, refund, and error/decline paths.Compatibility. Verify the PHP floor and extension requirements against every runtime in the fleet. Confirm the transitive pin on stripe-php does not conflict with the existing lockfile — if any other service uses stripe-php directly, both must land on compatible majors, and that coordination is the real compatibility risk here, not the Laravel constraint.
Sequencing. Laravel/PHP runtime first → package major second → stripe-php/API-version alignment third → cleanup of deprecated facade usage last. Roll out to one non-critical service, hold one release cycle, then propagate. Keep the prior major resolvable so rollback is a constraint revert.
Adoption policy. Standardize on this wrapper as the single payments entry point, or standardize on stripe-php directly. Mixed usage across services doubles the upgrade surface for no benefit and is the most likely way this decision degrades.
Maintenance. Initial integration is measured in hours; the recurring cost is cadence tracking across two upstreams (Laravel majors, stripe-php majors plus Stripe API versions). Budget one planned upgrade per Laravel major and one per stripe-php major as recurring capacity. Pin the constraint deliberately, let dependency automation open PRs, and never auto-merge majors on the payment path.
Support. Unevaluated, and the largest unquantified risk. Modest stars, zero listed dependents, stale top-level docs, and no supplied maintainer or security-policy data. Close this before adoption: identify maintainers, confirm recent issue response, and require a disclosure channel. Mitigate structurally by keeping the wrapper at arm's length — no business logic inside facade calls, all Stripe access behind our own thin service layer — so a fork or a swap to stripe-php is a contained change rather than an archaeology exercise.
Scaling. Negligible from the package itself; it is application-layer glue with no state. The real scaling concerns are ours and unaddressed by the wrapper: Stripe rate limits (notably stricter in test mode), queueing non-interactive Stripe calls, idempotency keys on retries, and webhook ingestion with signature verification. The package ships none of that.
Failure modes. (a) Silent API drift — an unpinned Stripe API version changes charge or subscription semantics after an account upgrade; mitigation is the explicit pin plus contract tests. (b) Framework-major lockstep — a Laravel upgrade blocks until the wrapper releases, forcing the payment path to gate a platform upgrade; mitigation is a maintained fork path and low exit cost. (c) Maintainer abandonment — no release for the next Laravel major; mitigation is the arm's-length service layer and a pre-scoped swap to stripe-php. (d) Credential leakage — keys committed in a published config; mitigation is secrets-manager sourcing and pre-commit scanning. (e) Test/production divergence — behavior only validated against test-mode rate limits and objects; mitigation is a small production canary with reconciliation.
Ramp-up. Low. A Laravel-fluent engineer is productive in under a day — publish config, set env vars, inject the facade, make a first call. The learning investment is not the wrapper; it is the surrounding discipline the wrapper does not provide: idempotency, webhook verification, currency/minor-unit handling, error taxonomy for declines, and reconciliation. Plan onboarding around those, and treat fluency with the Stripe dashboard and test clocks as part of the deliverable.
How can I help you explore Laravel packages today?