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:
- Criar e gerenciar modelos
- Componentes de modelo
- Envio de mensagens modelo
- As empresas também devem cumprir os requisitos de aceitação antes de enviar mensagens para usuários do WhatsApp
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.
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.
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
- Usar o modelo de exemplo sample_shipping_confirmation
- Usar o modelo de exemplo sample_movie_ticket_confirmation
- Usar o modelo de exemplo sample_happy_hour_announcement
- Usar o modelo de exemplo sample_flight_confirmation
- Usar o modelo de exemplo sample_issue_resolution
- Usar o modelo de exemplo sample_purchase_feedback
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 |
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
- IMAGEM: Usar o modelo de exemplo sample_movie_ticket_confirmation
- IMAGEM: Usar o modelo de exemplo sample_purchase_feedback
- VÍDEO: Usar o modelo de exemplo sample_happy_hour_announcement
- DOCUMENTO: Usar o modelo de exemplo sample_flight_confirmation
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
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
Oname
é usado para pesquisar o valor emMessageTemplateWhatsAppBindings
.text
O atributotext
não é usado.payload
Opayload
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
Oname
é usado para pesquisar o valor emMessageTemplateWhatsAppBindings
.text
O atributotext
define o texto que é acrescentado ao URL.payload
O atributopayload
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.
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.
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.
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.
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.
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.
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
Oname
é usado para pesquisar o valor emMessageTemplateWhatsAppBindings
.text
Usando os botões de resposta rápida, o atributotext
não é usado.payload
Opayload
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.
Agora, se exibir os detalhes do modelo no portal do Azure, você verá:
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
Oname
é usado para pesquisar o valor emMessageTemplateWhatsAppBindings
.text
Usando o botão de chamada à ação para links de site, o atributotext
define o texto que é anexado ao URL.
Neste exemplo, nosso valor detext
ésurvey-code
. Na mensagem recebida pelo usuário, é apresentado um botão que o vincula ao URLhttps://www.example.com/survey-code
.payload
Usando o botão de chamada à ação para links de site, o atributopayload
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 MessageTemplateText
e 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");
}
}
}