Jak wysyłać SMS-y przez SMPP API za pomocą PHP

Short Message Peer-to-Peer (SMPP) API to potężny protokół telekomunikacyjny zaprojektowany do wymiany wiadomości SMS między jednostkami, takimi jak centra SMS i aplikacje zewnętrzne. Ten kompleksowy przewodnik pokazuje, jak zaimplementować SMPP API za pomocą PHP, aby połączyć się z Ozeki SMS Gateway, umożliwiając programistom efektywne wysyłanie i zarządzanie wiadomościami SMS. Dzięki szczegółowym przykładom kodu PHP ten samouczek obejmuje konfigurację połączenia, wysyłanie wiadomości, raporty dostarczenia oraz najlepsze praktyki dotyczące budowania solidnego klienta SMPP API.

Zrozumienie SMPP API i jego roli w komunikacji SMS

SMPP API (Short Message Peer-to-Peer) jest szeroko stosowane w branży telekomunikacyjnej do obsługi komunikacji SMS o dużej skali. Pozwala aplikacjom na łączenie się z bramką SMS, taką jak Ozeki SMS Gateway, w celu niezawodnego wysyłania i odbierania wiadomości. Wykorzystując PHP, programiści mogą tworzyć skalowalne aplikacje, które współpracują z SMPP API do zarządzania przepływami SMS. Ten przewodnik wykorzystuje bibliotekę php-smpp, solidne narzędzie do implementacji protokołu SMPP w PHP, aby uprościć interakcje na niskim poziomie protokołu.

Konfiguracja klienta PHP SMPP do wysyłania SMS przez SMPP API

Aby wysyłać SMS-y przez SMPP API, należy najpierw serwerem SMPP Ozeki SMS Gateway. Użyjemy biblioteki php-smpp, która zapewnia implementację protokołu SMPP:

  1. Zainstaluj bibliotekę php-smpp za pomocą Composera, aby obsługiwać interakcje z SMPP API.
  2. Skonfiguruj parametry połączenia, w tym host, port, nazwę użytkownika i hasło dostarczone przez Ozeki SMS Gateway.
  3. Nawiąż połączenie z serwerem SMPP za pomocą transportu gniazdowego.

Oto jak zainstalować bibliotekę:

composer require onlinecity/php-smpp

Podstawowy przykład połączenia z SMPP API w PHP

Poniższy kod PHP demonstruje, jak nawiązać połączenie z Ozeki SMS Gateway za pomocą SMPP API. Ten przykład wykorzystuje bibliotekę php-smpp do utworzenia klienta, połączenia z serwerem i powiązania jako nadajnik do wysyłania wiadomości SMS.

<?php
require 'vendor/autoload.php';

use Smpp\Client;
use Smpp\Transport\Socket;

$host = 'your.ozeki.server';
$port = 2775;
$username = 'your_username';
$password = 'your_password';

// Utwórz transport i klienta
$transport = new Socket([$host], $port);
$transport->setRecvTimeout(30000);
$smpp = new Client($transport);

// Połącz i powiąż
$transport->open();
$smpp->bindTransmitter($username, $password);

echo "Pomyślnie połączono z serwerem SMPP\n";

// Wyślij wiadomość tutaj...

// Zamknij połączenie
$smpp->close();
?>

Ten kod inicjalizuje transport gniazdowy, ustawia timeout na odbieranie danych i powiązuje klienta jako nadajnik przy użyciu podanych poświadczeń. Po nawiązaniu połączenia klient jest gotowy do wysyłania wiadomości SMS przez SMPP API.

Utrzymanie połączenia z PHP przez SMPP API

Aby zapewnić niezawodne połączenie z SMPP API, Twoja aplikacja PHP musi wysyłać okresowe wiadomości keep-alive za pomocą PDU enquire_link. Zapobiega to przekroczeniu czasu połączenia i zapewnia ciągłą pracę. Poniżej znajduje się przykład implementacji mechanizmu keep-alive w PHP.

function sendKeepAlive($smpp) {
    try {
        $smpp->enquireLink();
        echo "Wysłano keep-alive\n";
    } catch (Exception $e) {
        echo "Keep-alive nie powiódł się: " . $e->getMessage() . "\n";
        // Zaimplementuj logikę ponownego połączenia tutaj
    }
}

// Wysyłaj keep-alive co 30 sekund
$keepAliveInterval = 30;
$lastKeepAlive = time();
while (true) {
    if (time() - $lastKeepAlive >= $keepAliveInterval) {
        sendKeepAlive($smpp);
        $lastKeepAlive = time();
    }
    // Obsłuż inne operacje tutaj
    sleep(1);
}

