Compartilhar via


Enviar mensagens de modelo do WhatsApp

Este documento fornece diretrizes para enviar mensagens do Modelo do WhatsApp usando o SDK de Mensagens de Comunicação Avançadas.

Por que preciso enviar uma mensagem de modelo?

Uma empresa só pode enviar mensagens modelo até que o usuário envie uma mensagem para a empresa.

Uma empresa ou um usuário pode iniciar uma janela de conversa, mas a empresa está limitada quanto aos tipos de mensagens que pode enviar. Somente depois que o usuário enviar uma mensagem para a empresa, a empresa poderá enviar mensagens de texto ou de mídia ao usuário durante a conversa ativa. Quando a janela de conversação de 24 horas expirar, a conversa deverá ser reiniciada. Para saber mais sobre conversas, consulte a definição em WhatsApp Business Platform.

Para obter mais requisitos do WhatsApp sobre modelos, consulte as referências da API da plataforma WhatsApp Business:

Escolhendo um modelo

Quando uma conta do WhatsApp Business é criada por meio do portal do Azure durante a inscrição incorporada, um conjunto de modelos de exemplo pode ficar automaticamente disponível para você experimentar. Confira o uso de alguns desses modelos de exemplos em Exemplos.

Criar modelo

Para criar seus próprios modelos, use o Meta WhatsApp Manager. Siga as instruções na Central de Ajuda do Meta Business em Criar modelos de mensagens para sua conta do WhatsApp Business.

Listar modelos

Você pode exibir seus modelos no portal do Azure acessando o recurso do Serviço de Comunicação do Azure > Modelos.

Captura de tela mostrando um recurso dos Serviços de Comunicação do Azure no portal do Azure, exibindo a guia 'Modelos'.

Ao selecionar um modelo, você poderá exibir os detalhes do modelo.
O campo content dos detalhes do modelo pode incluir associações de parâmetros. As associações de parâmetro podem ser indicadas como:

  • Um campo de "formato" com um valor como IMAGE.
  • Colchetes duplos ao redor de um número, como {{1}}. O número, indexado iniciado em 1, indica a ordem na qual os valores de associação devem ser fornecidos para criar o modelo de mensagem.

Captura de tela mostrando os detalhes do modelo.

Como alternativa, você pode exibir e editar todos os modelos da sua conta do WhatsApp Business nas ferramentas da conta do WhatsApp Manager> e dos >Modelos de mensagens.

Para listar seus modelos de forma programática, você pode buscar todos os modelos para a ID do seu canal:

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

Referência rápida

Modelos sem parâmetros

Se o modelo não aceitar parâmetros, você não precisará fornecer os valores ou associações ao criar o MessageTemplate.

var messageTemplate = new MessageTemplate(templateName, templateLanguage); 

Exemplo

Modelos com parâmetros de texto no corpo

Use MessageTemplateText para definir parâmetros no corpo indicados com colchetes duplos ao redor de um número, como {{1}}. O número, indexado iniciado em 1, indica a ordem na qual os valores de associação devem ser fornecidos para criar o modelo de mensagem.

Corpo da definição do modelo:

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

Assembly do modelo de mensagem:

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

Exemplos

Modelos com mídia no cabeçalho

Use MessageTemplateImage, MessageTemplateVideo, ou MessageTemplateDocument para definir o parâmetro de mídia em um cabeçalho.

O cabeçalho de definição de modelo que requer mídia de imagem:

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

O “formato” pode exigir diferentes tipos de mídia. No SDK do .NET, cada tipo de mídia usa um tipo MessageTemplateValue correspondente.

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

Para obter mais informações sobre os tipos de mídia com suporte e limites de tamanho, confira a documentação do WhatsApp para mídias de mensagens.

Assembly de modelo de mensagem para mídia de imagem:

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

Exemplos

Modelos com localização no cabeçalho

Use MessageTemplateLocation para definir o parâmetro de localização em um cabeçalho.

Definição de modelo para o componente de cabeçalho que requer a localização como:

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

O “formato” pode exigir diferentes tipos de mídia. No SDK do .NET, cada tipo de mídia usa um tipo MessageTemplateValue correspondente.

Propriedades Descrição Type
ADDRESS Endereço que aparecerá após o valor 'NOME', abaixo do mapa genérico na parte superior da mensagem. string
LATITUDE Latitude da localização. double
LONGITUDE Longitude da localização. double
LOCATIONNAME Texto que aparecerá logo abaixo do mapa genérico na parte superior da mensagem. string

