Compartir vía


Enviar mensajes de plantilla de WhatsApp mediante Mensajes avanzados

En este artículo se describe cómo enviar mensajes de plantilla de WhatsApp mediante el SDK de Mensajes de comunicación avanzada.

Requisitos previos

Modelo de objetos

Las siguientes clases e interfaces controlan algunas de las características principales del SDK de mensajes de Azure Communication Services para .NET.

Class Name (Nombre de clase) Descripción
NotificationMessagesClient Esta clase se conecta a su recurso de Azure Communication Services. Envía los mensajes.
MessageTemplate Esta clase define qué plantilla utiliza y el contenido de las propiedades de la plantilla para su mensaje.
TemplateNotificationContent Esta clase define el "quién" y el "qué" del mensaje de plantilla que pretende enviar.

Nota:

Para obtener más información, consulte la referencia de Azure SDK para .NET Espacio de nombres de Azure.Communication.Messages.

Tipos de plantilla de WhatsApp admitidas

Tipo de plantilla Descripción
Plantillas de mensaje basadas en texto Las plantillas de mensaje de WhatsApp son formatos de mensaje específicos con o sin parámetros.
Plantillas de mensaje basadas en medios Plantillas de mensajes de WhatsApp con parámetros multimedia para componentes del encabezado.
Plantillas de mensajes interactivos Las plantillas de mensajes interactivos amplían el contenido que puede enviar a los destinatarios, incluyendo botones interactivos mediante el objeto "components". Se admiten tanto la llamada a la acción como la respuesta rápida.
Plantillas de mensaje basadas en la ubicación Plantillas de mensajes de WhatsApp con parámetros de ubicación en términos longitud y latitud para los componentes del encabezado.

Configuración común

Siga estos pasos para agregar los fragmentos de código necesarios a la función principal de su archivo Program.cs.

Creación y administración del mensaje de plantilla de WhatsApp

Las plantillas de mensaje de WhatsApp son formatos de mensaje específicos que las empresas usan para enviar notificaciones o mensajes de atención al cliente a personas que optaron por recibir notificaciones. Los mensajes pueden incluir recordatorios de citas, información de envío, resolución de problemas o actualizaciones de pago. Antes de empezar a usar el SDK de Mensajería avanzada para enviar mensajes con plantilla, el usuario debe crear las plantillas necesarias en la Plataforma de WhatsApp Business.

Para obtener más información sobre los requisitos de WhatsApp para plantillas, consulte las referencias de la API de la Plataforma de WhatsApp Business:

Autenticar el cliente

El SDK de mensajes usa NotificationMessagesClient para enviar mensajes. El método NotificationMessagesClient se autentica mediante la cadena de conexión adquirida desde el recurso de Azure Communication Services en Azure Portal. Para más información sobre las cadenas de conexión, consulte access-your-connection-strings-and-service-endpoints.

Para simplificar, este inicio rápido utiliza una cadena de conexión para autenticarse. En entornos de producción, se recomienda utilizar los servicios principales.

Obtenga la cadena de conexión del recurso de Azure Communication Services en Azure Portal. A la izquierda, navegue hasta la pestaña Keys. Copie el campo Connection string para la clave primaria. La cadena de conexión tiene el formato endpoint=https://{your Azure Communication Services resource name}.communication.azure.com/;accesskey={secret key}.

Captura de pantalla que muestra un recurso de Azure Communication Services en Azure Portal y que muestra el campo

Establezca la variable de entorno COMMUNICATION_SERVICES_CONNECTION_STRING en el valor de la cadena de conexión.
Abra una ventana de consola y escriba el siguiente comando:

setx COMMUNICATION_SERVICES_CONNECTION_STRING "<your connection string>"

Tras agregar la variable de entorno, es posible que tenga que reiniciar todos los programas en ejecución que necesiten leer la variable de entorno, incluida la ventana de la consola. Por ejemplo, si usa Visual Studio como editor, reinícielo antes de ejecutar el ejemplo.

Para obtener más información sobre cómo configurar una variable de entorno para su sistema, siga los pasos indicados en Almacene su cadena de conexión en una variable de entorno.

Para crear una instancia un NotificationMessagesClient, agregue el siguiente código al método Main:

// Retrieve connection string from environment variable
string connectionString = 
    Environment.GetEnvironmentVariable("COMMUNICATION_SERVICES_CONNECTION_STRING");

// Instantiate the client
var notificationMessagesClient = new NotificationMessagesClient(connectionString);

Establecimiento del identificador de registro de canales

El Id. GUID del registro del canal se creó durante el registro del canal. Puede buscarlo en el portal en la pestaña Canales del recurso de Azure Communication Services.

Captura de pantalla que muestra un recurso de Azure Communication Services en Azure Portal, en la pestaña

Asígnelo a una variable llamada channelRegistrationId.

var channelRegistrationId = new Guid("<your channel registration ID GUID>");

Establecimiento de la lista de destinatarios

Debe proporcionar un número de teléfono activo asociado a una cuenta de WhatsApp. Esta cuenta de WhatsApp recibe la plantilla, el texto y los mensajes multimedia enviados en este inicio rápido.

En este ejemplo, puede usar su número de teléfono personal.

El número de teléfono del destinatario no puede ser el número de teléfono del trabajo (id. de remitente) asociado al registro de canales de WhatsApp. El id. de remitente aparece como remitente de los mensajes de texto y multimedia enviados al destinatario.

El número de teléfono debe incluir el código de país. Para obtener más información sobre el formato del número de teléfono, consulte la documentación de WhatsApp sobre Formatos de número de teléfono.

Nota:

Actualmente solo se admite un número de teléfono en la lista de destinatarios.

Cree la lista de destinatarios de la siguiente manera:

var recipientList = new List<string> { "<to WhatsApp phone number>" };

Ejemplo:

// Example only
var recipientList = new List<string> { "+14255550199" };

Comience a enviar mensajes entre una empresa y un usuario de WhatsApp

Las conversaciones entre una cuenta empresarial de WhatsApp y un usuario de WhatsApp se pueden iniciar de una de estas dos maneras:

  • La empresa envía un mensaje de plantilla al usuario de WhatsApp.
  • El usuario de WhatsApp envía cualquier mensaje al número del trabajo.

Una empresa no puede iniciar una conversación interactiva. Solo puede enviar un mensaje interactivo después de recibir un mensaje del usuario. La empresa solo puede enviar mensajes interactivos al usuario durante la conversación activa. Una vez que expire la ventana de conversación de 24 horas, solo el usuario puede reiniciar la conversación interactiva. Para obtener más información sobre las conversaciones, consulte la definición en la Plataforma de WhatsApp Business.

Para iniciar una conversación interactiva desde su cuenta personal de WhatsApp, envíe un mensaje al número de empresarial (id. de remitente).

Una conversación de WhatsApp vista en la web que muestra un mensaje de usuario enviado al número de cuenta empresarial de WhatsApp.

Configuración de entorno

Crear el proyecto .NET

Para crear su proyecto, siga el tutorial en Crear una aplicación de consola .NET con Visual Studio.

Para compilar su código, presione Ctrl+F7.

Instalar el paquete

Instale el paquete Azure.Communication.Messages NuGet en su proyecto C#.

  1. Abra el Administrador de paquetes NuGet en Project>Manage NuGet Packages....
  2. Buscar el paquete Azure.Communication.Messages.
  3. Instale la última versión.

Instalación del marco de la aplicación

Abra el archivo Program.cs en un editor de texto.

Reemplace el contenido de Program.cs por el código siguiente:

using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Azure;
using Azure.Communication.Messages;

namespace AdvancedMessagingQuickstart
{
    class Program
    {
        public static async Task Main(string[] args)
        {
            Console.WriteLine("Azure Communication Services - Advanced Messages quickstart samples.");

            // Quickstart code goes here
        }
    }
}

Para utilizar las funciones de Mensajería avanzada, agregue una directiva using para incluir el espacio de nombres Azure.Communication.Messages.

using Azure.Communication.Messages;

Ejemplos de código

Siga estos pasos para agregar los fragmentos de código necesarios a la función Main del archivo Program.cs.

Enumeración de plantillas de WhatsApp en Azure Portal

Para ver las plantillas en Azure Portal, vaya al recurso de Azure Communication Service >Mensajería avanzada>Plantillas.

Recorte de pantalla que muestra un recurso de Azure Communication Services en Azure Portal, en la pestaña Mensajería avanzada > Plantillas.

Seleccione una plantilla para ver los detalles.

El campo content de los detalles de la plantilla puede incluir enlaces de parámetros. Los enlaces de parámetros se pueden indicar como:

  • Un campo format con un valor como IMAGE.
  • Corchetes dobles que rodean un número, como {{1}}. El número, indizado iniciado en 1, indica el orden en el que se deben proporcionar los valores de enlace para crear la plantilla de mensaje.

Captura de pantalla que muestra los detalles de la plantilla.

Como alternativa, puede ver y editar todas las plantillas de la cuenta de WhatsApp Business en Administrador de WhatsApp> Herramientas de la cuenta >Plantillas de mensajes.

Para enumerar las plantillas mediante programación, puede capturar todas las plantillas para el id. de canal de la siguiente manera:

MessageTemplateClient messageTemplateClient = new MessageTemplateClient(connectionString);
Pageable<MessageTemplateItem> templates = messageTemplateClient.GetTemplates(channelRegistrationId);

Enviar un mensaje de plantilla sin parámetros

Si la plantilla no requiere parámetros, no es necesario proporcionar ningún valor ni enlace al crear MessageTemplate.

var messageTemplate = new MessageTemplate(templateName, templateLanguage); 

Ejemplo

sample_template no toma parámetros.

Captura de pantalla que muestra los detalles de la plantilla denominada sample_template.

Ensamble el MessageTemplate haciendo referencia al nombre y el idioma de la plantilla de destino.

string templateName = "sample_template"; 
string templateLanguage = "en_us"; 

var sampleTemplate = new MessageTemplate(templateName, templateLanguage); 

Enviar un mensaje de plantilla con parámetros de texto en el cuerpo

Use MessageTemplateText para definir parámetros en el cuerpo indicados con corchetes dobles que rodean un número, como {{1}}. El número, índice iniciado en 1, indica el orden en el que se deben proporcionar los valores del enlace para crear la plantilla de mensaje. La inclusión de parámetros que no están en la plantilla no es válida.

Definición de la plantilla con dos parámetros:

{
  "type": "BODY",
  "text": "Message with two parameters: {{1}} and {{2}}"
}

Ejemplos

Plantilla sample_shipping_confirmation:

Captura de pantalla que muestra los detalles de la plantilla denominada sample_shipping_confirmation.

En este ejemplo, el cuerpo de la plantilla tiene un parámetro:

{
  "type": "BODY",
  "text": "Your package has been shipped. It will be delivered in {{1}} business days."
},

Los parámetros se definen con los valores MessageTemplateValue y los enlaces de MessageTemplateWhatsAppBindings. Use los valores y enlaces para ensamblar el MessageTemplate.

string templateName = "sample_shipping_confirmation"; 
string templateLanguage = "en_us"; 

var threeDays = new MessageTemplateText("threeDays", "3");

WhatsAppMessageTemplateBindings bindings = new();
bindings.Body.Add(new(threeDays.Name));

MessageTemplate shippingConfirmationTemplate  = new(templateName, templateLanguage);
shippingConfirmationTemplate.Bindings = bindings;
shippingConfirmationTemplate.Values.Add(threeDays);

Enviar un mensaje de plantilla con el parámetro multimedia en el encabezado

Use MessageTemplateImage, MessageTemplateVideo o MessageTemplateDocument para definir el parámetro multimedia en un encabezado.

Definición de plantilla con el parámetro de imagen multimedia en el encabezado:

{
  "type": "HEADER",
  "format": "IMAGE"
},

format puede tener diferentes tipos multimedia compatibles con WhatsApp. En el SDK de .NET, cada tipo de medio usa un tipo MessageTemplateValue correspondiente.

Format Tipo MessageTemplateValue Tipo de archivo
IMAGE MessageTemplateImage png, jpg
VIDEO MessageTemplateVideo mp4
DOCUMENT MessageTemplateDocument pdf

Para obtener más información sobre los tipos de contenido multimedia admitidos y los límites de tamaño, consulte Documentación de WhatsApp para los mensajes multimedia.

Ensamblado de plantilla de mensaje para medios de imagen:

var url = new Uri("< Your media URL >");

var media = new MessageTemplateImage("image", url);
WhatsAppMessageTemplateBindings bindings = new();
bindings.Header.Add(new(media.Name));

var messageTemplate = new MessageTemplate(templateName, templateLanguage);
template.Bindings = bindings;
template.Values.Add(media);

Ejemplos

Plantilla sample_movie_ticket_confirmation:

Captura de pantalla que muestra los detalles de la plantilla denominada sample_movie_ticket_confirmation.

En este ejemplo, el encabezado de la plantilla requiere una imagen:

{
  "type": "HEADER",
  "format": "IMAGE"
},

Y el cuerpo de la plantilla requiere cuatro parámetros de texto:

{
  "type": "BODY",
  "text": "Your ticket for *{{1}}*\n*Time* - {{2}}\n*Venue* - {{3}}\n*Seats* - {{4}}"
},

Cree una MessageTemplateImage y cuatro variables de MessageTemplateText. A continuación, reúna la lista de MessageTemplateValue y el MessageTemplateWhatsAppBindings proporcionando los parámetros en el orden en que los parámetros aparecen en el contenido de la plantilla.

string templateName = "sample_movie_ticket_confirmation"; 
string templateLanguage = "en_us"; 
var imageUrl = new Uri("https://aka.ms/acsicon1");

var image = new MessageTemplateImage("image", imageUrl);
var title = new MessageTemplateText("title", "Contoso");
var time = new MessageTemplateText("time", "July 1st, 2023 12:30PM");
var venue = new MessageTemplateText("venue", "Southridge Video");
var seats = new MessageTemplateText("seats", "Seat 1A");

