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

Monnify Laravel Laravel Package

monnify/monnify-laravel

A Laravel wrapper for the Monnify payment gateway, making it easy to accept collections, initiate single and bulk transfers, verify transactions, and handle webhooks. Includes configurable credentials, a fluent API, and support for sandbox and live environments.

View on GitHub
Deep Wiki
Context7

Technical Evaluation

Architecture fit monnify-laravel is a thin, opinionated SDK wrapper around Monnify's REST API, packaged in idiomatic Laravel form (service provider, facade, publishable config, env-driven credentials). It slots into the layer of an application that already owns checkout, wallet, or payout flows and wants to avoid hand-rolling HTTP clients, auth token refresh, and signature verification. It is not an abstraction layer — it does not model payments as domain entities, does not persist transactions, and does not provide reconciliation, ledgering, or idempotency stores. Treat it as a transport adapter, not a payments subsystem. Teams expecting a plug-and-play "Laravel Cashier for Monnify" will be disappointed; teams expecting a typed, tested API client will be satisfied.

The 1.1.0 release widens scope from collections (card charge, transfer, refund) into disbursements and bill presentment (biller categories, billers, products, customer validation, vend, requery). That is a meaningful architectural expansion: bills payment introduces multi-step, stateful flows (browse → validate → vend → requery) where failures can occur mid-sequence. The package exposes the steps but leaves orchestration to the application. Budget for that orchestration explicitly.

Integration feasibility Low friction. composer require plus config publish plus three env vars gets a developer to a working sandbox charge. The new Quick Start (init + callback verification) and the Webhooks section — 12 event types, signature verification, a complete controller example, CSRF exclusion, best practices — remove the two integration steps that historically consume the most TPM time: signature verification correctness and CSRF exclusion misconfiguration. The sandbox test card table (no-OTP / OTP / 3DS / failure) is a concrete, undersung win: it lets QA write deterministic test cases instead of guessing at magic card numbers.

Feasibility risks are mostly informational, not technical: the notes do not state a supported Laravel/PHP version matrix, and PHP 8.1 compatibility is asserted via PHPStan at level 6 targeting the PHP 8.1 API rather than by an actual 8.1 runtime in CI. That is a reasonable proxy but not a guarantee — confirm the matrix in composer.json before committing to a platform baseline.

Technical risk

  • No breaking changes in 1.1.0. The destinationAccountName change makes a previously required field optional. This is lenient-by-default: payloads that would have failed validation client-side now reach the API. Low blast radius, but it can silently degrade payout records where the beneficiary name was doing reconciliation or fraud-screening duty. Audit any logic that reads that field post-transfer.
  • Bills payment is new surface area. vend is a money-moving, irreversible operation against third-party billers with their own downtime profiles. The package gives you requery; it does not give you retry policy, deduplication, or a state machine. First-release features in this category deserve a sandbox hardening period before production.
  • Test posture is strong. 99.87% line / 99.38% method coverage across 235 tests plus PHPStan level 6 is materially better than the typical Laravel payment wrapper and reduces the probability of silent auth/parsing regressions.
  • Supply chain is healthy but shallow. GitHub Actions bumped to Node 24 runtimes (checkout@v6, cache@v5, codecov-action@v6); composer.lock platform constraint fixed for PHP 8.2+. Single-maintainer risk is unassessable from the notes alone.

Key questions

  1. What is the officially supported Laravel and PHP version matrix in composer.json?
  2. Is the destinationAccountName relaxation accompanied by server-side validation, or does Monnify accept anonymous beneficiaries?
  3. Does the package expose idempotency keys or a reference generator for vend and transfers, or must the application mint and persist them?
  4. How are API tokens cached and refreshed — per-request, per-process, or via Laravel cache?
  5. Are the 12 webhook event types individually documented with payload schemas, or only listed?
  6. What is the package's policy for Monnify API version changes and deprecations?
  7. Is there a documented retry/backoff story for 5xx and timeout responses, or does the package surface raw exceptions?

Integration Approach

Stack fit Best fit: Laravel monolith or modular monolith with server-rendered or Inertia front ends, PHP 8.2+ (per the lock platform fix), using the framework's HTTP client, queue, and event system. Works well behind a queued job for payout and bills flows, where the request/response cycle is decoupled from the provider's latency.

Poor fit: multi-tenant SaaS that needs per-tenant credential isolation without config gymnastics; event-sourced architectures that want a domain-level payment model; polyglot shops where only part of the system is PHP (you would then be integrating Monnify twice, in two languages, with two signature implementations).