Para obter mais informações sobre modelos baseados em localização, confira a documentação do WhatsApp para mídias de mensagens.

Montagem de modelo de mensagem baseada em localização:

 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;

Exemplo

Captura de tela mostrando detalhes do modelo para o modelo denominado sample_location_template.

Modelos com botões de resposta rápida

Use MessageTemplateQuickAction para definir o conteúdo para botões de resposta rápida.

Os objetos MessageTemplateQuickAction e tem os três atributos a seguir.
Especificamente para botões de resposta rápida, siga estas diretrizes para criar seu objeto MessageTemplateQuickAction.

  • name
    O name é usado para pesquisar o valor em MessageTemplateWhatsAppBindings.
  • text
    O atributo text não é usado.
  • payload
    O payload atribuído a um botão estará disponível em uma resposta de mensagem se o usuário selecionar o botão.

Botões de definição de modelo:

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

A ordem em que os botões aparecem na definição de modelo deve corresponder à ordem em que os botões são definidos ao criar as associações com o MessageTemplateWhatsAppBindings.

Assembly do modelo de mensagem:

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 obter mais informações sobre o conteúdo nas respostas rápidas do usuário, confira a documentação do WhatsApp para Retorno de Chamada Recebido de um Botão de Resposta Rápida.

Exemplo

Modelos com botões de chamada à ação

Use MessageTemplateQuickAction para definir o sufixo de URL para botões de chamada à ação.

Os objetos MessageTemplateQuickAction e tem os três atributos a seguir.
Especificamente para botões de chamada à ação, siga estas diretrizes para criar seu objeto MessageTemplateQuickAction.

  • name
    O name é usado para pesquisar o valor em MessageTemplateWhatsAppBindings.
  • text
    O atributo text define o texto que é acrescentado ao URL.
  • payload
    O atributo payload não é obrigatório.

Botões de definição de modelo:

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

A ordem em que os botões aparecem na definição de modelo deve corresponder à ordem em que os botões são definidos ao criar as associações com o MessageTemplateWhatsAppBindings.

Assembly do modelo de mensagem:

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

Exemplo

Exemplos

Esses exemplos utilizam modelos de exemplos disponíveis para contas do WhatsApp Business criadas por meio da inscrição incorporada no portal do Azure.

Usar o modelo de exemplo sample_template

O modelo de exemplo chamado sample_template não usa parâmetros.

Captura de tela mostrando detalhes do modelo para o modelo denominado sample_template.

Monte o MessageTemplate referenciando o nome e o idioma do modelo de destino.

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

var sampleTemplate = new MessageTemplate(templateName, templateLanguage); 

Usar o modelo de exemplo sample_shipping_confirmation

Alguns modelos assumem parâmetros. Inclua apenas os parâmetros necessários para o modelo. A inclusão de parâmetros que não estão no modelo é inválida.

Captura de tela mostrando detalhes do modelo para o modelo denominado sample_shipping_confirmation.

Neste exemplo, o corpo do modelo tem um parâmetro:

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

Os parâmetros são definidos com os valores MessageTemplateValue e as associações de MessageTemplateWhatsAppBindings. Use os valores e as associações para montar o 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);

Usar o modelo de exemplo sample_movie_ticket_confirmation

Os modelos podem exigir vários tipos de parâmetros, como texto e imagens.

Captura de tela mostrando detalhes do modelo para o modelo denominado sample_movie_ticket_confirmation.

Neste exemplo, o cabeçalho do modelo requer uma imagem:

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

E o corpo do modelo requer quatro parâmetros de texto:

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

Crie uma MessageTemplateImage e quatro variáveis MessageTemplateText. Em seguida, monte sua lista de MessageTemplateValue e seu MessageTemplateWhatsAppBindings fornecendo os parâmetros na ordem em que aparecem no conteúdo do modelo.

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;

Usar o modelo de exemplo sample_happy_hour_announcement

Esse modelo de exemplo usa um vídeo no cabeçalho e dois parâmetros de texto no corpo.

Captura de tela mostrando detalhes do modelo para o modelo denominado sample_happy_hour_announcement.

Aqui, o cabeçalho do modelo requer um vídeo:

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

O vídeo deve ser um URL para hospedar o vídeo mp4. Para obter mais informações sobre os tipos de mídia com suporte e limites de tamanho, confira a documentação do WhatsApp para mídias de mensagens.

E o corpo do modelo requer dois parâmetros de texto:

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