WhatsAppMessageTemplateBindings bindings = new();
bindings.Header.Add(new(image.Name));
bindings.Body.Add(new(title.Name));
bindings.Body.Add(new(time.Name));
bindings.Body.Add(new(venue.Name));
bindings.Body.Add(new(seats.Name));

MessageTemplate movieTicketConfirmationTemplate = new(templateName, templateLanguage);
movieTicketConfirmationTemplate.Values.Add(image);
movieTicketConfirmationTemplate.Values.Add(title);
movieTicketConfirmationTemplate.Values.Add(time);
movieTicketConfirmationTemplate.Values.Add(venue);
movieTicketConfirmationTemplate.Values.Add(seats);
movieTicketConfirmationTemplate.Bindings = bindings;

Más ejemplos

Enviar un mensaje de plantilla con la ubicación en el encabezado

Use MessageTemplateLocation para definir el parámetro location en un encabezado.

Definición de plantilla para el componente del encabezado que requiere la ubicación como:

{
  "type": "header",
  "parameters": [
    {
      "type": "location",
      "location": {
        "latitude": "<LATITUDE>",
        "longitude": "<LONGITUDE>",
        "name": "<NAME>",
        "address": "<ADDRESS>"
      }
    }
  ]
}

format puede requerir diferentes tipos de contenido multimedia. En el SDK de .NET, cada tipo de medio usa un tipo MessageTemplateValue correspondiente.

Propiedades Descripción Tipo
ADDRESS Dirección que aparecerá después del valor NAME, debajo del mapa genérico que hay en la parte superior del mensaje. string
LATITUDE Latitud de ubicación. doble
LONGITUDE Longitud de ubicación. doble
LOCATIONNAME Texto que aparecerá inmediatamente debajo del mapa genérico de la parte superior del mensaje. string

Para más información sobre las plantillas basadas en ubicaciones, consulte la Documentación de WhatsApp para mensajes multimedia.

Ejemplo

Plantilla sample_movie_location:

Captura de pantalla que muestra los detalles de la plantilla denominada sample_location_template.

Ensamblado de plantilla de mensajes basado en ubicación:

 var location = new MessageTemplateLocation("location");
 location.LocationName = "Pablo Morales";
 location.Address = "1 Hacker Way, Menlo Park, CA 94025";
 location.Position = new Azure.Core.GeoJson.GeoPosition(longitude: 122.148981, latitude: 37.483307);

 WhatsAppMessageTemplateBindings location_bindings = new();
 location_bindings.Header.Add(new(location.Name));

 var messageTemplateWithLocation = new MessageTemplate(templateNameWithLocation, templateLanguage);
 messageTemplateWithLocation.Values.Add(location);
 messageTemplateWithLocation.Bindings = location_bindings;

Enviar un mensaje de plantilla con los botones de respuesta rápida

Use MessageTemplateQuickAction para definir la carga útil para los botones de respuesta rápida y los objetos MessageTemplateQuickAction tienen los tres atributos siguientes.

Propiedades Descripción Tipo
Nombre El name se usa para buscar el valor en MessageTemplateWhatsAppBindings. string
Texto Acción rápida text opcional. string
Carga útil El payload asignado a un botón está disponible en una respuesta de mensaje si el usuario selecciona el botón. string

Definición de plantilla con botones de respuesta rápida:

{
  "type": "BUTTONS",
  "buttons": [
    {
      "type": "QUICK_REPLY",
      "text": "Yes"
    },
    {
      "type": "QUICK_REPLY",
      "text": "No"
    }
  ]
}

El orden en que aparecen los botones en la definición de plantilla debe coincidir con el orden en que se definen los botones al crear los enlaces con MessageTemplateWhatsAppBindings.

Para obtener más información sobre la carga de las respuestas rápidas del usuario, consulte la documentación de WhatsApp sobre Devolución de una llamada recibida desde un botón de respuesta rápida.

Ejemplo

Plantilla sample_issue_resolution:

Captura de pantalla que muestra los detalles de la plantilla denominada sample_issue_resolution.

Aquí, el cuerpo de la plantilla requiere un parámetro de texto:

{
  "type": "BODY",
  "text": "Hi {{1}}, were we able to solve the issue that you were facing?"
},

La plantilla incluye dos botones de respuesta rellenados previamente: Yes y No.

{
  "type": "BUTTONS",
  "buttons": [
    {
      "type": "QUICK_REPLY",
      "text": "Yes"
    },
    {
      "type": "QUICK_REPLY",
      "text": "No"
    }
  ]
}

Cree una MessageTemplateText y dos variables de MessageTemplateQuickAction. A continuación, reúna la lista de MessageTemplateValue y el MessageTemplateWhatsAppBindings proporcionando los parámetros en el orden en que aparecen en el contenido de la plantilla. El orden también es importante al definir los botones del enlace.

string templateName = "sample_issue_resolution";
string templateLanguage = "en_us";

var name = new MessageTemplateText(name: "name", text: "Kat");
var yes = new MessageTemplateQuickAction(name: "Yes"){ Payload =  "Kat said yes" };
var no = new MessageTemplateQuickAction(name: "No") { Payload = "Kat said no" };

WhatsAppMessageTemplateBindings bindings = new();
bindings.Body.Add(new(name.Name));
bindings.Buttons.Add(new(WhatsAppMessageButtonSubType.QuickReply.ToString(), yes.Name));
bindings.Buttons.Add(new(WhatsAppMessageButtonSubType.QuickReply.ToString(), no.Name));

MessageTemplate issueResolutionTemplate = new(templateName, templateLanguage);
issueResolutionTemplate.Values.Add(name);
issueResolutionTemplate.Values.Add(yes);
issueResolutionTemplate.Values.Add(no);
issueResolutionTemplate.Bindings = bindings;

Use MessageTemplateQuickAction para definir el sufijo URL para los botones de llamada a la acción y el objeto MessageTemplateQuickAction tiene los dos atributos siguientes.

Propiedades Descripción Tipo
Nombre El name se usa para buscar el valor en MessageTemplateWhatsAppBindings. string
Texto El text que se anexa a la dirección URL. string

Botones de definición de plantilla:

{
  "type": "BUTTONS",
  "buttons": [
    {
      "type": "URL",
      "text": "Take Survey",
      "url": "https://www.example.com/{{1}}"
    }
  ]
}

El orden en que aparecen los botones en la definición de plantilla debe coincidir con el orden en que se definen los botones al crear los enlaces con MessageTemplateWhatsAppBindings.

Ejemplo

Plantilla sample_purchase_feedback:

Esta plantilla de ejemplo agrega un botón con un vínculo de dirección URL dinámica al mensaje. También usa una imagen en el encabezado y un parámetro de texto en el cuerpo.

Recorte de pantalla del panel de Llamada a la acción del Editor de botones del administrador de WhatsApp que muestra el botón Tipo de dirección URL que puede usar para elegir entre Estático y Dinámico.

En este ejemplo, el encabezado de la plantilla requiere una imagen:

{
  "type": "HEADER",
  "format": "IMAGE"
},

Aquí, el cuerpo de la plantilla requiere un parámetro de texto:

{
  "type": "BODY",
  "text": "Thank you for purchasing {{1}}! We value your feedback and would like to learn more about your experience."
},

Y la plantilla incluye un botón de dirección URL dinámica con un parámetro:

{
  "type": "BUTTONS",
  "buttons": [
    {
      "type": "URL",
      "text": "Take Survey",
      "url": "https://www.example.com/{{1}}"
    }
  ]
}

Cree una MessageTemplateImage, una MessageTemplateText y una variable MessageTemplateQuickAction. A continuación, reúna la lista de MessageTemplateValue y el MessageTemplateWhatsAppBindings proporcionando los parámetros en el orden en que aparecen en el contenido de la plantilla. El orden también es importante al definir los botones del enlace.

string templateName = "sample_purchase_feedback";
string templateLanguage = "en_us";
var imageUrl = new Uri("https://aka.ms/acsicon1");

var image = new MessageTemplateImage(name: "image", uri: imageUrl);
var product = new MessageTemplateText(name: "product", text: "coffee");
var urlSuffix = new MessageTemplateQuickAction(name: "text") { Text = "survey-code" };

WhatsAppMessageTemplateBindings bindings = new();
bindings.Header.Add(new(image.Name));
bindings.Body.Add(new(product.Name));
bindings.Buttons.Add(new(WhatsAppMessageButtonSubType.Url.ToString(), urlSuffix.Name));

MessageTemplate purchaseFeedbackTemplate = new("sample_purchase_feedback", "en_us");
purchaseFeedbackTemplate.Values.Add(image);
purchaseFeedbackTemplate.Values.Add(product);
purchaseFeedbackTemplate.Values.Add(urlSuffix);
purchaseFeedbackTemplate.Bindings = bindings;

En el caso de los vínculos estáticos, no es necesario incluir el modelo MessageTemplateQuickAction porque la plantilla de WhatsApp tiene un vínculo estático CallToAction sin necesidad de una entrada del usuario.

Botones de definición de plantilla:

{
  "type": "BUTTONS",
  "buttons": [
    {
      "type": "URL",
      "text": "Take Survey",
      "url": "https://www.example.com/{{1}}"
    }
  ]
}

Ejemplo

Plantilla purchase_feedback_static:

Esta plantilla de ejemplo agrega un botón con un vínculo de dirección URL estática al mensaje. También usa una imagen en el encabezado y un parámetro de texto en el cuerpo.

Recorte de pantalla que muestra los detalles de purchase-feedback-static-template.

En este ejemplo, el encabezado de la plantilla requiere una imagen:

{
  "type": "HEADER",
  "format": "IMAGE"
},

Aquí, el cuerpo de la plantilla requiere un parámetro de texto:

{
  "type": "BODY",
  "text": "Hello {{1}}, \nHope you are great day!.\n Please click on given link to explore about our program.."
},

Y la plantilla incluye un botón de dirección URL dinámica con un parámetro:

{
  "type": "BUTTONS",
  "buttons": [
    {
      "type": "URL",
      "text": "Take Survey",
      "url": "https://www.example.com/"
    }
  ]
}

Cree una MessageTemplateImage, una MessageTemplateText. A continuación, reúna la lista de MessageTemplateValue y el MessageTemplateWhatsAppBindings proporcionando los parámetros en el orden en que aparecen en el contenido de la plantilla. El orden también es importante al definir los botones del enlace.

// Send sample template sample_template
string templateNameWithcta = "purchase_feedback_static";
var bodyParam1 = new MessageTemplateText(name: "customer", text: "Joe");
var image = new MessageTemplateImage("image", new Uri("https://aka.ms/acsicon1"));

WhatsAppMessageTemplateBindings cta_bindings = new();
cta_bindings.Body.Add(new(bodyParam1.Name));
cta_bindings.Header.Add(new(image.Name));

var messageTemplateWithcta = new MessageTemplate(templateNameWithcta, templateLanguage);
messageTemplateWithcta.Values.Add(bodyParam1);
messageTemplateWithcta.Values.Add(image);
messageTemplateWithcta.Bindings = cta_bindings;

TemplateNotificationContent templateContent4 =
    new TemplateNotificationContent(channelRegistrationId, recipientList, messageTemplateWithcta);
Response<SendMessageResult> sendTemplateMessageResult4 =
    notificationMessagesClient.Send(templateContent4);

Ejecución del código

Compile y ejecute el programa.

Para enviar un mensaje de texto o multimedia a un usuario de WhatsApp, debe haber una conversación activa entre la cuenta de WhatsApp Business y el usuario de WhatsApp.

Si no tiene una conversación activa, a efectos de este ejemplo, debe agregar una espera entre el envío del mensaje de plantilla y el envío del mensaje de texto. Este retraso adicional le da tiempo suficiente para responder a la empresa en la cuenta de WhatsApp del usuario. Como referencia, el ejemplo dado solicita la entrada manual del usuario antes de enviar el siguiente mensaje. Para obtener más información, vea el ejemplo completo en Código de ejemplo. Si tiene éxito, recibirá tres mensajes en la cuenta de WhatsApp del usuario.

Compile y ejecute el programa.

dotnet build
dotnet run

Ejemplo de código completo

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Threading.Tasks;
using Azure;
using Azure.Communication.Messages;
using Azure.Communication.Messages.Models.Channels;

