Cómo enviar SMS a nivel global utilizando la API de puerta de enlace SMS de Infobip en tu proyecto Symfony 5

Cómo enviar SMS a nivel global utilizando la API de puerta de enlace SMS de Infobip en tu proyecto Symfony 5

Ahora llega una de las partes didácticas de tu nuevo proyecto, el momento en el que debes interactuar con los usuarios a través de SMS y comprobar si son realmente humanos. Una de las cosas más importantes que debes saber a la hora de elegir qué pasarela SMS debes utilizar para enviar los mensajes que tu proyecto necesita es, por supuesto, el precio. Nunca encontrarás una puerta de enlace SMS confiable que le permita enviar SMS gratis para siempre, la mayoría de ellos ofrecen pruebas, por supuesto. El precio de los SMS se basa en el destino y el tipo de mensaje que envía, así como en el operador de telefonía móvil (1 & 1, Movistar, Verizon Wireless, AT&T, etc.) al que se envía el SMS.

La mayoría de las plataformas ofrecen la función de pago por uso, que suele ser la mejor para proyectos de inicio, ya que no sabrás de inmediato si tendrá 1K usuarios o solo 50, por lo que pagar desde el principio una tarifa plana, no tiene sentido. En el momento en que aumente el número de usuarios de su aplicación, podrá buscar los precios al por mayor u ofertas especiales que la empresa pueda ofrecer según sus necesidades para que todos puedan sacar provecho de la situación.

En este tutorial, decidí continuar con Infobip, y no, esto no es patrocinado por ellos (si alguien de Infobip está leyendo esto y quiere patrocinarme, adelante 😉). Esto debido a que su API cubre más de 40 países y sus precios son asequibles en casi todos los países, ya que en algunos países el precio variará por supuesto, por ejemplo para un SMS entrante en Colombia pagas $ 0.018 USD, por lo que en comparación con otras plataformas como Twilio ($ 0.05), Sendhub, etc. En nuestro caso, los servicios de Infobip funcionan muy bien para mí, dependiendo de sus países de destino, otra plataforma puede ser una mejor opción si ofrecen un mejor precio.

Nota

  • Las llamadas y los mensajes en el período de prueba solo se pueden enviar a un número de teléfono móvil y a una dirección de correo electrónico que haya verificado durante el proceso de registro. Solo si paga podrá enviar mensajes a otros números.
  • La prueba es válida hasta que gaste todas sus unidades gratuitas.
  • Para los clientes de autoservicio, la moneda no se puede cambiar. 

En este artículo, te explicaré cómo implementar fácilmente el servicio de mensajería SMS en tu aplicación Symfony 5 usando la API de Infobip.

1. Cree una cuenta de Infobip

En este ejemplo, usaré la versión de prueba de Infobip porque, para ser honesto, no estoy trabajando en ningún proyecto real que requiera esta función en este momento 😂. Visita la página oficial de Infobip aquí y crea una cuenta , puedes iniciar sesión usando tu cuenta de LinkedIn o registrarte desde cero usando tu propio correo electrónico.

Create Infobip Account

Después de hacer clic en "Enviar", un correo electrónico aterrizará en su bandeja de entrada para validar su cuenta, haciendo clic en el enlace recibido le permitirá definir un nombre de usuario y una contraseña para su cuenta. Deberá validar también su número de teléfono móvil para recibir la prueba gratuita que le permitirá probar la API. Una vez que valides y accedes al portal de administración de la plataforma, recibirás un mensaje con la gran noticia:

Infobip Free Trial

Ahora que tenemos acceso, comencemos con la implementación de nuestro proyecto Symfony.

2. Obten la URL base y ApiKey

Infobip te permite interactuar con la puerta de enlace SMS a través de una API RESTful. Para acceder a ella en tu proyecto Symfony, necesitarás las siguientes propiedades que puede obtener desde su panel de Infobip:

La BaseURL

La baseURL corresponde al punto final de la API al que deben dirigirse sus solicitudes. Puedes obtenerlo accediendo a la documentación de la API aquí . Es una cadena simple que se parece a " https://<your-account-endpoint>.api.infobip.com":

APIKey Infobip

La ApiKey

ApiKey es el token que te permitirá interactuar con la puerta de enlace SMS. Puedes ver todas las claves API de tu cuenta en el panel aquí. Puede utilizar la clave predeterminada que se crea cuando crea la cuenta o puede crear una nueva. ApiKey es una credencial larga, puede modificarla para permitir el acceso desde direcciones IP específicas o definir una fecha de vencimiento.

Para este ejemplo, asumiremos que nuestra ApiKey y BaseURL serán las siguientes:

  • base_url =https://ourcodeworld.api.infobip.com
  • apikey =1234567890

