Recepción de SMS concatenados
Mensajes SMS que superar una longitud determinada se dividen en dos o más mensajes más cortos y se envían como SMS múltiples.
Cuando utilizas la SMS API para recibir SMS entrantes que podría superar la longitud en bytes permitida para un solo SMS, debes comprobar si los mensajes se han entregado a tu webhook pueden ser independientes o formar parte de un SMS de varias partes. Si el mensaje consta de varias partes, debes volver a ensamblarlas para visualizar el texto completo del mensaje.
Este tutorial te muestra cómo.
En este tutorial
En este tutorial, crearás una aplicación Node.js utilizando el framework Express que recibe SMS entrantes a través de un webhook y determina si el mensaje es un SMS de una o varias partes.
Si el SMS recibido consta de varias partes, la aplicación espera hasta haber recibido todas las partes del mensaje y, a continuación, las combina en el orden correcto para mostrárselas al usuario.
Para ello, debes seguir los siguientes pasos:
- Crear el proyecto - crear una aplicación Node.js/Express
- Publica tu aplicación en Internet - uso
ngrokpara que Vonage pueda acceder a tu aplicación a través de un webhook - Crear la aplicación básica - crear una aplicación con un webhook para recibir SMS entrantes
- Registra tu webhook con Vonage - informar a los servidores de Vonage sobre tu webhook
- Enviar un SMS de prueba - asegúrese de que su webhook puede recibir SMS entrantes
- Gestión de SMS multiparte - reensamblar un SMS de varias partes en un único mensaje
- Comprobación de la recepción de un SMS concatenado - ¡Míralo en acción!
Requisitos previos
Para completar el tutorial, necesitas:
- A Account de Vonage - para tu clave y tu secreto de API.
- ngrok - (opcional) para que los servidores de Vonage puedan acceder a tu servidor web de desarrollo a través de Internet.
- Todos los clientes con sede en EE. UU. deben registrar una marca y una campaña para cumplir con 10 directrices DLC.
Crear el proyecto
Crea un directorio para tu aplicación, cd en el directorio y, a continuación, utiliza el gestor de paquetes de Node.js npm para crear un package.json archivo con las dependencias de tu aplicación:
Pulse [Intro] para aceptar cada uno de los valores predeterminados excepto entry point para lo cual debe introducir server.js.
A continuación, instala el express marco de aplicaciones web y el body-parser paquetes:
Publica tu aplicación en Internet
Cuando la SMS API recibe un SMS destinado a uno de tus números virtuales, avisa a tu aplicación mediante un mensaje webhook. El webhook proporciona un mecanismo para que los servidores de Vonage se comuniquen con los tuyos.
Para que tu aplicación sea accesible para los servidores de Vonage, debe estar disponible públicamente en Internet. Una forma de lograr esto durante el desarrollo y las pruebas es utilizar ngrok, un servicio que permite que los servidores locales se conecten a la Internet pública a través de túneles seguros. Véase esta entrada del blog Para más información.
Descargar e instalar ngrok, y a continuación ejecútalo con el siguiente comando:
Esto crea URLs públicas (HTTP y HTTPS) para cualquier sitio web que se esté ejecutando en el puerto 5000 en su máquina local.
Utiliza el ngrok interfaz web en http://localhost:4040 y anota las URL que ngrok lo que necesitas: los necesitarás para completar este tutorial.
Crear la aplicación básica
Crear un server.js archivo en el directorio de tu aplicación con el siguiente código, que será nuestro punto de partida:
require('dotenv').config();
const app = require('express')();
const bodyParser = require('body-parser');
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
app
.route('/webhooks/inbound-sms')
.get(handleInboundSms)
.post(handleInboundSms);
const handleInboundSms = (request, response) => {
const params = Object.assign(request.query, request.body);
// Send OK status
response.status(204).send();
}
app.listen('5000');
Este código hace lo siguiente:
- Inicializa las dependencias (el
expressmarco ybody-parserpara analizar las solicitudes POST). - Registra un
/webhooks/inbound-smscon Express que acepta solicitudes GET y POST. Este es el webhook que las API de Vonage usarán para comunicarse con nuestra aplicación cuando uno de nuestros números virtuales reciba un SMS. - Crea una función de gestión para la ruta denominada
handleInboundSms()que muestra un mensaje indicándonos que hemos recibido un SMS entrante y devuelve un HTTPsuccessrespuesta a las API de Vonage. Este último paso es importante; de lo contrario, Vonage seguirá intentando enviar el SMS hasta que se agote el tiempo de espera. - Ejecuta el servidor de aplicaciones en el puerto 5000.
Registra tu webhook con Vonage
Ahora que ya has creado tu webhook, tienes que indicar a Vonage dónde se encuentra. Inicia sesión en tu Panel de control de la Account de Vonage y visite el ajustes página.
En tu aplicación, el webhook se encuentra en /webhooks/inbound-sms. Si utiliza Ngrok, el punto final de webhook completo que debe configurar se parece a https://demo.ngrok.io/webhooks/inbound-smsdonde demo es el subdominio proporcionado por Ngrok (normalmente algo así como 0547f2ad).
Introduzca el punto final de su webhook en el campo etiquetado como URL de Webhook para mensaje entrante y haz clic en el botón [Guardar cambios].