namespace SendTemplateMessages
{
    class Program
    {
        public static async Task Main(string[] args)
        {
            Console.WriteLine("Azure Communication Services - Send WhatsApp Template Messages\n");

            string connectionString = Environment.GetEnvironmentVariable("COMMUNICATION_SERVICES_CONNECTION_STRING");

            NotificationMessagesClient notificationMessagesClient = new NotificationMessagesClient(connectionString);

            var channelRegistrationId = new Guid("<Your Channel ID>");
            var recipientList = new List<string> { "<Recipient's WhatsApp Phone Number>" };

            // List out available templates for a channel ID
            MessageTemplateClient messageTemplateClient = new MessageTemplateClient(connectionString);
            Pageable<MessageTemplateItem> templates = messageTemplateClient.GetTemplates(channelRegistrationId);
            foreach (WhatsAppMessageTemplateItem template in templates)
            {
                Console.WriteLine("Name: {0}\tLanguage: {1}\tStatus: {2}\tContent: {3}\n",
                    template.Name, template.Language, template.Status, template.Content);
            }

            // Send Sample Template sample_template
            MessageTemplate sampleTemplate = AssembleSampleTemplate();
            var sampleTemplateContent = new TemplateNotificationContent(channelRegistrationId, recipientList, sampleTemplate);
            var result = await notificationMessagesClient.SendAsync(sampleTemplateContent);
            PrintResponse(result);
           
            // Send sample template sample_shipping_confirmation
            MessageTemplate shippingConfirmationTemplate = AssembleSampleShippingConfirmation();
            var shippingConfirmationTemplateContent = new TemplateNotificationContent(channelRegistrationId, recipientList, shippingConfirmationTemplate);
            result = await notificationMessagesClient.SendAsync(shippingConfirmationTemplateContent);
            PrintResponse(result);

            // Send sample template sample_movie_ticket_confirmation
            MessageTemplate movieTicketConfirmationTemplate = AssembleSampleMovieTicketConfirmation();
            var movieTicketConfirmationTemplateContent = new TemplateNotificationContent(channelRegistrationId, recipientList, movieTicketConfirmationTemplate);
            result = await notificationMessagesClient.SendAsync(movieTicketConfirmationTemplateContent);
            PrintResponse(result);

            // Send sample template sample_happy_hour_announcement
            MessageTemplate happyHourTemplate = AssembleSampleHappyHourAnnouncement();
            var happyHourTemplateContent = new TemplateNotificationContent(channelRegistrationId, recipientList, happyHourTemplate);
            result = await notificationMessagesClient.SendAsync(happyHourTemplateContent);
            PrintResponse(result);

            // Send sample template sample_flight_confirmation
            MessageTemplate flightConfirmationTemplate = AssembleSampleFlightConfirmation();
            var flightConfirmationTemplateContent = new TemplateNotificationContent(channelRegistrationId, recipientList, flightConfirmationTemplate);
            result = await notificationMessagesClient.SendAsync(flightConfirmationTemplateContent);
            PrintResponse(result);

            // Send sample template sample_issue_resolution
            MessageTemplate issueResolutionTemplate = AssembleSampleIssueResolution();
            var issueResolutionTemplateContent = new TemplateNotificationContent(channelRegistrationId, recipientList, issueResolutionTemplate);
            result = await notificationMessagesClient.SendAsync(issueResolutionTemplateContent);
            PrintResponse(result);

            // Send sample template sample_purchase_feedback
            MessageTemplate purchaseFeedbackTemplate = AssembleSamplePurchaseFeedback();
            var purchaseFeedbackTemplateContent = new TemplateNotificationContent(channelRegistrationId, recipientList, purchaseFeedbackTemplate);
            result = await notificationMessagesClient.SendAsync(purchaseFeedbackTemplateContent);
            PrintResponse(result);

            Console.WriteLine("Press any key to exit.");
            Console.ReadKey(true);
        }

        public static MessageTemplate AssembleSampleTemplate()
        {
            string templateName = "sample_template";
            string templateLanguage = "en_us";

            return new MessageTemplate(templateName, templateLanguage);
        }

        public static MessageTemplate AssembleSampleShippingConfirmation()
        {
            string templateName = "sample_shipping_confirmation";
            string templateLanguage = "en_us";

            var threeDays = new MessageTemplateText("threeDays", "3");

            WhatsAppMessageTemplateBindings bindings = new();
            bindings.Body.Add(new(threeDays.Name));

            MessageTemplate shippingConfirmationTemplate = new(templateName, templateLanguage);
            shippingConfirmationTemplate.Bindings = bindings;
            shippingConfirmationTemplate.Values.Add(threeDays);

            return shippingConfirmationTemplate;
        }

        public static MessageTemplate AssembleSampleMovieTicketConfirmation()
        {
            string templateName = "sample_movie_ticket_confirmation"; 
            string templateLanguage = "en_us"; 
            var imageUrl = new Uri("https://aka.ms/acsicon1");

            var image = new MessageTemplateImage("image", imageUrl);
            var title = new MessageTemplateText("title", "Contoso");
            var time = new MessageTemplateText("time", "July 1st, 2023 12:30PM");
            var venue = new MessageTemplateText("venue", "Southridge Video");
            var seats = new MessageTemplateText("seats", "Seat 1A");

            WhatsAppMessageTemplateBindings bindings = new();
            bindings.Header.Add(new(image.Name));
            bindings.Body.Add(new(title.Name));
            bindings.Body.Add(new(time.Name));
            bindings.Body.Add(new(venue.Name));
            bindings.Body.Add(new(seats.Name));

            MessageTemplate movieTicketConfirmationTemplate = new(templateName, templateLanguage);
            movieTicketConfirmationTemplate.Values.Add(image);
            movieTicketConfirmationTemplate.Values.Add(title);
            movieTicketConfirmationTemplate.Values.Add(time);
            movieTicketConfirmationTemplate.Values.Add(venue);
            movieTicketConfirmationTemplate.Values.Add(seats);
            movieTicketConfirmationTemplate.Bindings = bindings;

            return movieTicketConfirmationTemplate;
        }

        public static MessageTemplate AssembleSampleHappyHourAnnouncement()
        {
            string templateName = "sample_happy_hour_announcement";
            string templateLanguage = "en_us";
            var videoUrl = new Uri("< Your .mp4 Video URL >");

            var video = new MessageTemplateVideo("video", videoUrl);
            var venue = new MessageTemplateText("venue", "Fourth Coffee");
            var time = new MessageTemplateText("time", "Today 2-4PM");
            WhatsAppMessageTemplateBindings bindings = new();
            bindings.Header.Add(new(video.Name));
            bindings.Body.Add(new(venue.Name));
            bindings.Body.Add(new(time.Name));

            MessageTemplate happyHourAnnouncementTemplate = new(templateName, templateLanguage);
            happyHourAnnouncementTemplate.Values.Add(venue);
            happyHourAnnouncementTemplate.Values.Add(time);
            happyHourAnnouncementTemplate.Values.Add(video);
            happyHourAnnouncementTemplate.Bindings = bindings;

            return happyHourAnnouncementTemplate;
        }

        public static MessageTemplate AssembleSampleFlightConfirmation()
        {
            string templateName = "sample_flight_confirmation";
            string templateLanguage = "en_us";
            var documentUrl = new Uri("< Your .pdf document URL >");

            var document = new MessageTemplateDocument("document", documentUrl);
            var firstName = new MessageTemplateText("firstName", "Kat");
            var lastName = new MessageTemplateText("lastName", "Larssen");
            var date = new MessageTemplateText("date", "July 1st, 2023");

            WhatsAppMessageTemplateBindings bindings = new();
            bindings.Header.Add(new(document.Name));
            bindings.Body.Add(new(firstName.Name));
            bindings.Body.Add(new(lastName.Name));
            bindings.Body.Add(new(date.Name));

            MessageTemplate flightConfirmationTemplate = new(templateName, templateLanguage);
            flightConfirmationTemplate.Values.Add(document);
            flightConfirmationTemplate.Values.Add(firstName);
            flightConfirmationTemplate.Values.Add(lastName);
            flightConfirmationTemplate.Values.Add(date);
            flightConfirmationTemplate.Bindings = bindings;

            return flightConfirmationTemplate;
        }

        public static MessageTemplate AssembleSampleIssueResolution()
        {
            string templateName = "sample_issue_resolution";
            string templateLanguage = "en_us";

            var name = new MessageTemplateText(name: "name", text: "Kat");
            var yes = new MessageTemplateQuickAction(name: "Yes"){ Payload =  "Kat said yes" };
            var no = new MessageTemplateQuickAction(name: "No") { Payload = "Kat said no" };

            WhatsAppMessageTemplateBindings bindings = new();
            bindings.Body.Add(new(name.Name));
            bindings.Buttons.Add(new(WhatsAppMessageButtonSubType.QuickReply.ToString(), yes.Name));
            bindings.Buttons.Add(new(WhatsAppMessageButtonSubType.QuickReply.ToString(), no.Name));

            MessageTemplate issueResolutionTemplate = new(templateName, templateLanguage);
            issueResolutionTemplate.Values.Add(name);
            issueResolutionTemplate.Values.Add(yes);
            issueResolutionTemplate.Values.Add(no);
            issueResolutionTemplate.Bindings = bindings;

            return issueResolutionTemplate;
        }

        public static MessageTemplate AssembleSamplePurchaseFeedback()
        {
            
            string templateName = "sample_purchase_feedback";
            string templateLanguage = "en_us";
            var imageUrl = new Uri("https://aka.ms/acsicon1");

            var image = new MessageTemplateImage(name: "image", uri: imageUrl);
            var product = new MessageTemplateText(name: "product", text: "coffee");
            var urlSuffix = new MessageTemplateQuickAction(name: "text") { Text = "survey-code"};
            
            WhatsAppMessageTemplateBindings bindings = new();
            bindings.Header.Add(new(image.Name));
            bindings.Body.Add(new(product.Name));
            bindings.Buttons.Add(new(WhatsAppMessageButtonSubType.Url.ToString(), urlSuffix.Name));

            MessageTemplate purchaseFeedbackTemplate = new(templateName, templateLanguage);
            purchaseFeedbackTemplate.Values.Add(image);
            purchaseFeedbackTemplate.Values.Add(product);
            purchaseFeedbackTemplate.Values.Add(urlSuffix);
            purchaseFeedbackTemplate.Bindings = bindings;

            return purchaseFeedbackTemplate;
        }

        public static void PrintResponse(Response<SendMessageResult> response)
        {
            Console.WriteLine($"Response: {response.GetRawResponse().Status} " +
                $"({response.GetRawResponse().ReasonPhrase})");
            Console.WriteLine($"Date: " +
                $"{response.GetRawResponse().Headers.First(header => header.Name == "Date").Value}");
            Console.WriteLine($"ClientRequestId: {response.GetRawResponse().ClientRequestId}");
            Console.WriteLine($"MS-CV: " +
                $"{response.GetRawResponse().Headers.First(header => header.Name == "MS-CV").Value}");
            foreach (var receipts in response.Value.Receipts)
            {
                Console.WriteLine($"MessageId: {receipts.MessageId}");
            }
            Console.WriteLine($"\n");
        }
    }
}

Más ejemplos

En estos ejemplos se usan las plantillas de muestra disponibles para las cuentas de WhatsApp Business creadas a través del registro insertado de Azure Portal.

Uso de sample_happy_hour_announcement de plantilla de ejemplo

Esta plantilla de ejemplo usa un vídeo en el encabezado y dos parámetros de texto en el cuerpo.

Captura de pantalla que muestra los detalles de la plantilla denominada sample_happy_hour_announcement.

Aquí, el encabezado de la plantilla requiere un vídeo:

{
  "type": "HEADER",
  "format": "VIDEO"
},

El vídeo debe ser una dirección URL al vídeo mp4 hospedado.

Para obtener más información sobre los tipos de contenido multimedia admitidos y los límites de tamaño, consulte Documentación de WhatsApp para los mensajes multimedia.

Y el cuerpo de la plantilla requiere dos parámetros de texto:

{
  "type": "BODY",
  "text": "Happy hour is here! 🍺😀🍸\nPlease be merry and enjoy the day. 🎉\nVenue: {{1}}\nTime: {{2}}"
},

Cree una MessageTemplateVideo y dos variables de MessageTemplateText. A continuación, reúna la lista de MessageTemplateValue y el MessageTemplateWhatsAppBindings proporcionando los parámetros en el orden en que aparecen en el contenido de la plantilla.

string templateName = "sample_happy_hour_announcement";
string templateLanguage = "en_us";
var videoUrl = new Uri("< Your .mp4 Video URL >");

var video = new MessageTemplateVideo("video", videoUrl);
var venue = new MessageTemplateText("venue", "Fourth Coffee");
var time = new MessageTemplateText("time", "Today 2-4PM");
WhatsAppMessageTemplateBindings bindings = new();
bindings.Header.Add(new(video.Name));
bindings.Body.Add(new(venue.Name));
bindings.Body.Add(new(time.Name));

MessageTemplate happyHourAnnouncementTemplate = new(templateName, templateLanguage);
happyHourAnnouncementTemplate.Values.Add(venue);
happyHourAnnouncementTemplate.Values.Add(time);
happyHourAnnouncementTemplate.Values.Add(video);
happyHourAnnouncementTemplate.Bindings = bindings;

Uso de sample_flight_confirmation de plantilla de ejemplo

Esta plantilla de ejemplo usa un documento en el encabezado y tres parámetros de texto en el cuerpo.

Captura de pantalla que muestra los detalles de la plantilla denominada sample_flight_confirmation.

El encabezado de la plantilla requiere un documento:

{
  "type": "HEADER",
  "format": "DOCUMENT"
},

El documento debe ser una dirección URL al documento PDF hospedado.

Para obtener más información sobre los tipos de contenido multimedia admitidos y los límites de tamaño, consulte Documentación de WhatsApp para los mensajes multimedia.

Y el cuerpo de la plantilla requiere tres parámetros de texto:

{
  "type": "BODY",
  "text": "This is your flight confirmation for {{1}}-{{2}} on {{3}}."
},

Cree una MessageTemplateDocument y tres variables de MessageTemplateText. A continuación, reúna la lista de MessageTemplateValue y el MessageTemplateWhatsAppBindings proporcionando los parámetros en el orden en que aparecen en el contenido de la plantilla.

string templateName = "sample_flight_confirmation";
string templateLanguage = "en_us";
var documentUrl = new Uri("< Your .pdf document URL >");

var document = new MessageTemplateDocument("document", documentUrl);
var firstName = new MessageTemplateText("firstName", "Kat");
var lastName = new MessageTemplateText("lastName", "Larssen");
var date = new MessageTemplateText("date", "July 1st, 2023");

WhatsAppMessageTemplateBindings bindings = new();
bindings.Header.Add(new(document.Name));
bindings.Body.Add(new(firstName.Name));
bindings.Body.Add(new(lastName.Name));
bindings.Body.Add(new(date.Name));

MessageTemplate flightConfirmationTemplate = new(templateName, templateLanguage);
flightConfirmationTemplate.Values.Add(document);
flightConfirmationTemplate.Values.Add(firstName);
flightConfirmationTemplate.Values.Add(lastName);
flightConfirmationTemplate.Values.Add(date);
flightConfirmationTemplate.Bindings = bindings;

Requisitos previos

Modelo de objetos

Las siguientes clases e interfaces controlan algunas de las características principales del SDK de mensajes de Azure Communication Services para Java.

Class Name (Nombre de clase) Descripción
NotificationMessagesClient Esta clase se conecta a su recurso de Azure Communication Services. Envía los mensajes.
MessageTemplate Esta clase define qué plantilla utiliza y el contenido de las propiedades de la plantilla para su mensaje.
TemplateNotificationContent Esta clase define el "quién" y el "qué" del mensaje de plantilla que pretende enviar.

