https://d226lax1qjow5r.cloudfront.net/blog/blogposts/receive-sms-messages-java-dr/sms-receive-java.png

Cómo recibir mensajes SMS con Java

Publicado el November 3, 2020

Tiempo de lectura: 3 minutos

En el último tutorialconfiguramos una aplicación web Java que puede enviar mensajes SMS mediante la SMS API de Vonage. Este tutorial se basa en eso, agregando un punto final que será llamado por Vonage cuando alguien envíe un mensaje SMS a tu número de Vonage.

¿Cómo funciona?

Cuando Vonage recibe un mensaje SMS en un número de Vonage, busca el punto final de webhook (URL) asociado con ese número y llama a esa URL con un gran bloque de JSON que describe el mensaje que se acaba de recibir.

Receiving an SMS messageReceiving an SMS message diagram

Lo que vamos a hacer en este tutorial es escribir un Servlet que pueda manejar el mensaje SMS entrante. El problema es que mientras estamos desarrollando en nuestra máquina local, es probable que estemos aislados de Internet, por lo que los servidores de Vonage no pueden alcanzarnos. Una forma de evitar esto sería desplegar continuamente en un servidor web público, pero eso es una completa molestia. Afortunadamente existe una excelente herramienta llamada Ngrok que puede ayudarnos con este problema.

Desarrollo de Webhooks con Ngrok

Cuando ejecutas Ngrok, éste crea un nuevo subdominio de ngrok.io, y entonces tuneliza todas las peticiones a ese nombre de dominio a un servicio web que se ejecuta en tu máquina. ¡Práctico!

Así que instala Ngrok (esperaré aquí). Una vez hecho esto, ejecuta ngrok en tu terminal:

ngrok http 8080

Jetty utiliza el puerto 8080 puerto por defecto, así que lo usaremos para hacer la vida más fácil. Puedes ver en la captura de pantalla que Ngrok me ha asignado la URL aleatoria http://8b771613.ngrok.ioque ahora está haciendo un túnel a localhost:8080, donde ejecutaré Jetty en un momento.

Ngrok outputNgrok output

Deja Ngrok ejecutándose en una ventana de terminal (se ejecutará felizmente hasta que lo apagues), y queremos mantener la URL y el túnel ejecutándose por un tiempo. Lo que nos gustaría hacer ahora es configurar Vonage para que apunte a nuestra URL Ngrok, pero no lo hará a menos que la URL devuelva 200 mensajes. Así que primero necesitamos escribir un pequeño servlet stub.

Un servlet para recibir el mensaje SMS

En `src/main/java/getstarted/InboundSMSServlet.java', pegue lo siguiente:

package getstarted;

import javax.servlet.*;
import javax.servlet.http.*;

import java.util.Collections;

public class InboundSMSServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req,
                         HttpServletResponse resp)
            throws ServletException,
                   java.io.IOException {
        System.out.println("Received: " + req.getMethod());
        for (String param : Collections.list(req.getParameterNames())) {
            String value = req.getParameter(param);
            System.out.println(param + ": " + value);
        }
    }
}

Todo lo que hace el Servlet es imprimir los parámetros recibidos en la consola--¡útil para depurar! Ahora configura tu web.xml con lo siguiente:

<servlet>
    <servlet-name>inbound-sms</servlet-name>
    <servlet-class>getstarted.InboundSMSServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>send-sms</servlet-name>
    <url-pattern>/send</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>inbound-sms</servlet-name>
    <url-pattern>/inbound</url-pattern>
</servlet-mapping>

Tenga en cuenta que he reconfigurado el mapeo send-sms para que el patrón url sea ahora /send en lugar del mapeo comodín que era antes. Ahora, si ejecutas gradle appRunJetty debería iniciarse y estarás listo para configurar tu gancho web de Vonage.

Configura Vonage para llamar a tu Webhook

Inicia sesión en tu Account de Vonage y ve a Tus Numbers. Busca el número que deseas configurar, presiona 'Editar' y luego ingresa la URL de ngrok con /YOUR_PROJECT_NAME/inbound al final.

Ahora, si envías un mensaje de texto al número, deberías ver algunas líneas impresas en tu consola:

Received: GET
messageId: 0B0000004A2D09D9
to: 447520615146
text: Hello Nexmo!
msisdn: 447720123123
type: text
keyword: HELLO
message-timestamp: 2017-04-27 14:41:32

¡Y ya está!

Ya puedes recibir mensajes SMS. De momento, lo único que hacemos es imprimirlos en la consola. A menudo es útil almacenarlos en una base de datos de algún tipo, pero ahora puedes hacer lo que quieras con ellos: construir un bot de Slack para publicarlos en tu canal de Slack; pasarlos por Google Translate y luego reenviar los mensajes a tu teléfono; reenviarlos a Twitter? Las posibilidades son infinitas.

Enlaces de documentación

Los siguientes enlaces de documentación le serán útiles para trabajar con mensajes SMS:

Compartir:

https://a.storyblok.com/f/270183/150x150/a3d03a85fd/placeholder.svg
Mark SmithAntiguos alumnos de Vonage

Mark era nominalmente responsable de las bibliotecas cliente de Nexmo (aunque sólo escribe las bibliotecas Python y Java). Originalmente era un desarrollador Java, ha sido un desarrollador Python durante 18 años, y está incursionando cada vez más en Go y Rust. Le gusta llevar al límite los lenguajes de programación y luego enseñar estas técnicas a otros programadores. Tiene un sombrero vikingo, pero no es un vikingo, y es Judy2k en Twitter por razones que no discutirá.