Skip to main content

FahdCloud ThirdParty WhatsappProviders

A .NET library that provides unified interfaces and implementations for integrating with various WhatsApp service providers. This library simplifies the process of sending WhatsApp messages through different third-party providers with a consistent API.

Features

  • 🔌 Multiple Provider Support - Support for Ultramsg, WASender, Whats360, and WABotMaster
  • 💾 Built-in Caching - Memory caching support for improved performance
  • 🏗️ Dependency Injection Ready - Seamless integration with Microsoft.Extensions.DependencyInjection
  • ⚙️ Configuration Support - Easy configuration through Microsoft.Extensions.Options
  • 📱 Media Support - Send text messages, images, documents, and other media types
  • 🔄 HTTP Client Integration - Built-in HTTP client management with Microsoft.Extensions.Http

Supported Providers

  • Ultramsg - WhatsApp Business API provider
  • WASender - WhatsApp messaging service
  • Whats360 - WhatsApp API platform
  • WABotMaster - WhatsApp automation service

Installation

Install the package via NuGet Package Manager:

dotnet add package FahdCloud.ThirdParty.WhatsappProviders

Or via Package Manager Console:

Install-Package FahdCloud.ThirdParty.WhatsappProviders

Quick Start

1. Register Services

using FahdCloud.ThirdParty.WhatsappProviders.Extensions;

// In your Program.cs or Startup.cs
builder.Services.AddWhatsappProviders();

// Configure your specific provider settings
builder.Services.Configure<UltramsgSettings>(builder.Configuration.GetSection("UltramsgSettings"));
builder.Services.Configure<WASenderSettings>(builder.Configuration.GetSection("WASenderSettings"));
builder.Services.Configure<Whats360Settings>(builder.Configuration.GetSection("Whats360Settings"));
builder.Services.Configure<WABotMasterSettings>(builder.Configuration.GetSection("WABotMasterSettings"));

2. Configuration

Add your WhatsApp provider settings to your appsettings.json:

{
  "UltramsgSettings": {
    "Token": "your-ultramsg-token",
    "InstanceId": "your-instance-id",
    "BaseUrl": "https://api.ultramsg.com"
  },
  "WASenderSettings": {
    "ApiKey": "your-wasender-api-key",
    "BaseUrl": "https://api.wasender.com"
  },
  "Whats360Settings": {
    "ApiKey": "your-whats360-api-key",
    "BaseUrl": "https://api.whats360.com"
  },
  "WABotMasterSettings": {
    "ApiKey": "your-wabotmaster-api-key",
    "BaseUrl": "https://api.wabotmaster.com"
  }
}

Usage Examples

Ultramsg Provider

public class UltramsgMessageService
{
    private readonly IUltramsgService _ultramsgService;

    public UltramsgMessageService(IUltramsgService ultramsgService)
    {
        _ultramsgService = ultramsgService;
    }

    // Send text message
    public async Task SendTextMessageAsync(string phoneNumber, string message)
    {
        var result = await _ultramsgService.SendTextMessageAsync(phoneNumber, message);
        if (result.IsSuccess)
        {
            Console.WriteLine($"Message sent successfully: {result.MessageId}");
        }
    }

    // Send image message
    public async Task SendImageAsync(string phoneNumber, string imageUrl, string caption = null)
    {
        var result = await _ultramsgService.SendImageAsync(phoneNumber, imageUrl, caption);
        if (result.IsSuccess)
        {
            Console.WriteLine($"Image sent successfully: {result.MessageId}");
        }
    }

    // Send document
    public async Task SendDocumentAsync(string phoneNumber, string documentUrl, string fileName)
    {
        var result = await _ultramsgService.SendDocumentAsync(phoneNumber, documentUrl, fileName);
        if (result.IsSuccess)
        {
            Console.WriteLine($"Document sent successfully: {result.MessageId}");
        }
    }
}

WASender Provider

public class WASenderMessageService
{
    private readonly IWASenderService _waSenderService;

    public WASenderMessageService(IWASenderService waSenderService)
    {
        _waSenderService = waSenderService;
    }

    // Send text message
    public async Task SendTextMessageAsync(string phoneNumber, string message)
    {
        var result = await _waSenderService.SendTextMessageAsync(phoneNumber, message);
        if (result.IsSuccess)
        {
            Console.WriteLine($"Message sent via WASender: {result.MessageId}");
        }
    }