Migration path From v1.0.0 this is a drop-in minor bump. composer update monnify/monnify-laravel — no config republish required, no facade alias changes indicated. The only behavioural delta is the bulk transfer validation relaxation, which is permissive, so existing correct payloads are unaffected. The realistic migration work is adoption, not upgrade: retrofitting bills payment into an existing checkout means new routes, new UI states (biller → product → customer validation → confirm → requery), and new failure-handling paths.

Compatibility PHPStan targeting the PHP 8.1 API plus a lock constraint aligned to PHP 8.2+ suggests a supported floor of 8.1 with a tested target of 8.2 or later. Laravel version support is unstated and must be verified. The webhook guidance (CSRF exclusion, signature verification) is framework-version-agnostic and portable. Note the CSRF exclusion step in Laravel 11's slimmed middleware config differs from Laravel 10's VerifyCsrfToken — confirm the docs cover the version you run.

Sequencing

  1. Week 1 — Dependency + baseline. Bump to 1.1.0 on a branch, verify composer.lock resolves, run the full application suite. Confirm the Laravel/PHP matrix against your platform.
  2. Week 1 — Collections hardening (if not already done). Wire the webhook controller using the new docs, add CSRF exclusion, verify signatures in sandbox, write the 12-event handling table. Add idempotency around your callback handler before anything else.
  3. Week 2 — Bills payment in sandbox only. Implement the browse/validate/vend/requery state machine behind a feature flag. Exercise requery against deliberately stalled transactions. Add a durable record of every vend reference with its terminal state.
  4. Week 3 — Payout audit. Grep for destinationAccountName usage; decide whether a missing name is acceptable for reconciliation and screening, and add a fallback if not.
  5. Week 4 — Production canary. Enable bills payment for a small cohort or a single biller category. Monitor requery rates and failure codes before broadening.

Operational Impact

Maintenance Low steady-state burden. Version bumps are infrequent and, on this evidence, minor and non-breaking. The real maintenance cost sits in your code: webhook handlers, requery schedulers, and the bills state machine all need owning. Pin the version and review changelogs on release rather than floating to ^1.1 blindly — future minors may relax or tighten other required fields in the same quiet way.

Support Upstream support is via GitHub issues and Monnify's merchant support. The documentation uplift in 1.1.0 (Quick Start, webhooks, sandbox cards, responseBody nesting explanation) is the strongest support asset and should shorten internal onboarding considerably. Escalation for settlement disputes, biller outages, and API credential issues runs through Monnify, not the package — make sure your account management relationship is in place before bills payment goes live.

Scaling The package is stateless; scaling is bounded by Monnify's rate limits and latency, not by PHP. Two practical constraints: (a) token acquisition should be cached, so confirm the package does not re-authenticate per call under load; (b) card charges and vend calls should be dispatched from queued jobs with explicit timeouts, not from the request thread, or you will hold PHP workers open on provider latency. Webhook ingress should be acknowledged fast (return 200) and processed asynchronously, or bursts during biller incidents will back up your web tier.

Failure modes

  • Network timeout on vend — the classic. The transaction may have succeeded at the biller. Always requery by reference before retrying; never retry blind.
  • Webhook loss or duplication — signature verification is necessary but not sufficient. Deduplicate on event ID / transaction reference and reconcile via a scheduled poll of in-progress transactions.
  • Missing beneficiary name — post-1.1.0, transfers can carry no destinationAccountName. Downstream reconciliation and any name-based screening must tolerate null.
  • Biller downtime — bills payment inherits third-party availability. Surface pending states in the UI rather than hard failures, and requery on a backoff schedule.
  • Credential/environment mismatch — sandbox keys against production URLs is the most common integration incident; enforce via config validation at boot.
  • Silent validation regression — the transfer field relaxation shows the package will follow the API spec even when it loosens client-side guards. Do not rely on the SDK as your validation layer.

Ramp-up A mid-level Laravel developer with payments-adjacent experience should reach a working sandbox card charge in under a day using the new Quick Start, and a production-grade webhook handler in two to three days using the webhooks section. Bills payment is the longer pole: expect four to six days including the state machine, requery handling, and sandbox edge-case testing — the feature itself is easy, the orchestration around it is not. TPM time is best spent on the webhook event matrix and the idempotency/requery policy, both of which are application responsibilities the package deliberately does not cover.

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.
socialdept/atp-orm
cboxdk/laravel-assistant-client
socialdept/atp-resolver
socialdept/tenant-domains
tautvydasr/blade-class-names
socialdept/color-scales
maherelgamil/controller
coleus/widgets
coleus/table
coleus/users
coleus/music
coleus/health
coleus/calendar
coleus/notes
coleus/support
coleus/settings
coleus/apps
seampact/laravel
emmyconceptng/laravel-ng-postcode
jjsquady/round-robin