Ten skrypt wysyła wiadomość keep-alive co 30 sekund i zawiera obsługę błędów, aby zarządzać problemami z połączeniem. Jeśli keep-alive nie powiedzie się, możesz zaimplementować logikę ponownego połączenia, aby przywrócić połączenie z SMPP API.

Wysyłanie wiadomości SMS za pomocą PHP przez SMPP API

Wysyłanie wiadomości SMS przez SMPP API w PHP polega na utworzeniu wiadomości SMS za pomocą PDU submit_sm. Poniższy przykład pokazuje, jak wysłać wiadomość za pomocą biblioteki php-smpp.

use Smpp\Address;
use Smpp\SMS;

$from = new Address('12345', SMPP::TON_ALPHANUMERIC);
$to = new Address('+1234567890', SMPP::TON_INTERNATIONAL, SMPP::NPI_ISDN);

$message = new SMS($from, $to, 'Witaj z klienta PHP SMPP!');
$message->setDataCoding(SMPP::DATA_CODING_DEFAULT);

try {
    $messageId = $smpp->sendSMS($message);
    echo "Wiadomość wysłana pomyślnie, ID: $messageId\n";
} catch (Exception $e) {
    echo "Nie udało się wysłać wiadomości: " . $e->getMessage() . "\n";
}

W tym przykładzie adres nadawcy jest ustawiony jako ciąg alfanumeryczny, a numer odbiorcy używa formatowania międzynarodowego. Ustawienie DATA_CODING_DEFAULT zapewnia kompatybilność ze standardowymi wiadomościami tekstowymi. Obsługa błędów zapewnia, że wszelkie problemy podczas wysyłania wiadomości są wychwytywane i raportowane.

Obsługa raportów dostarczenia w PHP za pomocą interfejsu SMPP API

Interfejs SMPP API obsługuje raporty dostarczenia, które śledzą status wysłanych wiadomości. Aby odbierać te raporty w PHP, należy powiązać klienta jako odbiorcę i przetwarzać przychodzące PDU deliver_sm. Poniższy kod pokazuje, jak zaimplementować tę funkcjonalność.

// Najpierw powiąż jako odbiorca, aby otrzymywać raporty dostarczenia
$smpp->bindReceiver($username, $password);

while (true) {
    try {
        $pdu = $smpp->readPDU();
        if ($pdu instanceof DeliverSm) {
            $messageId = $pdu->getReceiptedMessageId();
            $status = $pdu->getMessageStatus();
            
            echo "Raport dostarczenia dla $messageId: $status\n";
            
            // Wyślij odpowiedź
            $smpp->respond($pdu, new DeliverSmResp());
        }
    } catch (Exception $e) {
        echo "Błąd odczytu PDU: " . $e->getMessage() . "\n";
        break;
    }
}

Ten kod powiązuje klienta jako odbiorcę, aby nasłuchiwać raportów dostarczenia, przetwarza przychodzące PDU i wysyła odpowiednie odpowiedzi. Dzięki temu Twoja aplikacja w PHP może skutecznie śledzić statusy dostarczenia wiadomości.

Kompletny klient SMPP w PHP do wysyłania SMS-ów za pomocą interfejsu SMPP API

Poniżej znajduje się kompleksowa klasa w PHP, która enkapsuluje funkcjonalność interfejsu SMPP API, w tym zarządzanie połączeniem, wysyłanie wiadomości i logikę ponownego łączenia. Ta implementacja jest zaprojektowana do użytku produkcyjnego, z solidną obsługą błędów i modularnością.

<?php
require 'vendor/autoload.php';

use Smpp\Client;
use Smpp\Transport\Socket;
use Smpp\Address;
use Smpp\SMS;

class SMPPClient {
    private $transport;
    private $smpp;
    private $config;
    private $isConnected = false;
    
    public function __construct($config) {
        $this->config = $config;
        $this->connect();
    }
    
    public function connect() {
        try {
            $this->transport = new Socket([$this->config['host']], $this->config['port']);
            $this->transport->setRecvTimeout(30000);
            $this->smpp = new Client($this->transport);
            $this->transport->open();
            $this->smpp->bindTransceiver(
                $this->config['username'],
                $this->config['password']
            );
            $this->isConnected = true;
            echo "Połączono z serwerem SMPP\n";
        } catch (Exception $e) {
            echo "Połączenie nieudane: " . $e->getMessage() . "\n";
            $this->reconnect();
        }
    }
    
