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

Flutterwave V3 Laravel Package

flutterwavedev/flutterwave-v3

Laravel package for Flutterwave v3 payments, offering a simple way to initiate and verify transactions, handle payment callbacks, and integrate Flutterwave’s payment APIs into your PHP or Laravel application.

View on GitHub
Deep Wiki
Context7

Technical Evaluation

Architecture fit. flutterwavedev/flutterwave-v3 is a framework-agnostic, thin REST wrapper over Flutterwave's v3 HTTP API, distributed via Composer. It ships no Laravel service provider, no facade, no publishable config, and no DI container awareness. Architecturally it belongs at the infrastructure edge of a hexagonal/ports-and-adapters design: one adapter class implementing an internal PaymentGateway port, with the SDK never appearing in domain, controller, or job signatures. If the team lets Flutterwave::payments() calls leak into controllers and jobs, every future change (v4 migration, provider swap, test strategy) becomes a cross-cutting refactor. That constraint should be stated as a design rule in the ticket, not left to convention.

Integration feasibility. composer require plus two secrets in .env is a sub-day spike for hosted checkout (initialize → redirect → verify). Full lifecycle coverage — webhooks, refunds, transfers/payouts, subaccounts, mobile-money rails, reconciliation — is a one-to-two week body of work, most of it not SDK work at all but idempotency, reconciliation, and admin tooling. Guzzle is already a transitive dependency of laravel/framework, so dependency conflict risk is low on Laravel 10–12. Testability is the friction point: because the SDK constructs its own HTTP client, Http::fake() will not intercept it. Plan for sandbox-backed integration tests plus adapter-level fakes, and budget for sandbox flakiness in CI (keep those tests out of the blocking path).

Technical risk.

  • API lifecycle. This is a v3 SDK. Flutterwave has been steering merchants toward v4. A deprecation/sunset notice here is a hard deadline affecting the whole payment path; the contract should include a written sunset commitment or a funded migration reserve.
  • Adoption signal is weak. 25 stars and zero dependents on an official SDK means almost no third-party battle-testing, no Stack Overflow corpus, and no community pressure on bug fixes. Every edge case is yours to find by reading source or hitting the sandbox.
  • Metadata credibility. The release is dated 2026-08-04, in the future relative to any current planning cycle. Combined with a score of 16/100 and opportunity 45, treat the freshness signal as unreliable and verify actual commit cadence, open-issue count, and tag history directly on GitHub before committing.
  • Correctness gaps. Expect no built-in idempotency keys, no retry/backoff policy, no circuit breaker, and default timeouts that must be set explicitly. Webhook signature verification must be validated against real payloads from the sandbox — do not assume the helper is correct because it exists.
  • Compliance. If the product charges cards directly (server-side PAN capture) rather than redirecting to hosted checkout, PCI scope expands to SAQ D. This is a product decision with cost implications far larger than the SDK choice; default to hosted/redirect and keep card data off our servers.
  • PCI/amount semantics. Amount subunits and rounding differ across endpoints and currencies; pin this with tests rather than documentation.

Key questions for the vendor/team.

  1. What is the v3 API sunset date, and is there a v4 SDK on a committed timeline?
  2. Which payment rails and currencies do we actually need, and are all of them covered in the v3 SDK's methods (mobile money country coverage is uneven)?
  3. Does the SDK expose client injection for test doubles, or must we wrap it to make it testable?
  4. Who at Flutterwave is our named support contact, and what is the escalation SLA for settlement or duplicate-charge incidents?
  5. Are we in PCI SAQ A (hosted) or SAQ D (direct card) scope?
  6. What is our fallback if the package goes unmaintained — fork (MIT permits it) or replace with first-party Laravel Http calls?

Integration Approach

Stack fit. Laravel 10–12, PHP 8.2+, Guzzle 7 (already present). No service provider means manual registration in AppServiceProvider: bind a FlutterwaveGateway interface to an adapter, resolve config from config/services.php or a dedicated config/flutterwave.php, and inject the SDK client as a singleton. Keys come from the secret manager, never from a committed .env.

Migration path. If the codebase currently uses raw cURL or the community wrapper kingflamez/laravelrave, adopt a strangler pattern: define the port first, implement it against the existing integration, swap the implementation to the official SDK behind a feature flag, then delete the old path. Existing call sites should not change at all during this. If this is greenfield, skip the community wrapper — it adds a second unmaintained dependency without removing the need for our own adapter.