Nota:

Para más información, consulte la referencia del SDK de Azure para Java en Paquete com.azure.communication.messages.

Tipos de plantilla de WhatsApp admitidas

Tipo de plantilla Descripción
Plantillas de mensaje basadas en texto Las plantillas de mensaje de WhatsApp son formatos de mensaje específicos con o sin parámetros.
Plantillas de mensaje basadas en medios Plantillas de mensajes de WhatsApp con parámetros multimedia para componentes del encabezado.
Plantillas de mensajes interactivos Las plantillas de mensajes interactivos amplían el contenido que puede enviar a los destinatarios, incluyendo botones interactivos mediante el objeto "components". Se admiten tanto la llamada a la acción como la respuesta rápida.
Plantillas de mensaje basadas en la ubicación Plantillas de mensajes de WhatsApp con parámetros de ubicación en términos longitud y latitud para los componentes del encabezado.

Configuración común

Siga estos pasos para agregar los fragmentos de código necesarios a la función principal de su archivo App.java.

Creación y administración del mensaje de plantilla de WhatsApp

Las plantillas de mensaje de WhatsApp son formatos de mensaje específicos que las empresas usan para enviar notificaciones o mensajes de atención al cliente a personas que optaron por recibir notificaciones. Los mensajes pueden incluir recordatorios de citas, información de envío, resolución de problemas o actualizaciones de pago. Antes de empezar a usar el SDK de Mensajería avanzada para enviar mensajes con plantilla, el usuario debe crear las plantillas necesarias en la Plataforma de WhatsApp Business.

Para obtener más información sobre los requisitos de WhatsApp para plantillas, consulte las referencias de la API de la Plataforma de WhatsApp Business:

Comience a enviar mensajes entre una empresa y un usuario de WhatsApp

Las conversaciones entre una cuenta empresarial de WhatsApp y un usuario de WhatsApp se pueden iniciar de una de estas dos maneras:

  • La empresa envía un mensaje de plantilla al usuario de WhatsApp.
  • El usuario de WhatsApp envía cualquier mensaje al número del trabajo.

Independientemente de cómo se haya iniciado la conversación, una empresa solo puede enviar mensajes de plantilla hasta que el usuario envíe un mensaje a la empresa. Solo después de que el usuario envíe un mensaje a la empresa, ésta podrá enviarle mensajes de texto o multimedia durante la conversación activa. Una vez transcurrido el plazo de 24 horas, la conversación debe reiniciarse. Para obtener más información sobre las conversaciones, consulte la definición en Plataforma de WhatsApp Business.

Autenticar el cliente

Existen varias opciones para autenticar a un cliente de mensajes:

Para autenticar a un cliente, cree una instancia NotificationMessagesClient o MessageTemplateClient con su cadena de conexión. También puede iniciar el cliente con cualquier cliente HTTP personalizado que implemente la interfaz com.azure.core.http.HttpClient.

Para simplificar, este inicio rápido utiliza una cadena de conexión para autenticarse. En entornos de producción, se recomienda utilizar los servicios principales.

Obtenga la cadena de conexión del recurso de Azure Communication Services en Azure Portal. A la izquierda, navegue hasta la pestaña Keys. Copie el campo Connection string para el Primary key. La cadena de conexión tiene el formato endpoint=https://{your Azure Communication Services resource name}.communication.azure.com/;accesskey={secret key}.

Captura de pantalla que muestra un recurso de Azure Communication Services en Azure Portal y que muestra el campo

Establezca la variable de entorno COMMUNICATION_SERVICES_CONNECTION_STRING en el valor de la cadena de conexión.
Abra una ventana de consola y escriba el siguiente comando:

setx COMMUNICATION_SERVICES_CONNECTION_STRING "<your connection string>"

Para obtener más información sobre cómo configurar una variable de entorno para su sistema, siga los pasos indicados en Almacene su cadena de conexión en una variable de entorno.

Para crear una instancia de NotificationMessagesClient, agregue el siguiente código al método main:

// You can get your connection string from your resource in the Azure portal.
String connectionString = System.getenv("COMMUNICATION_SERVICES_CONNECTION_STRING");

NotificationMessagesClient notificationClient = new NotificationMessagesClientBuilder()
    .connectionString(connectionString)
    .buildClient();

Establecimiento del identificador de registro de canales

El Id. GUID de registro de canal se creó durante el registro del canal. Puede buscarlo en el portal en la pestaña Canales del recurso de Azure Communication Services.

Captura de pantalla que muestra un recurso de Azure Communication Services en Azure Portal, en la pestaña

Asígnelo a una variable llamada channelRegistrationId.

String channelRegistrationId = "<your channel registration id GUID>";

Establecimiento de la lista de destinatarios

Debe proporcionar un número de teléfono real que tenga una cuenta de WhatsApp asociada. Esta cuenta de WhatsApp recibe los mensajes de texto y multimedia enviados en este inicio rápido. Para este inicio rápido, este número de teléfono puede ser su número de teléfono personal.

El número de teléfono del destinatario no puede ser el número de teléfono del trabajo (id. de remitente) asociado al registro de canales de WhatsApp. El id. de remitente aparece como remitente de los mensajes de texto y multimedia enviados al destinatario.

El número de teléfono debe incluir el código de país. Para obtener más información sobre el formato del número de teléfono, consulte la documentación de WhatsApp sobre formatos de número de teléfono.

Nota:

Actualmente solo se admite un número de teléfono en la lista de destinatarios.

Cree la lista de destinatarios de la siguiente manera:

List<String> recipientList = new ArrayList<>();
recipientList.add("<to WhatsApp phone number>");

Ejemplo:

// Example only
List<String> recipientList = new ArrayList<>();
recipientList.add("+14255550199");

Configuración de entorno

Para configurar un entorno para enviar mensajes, siga los pasos descritos en las secciones siguientes.

Requisito previo

Creación de una aplicación Java

Abra la ventana Comandos o el terminal y navegue hasta el directorio en el que quiere crear la aplicación de Java. Ejecute el comando siguiente para generar el proyecto de Java a partir de la plantilla maven-archetype-quickstart.

mvn archetype:generate -DgroupId="com.communication.quickstart" -DartifactId="communication-quickstart" -DarchetypeArtifactId="maven-archetype-quickstart" -DarchetypeVersion="1.4" -DinteractiveMode="false"

El objetivo generate crea un directorio con el mismo nombre que el valor artifactId. En este directorio, el directorio src/main/java contiene el código fuente del proyecto, el directorio src/test/java contiene el origen de la prueba y el archivo pom.xml es el modelo de objetos del proyecto o POM.

Instalar el paquete

Abra el archivo pom.xml en el editor de texto. Agregue el siguiente elemento de dependencia al grupo de dependencias.

<dependency>
    <groupId>com.azure</groupId>
    <artifactId>azure-communication-messages</artifactId>
</dependency>

Instalación del marco de la aplicación

Abra /src/main/java/com/communication/quickstart/App.java en un editor de texto, agregue directivas de importación y quite la instrucción System.out.println("Hello world!");:

package com.communication.quickstart;

import com.azure.communication.messages.*;
import com.azure.communication.messages.models.*;

import java.util.ArrayList;
import java.util.List;
public class App
{
    public static void main( String[] args )
    {
        // Quickstart code goes here.
    }
}

Ejemplos de código

Siga estos pasos para agregar los fragmentos de código necesarios a la función principal del archivo App.java.

Enumeración de plantillas de WhatsApp en Azure Portal

Para ver las plantillas en Azure Portal, vaya al recurso de Azure Communication Services >Mensajería avanzada>Plantillas.

Recorte de pantalla que muestra un recurso de Azure Communication Services en Azure Portal, en la pestaña Plantillas de Mensajería avanzada.

Seleccione una plantilla para ver los detalles de la plantilla.

El campo Contenido de los detalles de la plantilla puede incluir los enlaces del parámetro. Los enlaces de parámetros se pueden indicar como:

  • Un campo "format" con un valor como IMAGE.
  • Corchetes dobles que rodean un número, como {{1}}. El número, índice iniciado en 1, indica el orden en el que se deben proporcionar los valores del enlace para crear la plantilla de mensaje.

Captura de pantalla que muestra los detalles de la plantilla.

Como alternativa, puede ver y editar todas las plantillas de la cuenta de WhatsApp Business en Administrador de WhatsApp> Herramientas de la cuenta >Plantillas de mensajes.

Para enumerar las plantillas mediante programación, puede capturar todas las plantillas para el id. de canal con el siguiente código:

public static void getMessageTemplateWithConnectionString() {
    MessageTemplateClient templateClient =
        new MessageTemplateClientBuilder()
            .connectionString(connectionString)
            .buildClient();

    PagedIterable<MessageTemplateItem> response = templateClient.listTemplates(channelRegistrationId);

    response.stream().forEach(t -> {
        WhatsAppMessageTemplateItem template = (WhatsAppMessageTemplateItem) t ;
        System.out.println("===============================");
        System.out.println("Template Name :: "+template.getName());
        System.out.println("Template Language :: "+template.getLanguage());
        System.out.println("Template Status :: "+template.getStatus());
        System.out.println("Template Content :: "+template.getContent());
        System.out.println("===============================");
    });
    }

Enviar un mensaje de plantilla con parámetros de texto en el cuerpo

Si la plantilla no toma parámetros, no es necesario proporcionar los valores ni enlaces al crear el MessageTemplate.

 /*
    * This sample shows how to send template message with below details
    * Name: sample_shipping_confirmation, Language: en_US
    *  [
          {
            "type": "BODY",
            "text": "Your package has been shipped. It will be delivered in {{1}} business days."
          },
          {
            "type": "FOOTER",
            "text": "This message is from an unverified business."
          }
        ]
* */
private static void sendTemplateMessage() {

    //Update Template Name and language according your template associate to your channel.
    MessageTemplate template = new MessageTemplate("sample_shipping_confirmation", "en_US");

    //Update template parameter type and value
    List<MessageTemplateValue> messageTemplateValues = new ArrayList<>();
    messageTemplateValues.add(new MessageTemplateText("Days", "5"));
    template.setValues(messageTemplateValues);

    //Update template parameter binding
    List<WhatsAppMessageTemplateBindingsComponent> components = new ArrayList<>();
    components.add(new WhatsAppMessageTemplateBindingsComponent("Days"));
    MessageTemplateBindings bindings =new WhatsAppMessageTemplateBindings()
        .setBody(components);
    template.setBindings(bindings);

    NotificationMessagesClient client = createClientWithTokenCredential();
    SendMessageResult result = client.send(
        new TemplateNotificationContent(CHANNEL_ID, recipients, template));

    result.getReceipts().forEach(r -> System.out.println("Message sent to:"+r.getTo() + " and message id:"+ r.getMessageId()));
    }

Enviar un mensaje de plantilla con el parámetro multimedia en el encabezado

Use MessageTemplateImage, MessageTemplateVideo o MessageTemplateDocument para definir el parámetro multimedia en un encabezado.

Definición de plantilla con un parámetro multimedia de imagen en el encabezado:

{
  "type": "HEADER",
  "format": "VIDEO"
},

"format" puede estar en cuatro tipos de medios diferentes compatibles con WhatsApp. En el SDK de .NET, cada tipo de medio usa un tipo MessageTemplateValue correspondiente.

Format Tipo MessageTemplateValue Tipo de archivo
IMAGE MessageTemplateImage png, jpg
VÍDEO MessageTemplateVideo mp4
DOCUMENT MessageTemplateDocument pdf

Para obtener más información sobre los tipos de contenido multimedia admitidos y los límites de tamaño, consulte Documentación de WhatsApp para los mensajes multimedia.

Ejemplo

Plantilla sample_happy_hour_announcement:

Captura de pantalla que muestra los detalles de la plantilla denominada sample_happy_hour_announcement.

Aquí, el encabezado de la plantilla requiere un vídeo:

{
  "type": "HEADER",
  "format": "VIDEO"
},

El vídeo debe ser una dirección URL al vídeo mp4 hospedado.

Para obtener más información sobre los tipos de contenido multimedia admitidos y los límites de tamaño, consulte Documentación de WhatsApp para los mensajes multimedia.

Y el cuerpo de la plantilla requiere dos parámetros de texto:

{
  "type": "BODY",
  "text": "Happy hour is here! 🍺😀🍸\nPlease be merry and enjoy the day. 🎉\nVenue: {{1}}\nTime: {{2}}"
},

Cree una MessageTemplateVideo y cuatro variables de MessageTemplateText. A continuación, reúna la lista de MessageTemplateValue y el MessageTemplateWhatsAppBindings proporcionando los parámetros en el orden en que los parámetros aparecen en el contenido de la plantilla.

 /*
    * This sample shows how to send template message with below details
    * Name: sample_happy_hour_announcement, Language: en_US
    *  [
          {
            "type": "HEADER",
            "format": "VIDEO"
          },
          {
            "type": "BODY",
            "text": "Happy hour is here! 🍺😀🍸\nPlease be merry and enjoy the day. 🎉\nVenue: {{1}}\nTime: {{2}}"
          },
          {
            "type": "FOOTER",
            "text": "This message is from an unverified business."
          }
        ]
* */
private static void sendTemplateMessageWithVideo() {

    //Update Template Name and language according your template associate to your channel.
    MessageTemplate template = new MessageTemplate("sample_happy_hour_announcement", "en_US");

    //Add template parameter type with value in a list
    List<MessageTemplateValue> messageTemplateValues = new ArrayList<>();
    messageTemplateValues.add(new MessageTemplateVideo("HeaderVideo", "https://sample-videos.com/video123/mp4/720/big_buck_bunny_720p_1mb.mp4"));
    messageTemplateValues.add(new MessageTemplateText("VenueInfoInBody", "Starbucks"));
    messageTemplateValues.add(new MessageTemplateText("TimeInfoInBody", "Today 2-4PM"));

    // Add parameter binding for template header in a list
    List<WhatsAppMessageTemplateBindingsComponent> templateHeaderBindings = new ArrayList<>();
    templateHeaderBindings.add(new WhatsAppMessageTemplateBindingsComponent("HeaderVideo"));

    // Add parameter binding for template body in a list
    List<WhatsAppMessageTemplateBindingsComponent> templateBodyBindings = new ArrayList<>();
    templateBodyBindings.add(new WhatsAppMessageTemplateBindingsComponent("VenueInfoInBody"));
    templateBodyBindings.add(new WhatsAppMessageTemplateBindingsComponent("TimeInfoInBody"));

    MessageTemplateBindings templateBindings = new WhatsAppMessageTemplateBindings()
        .setHeaderProperty(templateHeaderBindings) // Set the parameter binding for template header
        .setBody(templateBodyBindings); // Set the parameter binding for template body

    template
        .setBindings(templateBindings)
        .setValues(messageTemplateValues);

    NotificationMessagesClient client = createClientWithConnectionString();
    SendMessageResult result = client.send(
        new TemplateNotificationContent(CHANNEL_ID, recipients, template));

    result.getReceipts().forEach(r -> System.out.println("Message sent to:"+r.getTo() + " and message id:"+ r.getMessageId()));
}

