akira/laravel-sisp
A Laravel package for integrating SISP into your applications. It provides configuration, service bindings, and convenient helpers for common SISP workflows, helping you connect and interact with SISP services with minimal boilerplate and clean, maintainable code.
Architecture fit. The v3.0.0 release notes materially correct the earlier read. This is not a thin gateway driver: it ships a persistence-backed payments module — transactions, invoices, refunds with a ledger, migrations, encrypted attributes, artisan commands (expire-pending, prune-request-payloads), publishable views, and a callback route with rate limiting and signed result links. That is an opinionated bounded context, not a facade. Fit is therefore conditional: it works if we are willing to let the package own the payment/invoice/refund tables for the SISP rail, and it works poorly if we have already committed to our own payments table as the single system of record. The previous recommendation still holds in shape — wrap it behind an internal PaymentGateway interface — but the seam must now be drawn around persistence and lifecycle, not just HTTP calls. Events consumed by order/billing code must be ours (PaymentSucceeded, RefundSettled), derived from package state, never the package's own model events.
Integration feasibility. Still mechanically simple (composer require, publish config, publish and run migrations, expose callback route, schedule the maintenance commands), but the surface is larger than assumed: schema ownership, view publishing, rate-limiter registration, and two scheduled commands are now part of "install". The critical path is unchanged — SISP merchant onboarding, entity eligibility, and sandbox credentials will outlast the engineering work. The 2.x→3.x breaking changes (merchant reference generation, refund operation rename, transaction cancellation rules, callback rejection semantics) are not a problem for a greenfield adoption pinned at 3.x, but they are a strong signal about upgrade cost for the lifetime of the dependency.
Technical risk. The risk profile has shifted from unknown quality toward known-scope-but-unproven. What v3.0.0 demonstrates is real payments-correctness engineering: callbacks now fail closed on invalid fingerprints, refused responses are validated with a distinct error fingerprint formula, sandbox error payloads are signed, unauthenticated payloads are no longer persisted to attempt rows, PAN masking fails closed, the result-page link is signed, the callback route is rate limited (per IP, both cancellation spellings), refunds are atomic and retried idempotently on the same key, the refund ledger is "exact, atomic and encrypted", amounts too large for thousandths are rejected, encrypted attributes are redacted from change logs, and expire-pending asks SISP before expiring rather than assuming failure. Those are exactly the hazards flagged previously, and the maintainer fixed them rather than ignoring them.
The counter-signal is the volume: this is a long list of integrity and security defects corrected in a single major release, several of which (refund ledger exactness, unauthenticated payload persistence, mask fail-open, refund double-processing on retry) would have been production-impacting. That implies earlier versions should not be trusted in production, and that the current correctness has not yet been validated by anyone but the author. Adoption evidence is unchanged — 16 stars, no dependents, single maintainer, no contractual support. The note that the assessment's underlying dataset was empty means none of the repo-level signals (CI, coverage, disclosure policy) have actually been verified.
Residual risks to audit directly: whether the fixes are covered by tests and whether any test hits a real sandbox; the encryption key lifecycle (encrypted payloads plus APP_KEY rotation, and what happens to undecryptable rows — the notes suggest the package has had to design around exactly this); migration safety on a live database (a "resumable and idempotent" refunds copy implies a data migration); whether rate limiting can drop legitimate SISP retries; and whether the package's schema is designed to be coexisting or authoritative.
Key questions.
transactions/invoices/refunds?expire-pending, prune-request-payloads) have documented scheduling guidance, locking behaviour, and multi-node safety?illuminate/* constraints bounded?Stack fit. Unchanged at the edges: Laravel 10/11/12 on PHP 8.2+, Composer-managed, comfortable with service-provider packages that publish config, migrations, and views. Poor fit for Lumen, legacy Laravel, or non-Laravel services — and now more emphatically poor fit for a polyglot estate, because adopting it means adopting a PHP/Eloquent data model for payments rather than just an HTTP client. If payments must live in a non-PHP service, call SISP directly.
Migration path. The sequencing changes because the package now brings a schema.
payments/invoices tables.PaymentGateway contract (create, confirm, refund, query) with the package as the only dependency; our code never touches package models.transactions/refunds against SISP settlement reports.Compatibility. Pin an exact version and commit the lockfile — this is now more important, since a minor bump can include data migrations. MIT gives a clean fork-to-private-VCS escape hatch under a replace/VCS repository; budget for it from day one. Before installing, verify: no global middleware beyond the documented callback rate limiter, no HTTP-client rebinding, no model/table name collisions, no conflicting Payment* or Invoice* class names, and that the published views can be overridden without forking.
Sequencing.
expire-pending and prune-request-payloads with locks and monitoring; confirm expire-pending behaviour when SISP is unreachable (the notes say it keeps the transaction pending — verify).Maintenance. Higher than the earlier estimate because we inherit a schema and two commands. Budget 2–4 engineer-days per quarter for dependency bumps, Laravel majors, and migration rehearsal on production-like data, plus unplanned time on any SISP API change. Treat the upstream repo as advisory and be prepared to patch locally; the 2.x→3.x delta shows the package is still evolving its data model, so expect migration work at each major.
Support. Unchanged in principle and worse in practice: SISP supports the merchant account, not the package; the maintainer supports nothing contractually. The runbook now needs to cover, in addition to credential rotation and refunds: encryption key rotation and recovery from undecryptable payloads, safe re-run of the resumable refunds migration, manual execution of expire-pending, pruning policy for request payloads (retention/PII implications), rate-limiter tuning, and version-upgrade rehearsal. A named on-call owner for payment incidents remains mandatory.
Scaling. Throughput is still bounded by SISP, not Laravel, and the package's overhead is negligible. New scaling notes: the callback rate limiter must be backed by a shared cache in a multi-instance deployment or each node enforces its own budget; callback handling should remain stateless with the database (or the package's idempotency key) as the arbiter; expire-pending and prune-request-payloads must be single-flight (locks/cursors) — the notes about row locks and durable pruned_at cursors suggest this has been a real problem; and any package work done synchronously in the checkout request must be moved to queued jobs with timeouts, since redirect latency converts directly to cart abandonment.
Failure modes.
expire-pending command now asks SISP first — confirm this is enforced and tested.Ramp-up. Technical ramp-up stays low — a day or two for a competent Laravel developer to get a sandbox payment through. The expensive knowledge is now broader: SISP settlement and dispute behaviour, fingerprint semantics per entity, the package's schema and commands, key management, and the upgrade/migration path. That is a named payments owner, not a shared responsibility, and it should include a deliberate read of the v3 breaking-change list so the team understands which invariants the package now enforces.
Verdict. The case for adoption is stronger than at v2.2.0: v3.0.0 closes most of the payment-integrity hazards that made the package unsafe — fail-closed callbacks, correct error-fingerprint validation, signed result links, rate limiting, atomic and idempotent refunds, encrypted-attribute redaction, and SISP-confirmed expiry. The case is also more demanding, because adopting it now means adopting an opinionated payments data model rather than a thin driver. Adopt only if SISP is a required rail and no better-maintained SDK exists; adopt pinned at 3.x, behind our own PaymentGateway interface, with the package's schema explicitly designated as the operational store for that rail, reconciliation and order-level idempotency built by us, and a rehearsed fork-and-own plan funded from day one. Do not adopt it as a general payments layer, and do not treat v3.0.0 as validated by production use — the defect list it fixes is evidence of care, not evidence of maturity.
How can I help you explore Laravel packages today?