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 Ems Bundle Laravel Package

justlease/payum-ems-bundle

A Symfony bundle that integrates the EMS payment gateway with Payum, offering gateway configuration, payment creation, callback handling, and transaction status workflows for JustLease applications.

View on GitHub
Deep Wiki
Context7

Technical Evaluation

Verdict up front: this is a Symfony bundle, not a Laravel package, and the TPM-level decision is therefore not "do we install this bundle" but "how much of the layer beneath it do we want to own." justlease/payum-ems-bundle is a thin DI/registration wrapper — a Bundle class, an Extension with a Configuration tree, a compiler pass, and service definitions — around justlease/payum-ems, which is itself a Payum GatewayFactory plus Action classes and an EMS HTTP client. With zero stars, zero dependents, and a single-vendor Bitbucket origin, treat it as an internal integration artefact that happens to be publicly readable, not a supported dependency. That framing drives every recommendation below.

Architecture fit. Three layers: Symfony bundle (DI, config tree, autoconfiguration) → justlease/payum-ems (Payum gateway factory, actions, API client) → EMS HTTP API. Only the top layer is Symfony-specific, and the top layer is precisely the part Laravel cannot consume. Payum core is framework-agnostic by design, so the business value — hosted payment page handling, capture/status/refund actions, notification mapping — sits one level below the part we'd have to throw away. Practical consequence: the bundle contributes zero to a Laravel roadmap; the underlying library is the only thing worth evaluating.

Integration feasibility. Medium, contingent on a licence check. Two viable paths:

  1. Payum-in-Laravel. Pull justlease/payum-ems directly, instantiate the gateway, and supply Eloquent-backed Storage\StorageInterface adapters plus a service provider. payum/payum-laravel-package exists but its maintenance cadence is stale and its Laravel-version coverage must be verified before we commit. Justified only if we already run Payum or need a multi-gateway abstraction.
  2. Extract and own. Read the EMS request-building and response-mapping out of payum-ems and implement a small EmsClient behind an interface we control. Removes the Payum dependency, the storage abstraction, and the stale-bridge risk in one move. Default recommendation unless Payum is already in the codebase.

Technical risk. Four areas a TPM must track explicitly:

  • Bus factor / abandonment. Single vendor, Dutch, built for Justlease's own leasing funnel. No issues, no stars, no dependents → no external bug reports will surface defects we haven't hit. Assume no security-patch cadence.
  • Distribution. Bitbucket VCS repo, almost certainly unpublishable to Packagist. Composer needs a vcs repository entry plus CI credentials (deploy key or app password), with no guarantee of semver tags — pin a commit SHA.
  • Framework drift. The bundle pins Symfony http-kernel/dependency-injection ranges and a Payum major (1.x vs 2.x wiring differs materially). These constraints can collide with our composer.json even if we never load the bundle, because Composer resolves them regardless.
  • Provenance and compliance. No visible licence. If we may not fork and vendor it, path 2 becomes legally necessary rather than merely preferable. Separately, PCI scope (hosted/redirect vs direct capture) and PSD2/SCA + 3DS2 coverage are unresolved and are go/no-go, not nice-to-have.

Key questions for the spike (each with an owner and a decision it unblocks):

  1. Is EMS European Merchant Services (Fiserv), and does payum-ems cover authorize, capture, refund, partial refund, void, 3DS/SCA challenge, tokenised repeat charges, and async notification — or only authorize/capture? (Gate: does it meet our payment-method roadmap?)
  2. Which Payum major and PHP/Symfony constraint does it pin, and does it conflict with our current lockfile? (Gate: installability.)
  3. Is the Bitbucket repo readable by us today, and under what licence, in writing? (Gate: fork/vendor legality.)
  4. Will Justlease confirm any maintenance commitment, or is this fire-and-forget? (Sets our fork budget.)
  5. Do we need recurring/mandate billing for the leasing-style funnel, and if so does the gateway support tokenised repeat charges? (Gate: product fit.)
  6. Are EMS sandbox credentials available, and is EMS certification required before production traffic? (Gate: schedule; certification is often weeks, not days.)

Integration Approach

Stack fit. Poor as shipped, sound underneath. Laravel has no bundle contract — no Bundle registration, no Extension/Configuration tree, no compiler passes, no services.yaml autoconfiguration. The bundle's entire job (conditional service registration from config) must be re-expressed as a ServiceProvider with a published config file and a singleton-bound gateway factory. That rewrite is small and well-understood; do not attempt a compatibility shim, and do not install the bundle.

