gabrielextso/paybox-bundle
Symfony bundle for integrating the Paybox payment gateway into PHP applications. It provides configuration and service wiring to initiate Paybox payments and handle payment responses, simplifying secure online payment setup in Symfony projects.
Architecture fit — the framework mismatch is the headline. The package is gabrielextso/paybox-bundle, a fork of the dormant lexik/paybox-bundle, and it is a Symfony bundle, not a Laravel package. It ships Symfony idioms throughout: a Bundle class, a DI extension with a Configuration tree, service definitions, and EventDispatcher hooks — and still uses the Lexik\Bundle\PayboxBundle namespace. A Laravel application has no bundle system, no config/bundles.php, and no compatible container wiring, so the package cannot be installed into a working state without a compatibility shim that costs more than a clean reimplementation. For a TPM the practical read is: nothing here is directly consumable by a Laravel team. Its value is as a documented reference implementation of the Paybox System protocol — request parameter set (PBX_SITE, PBX_RANG, PBX_IDENTIFIANT, PBX_TOTAL, PBX_DEVISE, PBX_CMD, PBX_RETOUR, PBX_HASH, PBX_TIME), HMAC signing of the canonical string, and callback/IPN parsing — which is exactly the part that is fiddly and easy to get subtly wrong.
Integration feasibility — the protocol is tractable, the dependency is not. What the bundle actually encapsulates is a few hundred lines: build the redirect form, sign it, verify the return signature, reconcile the order. That is a 3–5 day spike for a competent engineer, not a multi-sprint platform effort. The blocker is commercial, not technical: without a Verifone/Paybox merchant contract and preprod credentials (PBX_SITE, PBX_RANK, PBX_IDENTIFIER, HMAC key) the package is untestable and the whole decision is unbounded. Treat contract confirmation as the gate for every downstream estimate.
Technical risk — high, and concentrated on the exact surface where it matters.
hash_equals) and strict parameter canonicalization. An unmaintained HMAC implementation sitting in the payment path is an unacceptable blind dependency, and there is no diff confidence against upstream because the fork's changes are not documented.composer.json.Key questions to resolve before any commitment:
hash_equals and enforce the documented key set/ordering rather than trusting the request?composer.json constraints (PHP, symfony/framework-bundle, sensio/framework-extra-bundle)?Stack fit — do not install; lift the logic. In a Laravel codebase the realistic options, in preference order:
PayboxGateway service (form payload + redirect), one signature helper, one dedicated callback controller on the return URL, one queued reconciliation job. Config in config/services.php, secrets in the secret manager. This keeps the payment path in code we own and can test.Migration path (if the bundle is ever inherited). Fork, pin to our VCS, strip the Symfony Bundle/DI layer, lift only the signature and callback-parsing classes into our namespace with our own tests, and never allow it to remain a transitive dependency we don't control.
Compatibility checklist for the spike. PHP 8.x support; hash_hmac algorithm alignment with the merchant config (PBX_HASH SHA512 vs SHA256 must match); amounts as integer cents; currency 978 (EUR); charset/HTML-entity handling in PBX_RETOUR; URL-encoding rules for the signature base string; callback IP allowlisting.
Sequencing.
Maintenance — internal ownership, permanent. One maintainer, no releases, dead upstream means there is no maintenance model except "we own it." Budget an annual protocol review against Verifone docs, PHP/framework upgrades, and secret rotation. Small but non-zero, and it lands on whoever owns payments.
Support — effectively none. No SLA, no vendor relationship, no community. The escalation path is the issue tracker of a 1-star repository; production incidents are debugged in-house, with the merchant account manager — not the package author — as the PSP-side contact. Plan for a named engineer-owner before anything reaches production.
Scaling — PSP-bound, not code-bound. The System flow is a browser redirect plus a stateless server callback, so application scaling is trivial. The real concerns: callback endpoint availability during deploys (must never 5xx on a payment notification), DB contention on order-status writes during flash sales, and timeouts/retries/circuit-breaking if a Direct-style synchronous call is ever added.
Failure modes to design for explicitly.
pending_payment need an expiry policy and customer-facing messaging.Ramp-up — low code volume, moderate domain cost. Any competent Laravel engineer absorbs the code in an afternoon; the real cost is Paybox protocol semantics, sandbox quirks, and reconciliation design. Estimate 1–2 sprints for a safe System-flow implementation including tests and sandbox certification; add a sprint if Direct, refunds, or multi-currency are in scope.
TPM recommendation. Do not adopt gabrielextso/paybox-bundle as a dependency — it is the wrong framework and carries unmanaged payment-path risk. Leverage it as a protocol reference to price and de-risk a French-market hypothesis: fund a time-boxed 3–5 day spike, contingent on confirmed Verifone/Paybox credentials, that produces an owned Laravel adapter with independent tests for signing and IPN verification. If credentials or a clear commercial need for French acquiring are absent, decline and route EUR payments through the existing PSP.
How can I help you explore Laravel packages today?