Cómo enviar SMS a través de la API SMPP usando PHP

La API de Mensajería Peer-to-Peer (SMPP) es un protocolo de telecomunicaciones poderoso diseñado para intercambiar mensajes SMS entre entidades pares, como centros de SMS y aplicaciones externas. Esta guía completa demuestra cómo implementar la API SMPP usando PHP para conectarse con la Pasarela SMS Ozeki, permitiendo a los desarrolladores enviar y gestionar mensajes SMS de manera eficiente. Con ejemplos detallados de código PHP, este tutorial cubre la configuración de la conexión, el envío de mensajes, informes de entrega y mejores prácticas para construir un cliente robusto de la API SMPP.

Entendiendo la API SMPP y su papel en la mensajería SMS

La API SMPP (Short Message Peer-to-Peer) es ampliamente utilizada en la industria de telecomunicaciones para facilitar la comunicación SMS de alto volumen. Permite que las aplicaciones se conecten a una pasarela SMS, como la Pasarela SMS Ozeki, para enviar y recibir mensajes de manera confiable. Al aprovechar PHP, los desarrolladores pueden crear aplicaciones escalables que interactúen con la API SMPP para gestionar flujos de trabajo SMS. Esta guía utiliza la biblioteca php-smpp, una herramienta robusta para implementar el protocolo SMPP en PHP, para simplificar las interacciones de bajo nivel del protocolo.

Configuración del cliente SMPP en PHP para enviar SMS a través de la API SMPP

Para enviar SMS a través de la API SMPP, primero debes configurar un usuario SMPP, y luego vincular tu cliente al servidor SMPP de la Pasarela SMS Ozeki. Usaremos la biblioteca php-smpp que proporciona una implementación del protocolo SMPP:

  1. Instala la biblioteca php-smpp usando Composer para manejar las interacciones con la API SMPP.
  2. Configura tus parámetros de conexión, incluyendo el host, puerto, nombre de usuario y contraseña proporcionados por la Pasarela SMS Ozeki.
  3. Establece una conexión al servidor SMPP usando un transporte de socket.

Aquí se muestra cómo instalar la biblioteca:

composer require onlinecity/php-smpp

Ejemplo básico de conexión para la API SMPP en PHP

El siguiente código PHP demuestra cómo establecer una conexión a la Pasarela SMS Ozeki usando la API SMPP. Este ejemplo utiliza la biblioteca php-smpp para crear un cliente, conectarse al servidor y vincularse como transmisor para enviar mensajes SMS.

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

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

$host = 'tu.servidor.ozeki';
$port = 2775;
$username = 'tu_usuario';
$password = 'tu_contraseña';

// Crear transporte y cliente
$transport = new Socket([$host], $port);
$transport->setRecvTimeout(30000);
$smpp = new Client($transport);

// Conectar y vincular
$transport->open();
$smpp->bindTransmitter($username, $password);

echo "Conectado exitosamente al servidor SMPP\n";

// Enviar mensaje aquí...

// Cerrar conexión
$smpp->close();
?>

Este código inicializa un transporte de socket, establece un tiempo de espera para recibir datos y vincula el cliente como transmisor usando las credenciales proporcionadas. Una vez conectado, el cliente está listo para enviar mensajes SMS a través de la API SMPP.

Mantener la conexión con PHP a través de la API SMPP

Para garantizar una conexión confiable a la API SMPP, tu aplicación PHP debe enviar mensajes periódicos de keep-alive usando el PDU enquire_link. Esto evita que la conexión se interrumpa por tiempo de inactividad y asegura una operación continua. A continuación, se muestra un ejemplo de cómo implementar un mecanismo de keep-alive en PHP.

function sendKeepAlive($smpp) {
    try {
        $smpp->enquireLink();
        echo "Keep-alive enviado\n";
    } catch (Exception $e) {
        echo "Keep-alive falló: " . $e->getMessage() . "\n";
        // Implementa lógica de reconexión aquí
    }
}

// Enviar keep-alive cada 30 segundos
$keepAliveInterval = 30;
$lastKeepAlive = time();
while (true) {
    if (time() - $lastKeepAlive >= $keepAliveInterval) {
        sendKeepAlive($smpp);
        $lastKeepAlive = time();
    }
    // Manejar otras operaciones aquí
    sleep(1);
}

Este script envía un mensaje keep-alive cada 30 segundos e incluye manejo de errores para gestionar problemas de conexión. Si un keep-alive falla, puedes implementar lógica de reconexión para restaurar la conexión a la API SMPP.

Enviar mensajes SMS con PHP a través de la API SMPP

Enviar mensajes SMS a través de la API SMPP en PHP implica crear un mensaje SMS con el PDU submit_sm. El siguiente ejemplo demuestra cómo enviar un mensaje usando la biblioteca 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, '¡Hola desde el cliente PHP SMPP!');
$message->setDataCoding(SMPP::DATA_CODING_DEFAULT);

try {
    $messageId = $smpp->sendSMS($message);
    echo "Mensaje enviado exitosamente, ID: $messageId\n";
} catch (Exception $e) {
    echo "Error al enviar mensaje: " . $e->getMessage() . "\n";
}

