justlease/payum-ems
Payum gateway for EMS payments, helping Laravel/PHP applications initiate and handle EMS payment flows through Payum’s unified API. Adds the EMS integration layer so gateway-specific request and response handling stays out of your application code.
Adopt when:
COMPOSER_AUTH / Bitbucket app password), and licence clarification are prerequisites before the first composer install.Look elsewhere when:
Evaluation checklist before any commitment: read the commit history and last-commit date; confirm supported Payum major and PHP versions (test on 8.2/8.3, since older Payum releases break on dynamic-property deprecations); verify which Payum actions exist (authorize, capture, void, refund full/partial, notify, status); check for a test suite including contract tests against the EMS sandbox; confirm licence and fork rights; check for JustLease-specific assumptions (order IDs, customer models) baked into the code; and confirm the EMS API endpoints and credentials model (merchant ID, sub-ID, secret, sandbox flag, return URL) match your contract.
For executives — the decision in one paragraph. This is a small, purpose-built connector that lets our Laravel platform accept payments through EMS, a major Benelux acquirer, without an engineering build. It is a cheap way to add or dual-source a Dutch payment rail — but only if the EMS merchant relationship is already a business decision. On its own it is not a technology choice worth making: the package has essentially zero external adoption, no Packagist presence, no stated licence we have confirmed, and appears maintained by a single originating company. So the recommendation is: approve only alongside an EMS merchant account decision, and budget it as code we adopt and own — a fork under our control, pinned, with tests and an exit path — not as a supported vendor product. The financial ask is modest (roughly 0.1–0.2 FTE steady-state maintenance plus a few weeks of initial engineering), and the strategic upside is real: a Dutch rail, negotiating leverage with our incumbent processor, and a second gateway behind the same abstraction so we can switch without re-platforming.
For engineering — what it actually is and what we must do. It is a Payum GatewayFactory that maps EMS's API onto Payum's Api/Action contracts. That is the right architectural shape: provider specifics stay behind an abstraction instead of leaking into controllers. The catch is that Payum is framework-agnostic, so adopting this means adopting Payum's action pipeline, capture-token storage, and Symfony dependencies — clean if we already run Payum, a significant commitment if we do not. Plan to: audit the licence and code first and stop if either fails; fork into our own Git hosting with semantic tags and CI (PHPUnit, PHPStan, lint); pin by commit SHA, never by branch; obtain EMS sandbox credentials and write contract tests for authorize → capture → refund → notify; wrap the gateway behind our own PaymentGateway interface so Payum types never appear in domain code; run staging against the EMS test terminal including failure and timeout paths; canary behind a per-tenant or per-currency flag; and dual-write payment records against the existing path until reconciliation is proven through a full settlement cycle.
Operational expectations to set now. After forking, we own this outright — budget 0.1–0.2 FTE steady state with spikes on PHP/Payum upgrades and annual card-scheme mandate changes. There is no vendor to escalate to: EMS supports its gateway, not this adapter, so we need an internal runbook covering credential rotation, sandbox access, decline codes, and reconciliation. On-call must distinguish a decline (business outcome) from an error (system fault) from a timeout (unknown state requiring reconciliation) — conflating these is how customers get double-charged. Enforce idempotency keys, verify notifications by calling back to EMS rather than trusting the payload, and process callbacks through a queue rather than inline. Watch for the classic failure modes: silent API drift producing elevated declines with no code change to blame; orphaned authorisations after timeouts; expired Bitbucket credentials blocking deploys; minor-unit and rounding errors on multi-currency or partial refunds; and an abandoned adapter compounding into a framework and security-patch freeze.
Bottom line: valuable if and only if the EMS merchant relationship is already decided on commercial grounds. As a technology choice in isolation it is a low-cost, low-support bet that must be internally owned — approve it as such, or not at all.
How can I help you explore Laravel packages today?