Recientemente he tenido que montar un entorno con Dynamics 365 Customer Service donde uno de los canales será el de WhatsApp a través de Azure Communication Service.
Este es el típico artículo que también escribo para mi mismo por si tengo que tirar de el en el futuro.
El primer paso es el de sacar el recurso de Communication Service, logicamente necesitamos una suscripción en Azure al que asociar el recurso y no es válido una suscripción patrocinada o gratuita.
Una vez tenemos Communication Service, necesitamos un número de teléfono, y lo podemos obtener desde Telefonía y mensajería -> Números de teléfono -> Obtener. O bien usar un número ya existente.


Tan sencillo como agregar al carro y ya lo tenemos disponible desde Cumunication Service
Yo en mi caso he obtenido un número americano, ya que viene con la capacidad de enviar y recibir SMS, cosa que en España no se puede. Al menos en el momento en el que estoy escribiendo este post. Si necesitas un número español con capacidad de SMS no va a ser tan sencillo. España como país tercermundista que es actualmente, tiene una burocracia tremenda para cualquier cosa y obtener un simple número lo tienes que hacer a través de una petición y enviando documentación, en cambio en Estados Unidos es inmediato. En nuestro vecino Portugal, también puedes obtener números de forma inmediata, por hay alguno que dice… «eso es una normativa europea….» Cállate!
El siguiente paso será el de registrarnos al evento de recepción de sms para poder obtener el código de verificación de WhatsApp por lo que iremos al Event Grid, es decir, sección de eventos dentro de Communication Service.
Aquí más porque me gusta la fiesta, me monté una API en mi local para que el Event Grid al recibir el mensaje invoque a mi api via webhook y poder obtener el código, pero desde el propio Event Grid puedes crear un visualizador directamente.
Este seria mi código del server.js
require('dotenv').config();
const express = require('express');
const axios = require('axios');
const app = express();
const PORT = 3000;
app.use(express.json());
app.post("/incoming-sms", async (req, res) => {
console.log("Petición recibida:", JSON.stringify(req.body, null, 2));
// Validación del Webhook de Azure
if (Array.isArray(req.body) && req.body[0]?.eventType === "Microsoft.EventGrid.SubscriptionValidationEvent") {
const validationCode = req.body[0].data.validationCode;
const validationUrl = req.body[0].data.validationUrl;
console.log("Azure solicita validación del Webhook con código:", validationCode);
// Responder con el código de validación
res.status(200).json({ validationResponse: validationCode });
// Hacer un GET a validationUrl si Azure lo requiere
try {
const validationResponse = await axios.get(validationUrl);
console.log("Validación exitosa con GET a:", validationUrl);
} catch (error) {
console.error("Error al validar con GET:", error.message);
}
return;
}
// Procesar SMS si no es una validación
const smsMessage = req.body.message || "";
const sender = req.body.from || "Desconocido";
console.log(`Mensaje de: ${sender}`);
console.log(`Contenido: ${smsMessage}`);
res.status(200).send("SMS recibido y procesado");
});
app.get("/incoming-sms", (req, res) => {
console.log("Azure intenta validar el Webhook mediante GET.");
res.status(200).send(req.query.validationCode || "Webhook validado correctamente");
});
app.listen(PORT, () => {
console.log(`Servidor escuchando en http://localhost:${PORT}`);
});
Iniciamos nuestro server con:
node server.js
Una vez montada la API en nuestro local, usaremos un servicio gratuito llamado ngrok.
Con este comando hacemos un forwarding de la url de ngrok accesible desde internet a nuestro localhost. De esta forma podremos usar dicha url para el webhook y poder obtener así el código de verificación.
ngrok http http://localhost:3000

Ya por último nos vamos a los eventos de Communication Service y creamos uno de tipo Webhook para cuando se recibe un SMS


A partir de aqui ya estamos listos para conectar WhatsApp, por lo que nos iremos a Mensajeria Avanzada -> Canales -> Conectar


Iniciamos sesión en Facebook e iniciamos el proceso de validación en el que se realiza el envío del código de verificación enviado a nuestro nuevo número. Pegamos el número que obtenemos en nuestra API (o como he dicho antes desde el propio event grid)

PRIMERA PARTE COMPLETADA
Ahora la siguiente parte será conectar esto con Customer Service por lo que crearemos un workstream para WhatsApp.
Creamos la nueva secuencia de trabajo



Con esa URL del webhook la copiaremos para desde Azure Communication Service, dar de alta un nuevo evento de tipo Webhook, esta vez para el evento Microsoft.Communication.AdvancedMessageReceived

Para obtener el codigo de verificación con el evento SMSReceibed y para interactuar con Customer Service con el evento AdvancedMessageReceived.
Con esto ya tenemos todo para conectar WhatsApp a Customer Service.
A partir de aqui, cada vez que nos escriban a dicha cuenta, nos saltará en nuestra instancia de Customer Service.

Espero que os haya sido de utilidad.
Hasta la próxima