    // Send media message
    public async Task SendMediaMessageAsync(string phoneNumber, string mediaUrl, string mediaType, string caption = null)
    {
        var result = await _waSenderService.SendMediaMessageAsync(phoneNumber, mediaUrl, mediaType, caption);
        if (result.IsSuccess)
        {
            Console.WriteLine($"Media sent via WASender: {result.MessageId}");
        }
    }

    // Get message status
    public async Task<MessageStatus> GetMessageStatusAsync(string messageId)
    {
        return await _waSenderService.GetMessageStatusAsync(messageId);
    }
}

Whats360 Provider

public class Whats360MessageService
{
    private readonly IWhats360Service _whats360Service;

    public Whats360MessageService(IWhats360Service whats360Service)
    {
        _whats360Service = whats360Service;
    }

    // Send text message
    public async Task SendTextMessageAsync(string phoneNumber, string message)
    {
        var result = await _whats360Service.SendTextMessageAsync(phoneNumber, message);
        if (result.IsSuccess)
        {
            Console.WriteLine($"Message sent via Whats360: {result.MessageId}");
        }
    }

}

WABotMaster Provider

public class WABotMasterMessageService
{
    private readonly IWABotMasterService _waBotMasterService;

    public WABotMasterMessageService(IWABotMasterService waBotMasterService)
    {
        _waBotMasterService = waBotMasterService;
    }

    // Send text message
    public async Task SendTextMessageAsync(string phoneNumber, string message)
    {
        var result = await _waBotMasterService.SendTextMessageAsync(phoneNumber, message);
        if (result.IsSuccess)
        {
            Console.WriteLine($"Message sent via WABotMaster: {result.MessageId}");
        }
    }
    
}

Complete Integration Example

// Program.cs
using FahdCloud.ThirdParty.WhatsappProviders.Extensions;

var builder = WebApplication.CreateBuilder(args);

// Add WhatsApp providers
builder.Services.AddWhatsappProviders();

// Configure settings
builder.Services.Configure<UltramsgSettings>(builder.Configuration.GetSection("UltramsgSettings"));
builder.Services.Configure<WASenderSettings>(builder.Configuration.GetSection("WASenderSettings"));
builder.Services.Configure<Whats360Settings>(builder.Configuration.GetSection("Whats360Settings"));
builder.Services.Configure<WABotMasterSettings>(builder.Configuration.GetSection("WABotMasterSettings"));

// Add your application services
builder.Services.AddScoped<INotificationService, NotificationService>();

var app = builder.Build();

// NotificationService.cs
public class NotificationService : INotificationService
{
    private readonly IUltramsgService _ultramsgService;
    private readonly IWASenderService _waSenderService;
    private readonly IWhats360Service _whats360Service;
    private readonly IWABotMasterService _waBotMasterService;

    public NotificationService(
        IUltramsgService ultramsgService,
        IWASenderService waSenderService,
        IWhats360Service whats360Service,
        IWABotMasterService waBotMasterService)
    {
        _ultramsgService = ultramsgService;
        _waSenderService = waSenderService;
        _whats360Service = whats360Service;
        _waBotMasterService = waBotMasterService;
    }

    public async Task SendNotificationAsync(string phoneNumber, string message, WhatsAppProvider provider)
    {
        try
        {
            var result = provider switch
            {
                WhatsAppProvider.Ultramsg => await _ultramsgService.SendTextMessageAsync(phoneNumber, message),
                WhatsAppProvider.WASender => await _waSenderService.SendTextMessageAsync(phoneNumber, message),
                WhatsAppProvider.Whats360 => await _whats360Service.SendTextMessageAsync(phoneNumber, message),
                WhatsAppProvider.WABotMaster => await _waBotMasterService.SendTextMessageAsync(phoneNumber, message),
                _ => throw new ArgumentException($"Unsupported provider: {provider}")
            };

            if (result.IsSuccess)
            {
                Console.WriteLine($"Notification sent successfully via {provider}: {result.MessageId}");
            }
            else
            {
                Console.WriteLine($"Failed to send notification via {provider}: {result.ErrorMessage}");
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Error sending notification via {provider}: {ex.Message}");
        }
    }
}

public enum WhatsAppProvider
{
    Ultramsg,
    WASender,
    Whats360,
    WABotMaster
}

Error Handling

All services return a result object that includes success status and error information:

var result = await _ultramsgService.SendTextMessageAsync(phoneNumber, message);

if (result.IsSuccess)
{
    Console.WriteLine($"Message sent successfully: {result.MessageId}");
}
else
{
    Console.WriteLine($"Failed to send message: {result.ErrorMessage}");
    Console.WriteLine($"Error Code: {result.ErrorCode}");
}

Caching

The library includes built-in caching for improved performance. You can configure cache settings:

// The library automatically handles caching for:
// - User data validation
// - Message status tracking
// - Provider response caching

Dependencies

This library is built on top of the following Microsoft packages:

  • Microsoft.Extensions.Caching.Memory (9.0.6) - For caching functionality
  • Microsoft.Extensions.DependencyInjection.Abstractions (9.0.6) - For dependency injection
  • Microsoft.Extensions.Http (9.0.6) - For HTTP client management
  • Microsoft.Extensions.Options.ConfigurationExtensions (9.0.6) - For configuration binding
  • Newtonsoft.Json (13.0.3) - For JSON serialization
  • Scrutor (6.0.0) - For assembly scanning and service registration

Requirements

  • .NET 9.0 or later
  • C# 12 with nullable reference types enabled

Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

License

This project is licensed under the terms specified in the project repository.

Support

For support and questions, please refer to the project's issue tracker or documentation. using FahdCloud.ThirdParty.WhatsappProviders.Interfaces.Services; using FahdCloud.ThirdParty.WhatsappProviders.Models.Elwhats; using Microsoft.Extensions.DependencyInjection;

namespace Test.ServiceTests { public static class ElwhatsServiceTest { private static readonly ElwhatsSetting Settings = new() { ClientId = "your-client-id-here" // Replace with actual client ID for testing };

    private const string TestMessage = "Hello from Whats Providers! from Elwhats";
    private const string MediaUrl = "https://fahd-cloud-medical-dev.b-cdn.net/UploadedFiles/Storage%20Files/eaf89276-1c52-8407-91ce-48ddb297aa45.png";
    private const string MediaCaption = "Check out this amazing image from Elwhats!";

    public static async Task RunTestAsync(ServiceProvider serviceProvider, string phoneNumber)
    {
        Console.WriteLine("=== Testing Elwhats Service ===");

        try
        {
            var elwhatsService = serviceProvider.GetRequiredService<IElwhatsService>();

            // Test connection
            var isConnected = await elwhatsService.CheckConnectionAsync(Settings);
            Console.WriteLine($"Elwhats Connection status: {isConnected}");

            if (!isConnected)
            {
                Console.WriteLine("❌ Connection failed. Skipping message tests.");
                return;
            }

            // Test text message
            await TestTextMessageAsync(elwhatsService, phoneNumber);

            // Test media message
            await TestMediaMessageAsync(elwhatsService, phoneNumber);

            Console.WriteLine("✅ Elwhats tests completed successfully!");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"❌ Elwhats Error: {ex.Message}");
        }
        finally
        {
            Console.WriteLine();
        }
    }

    private static async Task TestTextMessageAsync(IElwhatsService service, string phoneNumber)
    {
        try
        {
            var result = await service.SendMessageAsync(Settings, phoneNumber, TestMessage);
            if (result.isSuccess)
            {
                Console.WriteLine("✅ Elwhats text message sent successfully!");
            }
            else
            {
                Console.WriteLine($"❌ Failed to send text message: {result.meessage}");
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine($"❌ Failed to send text message: {ex.Message}");
        }
    }

    private static async Task TestMediaMessageAsync(IElwhatsService service, string phoneNumber)
    {
        try
        {
            var result = await service.SendMediaMessageAsync(
                Settings,
                phoneNumber,
                MediaCaption,
                MediaUrl
            );

            if (result.isSuccess)
            {
                Console.WriteLine("✅ Elwhats media message sent successfully!");
            }
            else
            {
                Console.WriteLine($"❌ Failed to send media message: {result.meessage}");
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine($"❌ Failed to send media message: {ex.Message}");
        }
    }
}

}