    public function sendSMS($from, $to, $message) {
        if (!$this->isConnected) {
            throw new Exception("Brak połączenia z serwerem SMPP");
        }
        
        try {
            $fromAddr = new Address($from, SMPP::TON_ALPHANUMERIC);
            $toAddr = new Address($to, SMPP::TON_INTERNATIONAL, SMPP::NPI_ISDN);
            
            $sms = new SMS($fromAddr, $toAddr, $message);
            $sms->setDataCoding(SMPP::DATA_CODING_DEFAULT);
            
            return $this->smpp->sendSMS($sms);
        } catch (Exception $e) {
            $this->isConnected = false;
            throw $e;
        }
    }
    
    public function reconnect() {
        $this->close();
        sleep(5);
        $this->connect();
    }
    
    public function close() {
        if ($this->isConnected) {
            $this->smpp->close();
            $this->isConnected = false;
        }
    }
    
    public function __destruct() {
        $this->close();
    }
}

// Przykład użycia
$config = [
    'host' => 'your.ozeki.server',
    'port' => 2775,
    'username' => 'your_username',
    'password' => 'your_password'
];

$client = new SMPPClient($config);

try {
    $messageId = $client->sendSMS('12345', '+1234567890', 'Witaj z PHP!');
    echo "Wiadomość wysłana z ID: $messageId\n";
} catch (Exception $e) {
    echo "Błąd wysyłania wiadomości: " . $e->getMessage() . "\n";
}
?>

Ta klasa zapewnia wielokrotnego użytku implementację interfejsu SMPP API w PHP, z metodami do łączenia, wysyłania wiadomości, ponownego łączenia w przypadku awarii i czyszczenia zasobów. Jest zaprojektowana tak, aby była modularna i łatwa do integracji z większymi aplikacjami.

Najlepsze praktyki dotyczące budowania klienta SMPP w PHP

Aby zapewnić, że Twoja aplikacja w PHP korzystająca z interfejsu SMPP API jest solidna i skalowalna, postępuj zgodnie z tymi najlepszymi praktykami:

  • Zaimplementuj solidną obsługę błędów: Przechwytuj i obsługuj wyjątki dotyczące błędów połączenia, wysyłania wiadomości i przetwarzania PDU, aby zapewnić niezawodność.
  • Używaj trwałych połączeń: Utrzymuj jedno połączenie z interfejsem SMPP API, aby zmniejszyć obciążenie i poprawić wydajność.
  • Zaimplementuj kolejkowanie wiadomości: W przypadku wysyłania dużej liczby SMS-ów użyj kolejki do zarządzania dostarczaniem wiadomości i zapobiegania przeciążeniu serwera.
  • Monitoruj stan połączenia: Ciągle sprawdzaj status połączenia i zaimplementuj logikę automatycznego ponownego łączenia, aby radzić sobie z zakłóceniami sieci.
  • Używaj procesu roboczego: Uruchom swojego klienta SMPP w PHP jako demona lub proces roboczy do ciągłej pracy w środowiskach produkcyjnych.
  • Loguj aktywność: Zaimplementuj logowanie, aby śledzić zdarzenia związane z połączeniami, statusy wiadomości i błędy w celu debugowania i monitorowania.

Podsumowanie

Ten kompleksowy przewodnik pokazał, jak zaimplementować klienta w PHP dla interfejsu SMPP API do wysyłania i zarządzania wiadomościami SMS za pomocą bramki SMS Ozeki. Wykorzystując bibliotekę php-smpp, programiści mogą obsługiwać szczegóły niskopoziomowe protokołu SMPP, skupiając się na budowaniu solidnych aplikacji. Przedstawione przykłady kodu obejmują zarządzanie połączeniem, wysyłanie wiadomości, obsługę raportów dostarczenia oraz kompletną klasę w PHP do użytku produkcyjnego. W przypadku zaawansowanych aplikacji rozważ zaimplementowanie dodatkowych funkcji, takich jak kolejkowanie wiadomości, szczegółowe logowanie i monitorowanie, aby zwiększyć niezawodność i skalowalność.

W środowiskach produkcyjnych upewnij się, że Twój klient SMPP w PHP zawiera solidną obsługę błędów, monitorowanie połączeń i logowanie. Interfejs SMPP API obsługuje zaawansowane funkcje, takie jak priorytetyzacja wiadomości i ograniczanie przepustowości, które można zbadać w miarę wzrostu wymagań aplikacji.

More information