Migration path. Run it as a bounded spike with explicit decision gates, not as a project:

  • Step 1 — Read, don't install (≈0.5 day). Clone both repos; count actions and API client methods in payum-ems. This sizing determines path 1 vs path 2 and costs hours.
  • Step 2 — Sandbox proof (≈2–3 days). In a scratch Laravel app, wire the gateway manually, run authorize → capture → refund against the EMS sandbox, and capture request/response payloads as fixtures.
  • Step 3 — Path decision (gate review). Under roughly 500 lines of API logic, write our own client. Above that, retain Payum with Eloquent-backed storage. Document the call and the evidence behind it.
  • Step 4 — Harden (≈1–2 weeks). Idempotency keys on every mutating call, raw gateway responses persisted, and a notification endpoint with signature or source verification plus replay protection.

Compatibility. Pin to a commit SHA — not a branch, not a version range. If the licence permits, vendor the payment package into a private packages/ path repository; this insulates us from Bitbucket availability, credential rotation, and retroactive history rewrites, all real risks on a vendor-owned repo. Verify the Payum major against our PHP and Laravel versions before Step 2, not after.

Sequencing. Land an internal PaymentGateway interface first (initiate, capture, refund, handleNotification), so the EMS adapter can be swapped or duplicated — a second acquirer for redundancy, or a migration off EMS — without touching checkout, refund, or reconciliation code. Interface first, EMS adapter second, webhook/callback handling third, reconciliation and reporting last. This ordering lets the checkout team work in parallel and keeps the acquirer decision reversible.

Operational Impact

Maintenance. Effectively ours from day one. No upstream team is watching this for external consumers, so plan fork-and-own explicitly: assign a named owner, mirror the repo internally, and book a quarterly review of the EMS API surface. Absolute burden is low — payment integrations are small and change slowly — but it is unshared and therefore unforecastable in aggregate if we add more such dependencies.

Support. No support channel exists. EMS-side issues route through the acquirer's merchant support; package-side issues route through us. The absence of documentation means onboarding a second engineer requires a reverse-engineering pass, so author internal docs during the spike — flow diagrams, payload fixtures, error taxonomy, and a runbook for "payment stuck in pending" — rather than retrofitting them after go-live.

Scaling. Transaction volume is low-concurrency and will not be the constraint; the integration will not appear in capacity planning. The genuine scalability concerns are correctness under volume, not throughput: idempotency under retries, callback replay and out-of-order delivery, durable persistence of raw provider responses, and reconciliation drift between our ledger and EMS settlement reports. These degrade gracefully at low volume and painfully at high volume, which is exactly the failure pattern that surprises teams.

Failure modes to instrument from day one. (a) Ambiguous gateway timeout — payment may have succeeded; never auto-retry a mutating call without an idempotency key. (b) Duplicate charge from user retry or double-submitted callback. (c) Spoofed or replayed notification mutating order state. (d) State machine divergence between Payum's token/status model and our order model, visible only at reconciliation. (e) CI breakage from rotating Bitbucket credentials. (f) Currency/rounding mismatches on refund and partial refund. Each should have an alert and a documented human procedure before launch.

Ramp-up. Roughly three engineer-days to reach a confident go/no-go, and two to three weeks to production-grade including hardening, reconciliation, and documentation. The binding schedule risk is external: EMS sandbox access and any required certification. Secure those before committing the sprint, and hold the acquirer relationship accountable for sandbox timelines — that, not the code, is the critical path a TPM should be managing.

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.
adachsoft/changelog-linter
adachsoft/collection
payerurl/telegrambot-crypto-payment-instant-payout
dskripchenko/laravel-hybrid-search
riorizkyrainey/lara-ced
mehedimi/static-vel
zharp/zharp
nonsapiens/bigquery-model-sync
lgu-bayambang-ict-office/lgu-laravel-development-standards
andydefer/laravel-support
se7enxweb/flysystem
lampwick/laravel
jeslage/statamic-emojis
micahdshackelford/rmap-laravel
draftsmaninc/draftsman
square-bit/laravel-volition
himito/laravel-mailman
htinlynn/genius-helper
maco-studios/hephaestus
elmogy/larafast