Enviar un mensaje de plantilla con los botones de respuesta rápida

Use MessageTemplateQuickAction para definir la carga útil para los botones de respuesta rápida y los objetos MessageTemplateQuickAction tienen los tres atributos siguientes.

Propiedades Descripción Tipo
Nombre El name se usa para buscar el valor en MessageTemplateWhatsAppBindings. string
Texto La opción de acción rápida text. string
Carga útil El payload asignado a un botón está disponible en una respuesta de mensaje si el usuario selecciona el botón. string

Definición de plantilla con botones de respuesta rápida:

{
  "type": "BUTTONS",
  "buttons": [
    {
      "type": "QUICK_REPLY",
      "text": "Yes"
    },
    {
      "type": "QUICK_REPLY",
      "text": "No"
    }
  ]
}

El orden en que aparecen los botones en la definición de plantilla debe coincidir con el orden en que se definen los botones al crear los enlaces con MessageTemplateWhatsAppBindings.

Para obtener más información sobre la carga de respuestas rápidas del usuario, consulte la documentación de WhatsApp sobre Devolución de una llamada recibida desde un botón de respuesta rápida.

Ejemplo

Plantilla sample_issue_resolution:

Captura de pantalla que muestra los detalles de la plantilla denominada sample_issue_resolution.

Aquí, el cuerpo de la plantilla requiere un parámetro de texto:

/*
    * This sample shows how to send template message with below details
    * Name: sample_issue_resolution, Language: en_US
    *  [
          {
            "type": "BODY",
            "text": "Hi {{1}}, were we able to solve the issue that you were facing?"
          },
          {
            "type": "FOOTER",
            "text": "This message is from an unverified business."
          },
          {
            "type": "BUTTONS",
            "buttons": [
              {
                "type": "QUICK_REPLY",
                "text": "Yes"
              },
              {
                "type": "QUICK_REPLY",
                "text": "No"
              }
            ]
          }
        ]
* */
private static void sendTextTemplateMessageWithQuickReply() {

    //Add template parameter type with value in a list
    List<MessageTemplateValue> messageTemplateValues = new ArrayList<>();
    messageTemplateValues.add(new MessageTemplateText("Name", "Arif"));
    messageTemplateValues.add(new MessageTemplateQuickAction("Yes").setPayload("Yes"));
    messageTemplateValues.add(new MessageTemplateQuickAction("No").setPayload("No"));

    // Add parameter binding for template body in a list
    List<WhatsAppMessageTemplateBindingsComponent> templateBodyBindings = new ArrayList<>();
    templateBodyBindings.add(new WhatsAppMessageTemplateBindingsComponent("Name"));

    // Add parameter binding for template buttons in a list
    List<WhatsAppMessageTemplateBindingsButton> templateButtonBindings = new ArrayList<>();
    templateButtonBindings.add( new WhatsAppMessageTemplateBindingsButton(WhatsAppMessageButtonSubType.QUICK_REPLY, "Yes"));
    templateButtonBindings.add( new WhatsAppMessageTemplateBindingsButton(WhatsAppMessageButtonSubType.QUICK_REPLY, "No"));

    MessageTemplateBindings templateBindings = new WhatsAppMessageTemplateBindings()
        .setBody(templateBodyBindings) // Set the parameter binding for template body
        .setButtons(templateButtonBindings); // Set the parameter binding for template buttons

    MessageTemplate messageTemplate = new MessageTemplate("sample_issue_resolution", "en_US")
        .setBindings(templateBindings)
        .setValues(messageTemplateValues);

    NotificationMessagesClient client = createClientWithConnectionString();
    SendMessageResult result = client.send(
        new TemplateNotificationContent(CHANNEL_ID, recipients, messageTemplate));

    result.getReceipts().forEach(r -> System.out.println("Message sent to:"+r.getTo() + " and message id:"+ r.getMessageId()));
}

Use MessageTemplateQuickAction para definir el sufijo URL para los botones de llamada a la acción y el objeto MessageTemplateQuickAction tiene los dos atributos siguientes.

Propiedades Descripción Tipo
Nombre El name se usa para buscar el valor en MessageTemplateWhatsAppBindings. string
Texto El text anexado a la dirección URL. string

Botones de definición de plantilla:

{
  "type": "BUTTONS",
  "buttons": [
    {
      "type": "URL",
      "text": "Take Survey",
      "url": "https://www.example.com/{{1}}"
    }
  ]
}

El orden en que aparecen los botones en la definición de plantilla debe coincidir con el orden en que se definen los botones al crear los enlaces con MessageTemplateWhatsAppBindings.

Ejemplo

Plantilla sample_purchase_feedback:

Esta plantilla de ejemplo agrega un botón con un vínculo de dirección URL dinámica al mensaje. También usa una imagen en el encabezado y un parámetro de texto en el cuerpo.

Captura de pantalla que muestra la edición del tipo de dirección URL en el administrador de WhatsApp.

En este ejemplo, el encabezado de la plantilla requiere una imagen:

{
  "type": "HEADER",
  "format": "IMAGE"
},

Aquí, el cuerpo de la plantilla requiere un parámetro de texto:

{
  "type": "BODY",
  "text": "Thank you for purchasing {{1}}! We value your feedback and would like to learn more about your experience."
},

Y la plantilla incluye un botón de dirección URL dinámica con un parámetro:

{
  "type": "BUTTONS",
  "buttons": [
    {
      "type": "URL",
      "text": "Take Survey",
      "url": "https://www.example.com/{{1}}"
    }
  ]
}

Cree una MessageTemplateImage, una MessageTemplateText y una variable MessageTemplateQuickAction. A continuación, reúna la lista de MessageTemplateValue y el MessageTemplateWhatsAppBindings proporcionando los parámetros en el orden en que los parámetros aparecen en el contenido de la plantilla. El orden también es importante al definir los botones del enlace.

/*
* This sample shows how to send template message with below details
* Name: sample_purchase_feedback, Language: en_US
*  [
        {
        "type": "HEADER",
        "format": "IMAGE"
        },
        {
        "type": "BODY",
        "text": "Thank you for purchasing {{1}}! We value your feedback and would like to learn more about your experience."
        },
        {
        "type": "FOOTER",
        "text": "This message is from an unverified business."
        },
        {
        "type": "BUTTONS",
        "buttons": [
            {
            "type": "URL",
            "text": "Take Survey",
            "url": "https://www.example.com/"
            }
        ]
        }
    ]
* */
private static void sendTemplateMessageWithImage() {

    //Update Template Name and language according your template associate to your channel.
    MessageTemplate template = new MessageTemplate("sample_purchase_feedback", "en_US");

    //Add template parameter type with value in a list
    List<MessageTemplateValue> messageTemplateValues = new ArrayList<>();
    messageTemplateValues.add(new MessageTemplateImage("HeaderImage", "https://upload.wikimedia.org/wikipedia/commons/3/30/Building92microsoft.jpg"));
    messageTemplateValues.add(new MessageTemplateText("ProductInfoInBody", "Microsoft Office"));

    // Add parameter binding for template header in a list
    List<WhatsAppMessageTemplateBindingsComponent> templateHeaderBindings = new ArrayList<>();
    templateHeaderBindings.add(new WhatsAppMessageTemplateBindingsComponent("HeaderImage"));

    // Add parameter binding for template body in a list
    List<WhatsAppMessageTemplateBindingsComponent> templateBodyBindings = new ArrayList<>();
    templateBodyBindings.add(new WhatsAppMessageTemplateBindingsComponent("ProductInfoInBody"));

    MessageTemplateBindings templateBindings = new WhatsAppMessageTemplateBindings()
        .setHeaderProperty(templateHeaderBindings) // Set the parameter binding for template header
        .setBody(templateBodyBindings); // Set the parameter binding for template body

    template
        .setBindings(templateBindings)
        .setValues(messageTemplateValues);

    NotificationMessagesClient client = createClientWithConnectionString();
    SendMessageResult result = client.send(
        new TemplateNotificationContent(CHANNEL_ID, recipients, template));

    result.getReceipts().forEach(r -> System.out.println("Message sent to:"+r.getTo() + " and message id:"+ r.getMessageId()));
}

Ejecución del código

  1. Vaya al directorio que contiene el archivo pom.xml y compile el proyecto mediante el comando mvn.

    mvn compile
    
  2. Ejecute la aplicación ejecutando el siguiente comando mvn.

    mvn exec:java -D"exec.mainClass"="com.communication.quickstart.App" -D"exec.cleanupDaemonThreads"="false"
    

Ejemplo completo de código

Busque el código finalizado de este inicio rápido en GitHub.

Requisitos previos

Modelo de objetos

Las siguientes clases e interfaces controlan algunas de las características principales del SDK de mensajes de Azure Communication Services para JavaScript.

Class Name (Nombre de clase) Descripción
NotificationMessagesClient Esta clase se conecta a su recurso de Azure Communication Services. Envía los mensajes.
MessageTemplate Esta clase define qué plantilla utiliza y el contenido de las propiedades de la plantilla para su mensaje.
TemplateNotificationContent Esta clase define el "quién" y el "qué" del mensaje de plantilla que pretende enviar.

Nota:

Para más información, consulte la referencia del SDK de Azure para JavaScript Paquete @azure-rest/communication-messages

Tipos de plantilla de WhatsApp admitidas

Tipo de plantilla Descripción
Plantillas de mensaje basadas en texto Las plantillas de mensaje de WhatsApp son formatos de mensaje específicos con o sin parámetros.
Plantillas de mensaje basadas en medios Plantillas de mensajes de WhatsApp con parámetros multimedia para componentes del encabezado.
Plantillas de mensajes interactivos Las plantillas de mensajes interactivos amplían el contenido que puede enviar a los destinatarios, incluyendo botones interactivos mediante el objeto "components". Se admiten tanto la llamada a la acción como la respuesta rápida.
Plantillas de mensaje basadas en la ubicación Plantillas de mensajes de WhatsApp con parámetros de ubicación en términos longitud y latitud para los componentes del encabezado.

Configuración común

Siga estos pasos para agregar los fragmentos de código necesarios a la función principal de su archivo send-messages.js.

Creación y administración del mensaje de plantilla de WhatsApp

Las plantillas de mensaje de WhatsApp son formatos de mensaje específicos que las empresas usan para enviar notificaciones o mensajes de atención al cliente a personas que optaron por recibir notificaciones. Los mensajes pueden incluir recordatorios de citas, información de envío, resolución de problemas o actualizaciones de pago. Antes de empezar a usar el SDK de Mensajería avanzada para enviar mensajes con plantilla, el usuario debe crear las plantillas necesarias en la Plataforma de WhatsApp Business.

Para obtener más información sobre los requisitos de WhatsApp para plantillas, consulte las referencias de la API de la Plataforma de WhatsApp Business:

Comience a enviar mensajes entre una empresa y un usuario de WhatsApp

Las conversaciones entre una cuenta empresarial de WhatsApp y un usuario de WhatsApp se pueden iniciar de una de estas dos maneras:

  • La empresa envía un mensaje de plantilla al usuario de WhatsApp.
  • El usuario de WhatsApp envía cualquier mensaje al número del trabajo.

Independientemente de cómo se haya iniciado la conversación, una empresa solo puede enviar mensajes de plantilla hasta que el usuario envíe un mensaje a la empresa. Solo después de que el usuario envíe un mensaje a la empresa, ésta podrá enviarle mensajes de texto o multimedia durante la conversación activa. Una vez transcurrido el plazo de 24 horas, la conversación debe reiniciarse. Para obtener más información sobre las conversaciones, consulte la definición en Plataforma de WhatsApp Business.

Autenticar el cliente

El código siguiente recupera la cadena de conexión del recurso de una variable de entorno denominada COMMUNICATION_SERVICES_CONNECTION_STRING mediante el paquete dotenv.

Para simplificar, este inicio rápido utiliza una cadena de conexión para autenticarse. En entornos de producción, se recomienda utilizar los servicios principales.

Obtenga la cadena de conexión del recurso de Azure Communication Services en Azure Portal. A la izquierda, navegue hasta la pestaña Keys. Copie el campo Connection string para el Primary key. La cadena de conexión tiene el formato endpoint=https://{your Azure Communication Services resource name}.communication.azure.com/;accesskey={secret key}.

Captura de pantalla que muestra un recurso de Azure Communication Services en Azure Portal y que muestra el campo

Establezca la variable de entorno COMMUNICATION_SERVICES_CONNECTION_STRING en el valor de la cadena de conexión.
Abra una ventana de consola y escriba el siguiente comando:

setx COMMUNICATION_SERVICES_CONNECTION_STRING "<your connection string>"

Para obtener más información sobre cómo configurar una variable de entorno para su sistema, siga los pasos indicados en Almacene su cadena de conexión en una variable de entorno.

Para crear una instancia de NotificationClient, agregue el siguiente código al método Main:

const NotificationClient = require("@azure-rest/communication-messages").default;

// Set Connection string
const connectionString = process.env["COMMUNICATION_SERVICES_CONNECTION_STRING"];

