Compartir a través de


Envío de mensajes de plantilla de WhatsApp

En este documento se proporcionan instrucciones para enviar mensajes de plantilla de WhatsApp mediante el SDK de mensajes de comunicación avanzados.

¿Por qué necesito enviar un mensaje de plantilla?

Una empresa solo puede enviar mensajes de plantilla hasta que el usuario envíe un mensaje a la empresa.

Una empresa o un usuario pueden iniciar una ventana de conversación, pero la empresa está limitada en cuanto al tipo de mensajes que puede enviar. 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.

Para más requisitos de WhatsApp sobre plantillas, consulte las referencias de la API de la Plataforma WhatsApp Business:

Elección de una plantilla

Cuando se crea una cuenta empresarial de WhatsApp a través de Azure Portal durante la suscripción insertada, es posible que un conjunto de plantillas de ejemplo esté disponible automáticamente para que las pruebe. Consulte el uso de algunas de estas plantillas de ejemplo en Ejemplos.

Creación de una plantilla

Para crear sus propias plantillas, use Meta WhatsApp Manager. Siga las instrucciones del Centro de ayuda de Meta Business en Crear plantillas de mensaje para la cuenta de WhatsApp Business.

Enumeración de plantillas

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

Screenshot that shows an Azure Communication Services resource in the Azure portal, viewing the 'Templates' tab.

Al seleccionar una plantilla, puede 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 "formato" 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.

Screenshot that shows template details.

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 identificador de canal:

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

Referencia rápida

Plantillas sin parámetros

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

var messageTemplate = new MessageTemplate(templateName, templateLanguage); 

Ejemplo

Plantillas 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, indizado iniciado en 1, indica el orden en el que se deben proporcionar los valores de enlace para crear la plantilla de mensaje.

Cuerpo de definición de plantilla:

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

Ensamblado de plantilla de mensaje:

var param1 = new MessageTemplateText(name: "first", text: "First Parameter");
var param2 = new MessageTemplateText(name: "second", text: "Second Parameter");

WhatsAppMessageTemplateBindings bindings = new();
bindings.Body.Add(new(param1.Name));
bindings.Body.Add(new(param2.Name));

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

Ejemplos

Plantillas con contenido multimedia en el encabezado

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

Encabezado de definición de plantilla que requiere medios de imagen:

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

El "formato" puede requerir diferentes tipos de contenido multimedia. 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.

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

Plantillas con botones de respuesta rápida

Use MessageTemplateQuickAction para definir la carga de los botones de respuesta rápida.

Objetos MessageTemplateQuickAction y tienen los tres atributos siguientes.
Específicamente para los botones de respuesta rápida, siga estas instrucciones para crear el objeto MessageTemplateQuickAction.

  • name
    El name se usa para buscar el valor en MessageTemplateWhatsAppBindings.
  • text
    No se usa el atributo text.
  • payload
    El payload asignado a un botón está disponible en una respuesta de mensaje si el usuario selecciona el botón.

Botones de definición de plantilla:

{
  "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.

Ensamblado de plantilla de mensaje:

var yes = new MessageTemplateQuickAction(name: "Yes", payload: "User said yes");
var no = new MessageTemplateQuickAction(name: "No", payload: "User said no");

var yesButton = new WhatsAppMessageTemplateBindingsButton(WhatsAppMessageButtonSubType.QuickReply.ToString(), yes.Name);
var noButton = new WhatsAppMessageTemplateBindingsButton(WhatsAppMessageButtonSubType.QuickReply.ToString(), no.Name);

WhatsAppMessageTemplateBindings bindings = new();
bindings.Buttons.Add(yesButton);
bindings.Buttons.Add(noButton);

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

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

Ejemplo

Plantillas con botones de llamada a la acción

Use MessageTemplateQuickAction para definir el sufijo url de los botones de llamada a la acción.

Objetos MessageTemplateQuickAction y tienen los tres atributos siguientes.
Específicamente para los botones de llamada a la acción, siga estas instrucciones para crear el objeto MessageTemplateQuickAction.

  • name
    El name se usa para buscar el valor en MessageTemplateWhatsAppBindings.
  • text
    El atributo text define el texto que se anexa a la dirección URL.
  • payload
    El atributo payload no es necesario.

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.

Ensamblado de plantilla de mensaje:

var urlSuffix = new MessageTemplateQuickAction(name: "text", text: "url-suffix-text");

var urlButton = new WhatsAppMessageTemplateBindingsButton(WhatsAppMessageButtonSubType.Url.ToString(), urlSuffix.Name);

WhatsAppMessageTemplateBindings bindings = new();
bindings.Buttons.Add(urlButton);

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

Ejemplo

Ejemplos

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

Uso de sample_template de plantilla de ejemplo

La plantilla de ejemplo denominada sample_template no toma parámetros.

Screenshot that shows template details for template named 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); 