En este ejemplo, la dirección del remitente se establece como una cadena alfanumérica, y el número del destinatario usa formato internacional. La configuración DATA_CODING_DEFAULT asegura compatibilidad con mensajes de texto estándar. El manejo de errores garantiza que cualquier problema durante el envío del mensaje sea capturado y reportado.

Manejo de informes de entrega con PHP a través de la API SMPP

La API SMPP soporta informes de entrega para rastrear el estado de los mensajes enviados. Para recibir estos informes en PHP, vincula tu cliente como receptor y procesa los PDUs deliver_sm entrantes. El siguiente código muestra cómo implementar esta funcionalidad.

// Primero vincular como receptor para recibir informes de entrega
$smpp->bindReceiver($username, $password);

while (true) {
    try {
        $pdu = $smpp->readPDU();
        if ($pdu instanceof DeliverSm) {
            $messageId = $pdu->getReceiptedMessageId();
            $status = $pdu->getMessageStatus();
            
            echo "Informe de entrega para $messageId: $status\n";
            
            // Enviar respuesta
            $smpp->respond($pdu, new DeliverSmResp());
        }
    } catch (Exception $e) {
        echo "Error al leer PDU: " . $e->getMessage() . "\n";
        break;
    }
}

Este código vincula el cliente como receptor para escuchar informes de entrega, procesa los PDUs entrantes y envía respuestas apropiadas. Esto asegura que tu aplicación PHP pueda rastrear efectivamente los estados de entrega de los mensajes.

Cliente PHP SMPP completo para enviar SMS a través de la API SMPP

A continuación, se presenta una clase PHP completa que encapsula la funcionalidad de la API SMPP, incluyendo gestión de conexiones, envío de mensajes y lógica de reconexión. Esta implementación está diseñada para uso en producción, con manejo robusto de errores y modularidad.

<?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 "Conectado al servidor SMPP\n";
        } catch (Exception $e) {
            echo "Error de conexión: " . $e->getMessage() . "\n";
            $this->reconnect();
        }
    }
    
    public function sendSMS($from, $to, $message) {
        if (!$this->isConnected) {
            throw new Exception("No conectado al servidor 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();
    }
}

// Ejemplo de uso
$config = [
    'host' => 'tu.servidor.ozeki',
    'port' => 2775,
    'username' => 'tu_usuario',
    'password' => 'tu_contraseña'
];

$client = new SMPPClient($config);

try {
    $messageId = $client->sendSMS('12345', '+1234567890', '¡Hola desde PHP!');
    echo "Mensaje enviado con ID: $messageId\n";
} catch (Exception $e) {
    echo "Error al enviar mensaje: " . $e->getMessage() . "\n";
}
?>

Esta clase proporciona una implementación reutilizable de la API SMPP en PHP, con métodos para conectar, enviar mensajes, reconectar en caso de fallo y limpiar recursos. Está diseñada para ser modular y fácil de integrar en aplicaciones más grandes.

Mejores prácticas para construir un cliente PHP SMPP

Para asegurar que tu aplicación PHP que usa la API SMPP sea robusta y escalable, sigue estas mejores prácticas:

  • Implementa manejo robusto de errores: Captura y maneja excepciones para fallos de conexión, errores de envío de mensajes y problemas de procesamiento de PDU para garantizar confiabilidad.
  • Usa conexiones persistentes: Mantén una única conexión a la API SMPP para reducir sobrecarga y mejorar el rendimiento.
  • Implementa colas de mensajes: Para envío de SMS de alto volumen, usa una cola para gestionar la entrega y evitar sobrecarga del servidor.
  • Monitorea el estado de la conexión: Verifica continuamente el estado de la conexión e implementa lógica de reconexión automática para manejar interrupciones de red.
  • Usa un proceso worker: Ejecuta tu cliente PHP SMPP como un daemon o proceso worker para operación continua en entornos de producción.
  • Registra actividad: Implementa logging para rastrear eventos de conexión, estados de mensajes y errores para depuración y monitoreo.

Conclusión

Esta guía completa ha demostrado cómo implementar un cliente PHP para la API SMPP para enviar y gestionar mensajes SMS usando la Pasarela SMS Ozeki. Al aprovechar la biblioteca php-smpp, los desarrolladores pueden manejar detalles de bajo nivel del protocolo SMPP mientras se enfocan en construir aplicaciones robustas. Los ejemplos de código proporcionados cubren gestión de conexiones, envío de mensajes, manejo de informes de entrega y una clase PHP completa para uso en producción. Para aplicaciones avanzadas, considera implementar características adicionales como colas de mensajes, logging detallado y monitoreo para mejorar confiabilidad y escalabilidad.

Para entornos de producción, asegúrate de que tu cliente PHP SMPP incluya manejo robusto de errores, monitoreo de conexión y logging. La API SMPP soporta características avanzadas como priorización de mensajes y throttling, que pueden explorarse a medida que crecen los requisitos de tu aplicación.

More information