// Instantiate the client
const client = NotificationClient(connectionString);

Establecimiento del identificador de registro de canales

El Id. GUID de registro de canal se creó durante el registro del canal. Puede buscarlo en el portal en la pestaña Canales del recurso de Azure Communication Services.

Captura de pantalla que muestra un recurso de Azure Communication Services en Azure Portal, en la pestaña

Asígnelo a una variable llamada channelRegistrationId.

const channelRegistrationId = "<your channel registration id GUID>";

Establecimiento de la lista de destinatarios

Debe proporcionar un número de teléfono real que tenga una cuenta de WhatsApp asociada. Esta cuenta de WhatsApp recibe la plantilla, el texto y los mensajes multimedia enviados en este inicio rápido. Para este inicio rápido, este número de teléfono puede ser su número de teléfono personal.

El número de teléfono del destinatario no puede ser el número de teléfono del trabajo (id. de remitente) asociado al registro de canales de WhatsApp. El id. de remitente aparece como remitente de los mensajes de texto y multimedia enviados al destinatario.

El número de teléfono debe incluir el código de país. Para obtener más información sobre el formato del número de teléfono, consulte la documentación de WhatsApp sobre formatos de número de teléfono.

Nota:

Actualmente solo se admite un número de teléfono en la lista de destinatarios.

Cree la lista de destinatarios de la siguiente manera:

const recipientList = ["<to WhatsApp phone number>"];

Ejemplo:

// Example only
const recipientList = ["+14255550199"];

Instalación

Para configurar un entorno para enviar mensajes, siga los pasos descritos en las secciones siguientes.

Creación de una aplicación Node.js

  1. Cree un directorio para la aplicación y ábralo en un terminal o ventana Comandos.

  2. Ejecute el siguiente comando:

    mkdir advance-messages-quickstart && cd advance-messages-quickstart
    
  3. Ejecute el siguiente comando para crear un archivo package.json con la configuración predeterminada.

    npm init -y
    
  4. Use un editor de texto para crear un archivo denominado send-messages.js en el directorio raíz del proyecto.

  5. Agregue el siguiente fragmento de código al archivo send-messages.js.

    async function main() {
        // Quickstart code goes here.
    }
    
    main().catch((error) => {
        console.error("Encountered an error while sending message: ", error);
        process.exit(1);
    });
    

Complete la siguiente sección para agregar el código fuente de este ejemplo al archivo send-messages.js que ha creado.

Instalar el paquete

Utilice el comando npm install para instalar el SDK de la Mensajería avanzada de Azure Communication Services para JavaScript.

npm install @azure-rest/communication-messages --save

La opción --save muestra la biblioteca como dependencia en el archivo package.json.

Ejemplos de código

Siga estos pasos para agregar los fragmentos de código necesarios a la función principal del archivo send-messages.js.

Enumeración de plantillas de WhatsApp en Azure Portal

Para ver las plantillas en Azure Portal, vaya al recurso de Azure Communication Services >Mensajería avanzada>Plantillas.

Recorte de pantalla que muestra un recurso de Azure Communication Services en Azure Portal, en la pestaña Plantillas de Mensajería avanzada.

Seleccione una plantilla para ver los detalles de la plantilla.

El campo Contenido de los detalles de la plantilla puede incluir los enlaces del parámetro. Los enlaces de parámetros se pueden indicar como:

  • Un campo "format" con un valor como IMAGE.
  • Corchetes dobles que rodean un número, como {{1}}. El número, índice iniciado en 1, indica el orden en el que se deben proporcionar los valores del enlace para crear la plantilla de mensaje.

Captura de pantalla que muestra los detalles de la plantilla.

Como alternativa, puede ver y editar todas las plantillas de la cuenta de WhatsApp Business en Administrador de WhatsApp> Herramientas de la cuenta >Plantillas de mensajes.

Para enumerar las plantillas mediante programación, puede capturar todas las plantillas para el id. de canal con el siguiente código:

// Copyright (c) Microsoft Corporation.
// Licensed under the MIT License.

/**
 * @summary Get Template list for a channel
 */

const MessageTemplateClient = require("@azure-rest/communication-messages").default,
  { isUnexpected } = require("@azure-rest/communication-messages");

// Load the .env file if it exists
require("dotenv").config();

async function main() {
  const connectionString = process.env.COMMUNICATION_LIVETEST_STATIC_CONNECTION_STRING || "";
  const client = MessageTemplateClient(connectionString);
  console.log("Fetch Templates...");
  const response = await client
    .path("/messages/channels/{channelId}/templates", process.env.CHANNEl_ID || "")
    .get({
      queryParameters: { maxPageSize: 2 },
    });

  if (isUnexpected(response)) {
    throw new Error("Failed to get template for the channel.");
  }

  // The paginate helper creates a paged async iterator using metadata from the first page.
  const items = paginate(client, response);

  // We get an PageableAsyncIterator so we need to do `for await`.
  for await (const item of items) {
    console.log(JSON.stringify(item, null, 2));
  }
}

main().catch((error) => {
  console.error("Encountered an error while sending message: ", error);
  throw error;
});

Enviar un mensaje de plantilla con parámetros de texto en el cuerpo

Plantilla sample_shipping_confirmation:

Captura de pantalla que muestra los detalles de la plantilla denominada sample_shipping_confirmation.

En este ejemplo, el cuerpo de la plantilla tiene un parámetro:

{
  "type": "BODY",
  "text": "Your package has been shipped. It will be delivered in {{1}} business days."
},

Los parámetros se definen con los valores values y los enlaces de bindings. Use los valores y enlaces para ensamblar el objeto template.

 /*
    * This sample shows how to send template message with below details
    * Name: sample_shipping_confirmation, Language: en_US
    *  [
          {
            "type": "BODY",
            "text": "Your package has been shipped. It will be delivered in {{1}} business days."
          },
          {
            "type": "FOOTER",
            "text": "This message is from an unverified business."
          }
        ]
* */
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT License.

/**
 * @summary Use AAD token credentials when sending a whatsapp template message.
 */

const { isNode } = require("@azure/core-util");
const { ClientSecretCredential, DefaultAzureCredential } = require("@azure/identity");
const NotificationClient = require("@azure-rest/communication-messages").default,
  { isUnexpected } = require("@azure-rest/communication-messages");

// Load the .env file if it exists
require("dotenv").config();

async function main() {
  // You will need to set this environment variable or edit the following values
  const endpoint = process.env.ACS_URL || "";

  // Azure AD Credential information is required to run this sample:
  if (
    !process.env.AZURE_TENANT_ID ||
    !process.env.AZURE_CLIENT_ID ||
    !process.env.AZURE_CLIENT_SECRET
  ) {
    console.error(
      "Azure AD authentication information not provided, but it is required to run this sample. Exiting.",
    );
    return;
  }

  // get credentials
  const credential = isNode
    ? new DefaultAzureCredential()
    : new ClientSecretCredential(
        process.env.AZURE_TENANT_ID,
        process.env.AZURE_CLIENT_ID,
        process.env.AZURE_CLIENT_SECRET,
      );

  const client = NotificationClient(endpoint, credential);

  const DaysTemplateValue = {
    kind: "text",
    name: "Days",
    text: "5",
  };

  const templateBindings = {
    kind: "whatsApp",
    body: [
      {
        refValue: "Days",
      },
    ],
  };

  const template = {
    name: "sample_shipping_confirmation",
    language: "en_US",
    bindings: templateBindings,
    values: [DaysTemplateValue],
  };

  const result = await client.path("/messages/notifications:send").post({
    contentType: "application/json",
    body: {
      channelRegistrationId: process.env.CHANNEL_ID || "",
      to: [process.env.RECIPIENT_PHONE_NUMBER || ""],
      kind: "template",
      template: template,
    },
  });

  console.log("Response: " + JSON.stringify(result, null, 2));

  if (isUnexpected(result)) {
    throw new Error("Failed to send message");
  }

  const response = result;
  response.body.receipts.forEach((receipt) => {
    console.log("Message sent to:" + receipt.to + " with message id:" + receipt.messageId);
  });
}

main().catch((error) => {
  console.error("Encountered an error while sending message: ", error);
  throw error;
});

module.exports = { main };

Ejecución del código

Utilice el comando node para ejecutar el código que ha agregado al archivo send-messages.js.

node ./send-messages.js

Ejemplo completo de código

Busque el código finalizado de este ejemplo en GitHub.

Requisitos previos

Modelo de objetos

Las siguientes clases e interfaces controlan algunas de las características principales del SDK de mensajes de Azure Communication Services para Python.

Class Name (Nombre de clase) Descripción
NotificationMessagesClient Esta clase se conecta a su recurso de Azure Communication Services. Envía los mensajes.
MessageTemplate Esta clase define qué plantilla utiliza y el contenido de las propiedades de la plantilla para su mensaje.
TemplateNotificationContent Esta clase define el "quién" y el "qué" del mensaje de plantilla que pretende enviar.

Nota:

Para más información, consulte la referencia del SDK de Azure para Python Paquete de mensajes.

Tipos de plantilla de WhatsApp admitidas

Tipo de plantilla Descripción
Plantillas de mensaje basadas en texto Las plantillas de mensaje de WhatsApp son formatos de mensaje específicos con o sin parámetros.
Plantillas de mensaje basadas en medios Plantillas de mensajes de WhatsApp con parámetros multimedia para componentes del encabezado.
Plantillas de mensajes interactivos Las plantillas de mensajes interactivos amplían el contenido que puede enviar a los destinatarios, incluyendo botones interactivos mediante el objeto "components". Se admiten tanto la llamada a la acción como la respuesta rápida.
Plantillas de mensaje basadas en la ubicación Plantillas de mensajes de WhatsApp con parámetros de ubicación en términos longitud y latitud para los componentes del encabezado.

Configuración común

Siga estos pasos para agregar los fragmentos de código necesarios al programa de Python messages-quickstart.py.

Creación y administración del mensaje de plantilla de WhatsApp

Las plantillas de mensaje de WhatsApp son formatos de mensaje específicos que las empresas usan para enviar notificaciones o mensajes de atención al cliente a personas que optaron por recibir notificaciones. Los mensajes pueden incluir recordatorios de citas, información de envío, resolución de problemas o actualizaciones de pago. Antes de empezar a usar el SDK de Mensajería avanzada para enviar mensajes con plantilla, el usuario debe crear las plantillas necesarias en la Plataforma de WhatsApp Business.

Para obtener más información sobre los requisitos de WhatsApp para plantillas, consulte las referencias de la API de la Plataforma de WhatsApp Business:

Autenticar el cliente

El envío de mensajes se realiza mediante NotificationMessagesClient. NotificationMessagesClient se autentica mediante la cadena de conexión adquirida desde el recurso de Azure Communication Services en Azure Portal. Para más información sobre las cadenas de conexión, consulte access-your-connection-strings-and-service-endpoints.

Obtenga la cadena de conexión de Recursos de comunicación de Azure desde Azure Portal como se indica en el recorte de pantalla. A la izquierda, navegue hasta la pestaña Keys. Copie el campo Connection string para la clave primaria. La cadena de conexión tiene el formato endpoint=https://{your Azure Communication Services resource name}.communication.azure.com/;accesskey={secret key}.

Captura de pantalla que muestra un recurso de Azure Communication Services en Azure Portal y que muestra el campo

Establezca la variable de entorno COMMUNICATION_SERVICES_CONNECTION_STRING en el valor de la cadena de conexión.
Abra una ventana de consola y escriba el siguiente comando:

setx COMMUNICATION_SERVICES_CONNECTION_STRING "<your connection string>"

Tras agregar la variable de entorno, es posible que tenga que reiniciar todos los programas en ejecución que necesiten leer la variable de entorno, incluida la ventana de la consola. Por ejemplo, si usa Visual Studio como editor, reinícielo antes de ejecutar el ejemplo.

Para obtener más información sobre cómo configurar una variable de entorno para su sistema, siga los pasos indicados en Almacene su cadena de conexión en una variable de entorno.

    # Get a connection string to our Azure Communication Services resource.
    connection_string = os.getenv("COMMUNICATION_SERVICES_CONNECTION_STRING")
    
    def send_template_message(self):
        from azure.communication.messages import NotificationMessagesClient

        # Create NotificationMessagesClient Client
        messaging_client = NotificationMessagesClient.from_connection_string(self.connection_string)

Establecimiento del identificador de registro de canales

El Id. GUID del registro del canal se creó durante el registro del canal. Puede buscarlo en el portal en la pestaña Canales del recurso de Azure Communication Services.

Captura de pantalla que muestra un recurso de Azure Communication Services en Azure Portal, en la pestaña

Asígnelo a una variable llamada channelRegistrationId.

    channelRegistrationId = os.getenv("WHATSAPP_CHANNEL_ID_GUID")

Establecimiento de la lista de destinatarios

Debe proporcionar un número de teléfono activo asociado a una cuenta de WhatsApp. Esta cuenta de WhatsApp recibe la plantilla, el texto y los mensajes multimedia enviados en este inicio rápido.

En este ejemplo, puede usar su número de teléfono personal.

El número de teléfono del destinatario no puede ser el número de teléfono del trabajo (id. de remitente) asociado al registro de canales de WhatsApp. El id. de remitente aparece como remitente de los mensajes de texto y multimedia enviados al destinatario.

El número de teléfono debe incluir el código de país. Para obtener más información sobre el formato del número de teléfono, consulte la documentación de WhatsApp sobre Formatos de número de teléfono.

Nota:

Actualmente solo se admite un número de teléfono en la lista de destinatarios.

Establezca la lista de destinatarios así:

    phone_number = os.getenv("RECIPIENT_WHATSAPP_PHONE_NUMBER")

Ejemplo de uso:

    # Example only
    to=[self.phone_number],

Comience a enviar mensajes entre una empresa y un usuario de WhatsApp

Las conversaciones entre una cuenta empresarial de WhatsApp y un usuario de WhatsApp se pueden iniciar de una de estas dos maneras:

  • La empresa envía un mensaje de plantilla al usuario de WhatsApp.
  • El usuario de WhatsApp envía cualquier mensaje al número del trabajo.