Compatibility. Pin an exact version ("flutterwavedev/flutterwave-v3": "x.y.z"), run composer why-not in CI against the target PHP and Laravel versions, and include one job in the matrix at the oldest supported PHP. Because a future SDK release could break on an unpinned Guzzle constraint, treat any version bump as a code-reviewed change with sandbox verification, not an automated Dependabot merge.

Sequencing.

  1. Spike: sandbox charge, verify, and a real webhook captured end-to-end. Timebox two days; exit criteria is a captured payload and a passing signature check.
  2. Adapter, port interface, config, secrets wiring, and DTOs for the three calls we actually need.
  3. Webhook controller: CSRF exclusion, signature verification, raw-body handling, idempotency table keyed on event ID + tx_ref, queue dispatch, 200-always response policy.
  4. Reconciliation job: poll verify by tx_ref for any transaction stuck in pending past N minutes; this is the safety net for webhook loss, not an optional nicety.
  5. Refunds and payouts/transfers, with separate approval controls (payouts are the highest-blast-radius endpoint — gate them behind an admin role and a per-transaction limit).
  6. Observability and runbook, then a canary go-live with a low transaction ceiling.

Operational Impact

Maintenance. We own the wrapper regardless of upstream health. Budget roughly 1–2 engineer-days per quarter for dependency bumps, sandbox re-verification, and API change review — more in any quarter where Flutterwave ships a breaking change. MIT licensing gives us the fork option; decide the fork trigger now (e.g., no upstream release or issue response for 90 days) so the decision is not made under incident pressure.

Support. There is effectively no community to lean on. Support is Flutterwave's merchant channel plus our own runbook. The TPM action is to secure a named account contact and a documented escalation path before launch, and to record the incident categories that require vendor involvement (settlement discrepancies, duplicate charges, unexplained declines).

Scaling. The SDK is stateless, so application scaling is not the constraint. The constraints are provider rate limits, per-merchant throughput, and HTTP tail latency. Enforce explicit connect/read timeouts (never leave them at defaults), run all charge-initiation and reconciliation work through queues with exponential backoff and jitter, and wrap outbound calls in a circuit breaker so a Flutterwave slowdown degrades checkout gracefully instead of exhausting PHP-FPM workers.

Failure modes to design against.

  • Timeout on charge initiation → unknown state. Never assume failure. Persist the attempt with a unique tx_ref, mark it pending, and let the reconciler resolve it. This is the single largest source of duplicate-charge incidents.
  • Duplicate webhook delivery. Idempotency table with a unique constraint; the second delivery must be a no-op, not a second fulfillment.
  • Missed webhook. Reconciler is the only mitigation; without it, orders silently sit unfulfilled and customers churn.
  • Signature verification failure or bypass. Fail closed, alert, and log the raw payload hash — but never log full card or PII payloads.
  • Webhook endpoint as a trust boundary. The endpoint must verify and enqueue, nothing more; business logic runs in a queued job so a slow downstream cannot cause retries and duplicate events.
  • Key rotation or environment mix-up. Encode environment (test vs live key) in config with a startup assertion so a test key can never silently serve production traffic.
  • v3 sunset. Tracked as a dated risk on the roadmap, not an operational surprise.

Ramp-up. A mid-level Laravel engineer reaches productive velocity on the hosted-checkout path in about two days given the adapter skeleton and a sandbox walkthrough; the full surface (webhooks, reconciliation, refunds, payouts) takes one to two weeks and is best paired with a written runbook. Deliverables that make this sustainable: the port interface (so mocks are trivial), a captured set of real sandbox payloads as fixtures, an on-call runbook covering the five failure modes above, and a dashboard tracking webhook lag, pending-transaction age, and gateway error rate by endpoint.

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.
uni-method/symfony-lib
tacticmedia/scim-server-bundle
neika-ai/symfony-bundle
mattleads/agent-publishing-bundle
glavweb/framework-bundle
glavweb/extra-bundle
glavweb/api-bundle
glavweb/admin-bundle
adachsoft/api-version-bundle
elsayed85/laravel-api-exceptions
ouhssini/laravel-demo-mode
daworks/ncloud-outbound-mailer-driver
gp247/cms
ignibyte/aic-gates
nexa-merchant/blog
novasa/laravel-language-center
opencage/geocode
adolfoholzer/parameters
livenetworks/ln-starter
cgv/localized-resource