Uso de sample_shipping_confirmation de plantilla de ejemplo

Algunas plantillas toman parámetros. Incluya solo los parámetros que requiere la plantilla. La inclusión de parámetros que no están en la plantilla no es válida.

Screenshot that shows template details for template named 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);

Uso de ample_movie_ticket_confirmation de plantilla de ejemplo

Las plantillas pueden requerir varios tipos de parámetros, como texto e imágenes.

Screenshot that shows template details for template named 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;

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.

Screenshot that shows template details for template named 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 para el 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 los parámetros 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.

Screenshot that shows template details for template named sample_flight_confirmation.

Aquí, el encabezado de la plantilla requiere un documento:

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

El documento debe ser una dirección URL para el 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 los parámetros 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;

Uso de sample_issue_resolution de plantilla de ejemplo

Esta plantilla de ejemplo agrega al mensaje dos botones de respuesta rellenados previamente. También incluye un parámetro de texto en el cuerpo.

Screenshot that shows template details for template named 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?"
},

Y 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"
    }
  ]
}

Los botones de respuesta rápida se definen como objetos MessageTemplateQuickAction y tienen tres atributos:

  • name
    El name se usa para buscar el valor en MessageTemplateWhatsAppBindings.
  • text
    Con los botones de respuesta rápida, no se usa el atributo text.
  • payload
    El payload asignado a un botón está disponible en una respuesta de mensaje si el usuario selecciona el botón.

Para obtener más información sobre los botones, consulte la documentación de WhatsApp sobre Objeto de parámetros de botones.

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 los parámetros 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;

Uso de sample_purchase_feedback de plantilla de ejemplo

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.

Si usa la plantilla de ejemplo sample_purchase_feedback creada previamente, debe modificar el tipo de dirección URL de su botón de Static a Dynamic.
Vaya a las plantillas de mensajes en el administrador de WhatsApp y edite la plantilla de sample_purchase_feedback. En la lista desplegable tipo de dirección URL, cámbiela de Static a Dynamic. Incluya una dirección URL de ejemplo si es necesario.

Screenshot that shows editing URL Type in the WhatsApp manager.

Ahora, si ve los detalles de la plantilla en Azure Portal, verá: Screenshot that shows template details for template named sample_purchase_feedback.

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}}"
    }
  ]
}

Los botones de llamada a la acción para los vínculos de sitios web se definen como objetos MessageTemplateQuickAction y tienen tres atributos:

  • name
    El name se usa para buscar el valor en MessageTemplateWhatsAppBindings.
  • text
    Con el botón de llamada a la acción para los vínculos del sitio web, el atributo text define el texto que se anexa a la dirección URL.
    En este ejemplo, nuestro valor de text es survey-code. En el mensaje recibido por el usuario, se les presenta un botón que los vincula a la dirección URL https://www.example.com/survey-code.
  • payload
    Con el botón de llamada a la acción para los vínculos del sitio web, no se requiere el atributo payload.

Para obtener más información sobre los botones, consulte la documentación de WhatsApp sobre Objeto de parámetros de botones.

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.

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;

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");
        }
    }
}

Pasos siguientes