Una empresa no puede iniciar una conversación interactiva. Solo puede enviar un mensaje interactivo después de recibir un mensaje del usuario. La empresa solo puede enviar mensajes interactivos al usuario durante la conversación activa. Una vez que expire la ventana de conversación de 24 horas, solo el usuario puede reiniciar la conversación interactiva. Para obtener más información sobre las conversaciones, consulte la definición en la Plataforma de WhatsApp Business.

Para iniciar una conversación interactiva desde su cuenta personal de WhatsApp, envíe un mensaje al número de empresarial (id. de remitente).

Una conversación de WhatsApp vista en la web que muestra un mensaje de usuario enviado al número de cuenta empresarial de WhatsApp.

Configuración de entorno

Creación de una nueva aplicación de Python

En una ventana del terminal o la consola, cree una carpeta para la aplicación y ábrala.

mkdir messages-quickstart && cd messages-quickstart

Instalar el paquete

Deberá utilizar la biblioteca de clientes de Azure Communication Messages para Python versión 1.1.0 o superior.

En el símbolo del sistema o la consola, ejecute el comando siguiente:

pip install azure-communication-messages

Para InteractiveMessages, Reacciones y Stickers, use la versión beta siguiente:

pip install azure-communication-messages==1.2.0b1

Instalación del marco de la aplicación

Cree un archivo llamado messages-quickstart.py y agregue la estructura básica del programa.

type nul > messages-quickstart.py   

Estructura básica del programa

import os

class MessagesQuickstart(object):
    print("Azure Communication Services - Advanced Messages SDK Quickstart")

if __name__ == '__main__':
    messages = MessagesQuickstart()

Estructura básica del programa

import os

class MessagesQuickstart(object):
    print("Azure Communication Services - Advanced Messages SDK Quickstart")

if __name__ == '__main__':
    messages = MessagesQuickstart()

Ejemplos de código

Siga estos pasos para agregar los fragmentos de código necesarios al programa de Python messages-quickstart.py.

Enumeración de plantillas de WhatsApp en Azure Portal

Para ver las plantillas en Azure Portal, vaya al recurso de Azure Communication Service >Mensajería avanzada>Plantillas.

Captura de pantalla que muestra un recurso de Azure Communication Services en Azure Portal, en la pestaña

Seleccione una plantilla para ver los detalles de la plantilla.

El campo content de los detalles de la plantilla puede incluir enlaces de parámetros. Los enlaces de parámetros se pueden indicar como:

  • Un campo format con un valor como IMAGE.
  • Corchetes dobles que rodean un número, como {{1}}. El número, índice iniciado en 1, indica el orden en el que se deben proporcionar los valores del enlace para crear la plantilla de mensaje.

Captura de pantalla que muestra los detalles de la plantilla.

Como alternativa, puede ver y editar todas las plantillas de la cuenta empresarial de WhatsApp en las herramientas de WhatsApp Manager> Herramientas de cuenta >Plantillas de mensajes.

Para enumerar las plantillas mediante programación, puede capturar todas las plantillas para el id. de canal de la siguiente manera:

def get_templates_list(self):

    from azure.communication.messages import MessageTemplateClient
    message_template_client = MessageTemplateClient.from_connection_string(self.connection_string)
    # calling send() with whatsapp message details
    template_list = message_template_client.list_templates(self.channel_id)
    count_templates = len(list(template_list))
    print("Successfully retrieved {} templates from channel_id {}.".format(count_templates, self.channel_id))

Enviar un mensaje de plantilla sin parámetros

Si la plantilla no toma parámetros, no es necesario proporcionar los valores ni enlaces al crear el MessageTemplate.

Ejemplo

sample_template no tiene parámetros.

Captura de pantalla que muestra los detalles de la plantilla denominada sample_template.

Ensamble el MessageTemplate haciendo referencia al nombre y el idioma de la plantilla de destino.

input_template: MessageTemplate = MessageTemplate(name="gathering_invitation", language="ca")  # Name of the WhatsApp Template

Enviar un mensaje de plantilla con parámetros de texto en el cuerpo

Use MessageTemplateText para definir parámetros en el cuerpo indicados con corchetes dobles que rodean un número, como {{1}}. El número, índice iniciado en 1, indica el orden en el que se deben proporcionar los valores del enlace para crear la plantilla de mensaje. El intento de incluir parámetros que no están en la plantilla no es válido.

Definición de la plantilla con dos parámetros:

{
  "type": "BODY",
  "text": "Message with two parameters: {{1}} and {{2}}"
}

Ejemplos

Plantilla sample_shipping_confirmation:

Captura de pantalla que muestra los detalles de la plantilla denominada sample_shipping_confirmation.

En este ejemplo, el cuerpo de la plantilla tiene un parámetro:

{
  "type": "BODY",
  "text": "Your package has been shipped. It will be delivered in {{1}} business days."
},

Defina parámetros mediante los valores MessageTemplateValue y los enlaces MessageTemplateWhatsAppBindings. Use los valores y enlaces para ensamblar el MessageTemplate.

# Setting template options
templateName = "sample_shipping_confirmation"
templateLanguage = "en_us" 
shippingConfirmationTemplate: MessageTemplate = MessageTemplate(name=templateName, language=templateLanguage )
threeDays = MessageTemplateText(name="threeDays", text="3")
bindings = WhatsAppMessageTemplateBindings(body=[WhatsAppMessageTemplateBindingsComponent(ref_value=threeDays.name)])
shippingConfirmationTemplate.bindings = bindings
shippingConfirmationTemplate.template_values=[threeDays]
template_options = TemplateNotificationContent(
    channel_registration_id=self.channel_id, to=[self.phone_number], template=shippingConfirmationTemplate
)

Enviar un mensaje de plantilla con el parámetro multimedia en el encabezado

Use MessageTemplateImage, MessageTemplateVideo o MessageTemplateDocument para definir el parámetro multimedia en un encabezado.

Definición de plantilla con el parámetro de imagen multimedia en el encabezado:

{
  "type": "HEADER",
  "format": "IMAGE"
},

format puede tener diferentes tipos multimedia compatibles con WhatsApp. En el SDK de .NET, cada tipo de medio usa un tipo MessageTemplateValue correspondiente.

Format Tipo MessageTemplateValue Tipo de archivo
IMAGE MessageTemplateImage png, jpg
VÍDEO MessageTemplateVideo mp4
DOCUMENT MessageTemplateDocument pdf

Para obtener más información sobre los tipos de contenido multimedia admitidos y los límites de tamaño, consulte Documentación de WhatsApp para los mensajes multimedia.

Ejemplos

Plantilla sample_movie_ticket_confirmation:

Captura de pantalla que muestra los detalles de la plantilla denominada sample_movie_ticket_confirmation.

En este ejemplo, el encabezado de la plantilla requiere una imagen:

{
  "type": "HEADER",
  "format": "IMAGE"
},

Y el cuerpo de la plantilla requiere cuatro parámetros de texto:

{
  "type": "BODY",
  "text": "Your ticket for *{{1}}*\n*Time* - {{2}}\n*Venue* - {{3}}\n*Seats* - {{4}}"
},

Cree una MessageTemplateImage y cuatro variables de MessageTemplateText. A continuación, reúna la lista de MessageTemplateValue y el MessageTemplateWhatsAppBindings proporcionando los parámetros en el orden en que aparecen en el contenido de la plantilla.

 # Setting template options
templateName = "sample_movie_ticket_confirmation"
templateLanguage = "en_us" 
imageUrl = "https://aka.ms/acsicon1"
sample_movie_ticket_confirmation: MessageTemplate = MessageTemplate(name=templateName, language=templateLanguage )
image = MessageTemplateImage(name="image", url=imageUrl)
title = MessageTemplateText(name="title", text="Contoso")
time = MessageTemplateText(name="time", text="July 1st, 2023 12:30PM")
venue = MessageTemplateText(name="venue", text="Southridge Video")
seats = MessageTemplateText(name="seats", text="Seat 1A")

bindings = WhatsAppMessageTemplateBindings(header=[WhatsAppMessageTemplateBindingsComponent(ref_value=image.name)],
                                            body=[WhatsAppMessageTemplateBindingsComponent(ref_value=title.name),
                                                    WhatsAppMessageTemplateBindingsComponent(ref_value=time.name),
                                                    WhatsAppMessageTemplateBindingsComponent(ref_value=venue.name),
                                                    WhatsAppMessageTemplateBindingsComponent(ref_value=seats.name)])
sample_movie_ticket_confirmation.bindings = bindings
sample_movie_ticket_confirmation.template_values=[image,title,time,venue,seats]
template_options = TemplateNotificationContent(
    channel_registration_id=self.channel_id, to=[self.phone_number], template=sample_movie_ticket_confirmation)

Enviar un mensaje de plantilla con los botones de respuesta rápida

Use MessageTemplateQuickAction para definir la carga útil para los botones de respuesta rápida y los objetos MessageTemplateQuickAction tienen los tres atributos siguientes.

Propiedades Descripción Tipo
Nombre El name cuyo valor se va a buscar en MessageTemplateWhatsAppBindings. string
Texto La opción de acción rápida text. string
Carga útil El payload asignado a un botón está disponible en una respuesta de mensaje si el usuario selecciona el botón. string

Definición de plantilla con botones de respuesta rápida:

{
  "type": "BUTTONS",
  "buttons": [
    {
      "type": "QUICK_REPLY",
      "text": "Yes"
    },
    {
      "type": "QUICK_REPLY",
      "text": "No"
    }
  ]
}

El orden en que aparecen los botones en la definición de plantilla debe coincidir con el orden en que se definen los botones al crear los enlaces con MessageTemplateWhatsAppBindings.

Para obtener más información sobre la carga de respuestas rápidas del usuario, consulte la documentación de WhatsApp sobre Devolución de una llamada recibida desde un botón de respuesta rápida.

Ejemplo

Plantilla sample_issue_resolution:

Captura de pantalla que muestra los detalles de la plantilla denominada sample_issue_resolution.

Aquí, el cuerpo de la plantilla requiere un parámetro de texto:

{
  "type": "BODY",
  "text": "Hi {{1}}, were we able to solve the issue that you were facing?"
},

La plantilla incluye dos botones de respuesta rellenados previamente: Yes y No.

{
  "type": "BUTTONS",
  "buttons": [
    {
      "type": "QUICK_REPLY",
      "text": "Yes"
    },
    {
      "type": "QUICK_REPLY",
      "text": "No"
    }
  ]
}

Cree una MessageTemplateText y dos variables de MessageTemplateQuickAction. A continuación, reúna la lista de MessageTemplateValue y el MessageTemplateWhatsAppBindings proporcionando los parámetros en el orden en que aparecen en el contenido de la plantilla. El orden también es importante al definir los botones de enlace.

# Setting template options
templateName = "sample_issue_resolution"
templateLanguage = "en_us" 
shippingConfirmationTemplate: MessageTemplate = MessageTemplate(name=templateName, language=templateLanguage )
name = MessageTemplateText(name="first", text="Joe")
yes = MessageTemplateQuickAction(name="Yes", payload="Joe said yes")
no = MessageTemplateQuickAction(name="No", payload = "Joe said no")
bindings = WhatsAppMessageTemplateBindings(body=[WhatsAppMessageTemplateBindingsComponent(ref_value=name.name)])
bindings.buttons = [WhatsAppMessageTemplateBindingsButton(sub_type=WhatsAppMessageButtonSubType.QUICK_REPLY, ref_value=yes.name),
                    WhatsAppMessageTemplateBindingsButton(sub_type=WhatsAppMessageButtonSubType.QUICK_REPLY, ref_value=no.name)]
shippingConfirmationTemplate.bindings = bindings
shippingConfirmationTemplate.template_values=[name,yes,no]
template_options = TemplateNotificationContent(
    channel_registration_id=self.channel_id, to=[self.phone_number], template=shippingConfirmationTemplate
)

Enviar un mensaje de plantilla con la ubicación en el encabezado

Use MessageTemplateLocation para definir el parámetro location en un encabezado.

Definición de plantilla para el componente del encabezado que requiere la ubicación como:

{
  "type": "header",
  "parameters": [
    {
      "type": "location",
      "location": {
        "latitude": "<LATITUDE>",
        "longitude": "<LONGITUDE>",
        "name": "<NAME>",
        "address": "<ADDRESS>"
      }
    }
  ]
}

format puede requerir diferentes tipos de contenido multimedia. En el SDK de .NET, cada tipo de medio usa un tipo MessageTemplateValue correspondiente.

Propiedades Descripción Tipo
ADDRESS Dirección que aparecerá después del valor NAME, debajo del mapa genérico que hay en la parte superior del mensaje. string
LATITUDE Latitud de ubicación. doble
LONGITUDE Longitud de ubicación. doble
LOCATIONNAME Texto que aparecerá inmediatamente debajo del mapa genérico de la parte superior del mensaje. string

Para más información sobre las plantillas basadas en ubicaciones, consulte la Documentación de WhatsApp para mensajes multimedia.

Ejemplo

Plantilla sample_movie_location:

Captura de pantalla que muestra los detalles de la plantilla denominada sample_location_template.

Ensamblado de la plantilla de mensajes basada en la ubicación:

 # Setting template options
        templateName = "sample_movie_location"
        templateLanguage = "en_us" 
        sample_movie_location: MessageTemplate = MessageTemplate(name=templateName, language=templateLanguage )
        name = MessageTemplateText(name="first", text="Joe")
        location = MessageTemplateLocation(name="location", location_name="Pablo Morales",
                                            address="1 Hacker Way, Menlo Park, CA 94025",
                                            latitude=37.483307,longitude=122.148981)
        bindings = WhatsAppMessageTemplateBindings(body=[WhatsAppMessageTemplateBindingsComponent(ref_value=name.name)],
                                                    header=[WhatsAppMessageTemplateBindingsComponent(ref_value=location.name)])
        sample_movie_location.bindings = bindings
        sample_movie_location.template_values=[name,location]
        template_options = TemplateNotificationContent(
            channel_registration_id=self.channel_id, to=[self.phone_number], template=sample_movie_location)

