PHPackages                             afromessage/afromessage-laravel - 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. [HTTP &amp; Networking](/categories/http)
4. /
5. afromessage/afromessage-laravel

ActiveLibrary[HTTP &amp; Networking](/categories/http)

afromessage/afromessage-laravel
===============================

Laravel SDK for AfroMessage SMS and OTP services

00PHP

Since Oct 15Pushed 8mo agoCompare

[ Source](https://github.com/eshetua/afro-php)[ Packagist](https://packagist.org/packages/afromessage/afromessage-laravel)[ RSS](/packages/afromessage-afromessage-laravel/feed)WikiDiscussions main Synced today

READMEChangelogDependenciesVersions (3)Used By (0)

AfroMessage Laravel SDK
=======================

[](#afromessage-laravel-sdk)

A complete Laravel package for the AfroMessage SMS and OTP API. This package makes it easy to send single SMS, bulk SMS, and handle OTP challenges with Laravel elegance.

---

🚀 Installation
--------------

[](#-installation)

Install the package via Composer:

```
Install the package via Composer:
```

🔧 Configuration
===============

[](#-configuration)

Publish the configuration file:

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

Add your credentials to your .env file:

```
AFROMESSAGE_TOKEN=your_api_token_here
AFROMESSAGE_BASE_URL=https://api.afromessage.com/api/
SENDER_ID=your_sender_id
SENDER_NAME=your_sender_name
```

🔑 Quick Start
=============

[](#-quick-start)

Using Facade (Recommended):

```
use Afromessage\Laravel\Facades\AfroMessage;
use Afromessage\Laravel\DTO\SendSmsRequest;
use Afromessage\Laravel\DTO\BulkSmsRequest;
use Afromessage\Laravel\DTO\BulkRecipient;
use Afromessage\Laravel\DTO\SendOtpRequest;
use Afromessage\Laravel\DTO\VerifyOtpRequest;

// --- Single SMS ---
$smsRequest = new SendSmsRequest([
    'to' => '+251xxxxxxxxxx',
    'message' => 'Hello from AfroMessage Laravel SDK!',
    'from' => 'TEST',
    'sender' => 'TestSender'
]);

$response = AfroMessage::sms()->send($smsRequest);

// --- Bulk SMS ---
$bulkRequest = new BulkSmsRequest([
    'to' => ['+251xxxxxxxxxx', '+251xxxxxxxxxx'],
    'message' => 'Hello, bulk users!',
    'from' => 'TEST',
    'sender' => 'TestSender',
    'campaign' => 'MyCampaign'
]);

$bulkResponse = AfroMessage::sms()->bulkSend($bulkRequest);

// --- Personalized Bulk SMS ---
$personalizedRequest = new BulkSmsRequest([
    'to' => [
        new BulkRecipient([
            'to' => '+251xxxxxxxxxx',
            'message' => 'Hi Yonas!'
        ]),
        new BulkRecipient([
            'to' => '+251xxxxxxxxxx',
            'message' => 'Hi Eshetu!'
        ])
    ],
    'from' => 'TEST',
    'sender' => 'TestSender',
    'campaign' => 'PersonalizedCampaign'
]);

$personalizedResponse = AfroMessage::sms()->bulkSend($personalizedRequest);

// --- OTP Challenge ---
$otpRequest = new SendOtpRequest([
    'to' => '+251xxxxxxxxxx',
    'pr' => 'Your code'
]);

$otpResponse = AfroMessage::otp()->send($otpRequest);

// --- Verify OTP ---
$verifyRequest = new VerifyOtpRequest([
    'to' => '+251xxxxxxxxxx',
    'code' => '123456'
]);

$verifyResponse = AfroMessage::otp()->verify($verifyRequest);
```

using Dependancy injection:
---------------------------

[](#using-dependancy-injection)

```
use Afromessage\Laravel\Contracts\AfroMessageInterface;

class SmsController extends Controller
{
    public function sendSms(AfroMessageInterface $afroMessage)
    {
        $request = new SendSmsRequest([
            'to' => '+251xxxxxxxxxx',
            'message' => 'Hello from controller!'
        ]);

        $response = $afroMessage->sms()->send($request);

        return response()->json($response);
    }
}
```

using helper function
---------------------

[](#using-helper-function)

```
$response = app('afromessage')->sms()->send($smsRequest);
```

📦 Features
----------

[](#-features)

✅ Send single SMS
-----------------

[](#-send-single-sms)

✅ Send bulk SMS campaigns
-------------------------

[](#-send-bulk-sms-campaigns)

✅ send personalized bulk SMS
----------------------------

[](#-send-personalized-bulk-sms)

✅ Generate OTP challenges
-------------------------

[](#-generate-otp-challenges)

✅ Verify OTP codes
------------------

[](#-verify-otp-codes)

✅ Built-in error handling
-------------------------

[](#-built-in-error-handling)

✅ Request/response logging for debugging
----------------------------------------

[](#-requestresponse-logging-for-debugging)

⚡ API Reference
===============

[](#-api-reference)

Single SMS
----------

[](#single-sms)

```
use Afromessage\Laravel\DTO\SendSmsRequest;

$request = new SendSmsRequest([
    'to' => '+251xxxxxxxxxx',           // Required
    'message' => 'Hello World!',       // Required
    'from' => 'TEST',                  // Optional
    'sender' => 'TestSender',          // Optional
    'callback' => 'https://example.com/callback', // Optional
    'template' => 0                    // Optional
]);

$response = AfroMessage::sms()->send($request);
```

Bulk SMS
--------

[](#bulk-sms)

```
use Afromessage\Laravel\DTO\BulkSmsRequest;

$request = new BulkSmsRequest([
    'to' => ['+251xxxxxxxxxx', '+251xxxxxxxxxx'], // Required (min 2 numbers)
    'message' => 'Hello everyone!',             // Required
    'from' => 'TEST',                           // Optional
    'sender' => 'TestSender',                   // Optional
    'campaign' => 'MyCampaign',                 // Optional
    'create_callback' => 'https://example.com/create', // Optional
    'status_callback' => 'https://example.com/status'  // Optional
]);

$response = AfroMessage::sms()->bulkSend($request);
```

Bulk SMS (Personalized messages)
--------------------------------

[](#bulk-sms-personalized-messages)

```
use Afromessage\Laravel\DTO\BulkSmsRequest;
use Afromessage\Laravel\DTO\BulkRecipient;

$request = new BulkSmsRequest([
    'to' => [
        new BulkRecipient([
            'to' => '+251xxxxxxxxxx',
            'message' => 'Hi Yonas, welcome!'
        ]),
        new BulkRecipient([
            'to' => '+251xxxxxxxxxx',
            'message' => 'Hi Eshetu, welcome!'
        ])
    ],
    'from' => 'TEST',
    'sender' => 'TestSender',
    'campaign' => 'PersonalizedWelcome'
]);

$response = AfroMessage::sms()->bulkSend($request);
```

OTP Challenge
-------------

[](#otp-challenge)

```
use Afromessage\Laravel\DTO\SendOtpRequest;

$request = new SendOtpRequest([
    'to' => '+251xxxxxxxxxx',      // Required
    'pr' => 'Your code is',       // Optional - prefix
    'ps' => 'suffix',             // Optional - suffix
    'ttl' => 300,                 // Optional - time to live (60-3600 seconds)
    'len' => 6,                   // Optional - OTP length (flexible)
    'from' => 'TEST',             // Optional
    'sender' => 'TestSender'      // Optional
]);

$response = AfroMessage::otp()->send($request);
```

Verify OTP
----------

[](#verify-otp)

```
use Afromessage\Laravel\DTO\VerifyOtpRequest;

// Traditional numeric OTP
$request = new VerifyOtpRequest([
    'to' => '+251xxxxxxxxxx',
    'code' => '123456'
]);

// Alphanumeric OTP
$request = new VerifyOtpRequest([
    'to' => '+251xxxxxxxxxx',
    'code' => 'AB12CD'
]);

// Long OTP with special characters
$request = new VerifyOtpRequest([
    'to' => '+251xxxxxxxxxx',
    'code' => 'MySecureOTP!2024'
]);

$response = AfroMessage::otp()->verify($request);
```

🛠 Error Handling
================

[](#-error-handling)

All exceptions extend Afromessage\\Laravel\\Exceptions\\AfroMessageException:
-----------------------------------------------------------------------------

[](#all-exceptions-extend-afromessagelaravelexceptionsafromessageexception)

```
use Afromessage\Laravel\Exceptions\AfroMessageException;
use Afromessage\Laravel\Exceptions\ValidationException;

try {
    $response = AfroMessage::sms()->send($request);
} catch (ValidationException $e) {
    // Input validation failed
    return response()->json(['error' => $e->getMessage()], 422);
} catch (AfroMessageException $e) {
    // API or network error
    return response()->json(['error' => $e->getMessage()], 500);
}
```

Common Exceptions:
------------------

[](#common-exceptions)

ValidationException - Input validation errors
=============================================

[](#validationexception---input-validation-errors)

AfroMessageException - API errors, network issues, authentication failures
==========================================================================

[](#afromessageexception---api-errors-network-issues-authentication-failures)

🔍 Validation Rules
==================

[](#-validation-rules)

Phone Numbers:
--------------

[](#phone-numbers)

Must be in E.164 format or valid digits

Messages:
---------

[](#messages)

Minimum 1 characterk

OTP Codes:
----------

[](#otp-codes)

Flexible format: Can be numeric, alphanumeric, or contain special characters. Flexible length: No fixed limits (configurable if needed). Required for verification

🧪 Testing
=========

[](#-testing)

Run the test suite:

```
 vendor/bin/phpunit
```

Run specific test suites:

```
# Unit tests only
vendor/bin/phpunit --testsuite Unit

# Feature tests only
vendor/bin/phpunit --testsuite Feature

# Specific test file
vendor/bin/phpunit tests/Feature/SmsTest.php
```

🧪 Advanced Example (Real Test)
==============================

[](#-advanced-example-real-test)

Create a .env file in your package root:
----------------------------------------

[](#create-a-env-file-in-your-package-root)

```
AFROMESSAGE_TOKEN=your_actual_token_here
TEST_PHONE=+251xxxxxxxxxx
SENDER_ID=TEST
SENDER_NAME=TestSender
```

Run the real test script:
-------------------------

[](#run-the-real-test-script)

```
php real-test.php
```

We provide a full interactive test script in [RealTest.php](https://githubrepo.com)
-----------------------------------------------------------------------------------

[](#we-provide-a-full-interactive-test-script-in-realtestphp)

.

It shows how to send SMS, bulk SMS, and run OTP challenge + verification with .env loading.
-------------------------------------------------------------------------------------------

[](#it-shows-how-to-send-sms-bulk-sms-and-run-otp-challenge--verification-with-env-loading)

Run it with:
------------

[](#run-it-with)

```
php  RealTest.php
```

⚠️ Note: Running this will send real SMS/OTP messages and may incur costs.
--------------------------------------------------------------------------

[](#️-note-running-this-will-send-real-smsotp-messages-and-may-incur-costs)

🤝 Contributing
==============

[](#-contributing)

Contributions are welcome! To contribute:
-----------------------------------------

[](#contributions-are-welcome-to-contribute)

1. Fork the repo
----------------

[](#1-fork-the-repo)

2. Create your feature branch (git checkout -b feature/my-feature)
------------------------------------------------------------------

[](#2-create-your-feature-branch-git-checkout--b-featuremy-feature)

3. Commit your changes (git commit -m 'Add my feature')
-------------------------------------------------------

[](#3-commit-your-changes-git-commit--m-add-my-feature)

4. Push to the branch (git push origin feature/my-feature)
----------------------------------------------------------

[](#4-push-to-the-branch-git-push-origin-featuremy-feature)

5. Open a Pull Request
----------------------

[](#5-open-a-pull-request)

Run tests before submitting:
----------------------------

[](#run-tests-before-submitting)

```
comoser test
```

📜 License
=========

[](#-license)

This project is licensed under the MIT License.
-----------------------------------------------

[](#this-project-is-licensed-under-the-mit-license)

See LICENSE
-----------

[](#see-license)

for details.
------------

[](#for-details)

🙋 Support
=========

[](#-support)

For issues or feature requests, open a GitHub Issue
---------------------------------------------------

[](#for-issues-or-feature-requests-open-a-github-issue)

###  Health Score

17

—

LowBetter than 6% of packages

Maintenance42

Moderate activity, may be stable

Popularity0

Limited adoption so far

Community8

Small or concentrated contributor base

Maturity17

Early-stage or recently created project

 Bus Factor1

Top contributor holds 95.5% 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.

### Community

Maintainers

![](https://avatars.githubusercontent.com/u/183190833?v=4)[Yonas Fikadie](/maintainers/yonas8989)[@yonas8989](https://github.com/yonas8989)

---

Top Contributors

[![yonas8989](https://avatars.githubusercontent.com/u/183190833?v=4)](https://github.com/yonas8989 "yonas8989 (21 commits)")[![eshetua](https://avatars.githubusercontent.com/u/689791?v=4)](https://github.com/eshetua "eshetua (1 commits)")

### Embed Badge

![Health badge](/badges/afromessage-afromessage-laravel/health.svg)

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

###  Alternatives

[php-http/cache-plugin

PSR-6 Cache plugin for HTTPlug

25126.1M82](/packages/php-http-cache-plugin)[illuminate/http

The Illuminate Http package.

11937.9M6.9k](/packages/illuminate-http)[rdkafka/rdkafka

A PHP extension for Kafka

2.2k24.3k1](/packages/rdkafka-rdkafka)[httpsoft/http-message

Strict and fast implementation of PSR-7 and PSR-17

87965.9k114](/packages/httpsoft-http-message)[mezzio/mezzio-router

Router subcomponent for Mezzio

265.4M92](/packages/mezzio-mezzio-router)[serpapi/google-search-results-php

Get Google, Bing, Baidu, Ebay, Yahoo, Yandex, Home depot, Naver, Apple, Duckduckgo, Youtube search results via SerpApi.com

69127.2k](/packages/serpapi-google-search-results-php)

PHPackages © 2026

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