Con las credenciales, podemos proceder ahora con la implementación de la función de mensajería SMS de nuestro proyecto Symfony.

3. Instala la biblioteca cliente de la API de Infopib

Para interactuar con la API de Infopib, es bastante más fácil usar el SDK de PHP que está disponible en Github en lugar de crear solicitudes simples a los puntos finales de la API (por supuesto que está permitido, pero con la biblioteca cliente es más fácil). Instale la biblioteca cliente de API con el siguiente comando:

composer require infobip/infobip-api-php-client

El cliente usa el cliente HTTP Guzzle bajo cuerdas, por lo que no necesitas preocuparte por errores extraños de cURL o algo así.

4. Configura la APIKey y la URL base a nivel del proyecto en Symfony

Para acceder a la API desde el cliente, necesitarás autorización para continuar. Con esta API, necesitará los siguientes parámetros que se pueden obtener del panel de Infobip:

  • SMSGATEWAY_BASEURL: La URL base es la URL de la API a la que se deben reenviar las solicitudes. Puede obtener tu propia URL en los documentos de la API aquí .
  • SMSGATEWAY_APIKEYPREFIX: el encabezado de la clave API proporciona la autorización más segura con la mayor flexibilidad. Por lo general, se encuentra en todas las aplicaciones y se utiliza en el encabezado App de autorización de las solicitudes.
  • SMSGATEWAY_APIKEY: esta es la clave API de la aplicación creada en Infobip, puedes usar la clave general para propósitos de prueba o usar la clave de un proyecto que puedes crear en el dashboard.

Puede almacenar estos parámetros en tu archivo .env actual de esta manera:

# project/.env
###> symfony/mailer ###
SMSGATEWAY_BASEURL="https://ourcodeworld.api.infobip.com"
# https://www.infobip.com/docs/essentials/api-authentication#api-key-header
SMSGATEWAY_APIKEYPREFIX="App"
SMSGATEWAY_APIKEY="1234567890"
###< symfony/mailer ###

Después de definirlos en tu archivo de entorno, crea los parámetros respectivos en tu archivo services.yaml de esta manera:

# project/config/services.yaml
parameters:
    # Define the sms gateway parameters
    sms_gateway.baseurl: '%env(resolve:SMSGATEWAY_BASEURL)%'
    sms_gateway.apikey: '%env(resolve:SMSGATEWAY_APIKEY)%'
    sms_gateway.apikeyprefix: '%env(resolve:SMSGATEWAY_APIKEYPREFIX)%'

Estos serán los parámetros que obtendremos a través de ContainerBagInterface más adelante en el servicio o en tus controladores.

5. Envío de SMS desde su controlador

 ¡Ahora es el momento de probar la API de Infobip con el cliente! La lógica necesaria para enviar un SMS desde tu código PHP es la siguiente:

  1. Obtén las credenciales de nuestro archivo parameters.yaml y guárdalas en algunas variables.
  2. Inicializar un objeto de Configuración del cliente, definiendo la URL base, la APIKEY y el prefijo APIKEY (todos ellos obligatorios).
  3. Crea una instancia de Guzzle Client y proporciónela como argumento de una nueva instancia de la clase SendSMSApi y el objeto de configuración creado anteriormente.
  4. Cree una instancia de destino que contendrá el número al que se enviará el SMS. Tenga en cuenta que el número debe contener el código de llamada de la lista de países como prefijo del número de destino. Por ejemplo, en Colombia, el código de llamada es +57, por lo que si el número es 123 456 7890, la cadena que se usará como destino es "571234567890".
  5. Cree un objeto de mensaje que almacenará el mensaje que enviará, así como las instancias de destino.
  6. Finalmente cree una instancia SmsAdvancedTextualRequest que se utilizará para enviar los mensajes creados.

El siguiente controlador sigue la lógica mencionada, enviando un SMS a un número imaginario en Colombia:

<?php

namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;

// Incluir clases de Infobip
use Infobip\Configuration;
use Infobip\Api\SendSmsApi;
use Infobip\Model\SmsDestination;
use Infobip\Model\SmsTextualMessage;
use Infobip\Model\SmsAdvancedTextualRequest;

