Partager via


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 :

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.

Capture d’écran montrant une ressource Azure Communication Services dans le portail Azure et l’onglet « 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.

Capture d’écran montrant les détails du modèle.

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

Modèles avec média dans l’en-tête

Utilisez MessageTemplateImage, MessageTemplateVideoou 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 pdf

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

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

Capture d’écran montrant les détails du modèle pour le modèle nommé sample_location_template.

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
    La name est utilisée pour rechercher la valeur dans MessageTemplateWhatsAppBindings.
  • text
    L'attribut text n'est pas utilisé.
  • payload
    Le payload 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
    La name est utilisée pour rechercher la valeur dans MessageTemplateWhatsAppBindings.
  • text
    L’attribut text définit le texte qui est ajouté à l’URL.
  • payload
    L’attribut payload 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.

Capture d’écran montrant les détails du modèle pour le modèle nommé sample_template.

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.

Capture d’écran montrant les détails du modèle pour le modèle nommé sample_shipping_confirmation.

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.

Capture d’écran montrant les détails du modèle pour le modèle nommé sample_movie_ticket_confirmation.

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.

Capture d’écran montrant les détails du modèle pour le modèle nommé sample_happy_hour_announcement.

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.

Capture d’écran montrant les détails du modèle pour le modèle nommé sample_flight_confirmation.

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.

Capture d’écran montrant les détails du modèle pour le modèle nommé sample_issue_resolution.

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
    La name est utilisée pour rechercher la valeur dans MessageTemplateWhatsAppBindings.
  • text
    À l’aide des boutons de réponse rapide, l’attribut text n’est pas utilisé.
  • payload
    Le payload 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.

Capture d’écran montrant la modification du type d’URL dans le gestionnaire WhatsApp.

Maintenant, si vous affichez les détails du modèle dans le portail Azure, vous voyez : Capture d’écran montrant les détails du modèle pour le modèle nommé sample_purchase_feedback.

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
    La name est utilisée pour rechercher la valeur dans MessageTemplateWhatsAppBindings.
  • text
    À l’aide du bouton d’appel à l’action pour les liens de site web, l’attribut text définit le texte qui est ajouté à l’URL.
    Pour cet exemple, notre valeur text est survey-code. Dans le message reçu par l’utilisateur, un bouton qui relie à l’URL https://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’attribut payload 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 MessageTemplateTextet 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");
        }
    }
}

Étapes suivantes