Partilhar via


Enviar mensagens modelo do WhatsApp

Este documento fornece orientação para enviar mensagens de 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 de 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 é limitada em quais tipos de mensagens eles podem enviar. Somente depois que o usuário envia uma mensagem para a empresa, a empresa tem permissão para enviar mensagens de texto ou mídia para o usuário durante a conversa ativa. Quando a janela de conversa de 24 horas expirar, a conversa deve ser reiniciada. Para saber mais sobre conversas, consulte a definição em Plataforma WhatsApp Business.

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

Escolher 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 estar automaticamente disponível para você experimentar. Consulte o uso de alguns desses modelos de exemplo em Exemplos.

Criar o 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.

Modelos de lista

Pode ver os seus modelos no portal do Azure acedendo aos seus Modelos de recursos > do Serviço de Comunicação do Azure.

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

Ao selecionar um modelo, você pode visualizar os detalhes do modelo.
O content campo de detalhes do modelo pode incluir ligações de parâmetros. As ligações de parâmetros podem ser indicadas como:

  • Um campo "format" 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 vinculação devem ser fornecidos para criar o modelo de mensagem.

Screenshot that shows template details.

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

Para listar seus modelos programaticamente, você pode buscar todos os modelos para o ID do 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 usar 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 vinculaçã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}}"
},

Montagem 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, MessageTemplateVideoou MessageTemplateDocument para definir o parâmetro media em um cabeçalho.

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.

Formato Tipo MessageTemplateValue File Type
IMAGEM MessageTemplateImage PNG, JPG
VÍDEO MessageTemplateVideo mp4
DOCUMENTO MessageTemplateDocument pdf

Para obter mais informações sobre tipos de mídia suportados e limites de tamanho, consulte a documentação do WhatsApp para mídia de mensagens.

Montagem 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 botões de resposta rápida

Use MessageTemplateQuickAction para definir a carga útil para botões de resposta rápida.

MessageTemplateQuickAction objetos e têm os seguintes três atributos.
Especificamente para botões de resposta rápida, siga estas diretrizes para criar seu MessageTemplateQuickAction objeto.

  • name
    O name é usado para procurar o valor em MessageTemplateWhatsAppBindings.
  • text
    O text atributo 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 do modelo deve corresponder à ordem em que os botões são definidos ao criar as ligações com MessageTemplateWhatsAppBindings.

Montagem 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 a carga útil em respostas rápidas do usuário, consulte 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 para ação

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

MessageTemplateQuickAction objetos e têm os seguintes três atributos.
Especificamente para botões de chamada para ação, siga estas diretrizes para criar seu MessageTemplateQuickAction objeto.

  • name
    O name é usado para procurar o valor em MessageTemplateWhatsAppBindings.
  • text
    O text atributo define o texto que é anexado à URL.
  • payload
    O payload atributo 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 do modelo deve corresponder à ordem em que os botões são definidos ao criar as ligações com MessageTemplateWhatsAppBindings.

Montagem 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 exemplo disponíveis para Contas do WhatsApp Business criadas por meio da inscrição incorporada do portal do Azure.

Usar modelo de exemplo sample_template

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

Screenshot that shows template details for template named sample_template.

Monte o MessageTemplate fazendo referência ao nome e idioma do modelo de destino.

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

var sampleTemplate = new MessageTemplate(templateName, templateLanguage); 

Usar modelo de exemplo sample_shipping_confirmation

Alguns modelos usam parâmetros. Inclua apenas os parâmetros que o modelo exige. A inclusão de parâmetros que não estão no modelo é inválida.

Screenshot that shows template details for template named 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 MessageTemplateValue valores e MessageTemplateWhatsAppBindings ligações. Use os valores e as ligações para montar o MessageTemplatearquivo .

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 modelo de exemplo sample_movie_ticket_confirmation

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

Screenshot that shows template details for template named 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 MessageTemplateText variáveis. Em seguida, monte sua lista de e sua MessageTemplateWhatsAppBindings fornecendo os parâmetros na ordem em que os parâmetros aparecem no conteúdo do MessageTemplateValue 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 modelo de exemplo sample_happy_hour_announcement

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

Screenshot that shows template details for template named 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 o vídeo mp4 hospedado. Para obter mais informações sobre tipos de mídia suportados e limites de tamanho, consulte a documentação do WhatsApp para mídia 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 MessageTemplateText variáveis. Em seguida, monte sua lista de e sua MessageTemplateWhatsAppBindings fornecendo os parâmetros na ordem em que os parâmetros aparecem no conteúdo do MessageTemplateValue 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 modelo de exemplo sample_flight_confirmation

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

Screenshot that shows template details for template named 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 pdf hospedado. Para obter mais informações sobre tipos de mídia suportados e limites de tamanho, consulte a documentação do WhatsApp para mídia 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 MessageTemplateText variáveis. Em seguida, monte sua lista de e sua MessageTemplateWhatsAppBindings fornecendo os parâmetros na ordem em que os parâmetros aparecem no conteúdo do MessageTemplateValue 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 modelo de exemplo sample_issue_resolution

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

Screenshot that shows template details for template named 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 Yes de resposta pré-preenchidos 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 MessageTemplateQuickAction objetos e têm três atributos:

  • name
    O name é usado para procurar o valor em MessageTemplateWhatsAppBindings.
  • text
    Usando os botões de resposta rápida, o text atributo 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, consulte a documentação do WhatsApp para Button Parameter Object.

Crie uma MessageTemplateText e duas MessageTemplateQuickAction variáveis. Em seguida, monte sua lista de e sua MessageTemplateWhatsAppBindings fornecendo os parâmetros na ordem em que os parâmetros aparecem no conteúdo do MessageTemplateValue modelo. A ordem também é importante ao definir os botões da sua ligaçã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 modelo de exemplo sample_purchase_feedback

Este modelo de exemplo adiciona um botão com um link de URL dinâmico para a mensagem. Ele também usa uma imagem no cabeçalho e um parâmetro de texto no corpo.

Se estiver usando o modelo sample_purchase_feedbackde exemplo pré-criado, você precisará modificar o Tipo de URL do botão de Static para Dynamic.
Acesse seus modelos de mensagem no gerenciador do WhatsApp e edite o modelo para sample_purchase_feedback. No menu suspenso para Tipo de URL, altere-o de Static para Dynamic. Inclua um exemplo de URL, se necessário.

Screenshot that shows editing URL Type in the WhatsApp manager.

Agora, se você exibir os detalhes do modelo no portal do Azure, verá: Screenshot that shows template details for template named 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 para ação para links de sites são definidos como MessageTemplateQuickAction objetos e têm três atributos:

  • name
    O name é usado para procurar o valor em MessageTemplateWhatsAppBindings.
  • text
    Usando o botão de chamada para ação para links de sites, o text atributo define o texto que é anexado à URL.
    Para este exemplo, o nosso text valor é survey-code. Na mensagem recebida pelo utilizador, é-lhe apresentado um botão que os liga ao URL https://www.example.com/survey-code.
  • payload
    Usando o botão de chamada para ação para links de sites, o payload atributo não é necessário.

Para obter mais informações sobre botões, consulte a documentação do WhatsApp para Button Parameter Object.

Crie uma MessageTemplateImage, uma MessageTemplateTexte uma MessageTemplateQuickAction variável. Em seguida, monte sua lista de e sua MessageTemplateWhatsAppBindings fornecendo os parâmetros na ordem em que os parâmetros aparecem no conteúdo do MessageTemplateValue modelo. A ordem também é importante ao definir os botões da sua ligaçã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óximos passos