class PagesController extends AbstractController
{
    /**
     * @Route("/", name="app_index")
     */
    public function index(): Response
    {
        // 1. Crear cliente y objeto de configuración
        $baseurl = $this->getParameter("sms_gateway.baseurl");
        $apikey = $this->getParameter("sms_gateway.apikey");
        $apikeyPrefix = $this->getParameter("sms_gateway.apikeyprefix");
        
        $configuration = (new Configuration())
            ->setHost($baseurl)
            ->setApiKeyPrefix('Authorization', $apikeyPrefix)
            ->setApiKey('Authorization', $apikey);

        $client = new \GuzzleHttp\Client();
        $sendSmsApi = new SendSMSApi($client, $configuration);
        
        // 2. Crear objeto de mensaje con destino
        $destination = (new SmsDestination())->setTo('571234567890');
        $message = (new SmsTextualMessage())
            // La longitud del ID de remitente alfanumérico debe tener entre 3 y 11 caracteres (Ejemplo: `CompanyName`).
            // La longitud del ID numérico del remitente debe tener entre 3 y 14 caracteres.
            ->setFrom('InfoSMS')
            ->setText('Este es un mensaje SMS ficticio enviado usando infobip-api-php-client')
            ->setDestinations([$destination]);
        
        // 3. Crea una solicitud de mensaje con todos los mensajes que quieras enviar.
        $request = (new SmsAdvancedTextualRequest())->setMessages([$message]);
        
        // 4. Enviar!
        try {
            $smsResponse = $sendSmsApi->sendSmsMessage($request);
            
            dump($smsResponse);
        } catch (\Throwable $apiException) {
            // MANEJAR LA EXCEPCIÓN
            dump($apiException);
        }
        
        return new Response("Success (?)");
    }
}

Teniendo en cuenta que estás en el periodo de prueba, si usas tu propio número como destino, deberías recibir el mensaje en tu dispositivo móvil:

Infobip SMS Inbound

6. Creación de un servicio de SMS (opcional)

Como es habitual, es probable que necesites enviar SMS en múltiples controladores o comandos de tu proyecto Symfony. Por eso es mejor crear un servicio para hacerlo aún más fácil. En nuestro caso, nuestro servicio se verá bastante simple y te permitirá simplemente usar el método de envío del servicio, proporcionando una matriz con matrices que contienen la lista de SMS que deseas enviar:

<?php

//app/src/Service/SmsGatewayService.php
namespace App\Service;

use Symfony\Component\DependencyInjection\ParameterBag\ContainerBagInterface;
use Infobip\Configuration;
use Infobip\Api\SendSmsApi;
use Infobip\Model\SmsDestination;
use Infobip\Model\SmsTextualMessage;
use Infobip\Model\SmsAdvancedTextualRequest;
use GuzzleHttp\Client;

class SmsGatewayService 
{
    private $params;

    public function __construct(ContainerBagInterface $params)
    {
        $this->params = $params;
    }
    
    public function send(array $messages)
    {
        $baseurl = $this->params->get("sms_gateway.baseurl");
        $apikey = $this->params->get("sms_gateway.apikey");
        $apikeyPrefix = $this->params->get("sms_gateway.apikeyprefix");
        
        $configuration = (new Configuration())
            ->setHost($baseurl)
            ->setApiKeyPrefix('Authorization', $apikeyPrefix)
            ->setApiKey('Authorization', $apikey);

        $client = new Client();
        $sendSmsApi = new SendSMSApi($client, $configuration);
        $_messages = [];
        
        foreach($messages as $message){
            $destination = (new SmsDestination())->setTo($message["to"]);
            $_messages[] = (new SmsTextualMessage())
                ->setFrom($message["from"])
                ->setText($message["message"])
                ->setDestinations([$destination])
            ;
        }
        
        $request = (new SmsAdvancedTextualRequest())->setMessages($_messages);
        
        return $sendSmsApi->sendSmsMessage($request);
    }
}

Con el nuevo servicio, simplemente puedes incluirlo en sus controladores, comandos u otros servicios con cableado automático. Por ejemplo, puede enviar ahora el SMS dentro de un controlador con el servicio como este:

<?php

namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;

// Incluir el servicio para enviar SMS
use App\Service\SmsGatewayService;

class PagesController extends AbstractController
{
    /**
     * @Route("/", name="app_index")
     */
    public function index(SmsGatewayService $smsGateway): Response
    {
        try {
            $smsResponse = $smsGateway->send([
                [
                    "to" => "571234567890",
                    "from" => "InfoSMS",
                    "message" => "Hello World! This is my first message"
                ],
                [
                    "to" => "571234567890",
                    "from" => "InfoSMS",
                    "message" => "Hello World! This is my second message"
                ]
            ]);
        } catch (\Throwable $apiException) {
            // MANEJAR LA EXCEPCIÓN
            dump($apiException);
        }
        
        return $this->render('pages/index.html.twig', [
            'controller_name' => 'PagesController',
        ]);
        
        return new Response("Success (?)");
    }
}

Que te diviertas ❤️!

Esto podria interesarte

Conviertete en un programador más sociable