Envoyer des messages modèles WhatsApp
Ce document fournit des conseils pour envoyer des messages modèles WhatsApp à l’aide du Kit SDK de développement logiciel (SDK) Advanced Communication Messages.
Pourquoi dois-je envoyer un message modèle ?
Une entreprise ne peut envoyer que des messages modèles jusqu’à ce que l’utilisateur envoie un message à l’entreprise.
Une entreprise ou un utilisateur peut lancer une fenêtre de conversation, mais l’entreprise est limitée sur les types de messages qu’elle peut envoyer. Ce n’est qu’une fois que l’utilisateur a envoyé un message à l’entreprise que celle-ci est autorisée à lui envoyer des messages multimédias ou des SMS pendant la conversation active. Une fois la fenêtre de conversation de 24 heures arrivée à expiration, la conversation doit être relancée. Pour en savoir plus sur les conversations, consultez la définition sur le site Plateforme WhatsApp Business.
Pour plus d’informations sur les exigences WhatsApp relatives aux modèles, consultez les informations de référence de l’API WhatsApp Business Platform :
- Créer et gérer des modèles
- Composants du modèle
- Envoi de modèles de message
- Les entreprises doivent également respecter les exigences d’adhésion avant d’envoyer des messages aux utilisateurs WhatsApp
Choix d’un modèle
Lorsqu’un compte WhatsApp Business est créé via le portail Azure lors de l’inscription incorporée, un ensemble d’exemples de modèles peut être automatiquement disponible pour vous permettre d’essayer. Consultez l’utilisation de quelques-uns de ces exemples de modèles dans Exemples.
Créer un modèle
Pour créer vos propres modèles, utilisez le Gestionnaire Meta WhatsApp. Suivez les instructions dans le Meta Business Help Center dans Créer des modèles de message pour votre compte WhatsApp Business.
Modèles de liste
Vous pouvez afficher vos modèles dans le portail Azure en accédant à votre ressource Azure Communication Service > Modèles.
En sélectionnant un modèle, vous pouvez afficher les détails du modèle.
Le champ content
des détails du modèle peut inclure des liaisons de paramètres. Les liaisons de paramètres peuvent être désignées comme suit :
- Un champ « format » avec une valeur telle que
IMAGE
. - Crochets doubles entourant un nombre, tels que
{{1}}
. Le nombre, indexé à 1, indique l’ordre dans lequel les valeurs de liaison doivent être fournies pour créer le modèle de message.
Vous pouvez également afficher et modifier tous les modèles de votre compte WhatsApp Business dans les outils WhatsApp Manager> Compte >Modèles de message.
Pour répertorier vos modèles par programmation, vous pouvez récupérer tous les modèles pour votre ID de canal :
MessageTemplateClient messageTemplateClient = new MessageTemplateClient(connectionString);
Pageable<MessageTemplateItem> templates = messageTemplateClient.GetTemplates(channelRegistrationId);
Aide-mémoire
Modèles sans aucun paramètre
Si le modèle ne prend aucun paramètre, vous n’avez pas besoin de fournir les valeurs ou les liaisons lors de la création du MessageTemplate
.
var messageTemplate = new MessageTemplate(templateName, templateLanguage);
Exemple
Modèles avec des paramètres de texte dans le corps
Utilisez MessageTemplateText
pour définir des paramètres dans le corps indiqués avec des crochets doubles entourant un nombre, tels que {{1}}
. Le nombre, indexé à 1, indique l’ordre dans lequel les valeurs de liaison doivent être fournies pour créer le modèle de message.
Corps de définition de modèle :
{
"type": "BODY",
"text": "Message with two parameters: {{1}} and {{2}}"
},
Assembly de modèle de message :
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);
Exemples
- Utiliser un exemple de modèle sample_shipping_confirmation
- Utiliser un exemple de modèle sample_movie_ticket_confirmation
- Utiliser un exemple de modèle sample_happy_hour_announcement
- Utiliser un exemple de modèle sample_flight_confirmation
- Utiliser un exemple de modèle sample_issue_resolution
- Utiliser un exemple de modèle sample_purchase_feedback
Modèles avec média dans l’en-tête
Utilisez MessageTemplateImage
, MessageTemplateVideo
ou MessageTemplateDocument
pour définir le paramètre média dans un en-tête.
En-tête de définition de modèle nécessitant un média d’image :
{
"type": "HEADER",
"format": "IMAGE"
},
Le « format » peut nécessiter différents types de média. Dans le kit .NET SDK, chaque type de média utilise un type MessageTemplateValue correspondant.
Mettre en forme | Type MessageTemplateValue | Type de fichier |
---|---|---|
IMAGE | MessageTemplateImage |
png, jpg |
VIDÉO | MessageTemplateVideo |
mp4 |
DOCUMENT | MessageTemplateDocument |
Pour plus d’informations sur les types de média pris en charge et les limites de taille, consultez Documentation WhatsApp pour le média de message.
Assembly de modèle de message pour média d’image :
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);
Exemples
- IMAGE : Utiliser un exemple de modèle sample_movie_ticket_confirmation
- IMAGE : Utiliser un exemple de modèle sample_purchase_feedback
- VIDÉO : Utiliser un exemple de modèle sample_happy_hour_announcement
- DOCUMENT :Utiliser un exemple de modèle sample_flight_confirmation
Modèles avec emplacement dans l’en-tête
Utilisez MessageTemplateLocation
pour définir le paramètre d’emplacement dans un en-tête.
Définition de modèle pour le composant d’en-tête nécessitant un emplacement comme suit :
{
"type": "header",
"parameters": [
{
"type": "location",
"location": {
"latitude": "<LATITUDE>",
"longitude": "<LONGITUDE>",
"name": "<NAME>",
"address": "<ADDRESS>"
}
}
]
}
Le « format » peut nécessiter différents types de média. Dans le kit .NET SDK, chaque type de média utilise un type MessageTemplateValue correspondant.
Propriétés | Description | Type |
---|---|---|
ADDRESS | Adresse qui va apparaître après la valeur « NAME », sous la carte générique en haut du message. | string |
LATITUDE | Latitude de l’emplacement. | double |
LONGITUDE | Longitude de l’emplacement. | double |
LOCATIONNAME | Texte qui va apparaître juste en dessous de la carte générique en haut du message. | string |
Pour plus d’informations sur les modèles basés sur l’emplacement, consultez Documentation WhatsApp pour les médias des messages.
Assembly de modèle de message basé sur l’emplacement :
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;
Exemple
Modèles avec des boutons de réponse rapide
Utilisez MessageTemplateQuickAction
pour définir la charge utile pour les boutons de réponse rapide.
Les objets MessageTemplateQuickAction
et disposent des trois attributs suivants.
Spécifiquement pour les boutons de réponse rapide, suivez ces instructions pour créer votre objet MessageTemplateQuickAction
.
name
Laname
est utilisée pour rechercher la valeur dansMessageTemplateWhatsAppBindings
.text
L'attributtext
n'est pas utilisé.payload
Lepayload
affecté à un bouton est disponible dans une réponse de message si l’utilisateur sélectionne le bouton.
Boutons de définition de modèle :
{
"type": "BUTTONS",
"buttons": [
{
"type": "QUICK_REPLY",
"text": "Yes"
},
{
"type": "QUICK_REPLY",
"text": "No"
}
]
}
L’ordre dans lequel les boutons apparaissent dans la définition du modèle doit correspondre à l’ordre dans lequel les boutons sont définis lors de la création des liaisons avec MessageTemplateWhatsAppBindings
.
Assembly de modèle de message :
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);
Pour plus d’informations sur la charge utile dans les réponses rapides de l’utilisateur, consultez la documentation WhatsApp pour Rappel reçu à partir d’un bouton Réponse rapide.
Exemple
Modèles avec des boutons d’appel à action
Utilisez MessageTemplateQuickAction
pour définir le suffixe d’url pour les boutons d’appel à l’action.
Les objets MessageTemplateQuickAction
et disposent des trois attributs suivants.
Spécifiquement pour les boutons d’appel à l’action, suivez ces instructions pour créer votre objet MessageTemplateQuickAction
.
name
Laname
est utilisée pour rechercher la valeur dansMessageTemplateWhatsAppBindings
.text
L’attributtext
définit le texte qui est ajouté à l’URL.payload
L’attributpayload
n’est pas nécessaire.
Boutons de définition de modèle :
{
"type": "BUTTONS",
"buttons": [
{
"type": "URL",
"text": "Take Survey",
"url": "https://www.example.com/{{1}}"
}
]
}
L’ordre dans lequel les boutons apparaissent dans la définition du modèle doit correspondre à l’ordre dans lequel les boutons sont définis lors de la création des liaisons avec MessageTemplateWhatsAppBindings
.
Assembly de modèle de message :
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);
Exemple
Exemples
Ces exemples utilisent des exemples de modèles disponibles pour les comptes WhatsApp Business créés via l’inscription incorporée du portail Azure.
Utiliser un exemple de modèle sample_template
L’exemple de modèle nommé sample_template
ne prend aucun paramètre.
Assemblez le MessageTemplate
en référençant le nom et la langue du modèle cible.
string templateName = "sample_template";
string templateLanguage = "en_us";
var sampleTemplate = new MessageTemplate(templateName, templateLanguage);
Utiliser un exemple de modèle sample_shipping_confirmation
Certains modèles prennent des paramètres. Incluez uniquement les paramètres requis par le modèle. L’inclusion de paramètres qui ne sont pas dans le modèle n’est pas valide.
Dans cet exemple, le corps du modèle a un paramètre :
{
"type": "BODY",
"text": "Your package has been shipped. It will be delivered in {{1}} business days."
},
Les paramètres sont définis avec les valeurs MessageTemplateValue
et les liaisons MessageTemplateWhatsAppBindings
. Utilisez les valeurs et les liaisons pour assembler le 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);
Utiliser un exemple de modèle sample_movie_ticket_confirmation
Les modèles peuvent nécessiter différents types de paramètres tels que du texte et des images.
Dans cet exemple, l’en-tête du modèle nécessite une image :
{
"type": "HEADER",
"format": "IMAGE"
},
Et le corps du modèle nécessite quatre paramètres de texte :
{
"type": "BODY",
"text": "Your ticket for *{{1}}*\n*Time* - {{2}}\n*Venue* - {{3}}\n*Seats* - {{4}}"
},
Créez une variable MessageTemplateImage
et quatre variables MessageTemplateText
. Ensuite, assemblez votre liste de MessageTemplateValue
et votre MessageTemplateWhatsAppBindings
en fournissant les paramètres dans l’ordre dans lequel les paramètres apparaissent dans le contenu du modèle.
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;
Utiliser un exemple de modèle sample_happy_hour_announcement
Cet exemple de modèle utilise une vidéo dans l’en-tête et deux paramètres de texte dans le corps.
Ici, l’en-tête du modèle nécessite une vidéo :
{
"type": "HEADER",
"format": "VIDEO"
},
La vidéo doit être une URL pour la vidéo mp4 hébergée. Pour plus d’informations sur les types de média pris en charge et les limites de taille, consultez Documentation WhatsApp pour le média de message.
Et le corps du modèle nécessite deux paramètres de texte :
{
"type": "BODY",
"text": "Happy hour is here! 🍺😀🍸\nPlease be merry and enjoy the day. 🎉\nVenue: {{1}}\nTime: {{2}}"
},
Créez une variable MessageTemplateVideo
et deux variables MessageTemplateText
. Ensuite, assemblez votre liste de MessageTemplateValue
et votre MessageTemplateWhatsAppBindings
en fournissant les paramètres dans l’ordre dans lequel les paramètres apparaissent dans le contenu du modèle.
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;
Utiliser un exemple de modèle sample_flight_confirmation
Cet exemple de modèle utilise un document dans l’en-tête et trois paramètres de texte dans le corps.
Ici, l’en-tête du modèle nécessite un document :
{
"type": "HEADER",
"format": "DOCUMENT"
},
Le document doit être une URL vers le document pdf hébergé. Pour plus d’informations sur les types de média pris en charge et les limites de taille, consultez Documentation WhatsApp pour le média de message.
Et le corps du modèle nécessite trois paramètres de texte :
{
"type": "BODY",
"text": "This is your flight confirmation for {{1}}-{{2}} on {{3}}."
},
Créez une variable MessageTemplateDocument
et trois variables MessageTemplateText
. Ensuite, assemblez votre liste de MessageTemplateValue
et votre MessageTemplateWhatsAppBindings
en fournissant les paramètres dans l’ordre dans lequel les paramètres apparaissent dans le contenu du modèle.
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;
Utiliser un exemple de modèle sample_issue_resolution
Cet exemple de modèle ajoute deux boutons de réponse préremplis au message. Il inclut également un paramètre de texte dans le corps.
Ici, le corps du modèle nécessite un paramètre de texte :
{
"type": "BODY",
"text": "Hi {{1}}, were we able to solve the issue that you were facing?"
},
Et le modèle comprend deux boutons de réponse préremplis, Yes
et No
.
{
"type": "BUTTONS",
"buttons": [
{
"type": "QUICK_REPLY",
"text": "Yes"
},
{
"type": "QUICK_REPLY",
"text": "No"
}
]
}
Les boutons de réponse rapide sont définis en tant qu’objets MessageTemplateQuickAction
et ont trois attributs :
name
Laname
est utilisée pour rechercher la valeur dansMessageTemplateWhatsAppBindings
.text
À l’aide des boutons de réponse rapide, l’attributtext
n’est pas utilisé.payload
Lepayload
affecté à un bouton est disponible dans une réponse de message si l’utilisateur sélectionne le bouton.
Pour plus d’informations sur les boutons, consultez la documentation WhatsApp pour Objet de paramètre de bouton.
Créez une variable MessageTemplateText
et deux variables MessageTemplateQuickAction
. Ensuite, assemblez votre liste de MessageTemplateValue
et votre MessageTemplateWhatsAppBindings
en fournissant les paramètres dans l’ordre dans lequel les paramètres apparaissent dans le contenu du modèle. L’ordre est également important lors de la définition de vos boutons de liaison.
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;
Utiliser un exemple de modèle sample_purchase_feedback
Cet exemple de modèle ajoute un bouton avec un lien d’URL dynamique au message. Il utilise également une image dans l’en-tête et un paramètre de texte dans le corps.
Si vous utilisez l’exemple de modèle pré-créé sample_purchase_feedback
, vous devez modifier le type d’URL de son bouton de Static
à Dynamic
.
Accédez à vos modèles de message dans le gestionnaire WhatsApp et modifiez le modèle pour sample_purchase_feedback
. Dans la liste déroulante du type d’URL, remplacez-la de Static
à Dynamic
. Incluez un exemple d’URL si nécessaire.
Maintenant, si vous affichez les détails du modèle dans le portail Azure, vous voyez :
Dans cet exemple, l’en-tête du modèle nécessite une image :
{
"type": "HEADER",
"format": "IMAGE"
},
Ici, le corps du modèle nécessite un paramètre de texte :
{
"type": "BODY",
"text": "Thank you for purchasing {{1}}! We value your feedback and would like to learn more about your experience."
},
Et le modèle inclut un bouton d’URL dynamique avec un paramètre :
{
"type": "BUTTONS",
"buttons": [
{
"type": "URL",
"text": "Take Survey",
"url": "https://www.example.com/{{1}}"
}
]
}
Les boutons d’appel à l’action pour les liens de site web sont définis en tant qu’objets MessageTemplateQuickAction
et ont trois attributs :
name
Laname
est utilisée pour rechercher la valeur dansMessageTemplateWhatsAppBindings
.text
À l’aide du bouton d’appel à l’action pour les liens de site web, l’attributtext
définit le texte qui est ajouté à l’URL.
Pour cet exemple, notre valeurtext
estsurvey-code
. Dans le message reçu par l’utilisateur, un bouton qui relie à l’URLhttps://www.example.com/survey-code
lui est présenté.payload
À l’aide du bouton d’appel à l’action pour les liens de site web, l’attributpayload
n’est pas obligatoire.
Pour plus d’informations sur les boutons, consultez la documentation WhatsApp pour Objet de paramètre de bouton.
Créez une variable MessageTemplateImage
, une variable MessageTemplateText
et une variable MessageTemplateQuickAction
. Ensuite, assemblez votre liste de MessageTemplateValue
et votre MessageTemplateWhatsAppBindings
en fournissant les paramètres dans l’ordre dans lequel les paramètres apparaissent dans le contenu du modèle. L’ordre est également important lors de la définition de vos boutons de liaison.
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;
Exemple de code complet
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");
}
}
}