Weave Code
Weaver
Helps Laravel developers discover, compare, and choose open-source packages. See popularity, security, maintainers, and scores at a glance to make better decisions.
Feedback
Share your thoughts, report bugs, or suggest improvements.
Subject
Message

Payum Bundle Laravel Package

payum/payum-bundle

PayumBundle integrates Payum payment processing into Symfony, supporting 35+ gateways with YAML configuration, storage integration, and a secure capture controller. It powers payments for Sylius and works with any Symfony app.

View on GitHub
Deep Wiki
Context7

Technical Evaluation

Architecture fit. PayumBundle is a thin Symfony integration layer over payum/core. Payum models payments as a gateway (a named, configured payment provider) composed of actions that respond to typed requests — Capture, Authorize, Refund, Cancel, GetHumanStatus, Notify — plus a token-based security layer for capture/notify URLs and a pluggable storage abstraction (filesystem, Doctrine ORM, Doctrine MongoDB, Propel). The bundle contributes the Symfony-side concerns: DI extension and configuration tree, storage factory wiring, secured capture/notify controllers, routing, CLI commands, and a profiler panel.

This is a strong fit when a product needs provider-agnostic payment orchestration: multiple gateways behind one API, uniform status normalization, and off-site redirect flows with signed return/notify URLs. It is a weak fit when you need exactly one provider with a simple checkout — you inherit an abstraction tax (tokens, storages, action chains) with no offsetting benefit.

Integration feasibility. Composer install, a config/packages/payum.yaml block defining storages and gateways, then $gateway->execute(new Capture($payment)). The bundled offline factory gives a zero-credential smoke test of the entire token → capture → status loop before any real provider is touched. Models can be the shipped Payum\Core\Model\Payment/Token or your own entities implementing Payum's interfaces. Realistically a half-day to first successful offline capture, one to two weeks to a production-grade single-gateway integration including notify handling.

Technical risk. Moderate to elevated, concentrated in two places. First, version churn: 2.7.0 migrated service config from XML to PHP and routing from XML to YAML as breaking changes in a minor release, dropping PHP 7.4 and Symfony 4.4; 2.7.1 shipped a BC shim reintroducing XML files under deprecation. That tells you the maintainers iterate aggressively and that a 3.0 removal of XML is scheduled — a known migration clock, not a surprise. Second, domain risk: this code moves money. Idempotency, amount precision in minor units, token replay protection, and reconciliation are your responsibility, not the bundle's. The bundle handles the mechanics; it does not enforce your financial controls.

Note a data-quality flag: the provided metrics show Dependents: 0, which contradicts the README's statement that Sylius bases its payment stack on this bundle. Treat the dependent count as unmeasured rather than as evidence of low adoption, and verify ecosystem usage independently before using it as a signal.

Key questions.

  1. Which concrete gateways are in scope, and are all of them covered by first-party Payum factories at the versions we'd pin?
  2. What is the exact supported matrix (Symfony × PHP × Doctrine ORM) in composer.json at the version we'd adopt, given 2.7.0's drops?
  3. Are we PCI-scope-reducing (hosted/redirect gateways only) or do we need on-site card capture, which pulls in ObtainCreditCardAction and frontend form components?
  4. Which storage backend is production-intended for payments and tokens — and does our deployment topology (multiple app nodes, ephemeral filesystem) rule out the filesystem option entirely?
  5. Do we need multi-gateway routing (per-currency, per-region, failover), and does the payum registry support the switching logic we want without custom actions?
  6. What is our timeline relative to PayumBundle 3.0, and does it assume XML config removal?
  7. What is our support posture — community only, or a commercial arrangement — for a component on the critical revenue path?

Integration Approach

Stack fit. Native for Symfony applications on PHP 8.1+ and Symfony 5.4 through 8.x (per the 2.6/2.7 changelogs). Doctrine ORM is the mature storage path and ORM 3.x has been supported since 2.6.0. If the product is Sylius-based, this bundle is already in the dependency graph and integration is configuration rather than code. If the product is a custom Symfony app, the bundle slots in as a service-layer component with no assumptions about the rest of the app.

Migration path. Two credible entries:

  • From direct gateway SDKs — use a strangler pattern. Stand up Payum alongside the existing checkout, migrate one gateway and one flow (typically capture + notify) behind a feature flag, and keep reconciliation jobs reading from both until the new path is proven for a full settlement cycle. Do not port all gateways at once.
  • From an older PayumBundle — land on 2.7.x first, inventory any direct references to bundle XML service or routing files (those are what broke in 2.7.0 and are now deprecated), move them to the PHP/YAML equivalents, then treat 3.0 as a scheduled cleanup rather than a scramble.