Use MessageTemplateQuickAction para definir el sufijo URL para los botones de llamada a la acción y el objeto MessageTemplateQuickAction tiene los dos atributos siguientes.

Propiedades Descripción Tipo
Nombre El name se usa para buscar el valor en MessageTemplateWhatsAppBindings. string
Texto El text anexado a la dirección URL. string

Botones de definición de plantilla:

{
  "type": "BUTTONS",
  "buttons": [
    {
      "type": "URL",
      "text": "Take Survey",
      "url": "https://www.example.com/{{1}}"
    }
  ]
}

El orden en que aparecen los botones en la definición de plantilla debe coincidir con el orden en que se definen los botones al crear los enlaces con MessageTemplateWhatsAppBindings.

Ejemplo

Plantilla sample_purchase_feedback:

Esta plantilla de ejemplo agrega un botón con un vínculo de dirección URL dinámica al mensaje. También usa una imagen en el encabezado y un parámetro de texto en el cuerpo. Cree plantillas del botón de llamada a la acción con el tipo de dirección URL Dynamic para el tipo de acción View website.

Captura de pantalla que muestra la edición del tipo de dirección URL en el administrador de WhatsApp.

En este ejemplo, el encabezado de la plantilla requiere una imagen:

{
  "type": "HEADER",
  "format": "IMAGE"
},

Aquí, el cuerpo de la plantilla requiere un parámetro de texto:

{
  "type": "BODY",
  "text": "Thank you for purchasing {{1}}! We value your feedback and would like to learn more about your experience."
},

Y la plantilla incluye un botón de dirección URL dinámica con un parámetro:

{
  "type": "BUTTONS",
  "buttons": [
    {
      "type": "URL",
      "text": "Take Survey",
      "url": "https://www.example.com/{{1}}"
    }
  ]
}

Cree una MessageTemplateImage, una MessageTemplateText y una variable MessageTemplateQuickAction. A continuación, reúna la lista de MessageTemplateValue y el MessageTemplateWhatsAppBindings proporcionando los parámetros en el orden en que aparecen en el contenido de la plantilla. El orden también es importante al definir los botones del enlace.

# Setting template options
        templateName = "sample_purchase_feedback"
        templateLanguage = "en_us"
        imageUrl = "https://aka.ms/acsicon1" 
        sample_purchase_feedback: MessageTemplate = MessageTemplate(name=templateName, language=templateLanguage )
        name = MessageTemplateText(name="first", text="Joe")
        image = MessageTemplateImage(name="image", url=imageUrl)
        uri_to_click = MessageTemplateQuickAction(name="url", text="questions")

        bindings = WhatsAppMessageTemplateBindings(body=[WhatsAppMessageTemplateBindingsComponent(ref_value=name.name)],
                                                    header=[WhatsAppMessageTemplateBindingsComponent(ref_value=image.name)],
                                                    buttons=[WhatsAppMessageTemplateBindingsButton(sub_type=WhatsAppMessageButtonSubType.URL,
                                                    ref_value=uri_to_click.name)])
        sample_purchase_feedback.bindings = bindings
        sample_purchase_feedback.template_values=[name, image, uri_to_click]
        template_options = TemplateNotificationContent(
            channel_registration_id=self.channel_id, to=[self.phone_number], template=sample_purchase_feedback)

Ejemplo completo

import os
import sys

sys.path.append("..")

class SendWhatsAppTemplateMessageSample(object):

    connection_string = os.getenv("COMMUNICATION_SAMPLES_CONNECTION_STRING")
    phone_number = os.getenv("RECIPIENT_PHONE_NUMBER")
    channel_id = os.getenv("WHATSAPP_CHANNEL_ID")

    def send_template_message_without_parameters(self):
        from azure.communication.messages import NotificationMessagesClient
        from azure.communication.messages.models import ( TemplateNotificationContent , MessageTemplate )

        # client creation
        messaging_client = NotificationMessagesClient.from_connection_string(self.connection_string)
        input_template: MessageTemplate = MessageTemplate(
            name="<<TEMPLATE_NAME>>",
            language="<<LANGUAGE>>")
        template_options = TemplateNotificationContent(
            channel_registration_id=self.channelRegistrationId,
            to=[self.phone_number],
            template=input_template
        )

        # calling send() with WhatsApp template details.
        message_responses = messaging_client.send(template_options)
        response = message_responses.receipts[0]
        
        if (response is not None):
            print("WhatsApp Templated Message with message id {} was successfully sent to {}"
            .format(response.message_id, response.to))
        else:
            print("Message failed to send")

    def send_template_message_with_parameters(self):

        from azure.communication.messages import NotificationMessagesClient
        from azure.communication.messages.models import (TemplateNotificationContent, MessageTemplate,
        MessageTemplateText, WhatsAppMessageTemplateBindings, WhatsAppMessageTemplateBindingsComponent)

        messaging_client = NotificationMessagesClient.from_connection_string(self.connection_string)

        # Setting template options
        templateName = "sample_shipping_confirmation"
        templateLanguage = "en_us" 
        shippingConfirmationTemplate: MessageTemplate = MessageTemplate(name=templateName, language=templateLanguage )
        threeDays = MessageTemplateText(name="threeDays", text="3")
        bindings = WhatsAppMessageTemplateBindings(body=[WhatsAppMessageTemplateBindingsComponent(ref_value=threeDays.name)])
        shippingConfirmationTemplate.bindings = bindings
        shippingConfirmationTemplate.template_values=[threeDays]
        template_options = TemplateNotificationContent(
            channel_registration_id=self.channel_id, to=[self.phone_number], template=shippingConfirmationTemplate
        )

        # calling send() with whatsapp message details
        message_responses = messaging_client.send(template_options)
        response = message_responses.receipts[0]
        print("WhatsApp text parameters Templated Message with message id {} was successfully sent to {}"
            .format(response.message_id, response.to))

    def send_template_message_with_media(self):

        from azure.communication.messages import NotificationMessagesClient
        from azure.communication.messages.models import (TemplateNotificationContent, MessageTemplate,
        MessageTemplateText, WhatsAppMessageTemplateBindings, WhatsAppMessageTemplateBindingsComponent,
        MessageTemplateImage)

        messaging_client = NotificationMessagesClient.from_connection_string(self.connection_string)

        # Setting template options
        templateName = "sample_movie_ticket_confirmation"
        templateLanguage = "en_us" 
        imageUrl = "https://aka.ms/acsicon1"
        sample_movie_ticket_confirmation: MessageTemplate = MessageTemplate(name=templateName, language=templateLanguage )
        image = MessageTemplateImage(name="image", url=imageUrl)
        title = MessageTemplateText(name="title", text="Contoso")
        time = MessageTemplateText(name="time", text="July 1st, 2023 12:30PM")
        venue = MessageTemplateText(name="venue", text="Southridge Video")
        seats = MessageTemplateText(name="seats", text="Seat 1A")

        bindings = WhatsAppMessageTemplateBindings(header=[WhatsAppMessageTemplateBindingsComponent(ref_value=image.name)],
                                                   body=[WhatsAppMessageTemplateBindingsComponent(ref_value=title.name),
                                                         WhatsAppMessageTemplateBindingsComponent(ref_value=time.name),
                                                         WhatsAppMessageTemplateBindingsComponent(ref_value=venue.name),
                                                         WhatsAppMessageTemplateBindingsComponent(ref_value=seats.name)])

        sample_movie_ticket_confirmation.bindings = bindings
        sample_movie_ticket_confirmation.template_values=[image,title,time,venue,seats]
        template_options = TemplateNotificationContent(
            channel_registration_id=self.channel_id, to=[self.phone_number], template=sample_movie_ticket_confirmation)

        # calling send() with whatsapp message details
        message_responses = messaging_client.send(template_options)
        response = message_responses.receipts[0]
        print("WhatsApp media parameters in templated message header with message id {} was successfully sent to {}"
            .format(response.message_id, response.to))

    def send_template_message_with_buttons(self):

        from azure.communication.messages import NotificationMessagesClient
        from azure.communication.messages.models import (TemplateNotificationContent, MessageTemplate,
        MessageTemplateText, WhatsAppMessageTemplateBindings, WhatsAppMessageTemplateBindingsComponent,
        MessageTemplateQuickAction, WhatsAppMessageTemplateBindingsButton, WhatsAppMessageButtonSubType)

        messaging_client = NotificationMessagesClient.from_connection_string(self.connection_string)

        # Setting template options
        templateName = "sample_issue_resolution"
        templateLanguage = "en_us" 
        shippingConfirmationTemplate: MessageTemplate = MessageTemplate(name=templateName, language=templateLanguage )
        name = MessageTemplateText(name="first", text="Joe")
        yes = MessageTemplateQuickAction(name="Yes", payload="Joe said yes")
        no = MessageTemplateQuickAction(name="No", payload = "Joe said no")
        bindings = WhatsAppMessageTemplateBindings(body=[WhatsAppMessageTemplateBindingsComponent(ref_value=name.name)])
        bindings.buttons = [WhatsAppMessageTemplateBindingsButton(sub_type=WhatsAppMessageButtonSubType.QUICK_REPLY, ref_value=yes.name),
                            WhatsAppMessageTemplateBindingsButton(sub_type=WhatsAppMessageButtonSubType.QUICK_REPLY, ref_value=no.name)]
        shippingConfirmationTemplate.bindings = bindings
        shippingConfirmationTemplate.template_values=[name,yes,no]
        template_options = TemplateNotificationContent(
            channel_registration_id=self.channel_id, to=[self.phone_number], template=shippingConfirmationTemplate
        )

        # calling send() with whatsapp message details
        message_responses = messaging_client.send(template_options)
        response = message_responses.receipts[0]
        print("WhatsApp Quick Button Templated Message with message id {} was successfully sent to {}"
            .format(response.message_id, response.to))

    def send_template_message_with_location(self):

        from azure.communication.messages import NotificationMessagesClient
        from azure.communication.messages.models import (TemplateNotificationContent, MessageTemplate,
        MessageTemplateText, WhatsAppMessageTemplateBindings, WhatsAppMessageTemplateBindingsComponent,
        MessageTemplateLocation)

        messaging_client = NotificationMessagesClient.from_connection_string(self.connection_string)

        # Setting template options
        templateName = "sample_movie_location"
        templateLanguage = "en_us" 
        sample_movie_location: MessageTemplate = MessageTemplate(name=templateName, language=templateLanguage )
        name = MessageTemplateText(name="first", text="Joe")
        location = MessageTemplateLocation(name="location", location_name="Pablo Morales",
                                            address="1 Hacker Way, Menlo Park, CA 94025",
                                            latitude=37.483307,longitude=122.148981)
        bindings = WhatsAppMessageTemplateBindings(body=[WhatsAppMessageTemplateBindingsComponent(ref_value=name.name)],
                                                    header=[WhatsAppMessageTemplateBindingsComponent(ref_value=location.name)])
        sample_movie_location.bindings = bindings
        sample_movie_location.template_values=[name,location]
        template_options = TemplateNotificationContent(
            channel_registration_id=self.channel_id, to=[self.phone_number], template=sample_movie_location)

        # calling send() with whatsapp message details
        message_responses = messaging_client.send(template_options)
        response = message_responses.receipts[0]
        print("WhatsApp Location Templated Message with message id {} was successfully sent to {}"
            .format(response.message_id, response.to))

    def send_template_message_with_call_to_action(self):

        from azure.communication.messages import NotificationMessagesClient
        from azure.communication.messages.models import (TemplateNotificationContent, MessageTemplate,
        MessageTemplateText, WhatsAppMessageTemplateBindings, WhatsAppMessageTemplateBindingsComponent,
        MessageTemplateQuickAction, MessageTemplateImage, WhatsAppMessageTemplateBindingsButton,
        WhatsAppMessageButtonSubType)

        messaging_client = NotificationMessagesClient.from_connection_string(self.connection_string)

        # Setting template options
        templateName = "sample_purchase_feedback"
        templateLanguage = "en_us"
        imageUrl = "https://aka.ms/acsicon1" 
        sample_purchase_feedback: MessageTemplate = MessageTemplate(name=templateName, language=templateLanguage )
        name = MessageTemplateText(name="first", text="Joe")
        image = MessageTemplateImage(name="image", url=imageUrl)
        uri_to_click = MessageTemplateQuickAction(name="url", text="questions")

        bindings = WhatsAppMessageTemplateBindings(body=[WhatsAppMessageTemplateBindingsComponent(ref_value=name.name)],
                                                    header=[WhatsAppMessageTemplateBindingsComponent(ref_value=image.name)],
                                                    buttons=[WhatsAppMessageTemplateBindingsButton(sub_type=WhatsAppMessageButtonSubType.URL,
                                                                                                    ref_value=uri_to_click.name)])
        sample_purchase_feedback.bindings = bindings
        sample_purchase_feedback.template_values=[name, image, uri_to_click]
        template_options = TemplateNotificationContent(
            channel_registration_id=self.channel_id, to=[self.phone_number], template=sample_purchase_feedback)

        # calling send() with whatsapp message details
        message_responses = messaging_client.send(template_options)
        response = message_responses.receipts[0]
        print("WhatsApp Call To Action Templated Message with message id {} was successfully sent to {}"
        .format(response.message_id, response.to))

if __name__ == "__main__":
    sample = SendWhatsAppTemplateMessageSample()
    sample.send_template_message_without_parameters()
    sample.send_template_message_with_parameters()
    sample.send_template_message_with_buttons()
    sample.send_template_message_with_location()
    sample.send_template_message_with_call_to_action()

Ejecución del código

Para ejecutar el código, asegúrese de que se encuentra en el directorio donde está el archivo messages-quickstart.py.

python messages-quickstart.py
Azure Communication Services - Advanced Messages Quickstart
WhatsApp Templated Message with message id <<GUID>> was successfully sent to <<ToRecipient>>

Pasos siguientes