Crie uma MessageTemplateVideo e duas variáveis MessageTemplateText. Em seguida, monte sua lista de MessageTemplateValue e seu MessageTemplateWhatsAppBindings fornecendo os parâmetros na ordem em que aparecem no conteúdo do modelo.

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;

Usar o modelo de exemplo sample_flight_confirmation

Esse modelo de exemplo usa um documento no cabeçalho e três parâmetros de texto no corpo.

Captura de tela mostrando detalhes do modelo para o modelo denominado sample_flight_confirmation.

Aqui, o cabeçalho do modelo requer um documento:

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

O documento deve ser um URL para o documento em PDF hospedado. Para obter mais informações sobre os tipos de mídia com suporte e limites de tamanho, confira a documentação do WhatsApp para mídias de mensagens.

E o corpo do modelo requer três parâmetros de texto:

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

Crie uma MessageTemplateDocument e três variáveis MessageTemplateText. Em seguida, monte sua lista de MessageTemplateValue e seu MessageTemplateWhatsAppBindings fornecendo os parâmetros na ordem em que aparecem no conteúdo do modelo.

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;

Usar o modelo de exemplo sample_issue_resolution

Esse modelo de exemplo adiciona dois botões de resposta pré-preenchidos à mensagem. Ele também inclui um parâmetro de texto no corpo.

Captura de tela mostrando detalhes do modelo para o modelo denominado sample_issue_resolution.

Aqui, o corpo do modelo requer um parâmetro de texto:

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

E o modelo inclui dois botões de resposta pré-preenchidos, Yes e No.

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

Os botões de resposta rápida são definidos como objetos MessageTemplateQuickAction e têm três atributos:

  • name
    O name é usado para pesquisar o valor em MessageTemplateWhatsAppBindings.
  • text
    Usando os botões de resposta rápida, o atributo text não é usado.
  • payload
    O payload atribuído a um botão estará disponível em uma resposta de mensagem se o usuário selecionar o botão.

Para obter mais informações sobre botões, confira a documentação do WhatsApp para Objeto de Parâmetro do Botão.

Crie uma MessageTemplateText e duas variáveis MessageTemplateQuickAction. Em seguida, monte sua lista de MessageTemplateValue e seu MessageTemplateWhatsAppBindings fornecendo os parâmetros na ordem em que aparecem no conteúdo do modelo. A ordem também é importante ao definir os botões da associação.

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;

Usar o modelo de exemplo sample_purchase_feedback

Esse modelo de exemplo adiciona um botão com um link de URL dinâmico à mensagem. Também usa uma imagem no cabeçalho e um parâmetro de texto no corpo.

Se estiver usando o modelo de exemplo pré-criado sample_purchase_feedback, você precisará modificar o tipo de URL do botão de Static para Dynamic.
Acesse seus Modelos de mensagens no WhatsApp manager e edite o modelo para sample_purchase_feedback. Na lista suspensa para o Tipo de URL, altere-o de Static para Dynamic. Inclua um URL de exemplo, se necessário.

Captura de tela mostrando a edição do Tipo de URL no gerenciador do WhatsApp.

Agora, se exibir os detalhes do modelo no portal do Azure, você verá: Captura de tela mostrando os detalhes do modelo para o modelo denominado sample_purchase_feedback.

Neste exemplo, o cabeçalho do modelo requer uma imagem:

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

Aqui, o corpo do modelo requer um 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."
},

E o modelo inclui um botão de URL dinâmico com um parâmetro:

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

Os botões de chamada à ação para links de site são definidos como objetos MessageTemplateQuickAction e têm três atributos:

  • name
    O name é usado para pesquisar o valor em MessageTemplateWhatsAppBindings.
  • text
    Usando o botão de chamada à ação para links de site, o atributo text define o texto que é anexado ao URL.
    Neste exemplo, nosso valor de text é survey-code. Na mensagem recebida pelo usuário, é apresentado um botão que o vincula ao URL https://www.example.com/survey-code.
  • payload
    Usando o botão de chamada à ação para links de site, o atributo payload não é necessário.

Para obter mais informações sobre botões, confira a documentação do WhatsApp para Objeto de Parâmetro do Botão.

Crie uma MessageTemplateImage, uma MessageTemplateTexte uma variável MessageTemplateQuickAction. Em seguida, monte sua lista de MessageTemplateValue e seu MessageTemplateWhatsAppBindings fornecendo os parâmetros na ordem em que aparecem no conteúdo do modelo. A ordem também é importante ao definir os botões da associação.

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;

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

Próximas etapas