Compatibility. Pin the bundle and payum/core together and validate the transitive gateway SDK constraints before committing — gateway libraries carry their own HTTP client and version requirements that occasionally collide. Confirm Propel storage isn't on your path; it's configured but is not where new work should go. On the test side, PHPUnit 10+ is supported from 2.7.0.

Sequencing.

  1. Prove the loop with the offline gateway and Doctrine storage in a dev environment.
  2. Choose production storage; write and index the payment/token entities; decide retention policy before volume arrives.
  3. Integrate one real gateway end-to-end, including the notify/webhook route and token verification, in the provider's sandbox.
  4. Harden: idempotency keys on capture, duplicate-notify handling, amount/currency validation, structured logging of gateway request/response.
  5. Add refund/cancel and status-sync (cron or webhook-driven) before adding a second gateway.
  6. Only then introduce multi-gateway routing and failover logic.

Operational Impact

Maintenance. Release cadence is healthy and the changelog is genuinely detailed — a real operational asset. But semver is applied loosely: 2.7.0 shipped breaking config-format changes in a minor. The practical policy is to pin exact versions, read every changelog before bumping, and budget a maintenance window for minors rather than treating them as drop-ins. The XML→PHP/YAML deprecation is a dated obligation: it is your upgrade backlog item until 3.0 lands.

Support. Community-driven: GitHub issues, Gitter, Stack Overflow tag, GitBook docs, and a maintained sandbox repository. There is a commercial entity behind it (forma-pro) and Sylius's ecosystem provides an indirect production reference. There is no vendor SLA — for a revenue-critical payment path, plan an internal owner and a fallback plan (the ability to call a gateway SDK directly for one provider if the abstraction becomes a blocker).

Scaling. The application tier is stateless and scales horizontally without ceremony. The real scaling surface is storage: payment and token records accumulate monotonically and are business records, not cache — design indexes on token hash and payment number from day one, and plan archival rather than deletion. Inbound notify/webhook endpoints should enqueue work rather than process synchronously, both to survive gateway retry storms and to keep response latency inside provider timeouts. Provider-side rate limits and per-gateway concurrency are the binding constraint long before PHP is.

Failure modes. The ones that will actually page you:

  • Filesystem storage in a multi-node deployment — tokens written on one node are invisible to another; silent, intermittent, and hard to diagnose. Treat this as a hard rule: Doctrine in production.
  • Token expiry and single-use semantics — expired or reused capture tokens produce confusing user-facing dead ends; needs explicit UX handling.
  • Notify replay and forgery — token verification must be enforced on every inbound notification; skipping it because "it's behind a firewall" is how duplicate fulfillments happen.
  • Amount representation — Payum uses minor units (123 = 1.23 EUR); a rounding or unit mismatch is a real money bug that testing rarely catches.
  • Partial capture/refund state drift — the local status must be reconciled against the provider, not trusted.
  • Credential rotation and sandbox/prod config drift — encrypted gateway config exists in the bundle; use it and define a rotation runbook.
  • Storage outage blocks checkout — because payment state is persisted mid-flow, a database incident becomes a revenue incident; size and monitor accordingly.

Ramp-up. Moderate, and the learning curve is Payum-specific rather than Symfony-specific. A competent Symfony developer will absorb the DI/configuration layer in hours; the request/action model, the token security model, and the storage contracts take longer, and the failure cases above are learned by getting them wrong. Budget one to two weeks to a confidently shipped single-gateway integration including webhooks, and meaningfully longer for multi-gateway routing plus reconciliation. Onboarding assets that shorten this: the GitBook Symfony getting-started guide, the sandbox repository, and Sylius's payment code as a production reference implementation.

Weaver

How can I help you explore Laravel packages today?

Conversation history is not saved when not logged in.
Prompt
Add packages to context
No packages found.
abbasudo/artisan-route
mirvan/ippanel
ignibyte/aic-framework
glavweb/data-schema-bundle
glavweb/datagrid-bundle
tacticmedia/scim-server
uni-method/frame
neika-ai/sdk
adachsoft/php-code-style
pharaonic/laravel-notification-dependencies
beautinow/translug
dev-brainiac/bot-cloaked
octoberrain/html
octoberrain/extension
octoberrain/exception
octoberrain/contracts
adachsoft/api-version-bundle
cgv/localized-resource
noith/settings
kda/laravel-package