Envío de mensajes de plantilla de WhatsApp
En este documento se proporcionan instrucciones para enviar mensajes de plantilla de WhatsApp mediante el SDK de mensajes de comunicación avanzados.
¿Por qué necesito enviar un mensaje de plantilla?
Una empresa solo puede enviar mensajes de plantilla hasta que el usuario envíe un mensaje a la empresa.
Una empresa o un usuario pueden iniciar una ventana de conversación, pero la empresa está limitada en cuanto al tipo de mensajes que puede enviar. Solo después de que el usuario envíe un mensaje a la empresa, ésta podrá enviarle mensajes de texto o multimedia durante la conversación activa. Una vez transcurrido el plazo de 24 horas, la conversación debe reiniciarse. Para obtener más información sobre las conversaciones, consulte la definición en Plataforma de WhatsApp Business.
Para más requisitos de WhatsApp sobre plantillas, consulte las referencias de la API de la Plataforma WhatsApp Business:
- Creación y administración de plantillas
- Componentes de plantilla
- Enviar mensajes de plantilla
- Las empresas también deben cumplir losrequisitos de participación voluntaria antes de enviar mensajes a los usuarios de WhatsApp
Elección de una plantilla
Cuando se crea una cuenta empresarial de WhatsApp a través de Azure Portal durante la suscripción insertada, es posible que un conjunto de plantillas de ejemplo esté disponible automáticamente para que las pruebe. Consulte el uso de algunas de estas plantillas de ejemplo en Ejemplos.
Creación de una plantilla
Para crear sus propias plantillas, use Meta WhatsApp Manager. Siga las instrucciones del Centro de ayuda de Meta Business en Crear plantillas de mensaje para la cuenta de WhatsApp Business.
Enumeración de plantillas
Para ver las plantillas en Azure Portal, vaya al recurso de Azure Communication Service > Plantillas.
Al seleccionar una plantilla, puede ver los detalles.
El campo content
de los detalles de la plantilla puede incluir enlaces de parámetros. Los enlaces de parámetros se pueden indicar como:
- Un campo "formato" con un valor como
IMAGE
. - Corchetes dobles que rodean un número, como
{{1}}
. El número, indizado iniciado en 1, indica el orden en el que se deben proporcionar los valores de enlace para crear la plantilla de mensaje.
Como alternativa, puede ver y editar todas las plantillas de la cuenta empresarial de WhatsApp en las herramientas de WhatsApp Manager> Herramientas de cuenta >Plantillas de mensajes.
Para enumerar las plantillas mediante programación, puede capturar todas las plantillas para el identificador de canal:
MessageTemplateClient messageTemplateClient = new MessageTemplateClient(connectionString);
Pageable<MessageTemplateItem> templates = messageTemplateClient.GetTemplates(channelRegistrationId);
Referencia rápida
Plantillas sin parámetros
Si la plantilla no toma parámetros, no es necesario proporcionar los valores ni enlaces al crear el MessageTemplate
.
var messageTemplate = new MessageTemplate(templateName, templateLanguage);
Ejemplo
Plantillas con parámetros de texto en el cuerpo
Use MessageTemplateText
para definir parámetros en el cuerpo indicados con corchetes dobles que rodean un número, como {{1}}
. El número, indizado iniciado en 1, indica el orden en el que se deben proporcionar los valores de enlace para crear la plantilla de mensaje.
Cuerpo de definición de plantilla:
{
"type": "BODY",
"text": "Message with two parameters: {{1}} and {{2}}"
},
Ensamblado de plantilla de mensaje:
var param1 = new MessageTemplateText(name: "first", text: "First Parameter");
var param2 = new MessageTemplateText(name: "second", text: "Second Parameter");
WhatsAppMessageTemplateBindings bindings = new();
bindings.Body.Add(new(param1.Name));
bindings.Body.Add(new(param2.Name));
var messageTemplate = new MessageTemplate(templateName, templateLanguage);
messageTemplate.Bindings = bindings;
messageTemplate.Values.Add(param1);
messageTemplate.Values.Add(param2);
Ejemplos
- Use sample_shipping_confirmation de plantilla de ejemplo
- Use ample_movie_ticket_confirmation de plantilla de ejemplo
- Use sample_happy_hour_announcement de plantilla de ejemplo
- Use sample_flight_confirmation de plantilla de ejemplo
- Use sample_issue_resolution de plantilla de ejemplo
- Use sample_purchase_feedback de plantilla de ejemplo
Plantillas con contenido multimedia en el encabezado
Use MessageTemplateImage
, MessageTemplateVideo
o MessageTemplateDocument
para definir el parámetro multimedia en un encabezado.
Encabezado de definición de plantilla que requiere medios de imagen:
{
"type": "HEADER",
"format": "IMAGE"
},
El "formato" puede requerir diferentes tipos de contenido multimedia. En el SDK de .NET, cada tipo de medio usa un tipo MessageTemplateValue correspondiente.
Format | Tipo MessageTemplateValue | Tipo de archivo |
---|---|---|
IMAGE | MessageTemplateImage |
png, jpg |
VÍDEO | MessageTemplateVideo |
mp4 |
DOCUMENT | MessageTemplateDocument |
Para obtener más información sobre los tipos de contenido multimedia admitidos y los límites de tamaño, consulte Documentación de WhatsApp para los mensajes multimedia.
Ensamblado de plantilla de mensaje para medios de imagen:
var url = new Uri("< Your media URL >");
var media = new MessageTemplateImage("image", url);
WhatsAppMessageTemplateBindings bindings = new();
bindings.Header.Add(new(media.Name));
var messageTemplate = new MessageTemplate(templateName, templateLanguage);
template.Bindings = bindings;
template.Values.Add(media);
Ejemplos
- IMAGEN: Use ample_movie_ticket_confirmation de plantilla de ejemplo
- IMAGEN: Use sample_purchase_feedback de plantilla de ejemplo
- VÍDEO: Use sample_happy_hour_announcement de plantilla de ejemplo
- DOCUMENTO: Use sample_flight_confirmation de plantilla de ejemplo
Plantillas con botones de respuesta rápida
Use MessageTemplateQuickAction
para definir la carga de los botones de respuesta rápida.
Objetos MessageTemplateQuickAction
y tienen los tres atributos siguientes.
Específicamente para los botones de respuesta rápida, siga estas instrucciones para crear el objeto MessageTemplateQuickAction
.
name
Elname
se usa para buscar el valor enMessageTemplateWhatsAppBindings
.text
No se usa el atributotext
.payload
Elpayload
asignado a un botón está disponible en una respuesta de mensaje si el usuario selecciona el botón.
Botones de definición de plantilla:
{
"type": "BUTTONS",
"buttons": [
{
"type": "QUICK_REPLY",
"text": "Yes"
},
{
"type": "QUICK_REPLY",
"text": "No"
}
]
}
El orden en que aparecen los botones en la definición de plantilla debe coincidir con el orden en que se definen los botones al crear los enlaces con MessageTemplateWhatsAppBindings
.
Ensamblado de plantilla de mensaje:
var yes = new MessageTemplateQuickAction(name: "Yes", payload: "User said yes");
var no = new MessageTemplateQuickAction(name: "No", payload: "User said no");
var yesButton = new WhatsAppMessageTemplateBindingsButton(WhatsAppMessageButtonSubType.QuickReply.ToString(), yes.Name);
var noButton = new WhatsAppMessageTemplateBindingsButton(WhatsAppMessageButtonSubType.QuickReply.ToString(), no.Name);
WhatsAppMessageTemplateBindings bindings = new();
bindings.Buttons.Add(yesButton);
bindings.Buttons.Add(noButton);
var messageTemplate = new MessageTemplate(templateName, templateLanguage);
messageTemplate.Bindings = bindings;
template.Values.Add(yes);
template.Values.Add(no);
Para obtener más información sobre la carga de las respuestas rápidas del usuario, consulte la documentación de WhatsApp para devolución de una llamada recibida desde un botón de respuesta rápida.
Ejemplo
Plantillas con botones de llamada a la acción
Use MessageTemplateQuickAction
para definir el sufijo url de los botones de llamada a la acción.
Objetos MessageTemplateQuickAction
y tienen los tres atributos siguientes.
Específicamente para los botones de llamada a la acción, siga estas instrucciones para crear el objeto MessageTemplateQuickAction
.
name
Elname
se usa para buscar el valor enMessageTemplateWhatsAppBindings
.text
El atributotext
define el texto que se anexa a la dirección URL.payload
El atributopayload
no es necesario.
Botones de definición de plantilla:
{
"type": "BUTTONS",
"buttons": [
{
"type": "URL",
"text": "Take Survey",
"url": "https://www.example.com/{{1}}"
}
]
}
El orden en que aparecen los botones en la definición de plantilla debe coincidir con el orden en que se definen los botones al crear los enlaces con MessageTemplateWhatsAppBindings
.
Ensamblado de plantilla de mensaje:
var urlSuffix = new MessageTemplateQuickAction(name: "text", text: "url-suffix-text");
var urlButton = new WhatsAppMessageTemplateBindingsButton(WhatsAppMessageButtonSubType.Url.ToString(), urlSuffix.Name);
WhatsAppMessageTemplateBindings bindings = new();
bindings.Buttons.Add(urlButton);
var messageTemplate = new MessageTemplate(templateName, templateLanguage);
messageTemplate.Bindings = bindings;
messageTemplate.Values.Add(urlSuffix);
Ejemplo
Ejemplos
En estos ejemplos se usan plantillas de ejemplo disponibles para las cuentas empresariales de WhatsApp creadas a través del registro insertado de Azure Portal.
Uso de sample_template de plantilla de ejemplo
La plantilla de ejemplo denominada sample_template
no toma parámetros.
Ensamble el MessageTemplate
haciendo referencia al nombre y el idioma de la plantilla de destino.
string templateName = "sample_template";
string templateLanguage = "en_us";
var sampleTemplate = new MessageTemplate(templateName, templateLanguage);
Uso de sample_shipping_confirmation de plantilla de ejemplo
Algunas plantillas toman parámetros. Incluya solo los parámetros que requiere la plantilla. La inclusión de parámetros que no están en la plantilla no es válida.
En este ejemplo, el cuerpo de la plantilla tiene un parámetro:
{
"type": "BODY",
"text": "Your package has been shipped. It will be delivered in {{1}} business days."
},
Los parámetros se definen con los valores MessageTemplateValue
y los enlaces de MessageTemplateWhatsAppBindings
. Use los valores y enlaces para ensamblar el MessageTemplate
.
string templateName = "sample_shipping_confirmation";
string templateLanguage = "en_us";
var threeDays = new MessageTemplateText("threeDays", "3");
WhatsAppMessageTemplateBindings bindings = new();
bindings.Body.Add(new(threeDays.Name));
MessageTemplate shippingConfirmationTemplate = new(templateName, templateLanguage);
shippingConfirmationTemplate.Bindings = bindings;
shippingConfirmationTemplate.Values.Add(threeDays);
Uso de ample_movie_ticket_confirmation de plantilla de ejemplo
Las plantillas pueden requerir varios tipos de parámetros, como texto e imágenes.
En este ejemplo, el encabezado de la plantilla requiere una imagen:
{
"type": "HEADER",
"format": "IMAGE"
},
Y el cuerpo de la plantilla requiere cuatro parámetros de texto:
{
"type": "BODY",
"text": "Your ticket for *{{1}}*\n*Time* - {{2}}\n*Venue* - {{3}}\n*Seats* - {{4}}"
},
Cree una MessageTemplateImage
y cuatro variables de MessageTemplateText
. A continuación, reúna la lista de MessageTemplateValue
y el MessageTemplateWhatsAppBindings
proporcionando los parámetros en el orden en que los parámetros aparecen en el contenido de la plantilla.
string templateName = "sample_movie_ticket_confirmation";
string templateLanguage = "en_us";
var imageUrl = new Uri("https://aka.ms/acsicon1");
var image = new MessageTemplateImage("image", imageUrl);
var title = new MessageTemplateText("title", "Contoso");
var time = new MessageTemplateText("time", "July 1st, 2023 12:30PM");
var venue = new MessageTemplateText("venue", "Southridge Video");
var seats = new MessageTemplateText("seats", "Seat 1A");
WhatsAppMessageTemplateBindings bindings = new();
bindings.Header.Add(new(image.Name));
bindings.Body.Add(new(title.Name));
bindings.Body.Add(new(time.Name));
bindings.Body.Add(new(venue.Name));
bindings.Body.Add(new(seats.Name));
MessageTemplate movieTicketConfirmationTemplate = new(templateName, templateLanguage);
movieTicketConfirmationTemplate.Values.Add(image);
movieTicketConfirmationTemplate.Values.Add(title);
movieTicketConfirmationTemplate.Values.Add(time);
movieTicketConfirmationTemplate.Values.Add(venue);
movieTicketConfirmationTemplate.Values.Add(seats);
movieTicketConfirmationTemplate.Bindings = bindings;
Uso de sample_happy_hour_announcement de plantilla de ejemplo
Esta plantilla de ejemplo usa un vídeo en el encabezado y dos parámetros de texto en el cuerpo.
Aquí, el encabezado de la plantilla requiere un vídeo:
{
"type": "HEADER",
"format": "VIDEO"
},
El vídeo debe ser una dirección URL para el vídeo mp4 hospedado. Para obtener más información sobre los tipos de contenido multimedia admitidos y los límites de tamaño, consulte Documentación de WhatsApp para los mensajes multimedia.
Y el cuerpo de la plantilla requiere dos parámetros de texto:
{
"type": "BODY",
"text": "Happy hour is here! 🍺😀🍸\nPlease be merry and enjoy the day. 🎉\nVenue: {{1}}\nTime: {{2}}"
},
Cree una MessageTemplateVideo
y dos variables de MessageTemplateText
. A continuación, reúna la lista de MessageTemplateValue
y el MessageTemplateWhatsAppBindings
proporcionando los parámetros en el orden en que los parámetros aparecen en el contenido de la plantilla.
string templateName = "sample_happy_hour_announcement";
string templateLanguage = "en_us";
var videoUrl = new Uri("< Your .mp4 Video URL >");
var video = new MessageTemplateVideo("video", videoUrl);
var venue = new MessageTemplateText("venue", "Fourth Coffee");
var time = new MessageTemplateText("time", "Today 2-4PM");
WhatsAppMessageTemplateBindings bindings = new();
bindings.Header.Add(new(video.Name));
bindings.Body.Add(new(venue.Name));
bindings.Body.Add(new(time.Name));
MessageTemplate happyHourAnnouncementTemplate = new(templateName, templateLanguage);
happyHourAnnouncementTemplate.Values.Add(venue);
happyHourAnnouncementTemplate.Values.Add(time);
happyHourAnnouncementTemplate.Values.Add(video);
happyHourAnnouncementTemplate.Bindings = bindings;
Uso de sample_flight_confirmation de plantilla de ejemplo
Esta plantilla de ejemplo usa un documento en el encabezado y tres parámetros de texto en el cuerpo.
Aquí, el encabezado de la plantilla requiere un documento:
{
"type": "HEADER",
"format": "DOCUMENT"
},
El documento debe ser una dirección URL para el documento pdf hospedado. Para obtener más información sobre los tipos de contenido multimedia admitidos y los límites de tamaño, consulte Documentación de WhatsApp para los mensajes multimedia.
Y el cuerpo de la plantilla requiere tres parámetros de texto:
{
"type": "BODY",
"text": "This is your flight confirmation for {{1}}-{{2}} on {{3}}."
},
Cree una MessageTemplateDocument
y tres variables de MessageTemplateText
. A continuación, reúna la lista de MessageTemplateValue
y el MessageTemplateWhatsAppBindings
proporcionando los parámetros en el orden en que los parámetros aparecen en el contenido de la plantilla.
string templateName = "sample_flight_confirmation";
string templateLanguage = "en_us";
var documentUrl = new Uri("< Your .pdf document URL >");
var document = new MessageTemplateDocument("document", documentUrl);
var firstName = new MessageTemplateText("firstName", "Kat");
var lastName = new MessageTemplateText("lastName", "Larssen");
var date = new MessageTemplateText("date", "July 1st, 2023");
WhatsAppMessageTemplateBindings bindings = new();
bindings.Header.Add(new(document.Name));
bindings.Body.Add(new(firstName.Name));
bindings.Body.Add(new(lastName.Name));
bindings.Body.Add(new(date.Name));
MessageTemplate flightConfirmationTemplate = new(templateName, templateLanguage);
flightConfirmationTemplate.Values.Add(document);
flightConfirmationTemplate.Values.Add(firstName);
flightConfirmationTemplate.Values.Add(lastName);
flightConfirmationTemplate.Values.Add(date);
flightConfirmationTemplate.Bindings = bindings;
Uso de sample_issue_resolution de plantilla de ejemplo
Esta plantilla de ejemplo agrega al mensaje dos botones de respuesta rellenados previamente. También incluye un parámetro de texto en el cuerpo.
Aquí, el cuerpo de la plantilla requiere un parámetro de texto:
{
"type": "BODY",
"text": "Hi {{1}}, were we able to solve the issue that you were facing?"
},
Y la plantilla incluye dos botones de respuesta rellenados previamente: Yes
y No
.
{
"type": "BUTTONS",
"buttons": [
{
"type": "QUICK_REPLY",
"text": "Yes"
},
{
"type": "QUICK_REPLY",
"text": "No"
}
]
}
Los botones de respuesta rápida se definen como objetos MessageTemplateQuickAction
y tienen tres atributos:
name
Elname
se usa para buscar el valor enMessageTemplateWhatsAppBindings
.text
Con los botones de respuesta rápida, no se usa el atributotext
.payload
Elpayload
asignado a un botón está disponible en una respuesta de mensaje si el usuario selecciona el botón.
Para obtener más información sobre los botones, consulte la documentación de WhatsApp sobre Objeto de parámetros de botones.
Cree una MessageTemplateText
y dos variables de MessageTemplateQuickAction
. A continuación, reúna la lista de MessageTemplateValue
y el MessageTemplateWhatsAppBindings
proporcionando los parámetros en el orden en que los parámetros aparecen en el contenido de la plantilla. El orden también es importante al definir los botones del enlace.
string templateName = "sample_issue_resolution";
string templateLanguage = "en_us";
var name = new MessageTemplateText(name: "name", text: "Kat");
var yes = new MessageTemplateQuickAction(name: "Yes"){ Payload = "Kat said yes" };
var no = new MessageTemplateQuickAction(name: "No") { Payload = "Kat said no" };
WhatsAppMessageTemplateBindings bindings = new();
bindings.Body.Add(new(name.Name));
bindings.Buttons.Add(new(WhatsAppMessageButtonSubType.QuickReply.ToString(), yes.Name));
bindings.Buttons.Add(new(WhatsAppMessageButtonSubType.QuickReply.ToString(), no.Name));
MessageTemplate issueResolutionTemplate = new(templateName, templateLanguage);
issueResolutionTemplate.Values.Add(name);
issueResolutionTemplate.Values.Add(yes);
issueResolutionTemplate.Values.Add(no);
issueResolutionTemplate.Bindings = bindings;
Uso de sample_purchase_feedback de plantilla de ejemplo
Esta plantilla de ejemplo agrega un botón con un vínculo de dirección URL dinámica al mensaje. También usa una imagen en el encabezado y un parámetro de texto en el cuerpo.
Si usa la plantilla de ejemplo sample_purchase_feedback
creada previamente, debe modificar el tipo de dirección URL de su botón de Static
a Dynamic
.
Vaya a las plantillas de mensajes en el administrador de WhatsApp y edite la plantilla de sample_purchase_feedback
. En la lista desplegable tipo de dirección URL, cámbiela de Static
a Dynamic
. Incluya una dirección URL de ejemplo si es necesario.
Ahora, si ve los detalles de la plantilla en Azure Portal, verá:
En este ejemplo, el encabezado de la plantilla requiere una imagen:
{
"type": "HEADER",
"format": "IMAGE"
},
Aquí, el cuerpo de la plantilla requiere un parámetro de texto:
{
"type": "BODY",
"text": "Thank you for purchasing {{1}}! We value your feedback and would like to learn more about your experience."
},
Y la plantilla incluye un botón de dirección URL dinámica con un parámetro:
{
"type": "BUTTONS",
"buttons": [
{
"type": "URL",
"text": "Take Survey",
"url": "https://www.example.com/{{1}}"
}
]
}
Los botones de llamada a la acción para los vínculos de sitios web se definen como objetos MessageTemplateQuickAction
y tienen tres atributos:
name
Elname
se usa para buscar el valor enMessageTemplateWhatsAppBindings
.text
Con el botón de llamada a la acción para los vínculos del sitio web, el atributotext
define el texto que se anexa a la dirección URL.
En este ejemplo, nuestro valor detext
essurvey-code
. En el mensaje recibido por el usuario, se les presenta un botón que los vincula a la dirección URLhttps://www.example.com/survey-code
.payload
Con el botón de llamada a la acción para los vínculos del sitio web, no se requiere el atributopayload
.
Para obtener más información sobre los botones, consulte la documentación de WhatsApp sobre Objeto de parámetros de botones.
Cree una MessageTemplateImage
, una MessageTemplateText
y una variable MessageTemplateQuickAction
. A continuación, reúna la lista de MessageTemplateValue
y el MessageTemplateWhatsAppBindings
proporcionando los parámetros en el orden en que los parámetros aparecen en el contenido de la plantilla. El orden también es importante al definir los botones del enlace.
string templateName = "sample_purchase_feedback";
string templateLanguage = "en_us";
var imageUrl = new Uri("https://aka.ms/acsicon1");
var image = new MessageTemplateImage(name: "image", uri: imageUrl);
var product = new MessageTemplateText(name: "product", text: "coffee");
var urlSuffix = new MessageTemplateQuickAction(name: "text") { Text = "survey-code" };
WhatsAppMessageTemplateBindings bindings = new();
bindings.Header.Add(new(image.Name));
bindings.Body.Add(new(product.Name));
bindings.Buttons.Add(new(WhatsAppMessageButtonSubType.Url.ToString(), urlSuffix.Name));
MessageTemplate purchaseFeedbackTemplate = new("sample_purchase_feedback", "en_us");
purchaseFeedbackTemplate.Values.Add(image);
purchaseFeedbackTemplate.Values.Add(product);
purchaseFeedbackTemplate.Values.Add(urlSuffix);
purchaseFeedbackTemplate.Bindings = bindings;
Ejemplo de código completo
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Threading.Tasks;
using Azure;
using Azure.Communication.Messages;
using Azure.Communication.Messages.Models.Channels;
namespace SendTemplateMessages
{
class Program
{
public static async Task Main(string[] args)
{
Console.WriteLine("Azure Communication Services - Send WhatsApp Template Messages\n");
string connectionString = Environment.GetEnvironmentVariable("COMMUNICATION_SERVICES_CONNECTION_STRING");
NotificationMessagesClient notificationMessagesClient = new NotificationMessagesClient(connectionString);
var channelRegistrationId = new Guid("<Your Channel ID>");
var recipientList = new List<string> { "<Recipient's WhatsApp Phone Number>" };
// List out available templates for a channel ID
MessageTemplateClient messageTemplateClient = new MessageTemplateClient(connectionString);
Pageable<MessageTemplateItem> templates = messageTemplateClient.GetTemplates(channelRegistrationId);
foreach (WhatsAppMessageTemplateItem template in templates)
{
Console.WriteLine("Name: {0}\tLanguage: {1}\tStatus: {2}\tContent: {3}\n",
template.Name, template.Language, template.Status, template.Content);
}
// Send Sample Template sample_template
MessageTemplate sampleTemplate = AssembleSampleTemplate();
var sampleTemplateContent = new TemplateNotificationContent(channelRegistrationId, recipientList, sampleTemplate);
var result = await notificationMessagesClient.SendAsync(sampleTemplateContent);
PrintResponse(result);
// Send sample template sample_shipping_confirmation
MessageTemplate shippingConfirmationTemplate = AssembleSampleShippingConfirmation();
var shippingConfirmationTemplateContent = new TemplateNotificationContent(channelRegistrationId, recipientList, shippingConfirmationTemplate);
result = await notificationMessagesClient.SendAsync(shippingConfirmationTemplateContent);
PrintResponse(result);
// Send sample template sample_movie_ticket_confirmation
MessageTemplate movieTicketConfirmationTemplate = AssembleSampleMovieTicketConfirmation();
var movieTicketConfirmationTemplateContent = new TemplateNotificationContent(channelRegistrationId, recipientList, movieTicketConfirmationTemplate);
result = await notificationMessagesClient.SendAsync(movieTicketConfirmationTemplateContent);
PrintResponse(result);
// Send sample template sample_happy_hour_announcement
MessageTemplate happyHourTemplate = AssembleSampleHappyHourAnnouncement();
var happyHourTemplateContent = new TemplateNotificationContent(channelRegistrationId, recipientList, happyHourTemplate);
result = await notificationMessagesClient.SendAsync(happyHourTemplateContent);
PrintResponse(result);
// Send sample template sample_flight_confirmation
MessageTemplate flightConfirmationTemplate = AssembleSampleFlightConfirmation();
var flightConfirmationTemplateContent = new TemplateNotificationContent(channelRegistrationId, recipientList, flightConfirmationTemplate);
result = await notificationMessagesClient.SendAsync(flightConfirmationTemplateContent);
PrintResponse(result);
// Send sample template sample_issue_resolution
MessageTemplate issueResolutionTemplate = AssembleSampleIssueResolution();
var issueResolutionTemplateContent = new TemplateNotificationContent(channelRegistrationId, recipientList, issueResolutionTemplate);
result = await notificationMessagesClient.SendAsync(issueResolutionTemplateContent);
PrintResponse(result);
// Send sample template sample_purchase_feedback
MessageTemplate purchaseFeedbackTemplate = AssembleSamplePurchaseFeedback();
var purchaseFeedbackTemplateContent = new TemplateNotificationContent(channelRegistrationId, recipientList, purchaseFeedbackTemplate);
result = await notificationMessagesClient.SendAsync(purchaseFeedbackTemplateContent);
PrintResponse(result);
Console.WriteLine("Press any key to exit.");
Console.ReadKey(true);
}
public static MessageTemplate AssembleSampleTemplate()
{
string templateName = "sample_template";
string templateLanguage = "en_us";
return new MessageTemplate(templateName, templateLanguage);
}
public static MessageTemplate AssembleSampleShippingConfirmation()
{
string templateName = "sample_shipping_confirmation";
string templateLanguage = "en_us";
var threeDays = new MessageTemplateText("threeDays", "3");
WhatsAppMessageTemplateBindings bindings = new();
bindings.Body.Add(new(threeDays.Name));
MessageTemplate shippingConfirmationTemplate = new(templateName, templateLanguage);
shippingConfirmationTemplate.Bindings = bindings;
shippingConfirmationTemplate.Values.Add(threeDays);
return shippingConfirmationTemplate;
}
public static MessageTemplate AssembleSampleMovieTicketConfirmation()
{
string templateName = "sample_movie_ticket_confirmation";
string templateLanguage = "en_us";
var imageUrl = new Uri("https://aka.ms/acsicon1");
var image = new MessageTemplateImage("image", imageUrl);
var title = new MessageTemplateText("title", "Contoso");
var time = new MessageTemplateText("time", "July 1st, 2023 12:30PM");
var venue = new MessageTemplateText("venue", "Southridge Video");
var seats = new MessageTemplateText("seats", "Seat 1A");
WhatsAppMessageTemplateBindings bindings = new();
bindings.Header.Add(new(image.Name));
bindings.Body.Add(new(title.Name));
bindings.Body.Add(new(time.Name));
bindings.Body.Add(new(venue.Name));
bindings.Body.Add(new(seats.Name));
MessageTemplate movieTicketConfirmationTemplate = new(templateName, templateLanguage);
movieTicketConfirmationTemplate.Values.Add(image);
movieTicketConfirmationTemplate.Values.Add(title);
movieTicketConfirmationTemplate.Values.Add(time);
movieTicketConfirmationTemplate.Values.Add(venue);
movieTicketConfirmationTemplate.Values.Add(seats);
movieTicketConfirmationTemplate.Bindings = bindings;
return movieTicketConfirmationTemplate;
}
public static MessageTemplate AssembleSampleHappyHourAnnouncement()
{
string templateName = "sample_happy_hour_announcement";
string templateLanguage = "en_us";
var videoUrl = new Uri("< Your .mp4 Video URL >");
var video = new MessageTemplateVideo("video", videoUrl);
var venue = new MessageTemplateText("venue", "Fourth Coffee");
var time = new MessageTemplateText("time", "Today 2-4PM");
WhatsAppMessageTemplateBindings bindings = new();
bindings.Header.Add(new(video.Name));
bindings.Body.Add(new(venue.Name));
bindings.Body.Add(new(time.Name));
MessageTemplate happyHourAnnouncementTemplate = new(templateName, templateLanguage);
happyHourAnnouncementTemplate.Values.Add(venue);
happyHourAnnouncementTemplate.Values.Add(time);
happyHourAnnouncementTemplate.Values.Add(video);
happyHourAnnouncementTemplate.Bindings = bindings;
return happyHourAnnouncementTemplate;
}
public static MessageTemplate AssembleSampleFlightConfirmation()
{
string templateName = "sample_flight_confirmation";
string templateLanguage = "en_us";
var documentUrl = new Uri("< Your .pdf document URL >");
var document = new MessageTemplateDocument("document", documentUrl);
var firstName = new MessageTemplateText("firstName", "Kat");
var lastName = new MessageTemplateText("lastName", "Larssen");
var date = new MessageTemplateText("date", "July 1st, 2023");
WhatsAppMessageTemplateBindings bindings = new();
bindings.Header.Add(new(document.Name));
bindings.Body.Add(new(firstName.Name));
bindings.Body.Add(new(lastName.Name));
bindings.Body.Add(new(date.Name));
MessageTemplate flightConfirmationTemplate = new(templateName, templateLanguage);
flightConfirmationTemplate.Values.Add(document);
flightConfirmationTemplate.Values.Add(firstName);
flightConfirmationTemplate.Values.Add(lastName);
flightConfirmationTemplate.Values.Add(date);
flightConfirmationTemplate.Bindings = bindings;
return flightConfirmationTemplate;
}
public static MessageTemplate AssembleSampleIssueResolution()
{
string templateName = "sample_issue_resolution";
string templateLanguage = "en_us";
var name = new MessageTemplateText(name: "name", text: "Kat");
var yes = new MessageTemplateQuickAction(name: "Yes"){ Payload = "Kat said yes" };
var no = new MessageTemplateQuickAction(name: "No") { Payload = "Kat said no" };
WhatsAppMessageTemplateBindings bindings = new();
bindings.Body.Add(new(name.Name));
bindings.Buttons.Add(new(WhatsAppMessageButtonSubType.QuickReply.ToString(), yes.Name));
bindings.Buttons.Add(new(WhatsAppMessageButtonSubType.QuickReply.ToString(), no.Name));
MessageTemplate issueResolutionTemplate = new(templateName, templateLanguage);
issueResolutionTemplate.Values.Add(name);
issueResolutionTemplate.Values.Add(yes);
issueResolutionTemplate.Values.Add(no);
issueResolutionTemplate.Bindings = bindings;
return issueResolutionTemplate;
}
public static MessageTemplate AssembleSamplePurchaseFeedback()
{
string templateName = "sample_purchase_feedback";
string templateLanguage = "en_us";
var imageUrl = new Uri("https://aka.ms/acsicon1");
var image = new MessageTemplateImage(name: "image", uri: imageUrl);
var product = new MessageTemplateText(name: "product", text: "coffee");
var urlSuffix = new MessageTemplateQuickAction(name: "text") { Text = "survey-code"};
WhatsAppMessageTemplateBindings bindings = new();
bindings.Header.Add(new(image.Name));
bindings.Body.Add(new(product.Name));
bindings.Buttons.Add(new(WhatsAppMessageButtonSubType.Url.ToString(), urlSuffix.Name));
MessageTemplate purchaseFeedbackTemplate = new(templateName, templateLanguage);
purchaseFeedbackTemplate.Values.Add(image);
purchaseFeedbackTemplate.Values.Add(product);
purchaseFeedbackTemplate.Values.Add(urlSuffix);
purchaseFeedbackTemplate.Bindings = bindings;
return purchaseFeedbackTemplate;
}
public static void PrintResponse(Response<SendMessageResult> response)
{
Console.WriteLine($"Response: {response.GetRawResponse().Status} " +
$"({response.GetRawResponse().ReasonPhrase})");
Console.WriteLine($"Date: " +
$"{response.GetRawResponse().Headers.First(header => header.Name == "Date").Value}");
Console.WriteLine($"ClientRequestId: {response.GetRawResponse().ClientRequestId}");
Console.WriteLine($"MS-CV: " +
$"{response.GetRawResponse().Headers.First(header => header.Name == "MS-CV").Value}");
foreach (var receipts in response.Value.Receipts)
{
Console.WriteLine($"MessageId: {receipts.MessageId}");
}
Console.WriteLine($"\n");
}
}
}