PHPackages                             emmanuelsiziba/zb-laravel-smilepay - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Payment Processing](/categories/payments)
4. /
5. emmanuelsiziba/zb-laravel-smilepay

ActiveLibrary[Payment Processing](/categories/payments)

emmanuelsiziba/zb-laravel-smilepay
==================================

ZB Laravel package for SmilePay Payment Gateway integration (ZB Bank Zimbabwe)

0.16(1mo ago)02↓100%MITPHPPHP ^8.0|^8.1|^8.2|^8.3

Since Oct 19Pushed 1mo agoCompare

[ Source](https://github.com/Omni-Learning-Dev/zb-laravel-smilepay)[ Packagist](https://packagist.org/packages/emmanuelsiziba/zb-laravel-smilepay)[ RSS](/packages/emmanuelsiziba-zb-laravel-smilepay/feed)WikiDiscussions main Synced 1w ago

READMEChangelog (2)Dependencies (4)Versions (9)Used By (0)

Laravel SmilePay Package
========================

[](#laravel-smilepay-package)

A comprehensive Laravel package for integrating **SmilePay Payment Gateway** (ZB Bank Zimbabwe) into your Laravel application. This package supports multiple payment methods including Ecocash, Innbucks, Omari, SmileCash, and Visa/Mastercard.

[![Latest Version](https://camo.githubusercontent.com/05c9a534a2e5157bd0ea967863cda3dc0759ac2d10562597be4a12c8f86a8fae/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f762f656d6d616e75656c73697a6962612f7a622d6c61726176656c2d736d696c657061792e7376673f7374796c653d666c61742d737175617265)](https://packagist.org/packages/emmanuelsiziba/zb-laravel-smilepay)[![Total Downloads](https://camo.githubusercontent.com/71b4eeaa1d0654cbe98d96d7af6fd775a3ca010b2e7c1958711c89dd20113ea3/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f64742f656d6d616e75656c73697a6962612f7a622d6c61726176656c2d736d696c657061792e7376673f7374796c653d666c61742d737175617265)](https://packagist.org/packages/emmanuelsiziba/zb-laravel-smilepay)[![License](https://camo.githubusercontent.com/5215b96e739893e6dcae28fc166974f7005c51206ce440f020f18ea37ca450f4/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f6c2f656d6d616e75656c73697a6962612f7a622d6c61726176656c2d736d696c657061792e7376673f7374796c653d666c61742d737175617265)](https://packagist.org/packages/emmanuelsiziba/zb-laravel-smilepay)

Features
--------

[](#features)

✅ **Multi-Payment Support** – Ecocash, Innbucks, Omari, SmileCash, Visa/Mastercard ✅ **Standard Checkout** – Hosted payment page integration ✅ **Express Checkout** – Direct API integration for custom UIs ✅ **Webhook Handling** – Automatic payment status callbacks ✅ **Auto-Configured Callbacks** – No manual URL setup required; the package registers and wires its own routes ✅ **Built-in Return Handler** – `/smilepay/return` polls status, fires events, and redirects the user ✅ **Dual-App Return URLs** – Route mobile deep-links and web redirects independently via a `platform` param ✅ **Transaction Management** – Check status, cancel payments ✅ **Event System** – Laravel events for payment notifications ✅ **Sandbox &amp; Production** – Easy environment switching ✅ **Comprehensive Logging** – Debug and track all API interactions

Table of Contents
-----------------

[](#table-of-contents)

- [Requirements](#requirements)
- [Installation](#installation)
- [Configuration](#configuration)
- [How Callbacks Work](#how-callbacks-work)
- [App Return URLs](#app-return-urls)
- [Usage](#usage)
    - [Standard Checkout](#standard-checkout)
    - [Express Checkout](#express-checkout)
    - [Transaction Management](#transaction-management)
    - [Webhook Handling](#webhook-handling)
- [Events](#events)
- [Testing](#testing)
- [Changelog](#changelog)
- [Contributing](#contributing)
- [License](#license)

Requirements
------------

[](#requirements)

- PHP 8.0 or higher
- Laravel 9.x, 10.x, or 11.x
- Guzzle HTTP Client 7.x

Installation
------------

[](#installation)

Install the package via Composer:

```
composer require emmanuelsiziba/zb-laravel-smilepay
```

### Publish Configuration

[](#publish-configuration)

Publish the configuration file:

```
php artisan vendor:publish --tag=smilepay-config
```

This will create a `config/smilepay.php` configuration file.

Configuration
-------------

[](#configuration)

### Environment Variables

[](#environment-variables)

The minimum configuration needed is just your credentials:

```
SMILEPAY_ENVIRONMENT=sandbox
SMILEPAY_API_KEY=your_api_key_here
SMILEPAY_API_SECRET=your_api_secret_here
SMILEPAY_DEFAULT_CURRENCY=840
```

The package automatically registers and wires its own callback routes (`/smilepay/webhook` and `/smilepay/return`), so **you do not need to set `SMILEPAY_RETURN_URL`, `SMILEPAY_RESULT_URL`, `SMILEPAY_CANCEL_URL`, or `SMILEPAY_FAILURE_URL`** unless you want to override the defaults.

#### Optional: App Return URLs

[](#optional-app-return-urls)

After the hosted checkout completes, the package's `/smilepay/return` route will redirect your user. Configure where to send them:

```
# Single app (web or mobile)
SMILEPAY_APP_RETURN_URL=https://yourapp.com/payments/return

# OR — separate URLs for mobile deep-links and web redirects
SMILEPAY_MOBILE_RETURN_URL=yourapp://payments/return
SMILEPAY_WEB_RETURN_URL=https://yourapp.com/payments/return
```

If none of these are set, the `/smilepay/return` route returns a JSON response instead of redirecting.

#### Optional: Override Callback URLs

[](#optional-override-callback-urls)

Only set these if you need to point to a custom handler instead of the package's built-in routes:

```
SMILEPAY_RETURN_URL=https://yourdomain.com/custom/return
SMILEPAY_RESULT_URL=https://yourdomain.com/custom/webhook
SMILEPAY_CANCEL_URL=https://yourdomain.com/custom/cancel
SMILEPAY_FAILURE_URL=https://yourdomain.com/custom/failed
```

#### Logging (optional)

[](#logging-optional)

```
SMILEPAY_LOGGING=true
SMILEPAY_LOG_CHANNEL=stack
```

### Currency Codes

[](#currency-codes)

- `840` - USD (United States Dollar)
- `924` - ZWG (Zimbabwean Dollar)

### Getting API Credentials

[](#getting-api-credentials)

1. **Sandbox**: Register at [https://zbnet.zb.co.zw/wallet\_sandbox\_merchant/](https://zbnet.zb.co.zw/wallet_sandbox_merchant/)
2. Navigate to **Settings &gt; API Keys**
3. Click **Generate New API Key**
4. Copy your API Key and API Secret

How Callbacks Work
------------------

[](#how-callbacks-work)

When the package is installed, its service provider automatically:

1. Registers two routes in your application:

    - `POST /smilepay/webhook` — ZB calls this server-to-server to notify you of a payment result
    - `GET  /smilepay/return` — ZB redirects the customer here after the hosted checkout page
2. Populates `returnUrl`, `resultUrl`, `cancelUrl`, and `failureUrl` on every payment request using `url('/smilepay/return')` and `url('/smilepay/webhook')` as defaults, so you never need to set them manually.

### What `/smilepay/return` Does

[](#what-smilepayreturn-does)

When ZB redirects the customer back to your server, this built-in controller:

1. Reads the `orderReference` from the query string
2. Polls ZB for the definitive payment status
3. Fires the appropriate package event (`PaymentReceived`, `PaymentFailed`, or `PaymentCanceled`)
4. Redirects the user to your configured app return URL (with `?status=&orderReference=` appended), or returns JSON if no URL is configured

---

App Return URLs
---------------

[](#app-return-urls)

Use app return URLs to send the customer back to your application after the hosted checkout.

### Single Application

[](#single-application)

```
SMILEPAY_APP_RETURN_URL=https://yourapp.com/payments/return
```

The customer will be redirected to:

```
https://yourapp.com/payments/return?status=success&orderReference=SP-ABC123

```

### Mobile App + Web App (Dual Platform)

[](#mobile-app--web-app-dual-platform)

If you serve both a mobile app (deep link) and a web app, configure separate URLs:

```
SMILEPAY_MOBILE_RETURN_URL=yourapp://payments/return
SMILEPAY_WEB_RETURN_URL=https://yourapp.com/payments/return
```

Then signal the platform when initiating a payment by appending `?platform=mobile` or `?platform=web` to the `returnUrl`, `cancelUrl`, and `failureUrl`:

```
$platform = 'mobile'; // or 'web', determined by your request context

SmilePay::standardCheckout()->initiate([
    'amount'            => 100.00,
    'itemName'          => 'Order #123',
    'returnUrl'         => url('/smilepay/return') . '?platform=' . $platform,
    'cancelUrl'         => url('/smilepay/return') . '?platform=' . $platform,
    'failureUrl'        => url('/smilepay/return') . '?platform=' . $platform,
    // resultUrl is always server-to-server — no platform param needed
]);
```

The `ReturnController` reads `?platform=` and picks the matching configured URL:

`?platform=`Uses config key`.env` variable`mobile``smilepay.mobile_return_url``SMILEPAY_MOBILE_RETURN_URL``web``smilepay.web_return_url``SMILEPAY_WEB_RETURN_URL`*(absent)*`smilepay.app_return_url``SMILEPAY_APP_RETURN_URL`If none match, a JSON response is returned.

### Return URL Query Parameters

[](#return-url-query-parameters)

Regardless of which URL is used, the following query parameters are always appended:

ParameterValuesDescription`status``success`, `failed`, `cancelled`, `pending`Payment outcome`orderReference`stringYour order reference`message`stringHuman-readable status message (only on non-success)---

Usage
-----

[](#usage)

### Standard Checkout

[](#standard-checkout)

Standard Checkout redirects customers to a SmilePay hosted payment page.

```
use Emmanuelsiziba\SmilePay\Facades\SmilePay;

$response = SmilePay::standardCheckout()->initiate([
    'amount' => 100.00,
    'itemName' => 'Premium Subscription',
    'itemDescription' => 'Monthly subscription',
    'email' => 'customer@example.com',
    'mobilePhoneNumber' => '0771234567',
    'firstName' => 'John',
    'lastName' => 'Doe',
]);

if ($response->isSuccessful()) {
    // Redirect customer to payment page
    return redirect($response->paymentUrl);
}
```

### Express Checkout

[](#express-checkout)

Express Checkout allows you to build custom payment UIs.

#### Ecocash

[](#ecocash)

```
use Emmanuelsiziba\SmilePay\Facades\SmilePay;

$response = SmilePay::expressCheckout()->ecocash([
    'amount' => 50.00,
    'itemName' => 'Product Purchase',
    'ecocashMobile' => '0771234567',
    'email' => 'customer@example.com',
]);

if ($response->isSuccessful()) {
    // Customer receives USSD push notification
    // Poll for payment status or wait for webhook
    echo "Payment initiated: {$response->transactionReference}";
}
```

#### Innbucks

[](#innbucks)

```
$response = SmilePay::expressCheckout()->innbucks([
    'amount' => 75.00,
    'itemName' => 'Service Payment',
    'email' => 'customer@example.com',
]);

if ($response->isSuccessful()) {
    // Get payment code
    $paymentCode = $response->innbucksPaymentCode;

    // Get deep link for mobile app
    $deepLink = $response->getInnbucksDeepLink();

    // Display to customer or create QR code
    echo "Payment Code: {$paymentCode}";
    echo "Deep Link: Pay with InnBucks";
}
```

#### Omari (Two-Step Process)

[](#omari-two-step-process)

```
// Step 1: Initiate payment (sends OTP)
$response = SmilePay::expressCheckout()->omari([
    'amount' => 100.00,
    'itemName' => 'Order #12345',
    'omariMobile' => '0771234567',
]);

$transactionRef = $response->transactionReference;

// Step 2: Confirm with OTP (customer enters OTP from SMS)
$confirmResponse = SmilePay::expressCheckout()->omariConfirm(
    $transactionRef,
    '123456', // OTP from customer
    '0771234567' // Same mobile number
);

if ($confirmResponse->isSuccessful()) {
    echo "Payment confirmed!";
}
```

#### SmileCash (Two-Step Process)

[](#smilecash-two-step-process)

```
// Step 1: Initiate payment
$response = SmilePay::expressCheckout()->smileCash([
    'amount' => 200.00,
    'itemName' => 'Shopping Cart',
    'smileCashMobile' => '0771234567',
]);

$transactionRef = $response->transactionReference;

// Step 2: Confirm with OTP
$confirmResponse = SmilePay::expressCheckout()->smileCashConfirm(
    $transactionRef,
    '000000', // OTP (use '000000' in sandbox)
    '0771234567'
);
```

#### Visa/Mastercard

[](#visamastercard)

```
$response = SmilePay::expressCheckout()->card([
    'amount' => 150.00,
    'itemName' => 'Product Purchase',
    'pan' => '5123450000000008',
    'expMonth' => '01',
    'expYear' => '39',
    'securityCode' => '100',
    'email' => 'customer@example.com',
]);

if ($response->requires3DS()) {
    // Redirect to 3D Secure authentication
    $redirectHtml = $response->redirectHtml;
    echo $redirectHtml; // Renders 3DS form
}
```

### Transaction Management

[](#transaction-management)

#### Check Payment Status

[](#check-payment-status)

```
use Emmanuelsiziba\SmilePay\Facades\SmilePay;

$status = SmilePay::utility()->checkStatus('SP-ABC123-1234567890');

if ($status->isPaid()) {
    echo "Payment successful!";
    echo "Amount: {$status->amount}";
    echo "Payment Method: {$status->paymentOption}";
}

// Other status methods
$status->isPending();   // Returns true if pending
$status->isFailed();    // Returns true if failed
$status->isCanceled();  // Returns true if canceled
```

#### Cancel Payment

[](#cancel-payment)

```
$result = SmilePay::utility()->cancel('SP-ABC123-1234567890');

if ($result['success']) {
    echo "Payment canceled successfully";
}
```

#### Helper Methods

[](#helper-methods)

```
// Quick boolean checks
$isPaid = SmilePay::utility()->isPaymentSuccessful('ORDER-REF');
$isPending = SmilePay::utility()->isPaymentPending('ORDER-REF');
$isFailed = SmilePay::utility()->isPaymentFailed('ORDER-REF');
```

### Webhook Handling

[](#webhook-handling)

The package automatically registers a webhook route at `/smilepay/webhook` and sets it as the default `resultUrl` on every payment request — no manual configuration required.

To verify the route is registered:

```
php artisan route:list --name=smilepay
```

#### Listen to Payment Events

[](#listen-to-payment-events)

Create event listeners in `app/Listeners`:

```
// app/Listeners/HandlePaymentReceived.php
namespace App\Listeners;

use Emmanuelsiziba\SmilePay\Events\PaymentReceived;

class HandlePaymentReceived
{
    public function handle(PaymentReceived $event)
    {
        $transaction = $event->transaction;

        // Update order status
        $order = Order::where('reference', $transaction->orderReference)->first();
        $order->update(['status' => 'paid']);

        // Send confirmation email
        Mail::to($order->email)->send(new PaymentConfirmation($order));
    }
}
```

Register the listener in `app/Providers/EventServiceProvider.php`:

```
use Emmanuelsiziba\SmilePay\Events\PaymentReceived;
use Emmanuelsiziba\SmilePay\Events\PaymentFailed;
use Emmanuelsiziba\SmilePay\Events\PaymentCanceled;

protected $listen = [
    PaymentReceived::class => [
        HandlePaymentReceived::class,
    ],
    PaymentFailed::class => [
        HandlePaymentFailed::class,
    ],
    PaymentCanceled::class => [
        HandlePaymentCanceled::class,
    ],
];
```

Events
------

[](#events)

The package dispatches the following events:

EventDescription`PaymentReceived`Fired when payment is successful (status: PAID)`PaymentFailed`Fired when payment fails (status: FAILED)`PaymentCanceled`Fired when payment is canceled (status: CANCELED)Each event contains a `$transaction` property of type `TransactionStatus`.

Testing
-------

[](#testing)

### Sandbox Environment

[](#sandbox-environment)

Use the following test credentials in sandbox mode:

#### SmileCash

[](#smilecash)

- **Mobile**: `0711111111`
- **OTP**: `000000`

#### Visa/Mastercard

[](#visamastercard-1)

- **Card Number**: `5123450000000008`
- **Expiry**: `01/39`
- **CVV**: `100`

#### Ecocash

[](#ecocash-1)

- Use any valid Zimbabwe mobile number
- Approve the USSD prompt in sandbox

#### Innbucks

[](#innbucks-1)

- Any payment code generated will work in sandbox

### Running Tests

[](#running-tests)

```
composer test
```

API Reference
-------------

[](#api-reference)

### Payment Methods

[](#payment-methods)

MethodDescription`WALLETPLUS`Combined wallet option`ECOCASH`Ecocash mobile money`INNBUCKS`Innbucks digital wallet`CARD`Visa/Mastercard`OMARI`Omari payment platform`ONEMONEY`OneMoney mobile money### Payment Statuses

[](#payment-statuses)

StatusDescription`PAID`Payment successful`PENDING`Payment pending confirmation`FAILED`Payment failed`CANCELED`Payment canceledAdvanced Usage
--------------

[](#advanced-usage)

### Custom Order Reference

[](#custom-order-reference)

```
$response = SmilePay::standardCheckout()->initiate([
    'orderReference' => 'CUSTOM-ORDER-' . time(),
    'amount' => 100.00,
    'itemName' => 'Product',
    // ... other fields
]);
```

### Using Dependency Injection

[](#using-dependency-injection)

```
use Emmanuelsiziba\SmilePay\Services\StandardCheckout;
use Emmanuelsiziba\SmilePay\Services\ExpressCheckout;

class PaymentController extends Controller
{
    public function __construct(
        protected StandardCheckout $standardCheckout,
        protected ExpressCheckout $expressCheckout
    ) {}

    public function processPayment()
    {
        $response = $this->expressCheckout->ecocash([...]);
    }
}
```

### Error Handling

[](#error-handling)

The package provides comprehensive error handling with user-friendly error messages:

```
use Emmanuelsiziba\SmilePay\Exceptions\SmilePayException;
use Emmanuelsiziba\SmilePay\Exceptions\PaymentException;

try {
    $response = SmilePay::expressCheckout()->ecocash([
        'amount' => 50.00,
        'itemName' => 'Product Purchase',
        'ecocashMobile' => '0771234567',
    ]);

    if ($response->isSuccessful()) {
        // Handle successful initiation
    }
} catch (PaymentException $e) {
    // Payment validation or business logic errors
    Log::error('Payment validation failed: ' . $e->getMessage());

    // Get additional context (API response details)
    $context = $e->getContext();

    return back()->withErrors([
        'payment' => $e->getMessage()
    ]);
} catch (SmilePayException $e) {
    // API communication errors (network, authentication, etc.)
    Log::error('SmilePay API error', [
        'message' => $e->getMessage(),
        'code' => $e->getCode(),
        'context' => $e->getContext(),
    ]);

    return back()->withErrors([
        'payment' => 'Unable to process payment. Please try again later.'
    ]);
}
```

#### Common Error Scenarios

[](#common-error-scenarios)

**404 Not Found Error**

```
try {
    $response = SmilePay::expressCheckout()->ecocash([...]);
} catch (SmilePayException $e) {
    // User-friendly message:
    // "Endpoint not found: The payment method or endpoint '/payments/express-checkout/ecocash'
    // is not available. Please verify the API endpoint or contact support."

    if ($e->getCode() === 404) {
        // Check if you're using the correct environment
        // Verify the endpoint is available in your environment
        Log::warning('Payment endpoint not available', $e->getContext());
        return back()->with('warning', 'This payment method is currently unavailable.');
    }
}
```

**Authentication Error (401)**

```
try {
    $response = SmilePay::expressCheckout()->innbucks([...]);
} catch (SmilePayException $e) {
    if ($e->getCode() === 401) {
        // "Authentication failed: Invalid API credentials.
        // Please check your SmilePay configuration."

        Log::critical('Invalid SmilePay credentials');
        return back()->withErrors(['payment' => 'Payment system configuration error.']);
    }
}
```

**Network/Connection Error**

```
try {
    $response = SmilePay::standardCheckout()->initiate([...]);
} catch (SmilePayException $e) {
    // "Connection error: Unable to connect to SmilePay API.
    // Please check your internet connection and try again."

    Log::error('SmilePay connection failed', [
        'message' => $e->getMessage(),
        'context' => $e->getContext(),
    ]);

    return back()->withErrors([
        'payment' => 'Connection issue. Please check your internet and try again.'
    ]);
}
```

#### Error Context

[](#error-context)

All exceptions include a context array with debugging information:

```
try {
    $response = SmilePay::expressCheckout()->ecocash([...]);
} catch (SmilePayException $e) {
    $context = $e->getContext();

    // Context includes:
    // - endpoint: The API endpoint that failed
    // - method: HTTP method (GET/POST)
    // - status_code: HTTP status code (if available)
    // - raw_response: Full API response (if available)

    Log::error('SmilePay error details', [
        'endpoint' => $context['endpoint'] ?? 'unknown',
        'status' => $context['status_code'] ?? 'N/A',
        'response' => $context['raw_response'] ?? 'No response',
    ]);
}
```

#### Best Practices

[](#best-practices)

1. **Always catch exceptions** when initiating payments
2. **Log errors with context** for debugging
3. **Show user-friendly messages** to customers
4. **Handle specific error codes** differently (404, 401, 500, etc.)
5. **Enable logging** in `config/smilepay.php` for production debugging

Troubleshooting
---------------

[](#troubleshooting)

### 404 Not Found Error

[](#404-not-found-error)

If you encounter a 404 error when initiating payments:

```
Endpoint not found: The payment method or endpoint '/payments/express-checkout/ecocash'
is not available. Please verify the API endpoint or contact support.

```

**Possible causes:**

- **Wrong environment**: You may be using sandbox credentials with a production base URL (or vice versa)
- **Endpoint not available**: The specific payment method may not be enabled for your account
- **Incorrect base URL**: Check your `SMILEPAY_ENVIRONMENT` setting in `.env`
- **Outdated package version**: Versions prior to v0.1.5 had URL construction issues with Guzzle

**Solutions:**

1. **Update to the latest version** (recommended):

    ```
    composer update emmanuelsiziba/zb-laravel-smilepay
    ```

    This fixes a critical bug where leading slashes in endpoints caused Guzzle to treat them as absolute paths when the base URL has a trailing slash.
2. Verify your environment setting:

    ```
    SMILEPAY_ENVIRONMENT=sandbox  # or 'production'
    ```
3. Ensure your API credentials match the environment
4. Check if the payment method is enabled in your SmilePay merchant dashboard
5. Enable logging to see the full request details:

    ```
    SMILEPAY_LOGGING=true
    ```

### API Credentials Not Working

[](#api-credentials-not-working)

- Ensure you're using the correct environment (sandbox/production)
- Verify API keys are generated from the correct environment
- Check for any whitespace in your `.env` file
- Confirm credentials have the required permissions

### Webhook Not Receiving Callbacks

[](#webhook-not-receiving-callbacks)

- The `resultUrl` is auto-set to `{APP_URL}/smilepay/webhook` — ensure your `APP_URL` in `.env` is publicly accessible (use [ngrok](https://ngrok.com) for local testing)
- Verify both routes are registered: `php artisan route:list --name=smilepay`
- Check webhook middleware in `config/smilepay.php`
- Check your server's firewall allows incoming POST requests

### Payment Status Not Updating

[](#payment-status-not-updating)

- Always poll the status API in addition to webhook callbacks
- Implement retry logic for failed webhook deliveries
- Use Laravel queues for webhook processing
- Check your application logs for webhook processing errors

Changelog
---------

[](#changelog)

Please see [CHANGELOG](CHANGELOG.md) for recent changes.

Contributing
------------

[](#contributing)

Contributions are welcome! Please see [CONTRIBUTING](CONTRIBUTING.md) for details.

Security
--------

[](#security)

If you discover any security-related issues, please email  instead of using the issue tracker.

Credits
-------

[](#credits)

- [Emmanuel Siziba](https://github.com/yourusername)
- [All Contributors](../../contributors)

License
-------

[](#license)

The MIT License (MIT). Please see [License File](LICENSE.md) for more information.

Support
-------

[](#support)

- **Documentation**: [SmilePay Official Docs](https://docs.smilepay.id/)
- **Issues**: [GitHub Issues](https://github.com/emmanuelsiziba/zb-laravel-smilepay/issues)
- **Email**:

---

Made with ❤️ for the Laravel community

###  Health Score

39

—

LowBetter than 84% of packages

Maintenance92

Actively maintained with recent releases

Popularity3

Limited adoption so far

Community6

Small or concentrated contributor base

Maturity46

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~28 days

Recently: every ~49 days

Total

8

Last Release

37d ago

### Community

Maintainers

![](https://avatars.githubusercontent.com/u/20104015?v=4)[Emmanuel Siziba](/maintainers/SyzbaLinux)[@SyzbaLinux](https://github.com/SyzbaLinux)

---

Top Contributors

[![SyzbaLinux](https://avatars.githubusercontent.com/u/20104015?v=4)](https://github.com/SyzbaLinux "SyzbaLinux (14 commits)")

---

Tags

laravelpaymentpayment gatewayzimbabwesmilepayzb bankecocashinnbucksomarismilecash

###  Code Quality

TestsPHPUnit

### Embed Badge

![Health badge](/badges/emmanuelsiziba-zb-laravel-smilepay/health.svg)

```
[![Health](https://phpackages.com/badges/emmanuelsiziba-zb-laravel-smilepay/health.svg)](https://phpackages.com/packages/emmanuelsiziba-zb-laravel-smilepay)
```

###  Alternatives

[sebdesign/laravel-viva-payments

A Laravel package for integrating the Viva Payments gateway

4849.3k](/packages/sebdesign-laravel-viva-payments)[luigel/laravel-paymongo

A laravel wrapper for Paymongo API

7961.3k1](/packages/luigel-laravel-paymongo)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
