cable8mm/laravel-portone
Laravel integration for PortOne (formerly I’mport) payments. Configure credentials, initiate and verify Korean payment gateway transactions, and handle webhooks from your Laravel app with a simple, package-friendly API.
Architecture fit
laravel-portone is a thin, opinionated wrapper around the PortOne V2 payment gateway aimed at Laravel applications. It slots into the standard Laravel package shape (service provider, publishable config, facade/helper surface), which means it fits a conventional Laravel monolith or modular monolith with minimal ceremony. The v0.6.0 addition — a single redirect checkout flow for mobile PG windows — is architecturally significant rather than cosmetic: it moves the package from a "call the API and render a popup/iframe" posture toward owning a redirect round-trip (initiate → external PG window → return URL → verification). That is the correct shape for mobile browsers, where popups are unreliable and third-party cookie restrictions break iframe-based flows, but it means the package now participates in request/session lifecycle and routing, not just outbound HTTP. Treat it as an integration component with a route surface, not a pure library.
Integration feasibility Feasible for a team already on Laravel 9/10/11 with PHP 8.1+. The package is Composer-installable, config is env-driven (store ID, channel keys, API secret), and the new redirect flow removes the need to hand-roll mobile-specific JavaScript. The real integration cost is not the package — it is the surrounding scaffolding every payment integration needs regardless: a return/callback route that is CSRF-exempt or token-validated, a webhook endpoint with signature verification, a queue worker for asynchronous reconciliation, and a durable order-state machine. Budget for that work explicitly; do not assume the package supplies it.
Technical risk
Key questions
composer.json?force-redirect now deprecated?Stack fit
Standard Laravel: composer require cable8mm/laravel-portone, publish config, populate env, register the service provider (auto-discovered). The package assumes Guzzle for HTTP and Laravel's HTTP client; confirm no conflict with an existing pinned Guzzle major. The redirect flow will require at least one application-owned route (return/callback) and one webhook route — plan these into the app's routing and middleware groups rather than treating them as package-internal.
Migration path There is no prior state in this repository, so this is a greenfield adoption, not a migration. Sequence it as: (1) sandbox/test channel credentials only; (2) server-side payment creation + webhook verification with no UI; (3) webhook-first reconciliation and order-state machine; (4) desktop checkout; (5) mobile redirect flow last, once (3) is proven. If any legacy payment code exists elsewhere in the estate, keep it running in parallel behind a feature flag until the webhook reconciliation path has survived a full settlement cycle.
Compatibility Verify four things before committing: Laravel version constraint, PHP version constraint, PortOne API version (V2 vs legacy V1 — the two are not interoperable), and whether the redirect flow requires a specific PortOne channel configuration in the merchant console. The v0.6.0 docs PR should be read in full, since "changing force-redirect flow" implies a behavioural change that may affect any early prototype built against 0.5.x.
Sequencing
0.6.0 exactly; abstract behind an internal PaymentGateway interface.Maintenance Ongoing maintenance burden is moderate but non-trivial: the package is pre-1.0 with a single maintainer, so expect to review every release personally rather than trusting semver. Assign clear ownership (one backend engineer as package owner) and schedule a recurring dependency review. Keep a fork ready; forking a ~small package of this shape is cheap insurance.
Support Support for the package itself is best-effort via GitHub issues, and PortOne's own documentation and console are primarily Korean-language with partial English coverage. If the team lacks Korean-language capability or prior PortOne exposure, factor in escalation time for PG-side issues (channel outages, settlement discrepancies) that the package cannot resolve. These are vendor-support problems, not code problems — route them accordingly.
Scaling The package is not the scaling bottleneck; the surrounding system is. Watch: webhook ingestion volume during peak sales (bursty — use a queue with a dedicated worker pool and a dead-letter queue), redirect-route throughput (cheap, stateless), and outbound API rate limits from PortOne during reconciliation backfills. Reconciliation jobs must be batched and rate-limited, not run as unbounded loops.
Failure modes
pending indefinitely; requires a scheduled sweep to expire and reconcile.Ramp-up A mid-level Laravel engineer should reach productive integration in roughly 3–5 days for the package itself, plus 1–2 sprints for the surrounding webhook, state-machine, and reconciliation work, plus device-matrix QA. The package-specific learning curve is small; the payment-domain learning curve (idempotency, out-of-order events, settlement reconciliation, PG channel quirks) is where the schedule risk actually lives. Plan onboarding around the domain, not the library.
How can I help you explore Laravel packages today?