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:
- Criar e gerenciar modelos
- Componentes do modelo
- Enviando mensagens de modelo
- As empresas também devem aderir aos requisitos de aceitação antes de enviar mensagens aos usuários do WhatsApp
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.
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.
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
- Usar modelo de exemplo sample_shipping_confirmation
- Usar modelo de exemplo sample_movie_ticket_confirmation
- Usar modelo de exemplo sample_happy_hour_announcement
- Usar modelo de exemplo sample_flight_confirmation
- Usar modelo de exemplo sample_issue_resolution
- Usar modelo de exemplo sample_purchase_feedback
Modelos com mídia no cabeçalho
Use MessageTemplateImage
, MessageTemplateVideo
ou 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 |
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
- IMAGEM: Usar modelo de exemplo sample_movie_ticket_confirmation
- IMAGEM: Use o modelo de exemplo sample_purchase_feedback
- VÍDEO: Usar modelo de exemplo sample_happy_hour_announcement
- DOCUMENTO: Usar modelo de exemplo sample_flight_confirmation
Modelos com localização no cabeçalho
Use MessageTemplateLocation
para definir o parâmetro location em um cabeçalho.
Definição de modelo para o componente de cabeçalho que requer 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 | Description | Type |
---|---|---|
ENDEREÇO | Endereço que aparecerá após o valor 'NOME', abaixo do mapa genérico na parte superior da mensagem. | string |
LATITUDE | Latitude de localização. | duplo |
LONGITUDE | Localização longitude. | duplo |
LOCALIZAÇÃONOME | Texto que aparecerá imediatamente abaixo do mapa genérico na parte superior da mensagem. | string |
Para obter mais informações sobre modelos baseados em localização, consulte a documentação do WhatsApp para mídia de mensagens.
Montagem do modelo de mensagem com base no local:
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 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
Oname
é usado para procurar o valor emMessageTemplateWhatsAppBindings
.text
Otext
atributo 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 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
Oname
é usado para procurar o valor emMessageTemplateWhatsAppBindings
.text
Otext
atributo define o texto que é anexado à URL.payload
Opayload
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.
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.
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 MessageTemplate
arquivo .
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.
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.
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.
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.
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
Oname
é usado para procurar o valor emMessageTemplateWhatsAppBindings
.text
Usando os botões de resposta rápida, otext
atributo 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, 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_feedback
de 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.
Agora, se você exibir os detalhes do modelo no portal do Azure, 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 para ação para links de sites são definidos como MessageTemplateQuickAction
objetos e têm três atributos:
name
Oname
é usado para procurar o valor emMessageTemplateWhatsAppBindings
.text
Usando o botão de chamada para ação para links de sites, otext
atributo define o texto que é anexado à URL.
Para este exemplo, o nossotext
valor ésurvey-code
. Na mensagem recebida pelo utilizador, é-lhe apresentado um botão que os liga ao URLhttps://www.example.com/survey-code
.payload
Usando o botão de chamada para ação para links de sites, opayload
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 MessageTemplateText
e 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");
}
}
}