Ahora, si alguno de tus números virtuales recibe un SMS, Vonage llamará a ese punto final de webhook con los detalles del mensaje.
Enviar un SMS de prueba
-
Abre una nueva ventana de terminal y ejecuta el comando
server.jspara que escuche los SMS entrantes:node server.js -
Envía un SMS de prueba a tu número de Vonage desde tu dispositivo móvil, con un mensaje de texto breve. Por ejemplo: «Este es un mensaje de texto breve».
Si todo está configurado correctamente debería recibir un Inbound SMS received mensaje en la ventana de la terminal en la que se está ejecutando server.js.
Ahora, vamos a escribir un poco de código para analizar el SMS recibido y ver qué contiene el mensaje.
-
Pulse [CTRL+C] para finalizar la ejecución.
server.jssolicitud. -
Crear una nueva función en
server.jsllamadodisplaySms():Copiaconst displaySms = (msisdn, text) => { console.log('FROM: ' + msisdn); console.log('MESSAGE: ' + text); console.log('---'); } -
También en
server.jsy antes de que tu código envíe el204añada una llamada adisplaySms()utilizando los siguientes parámetros:CopiadisplaySms(params.msisdn, params.text); -
Reiniciar
server.jsy, a continuación, envíe otro mensaje corto desde su dispositivo móvil. Esta vez, debería ver lo siguiente en la ventana del terminal en ejecuciónserver.js:Inbound SMS received FROM: <YOUR_MOBILE_NUMBER> MESSAGE: This is a short text message. -
Visite
server.jsen marcha, pero esta vez utiliza tu dispositivo móvil para enviar un mensaje considerablemente más largo de lo que permite un solo SMS. Por ejemplo, la primera frase de "Historia de dos ciudades" de Dickens:CopiaIt was the best of times, it was the worst of times, it was the age of wisdom, it was the age of foolishness, it was the epoch of belief, it was the epoch of incredulity, it was the season of Light, it was the season of Darkness, it was the spring of hope, it was the winter of despair, we had everything before us, we had nothing before us, we were all going direct to Heaven, we were all going direct the other way ... in short, the period was so far like the present period, that some of its noisiest authorities insisted on its being received, for good or for evil, in the superlative degree of comparison only.' -
Comprueba la salida en la ventana del terminal que se está ejecutando
server.js. Debería ver algo parecido a lo siguiente:Copia--- Inbound SMS received FROM: <YOUR_MOBILE_NUMBER> MESSAGE: It was the best of times, it was the worst of times, it was the age of wisdom, it was the age of foolishness, it was the epoch of belief, it was the epo --- Inbound SMS received FROM: <YOUR_MOBILE_NUMBER> MESSAGE: ch of incredulity, it was the season of Light, it was the season of Darkness, it was the spring of hope, it was the winter of despair, we had everything --- Inbound SMS received FROM: <YOUR_MOBILE_NUMBER> MESSAGE: e the present period, that some of its noisiest authorities insisted on its being received, for good or for evil, in the superlative degree of compariso --- Inbound SMS received FROM: <YOUR_MOBILE_NUMBER> MESSAGE: before us, we had nothing before us, we were all going direct to Heaven, we were all going direct the other way ... in short, the period was so far lik --- Inbound SMS received FROM: <YOUR_MOBILE_NUMBER> MESSAGE: n only. ---
¿Qué ha pasado? El mensaje superó el límite de un byte por SMS, por lo que se envió en varios mensajes SMS.
Para poder presentar estos mensajes a nuestros usuarios en el formato para el que fueron concebidos, necesitamos detectar si un mensaje entrante ha sido dividido de esta manera y volver a ensamblarlo a partir de las partes.
Fíjate en el resultado anterior: las piezas no llegaron en el orden correcto. Esto no es raro, por lo que tenemos que programar nuestro webhook para que se adapte a esta eventualidad.
Gestión de SMS multiparte
Vonage pasa cuatro parámetros especiales a tu webhook cuando se concatena un SMS entrante. (No aparecen en la solicitud cuando el SMS es de una sola parte.) Puedes usarlos para volver a ensamblar las partes individuales en un todo coherente:
concat:true- cuando se concatena el mensajeconcat-ref- una referencia única que permite determinar a qué SMS pertenece una parte concreta del mensajeconcat-total- el número total de piezas que componen todo el SMSconcat-part- la posición de esta parte del mensaje en el mensaje completo, para que pueda volver a montar las partes en el orden correcto
Detectar si un mensaje está concatenado
En primer lugar, debes detectar si un mensaje está concatenado. Modifica el handleInboundSms() para que muestre un SMS de una sola parte al usuario de la forma habitual, pero realice un procesamiento adicional para los SMS de varias partes que implementarás en un paso posterior:
const handleInboundSms = (request, response) => {
const params = Object.assign(request.query, request.body);
if (params['concat'] == 'true') {
// Perform extra processing
} else {
// Not a concatenated message, so display it
displaySms(params.msisdn, params.text);
}
// Send OK status
response.status(204).send();
}
Almacena SMS de varias partes para procesarlos más tarde
Necesitamos almacenar todos los SMS entrantes que formen parte de un mensaje mayor para poder procesarlos una vez que tengamos todas las partes.
Declarar un array fuera del handleInboundSms() función llamada concat_sms. Si un SMS entrante forma parte de un mensaje más largo, guárdalo en la matriz:
let concat_sms = []; // Array of message objects
const handleInboundSms = (request, response) => {
const params = Object.assign(request.query, request.body);
if (params['concat'] == 'true') {
/* This is a concatenated message. Add it to an array
so that we can process it later. */
concat_sms.push({
ref: params['concat-ref'],
part: params['concat-part'],
from: params.msisdn,
message: params.text
});
} else {
// Not a concatenated message, so display it
displaySms(params.msisdn, params.text);
}
// Send OK status
response.status(204).send();
}
Reunir todas las partes del mensaje
Antes incluso de intentar recomponer el mensaje a partir de sus partes, tenemos que asegurarnos de que disponemos de todas las piezas para una referencia de mensaje determinada. Recuerda que no hay garantía de que todas las partes lleguen en el orden correcto, así que no se trata sólo de comprobar si concart-part es igual a concat-total.
Podemos hacerlo filtrando el concat_sms matriz que incluya únicamente aquellos objetos SMS que compartan el mismo concat-ref tal y como aparece en el SMS que hemos recibido. Si la longitud de esa matriz filtrada es la misma que concat-total, entonces ya tenemos todas las partes de ese mensaje y podemos volver a ensamblarlas:
if (params['concat'] == 'true') {
/* This is a concatenated message. Add it to an array
so that we can process it later. */
concat_sms.push({
ref: params['concat-ref'],
part: params['concat-part'],
from: params.msisdn,
message: params.text
});
/* Do we have all the message parts yet? They might
not arrive consecutively. */
const parts_for_ref = concat_sms.filter(part => part.ref == params['concat-ref']);
// Is this the last message part for this reference?
if (parts_for_ref.length == params['concat-total']) {
console.dir(parts_for_ref);
processConcatSms(parts_for_ref);
}
}
Vuelve a montar las partes del mensaje
Ahora que tenemos todas las partes del mensaje, pero no necesariamente en el orden correcto, podemos utilizar la función Array.sort() función para reordenarlos según el orden de concat-part. Cree el processConcatSms() función para hacerlo:
const processConcatSms = (all_parts) => {
// Sort the message parts
all_parts.sort((a, b) => a.part - b.part);
// Reassemble the message from the parts
let concat_message = '';
for (i = 0; i < all_parts.length; i++) {
concat_message += all_parts[i].message;
}
displaySms(all_parts[0].from, concat_message);
}
Comprobación de la recepción de un SMS concatenado
Correr server.js y utiliza tu dispositivo móvil para volver a enviar el mensaje de texto largo que enviaste en el paso 5 del Enviar un SMS de prueba sección anterior.
Si ha codificado todo correctamente, entonces en la pantalla server.js En la ventana deberías ver cómo van llegando las distintas partes del mensaje. Cuando se hayan recibido todas las partes, se mostrará el mensaje completo:
[ { ref: '08B5',
part: '3',
from: '<YOUR_MOBILE_NUMBER>',
message: ' before us, we had nothing before us, we were all going direct to Heaven, we were all going direct the other way ... in short, the period was so far lik' },
{ ref: '08B5',
part: '1',
from: '<YOUR_MOBILE_NUMBER>',
message: 'It was the best of times, it was the worst of times, it was the age of wisdom, it was the age of foolishness, it was the epoch of belief, it was the epo' },
{ ref: '08B5', part: '5', from: 'TEST-NEXMO', message: 'n only.' },
{ ref: '08B5',
part: '2',
from: '<YOUR_MOBILE_NUMBER>',
message: 'ch of incredulity, it was the season of Light, it was the season of Darkness, it was the spring of hope, it was the winter of despair, we had everything' },
{ ref: '08B5',
part: '4',
from: '<YOUR_MOBILE_NUMBER>',
message: 'e the present period, that some of its noisiest authorities insisted on its being received, for good or for evil, in the superlative degree of compariso' } ]
FROM: <YOUR_MOBILE_NUMBER>
MESSAGE: It was the best of times, it was the worst of times, it was the age of wisdom, it was the age of foolishness, it was the epoch of belief, it was the epoch of incredulity, it was the season of Light, it was the season of Darkness, it was the spring of hope, it was the winter of despair, we had everything before us, we had nothing before us, we were all going direct to Heaven, we were all going direct the other way ... in short, the period was so far like the present period, that some of its noisiest authorities insisted on its being received, for good or for evil, in the superlative degree of comparison only.
---
Conclusión
En este tutorial, has creado una aplicación que te muestra cómo recomponer un SMS concatenado a partir de los mensajes que lo componen. Has aprendido sobre el concat, concat-ref, concat-totaly concat-part parámetros de solicitud de tu webhook de SMS entrantes y cómo puedes utilizarlos para determinar:
- Si se concatena un SMS entrante
- A qué mensaje pertenece una parte específica del mensaje
- Cuántas partes del mensaje componen el mensaje completo
- El orden de una parte específica del mensaje dentro del mensaje completo
¿Y ahora qué?
Los siguientes recursos le ayudarán a utilizar Number Insight en sus aplicaciones: