Inviare messaggi modello WhatsApp

Importante

La funzionalità descritta in questo articolo è attualmente disponibile in anteprima pubblica. Questa versione di anteprima viene fornita senza un contratto di servizio e non è consigliabile per i carichi di lavoro di produzione. Alcune funzionalità potrebbero non essere supportate o potrebbero presentare funzionalità limitate. Per altre informazioni, vedere le Condizioni supplementari per l'uso delle anteprime di Microsoft Azure.

Questo documento fornisce indicazioni per l'invio di messaggi modello WhatsApp tramite Advanced Communication Messages SDK.

Perché è necessario inviare un messaggio modello?

Le conversazioni tra un account WhatsApp Business e un utente WhatsApp possono essere avviate in uno dei due modi seguenti:

  • L'azienda invia un messaggio modello all'utente WhatsApp.
  • L'utente WhatsApp invia qualsiasi messaggio al numero di ufficio.

Un'azienda può inviare solo messaggi modello fino a quando l'utente non invia un messaggio all'azienda. Solo allora l'azienda può inviare sms o messaggi multimediali all'utente. Una volta scaduta la finestra di conversazione di 24 ore, è necessario reinizializzare la conversazione. Per altre informazioni sulle conversazioni, vedi la definizione in WhatsApp Business Platform

Per altri requisiti sui modelli, fare riferimento alle linee guida riportate nelle informazioni di riferimento sull'API WhatsApp Business Platform Creare e gestire modelli, componenti modello e invio di messaggi modello.
Le aziende devono inoltre rispettare i requisiti di consenso esplicito prima di inviare messaggi agli utenti di WhatsApp.

Scelta di un modello

Quando un account WhatsApp Business viene creato tramite il portale di Azure durante l'iscrizione incorporata, un set di modelli di esempio può essere automaticamente disponibile per voi per provare. Vedere l'utilizzo per alcuni di questi modelli di esempio in Esempi.

Creare il modello

Per creare modelli personalizzati, usa Meta WhatsApp Manager. Seguire le istruzioni nel Centro assistenza Meta Business in Creare modelli di messaggio per il tuo account WhatsApp Business.

Elencare i modelli

È possibile visualizzare i modelli nel portale di Azure passando ai modelli di risorse > del servizio di comunicazione di Azure.

Screenshot that shows an Azure Communication Services resource in the Azure portal, viewing the 'Templates' tab.

Selezionando un modello, è possibile visualizzare i dettagli del modello.
Il content campo dei dettagli del modello può includere associazioni di parametri. Le associazioni di parametri possono essere indicate come:

  • Campo "format" con un valore, IMAGEad esempio .
  • Parentesi doppie che circondano un numero, ad esempio {{1}}. Il numero, indicizzato in corrispondenza di 1, indica l'ordine in cui devono essere specificati i valori di associazione per creare il modello di messaggio.

Screenshot that shows template details.

In alternativa, puoi visualizzare e modificare tutti i modelli del tuo account WhatsApp Business nei modelli di messaggio strumenti> account WhatsApp Manager>.

Per elencare i modelli a livello di codice, è possibile recuperare tutti i modelli per l'ID canale:

MessageTemplateClient messageTemplateClient = new MessageTemplateClient(connectionString);
Pageable<MessageTemplateItem> templates = messageTemplateClient.GetTemplates(channelRegistrationId);

Riferimento rapido

Modelli senza parametri

Se il modello non accetta parametri, non è necessario specificare i valori o le associazioni durante la creazione di MessageTemplate.

var messageTemplate = new MessageTemplate(templateName, templateLanguage); 

Esempio

Modelli con parametri di testo nel corpo

Usare MessageTemplateText per definire i parametri nel corpo indicato con parentesi quadre doppie che circondano un numero, ad esempio {{1}}. Il numero, indicizzato in corrispondenza di 1, indica l'ordine in cui devono essere specificati i valori di associazione per creare il modello di messaggio.

Corpo della definizione del modello:

{
  "type": "BODY",
  "text": "Message with two parameters: {{1}} and {{2}}"
},

Assembly del modello di messaggio:

var param1 = new MessageTemplateText(name: "first", text: "First Parameter");
var param2 = new MessageTemplateText(name: "second", text: "Second Parameter");
IEnumerable<MessageTemplateValue> values = new List<MessageTemplateValue>
{
    param1,
    param2
};
var bindings = new MessageTemplateWhatsAppBindings(
    body: new[] { param1.Name, param2.Name });
var messageTemplate = new MessageTemplate(templateName, templateLanguage, values, bindings); 

Esempi

Modelli con supporti nell'intestazione

Usare MessageTemplateImage, MessageTemplateVideoo MessageTemplateDocument per definire il parametro multimediale in un'intestazione.

Intestazione di definizione del modello che richiede supporti di immagine:

{
  "type": "HEADER",
  "format": "IMAGE"
},

Il "formato" può richiedere tipi di supporti diversi. In .NET SDK ogni tipo di supporto usa un tipo MessageTemplateValue corrispondente.

Formato Tipo MessageTemplateValue Tipo di file
IMMAGINE MessageTemplateImage png, jpg
VIDEO MessageTemplateVideo mp4
DOCUMENT MessageTemplateDocument pdf

Per altre informazioni sui tipi di supporti supportati e sui limiti di dimensioni, vedi la documentazione di WhatsApp per i supporti di messaggio.

Assembly del modello di messaggio per i supporti di immagine:

var url = new Uri("< Your media URL >");

var media = new MessageTemplateImage("image", url);
IEnumerable<MessageTemplateValue> values =  new List<MessageTemplateValue>
{
    media
};
var bindings = new MessageTemplateWhatsAppBindings(
    header: new[] { media.Name });

var messageTemplate = new MessageTemplate(templateName, templateLanguage, values, bindings);

Esempi

Modelli con pulsanti di risposta rapida

Usare MessageTemplateQuickAction per definire il payload per i pulsanti di risposta rapida.

MessageTemplateQuickAction gli oggetti e hanno i tre attributi seguenti.
In particolare per i pulsanti di risposta rapida, seguire queste linee guida per creare l'oggetto MessageTemplateQuickAction .

  • name
    Viene name utilizzato per cercare il valore in MessageTemplateWhatsAppBindings.
  • text
    L'attributo text non viene usato.
  • payload
    L'oggetto payload assegnato a un pulsante è disponibile in una risposta di messaggio se l'utente seleziona il pulsante.

Pulsanti di definizione del modello:

{
  "type": "BUTTONS",
  "buttons": [
    {
      "type": "QUICK_REPLY",
      "text": "Yes"
    },
    {
      "type": "QUICK_REPLY",
      "text": "No"
    }
  ]
}

L'ordine in cui i pulsanti vengono visualizzati nella definizione del modello deve corrispondere all'ordine in cui i pulsanti vengono definiti durante la creazione dei binding con MessageTemplateWhatsAppBindings.

Assembly del modello di messaggio:

var yes = new MessageTemplateQuickAction(name: "Yes", payload: "User said yes");
var no = new MessageTemplateQuickAction(name: "No", payload: "User said no");

IEnumerable<MessageTemplateValue> values = new List<MessageTemplateValue>
{
    yes,
    no
};
var bindings = new MessageTemplateWhatsAppBindings(
    button: new[] {
        new KeyValuePair<string, MessageTemplateValueWhatsAppSubType>(yes.Name,
            MessageTemplateValueWhatsAppSubType.QuickReply),
        new KeyValuePair<string, MessageTemplateValueWhatsAppSubType>(no.Name,
            MessageTemplateValueWhatsAppSubType.QuickReply)
    });

var messageTemplate = new MessageTemplate(templateName, templateLanguage, values, bindings);

Per altre informazioni sul payload nelle risposte di risposta rapida dell'utente, vedi la documentazione di WhatsApp per il callback ricevuto da un pulsante di risposta rapida.

Esempio

Modelli con pulsanti di chiamata all'azione

Usare MessageTemplateQuickAction per definire il suffisso url per i pulsanti di chiamata all'azione.

MessageTemplateQuickAction gli oggetti e hanno i tre attributi seguenti.
In particolare per i pulsanti di chiamata all'azione, seguire queste linee guida per creare l'oggetto MessageTemplateQuickAction .

  • name
    Viene name utilizzato per cercare il valore in MessageTemplateWhatsAppBindings.
  • text
    L'attributo text definisce il testo aggiunto all'URL.
  • payload
    L'attributo payload non è obbligatorio.

Pulsanti di definizione del modello:

{
  "type": "BUTTONS",
  "buttons": [
    {
      "type": "URL",
      "text": "Take Survey",
      "url": "https://www.example.com/{{1}}"
    }
  ]
}

L'ordine in cui i pulsanti vengono visualizzati nella definizione del modello deve corrispondere all'ordine in cui i pulsanti vengono definiti durante la creazione dei binding con MessageTemplateWhatsAppBindings.

Assembly del modello di messaggio:

var urlSuffix = new MessageTemplateQuickAction(name: "text", text: "url-suffix-text");

IEnumerable<MessageTemplateValue> values = new List<MessageTemplateValue>
{
    urlSuffix
};
var bindings = new MessageTemplateWhatsAppBindings(
    button: new[]
    {
        new KeyValuePair<string, MessageTemplateValueWhatsAppSubType>(urlSuffix.Name,
            MessageTemplateValueWhatsAppSubType.Url)
    });

var messageTemplate = new MessageTemplate(templateName, templateLanguage, values, bindings);

Esempio

Esempi

Questi esempi usano modelli di esempio disponibili per gli account WhatsApp Business creati tramite il portale di Azure iscrizione incorporata.

Usare un modello di esempio sample_template

Il modello di esempio denominato sample_template non accetta parametri.

Screenshot that shows template details for template named sample_template.

Assemblare l'oggetto MessageTemplate facendo riferimento al nome e alla lingua del modello di destinazione.

string templateName = "sample_template"; 
string templateLanguage = "en_us"; 

var sampleTemplate = new MessageTemplate(templateName, templateLanguage); 

Usare sample_shipping_confirmation di modelli di esempio

Alcuni modelli accettano parametri. Includere solo i parametri richiesti dal modello. L'inclusione di parametri non presenti nel modello non è valida.

Screenshot that shows template details for template named sample_shipping_confirmation.

In questo esempio il corpo del modello ha un parametro:

{
  "type": "BODY",
  "text": "Your package has been shipped. It will be delivered in {{1}} business days."
},

I parametri vengono definiti con i MessageTemplateValue valori e MessageTemplateWhatsAppBindings le associazioni. Usare i valori e le associazioni per assemblare .MessageTemplate

string templateName = "sample_shipping_confirmation"; 
string templateLanguage = "en_us"; 

var threeDays = new MessageTemplateText("threeDays", "3");
IEnumerable<MessageTemplateValue> values = 
    new List<MessageTemplateValue> { threeDays };
MessageTemplateWhatsAppBindings bindings = new MessageTemplateWhatsAppBindings(
    body: new[] { threeDays.Name });
var shippingConfirmationTemplate = new MessageTemplate(templateName, templateLanguage, values, bindings); 

Usare un modello di esempio sample_movie_ticket_confirmation

I modelli possono richiedere diversi tipi di parametri, ad esempio testo e immagini.

Screenshot that shows template details for template named sample_movie_ticket_confirmation.

In questo esempio l'intestazione del modello richiede un'immagine:

{
  "type": "HEADER",
  "format": "IMAGE"
},

Il corpo del modello richiede quattro parametri di testo:

{
  "type": "BODY",
  "text": "Your ticket for *{{1}}*\n*Time* - {{2}}\n*Venue* - {{3}}\n*Seats* - {{4}}"
},

Creare una MessageTemplateImage e quattro MessageTemplateText variabili. Assemblare quindi l'elenco di MessageTemplateValue e MessageTemplateWhatsAppBindings specificando i parametri nell'ordine in cui i parametri vengono visualizzati nel contenuto del modello.

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");
IEnumerable<MessageTemplateValue> values = new List<MessageTemplateValue>
{
    image,
    title,
    time,
    venue,
    seats
};
var bindings = new MessageTemplateWhatsAppBindings(
    header: new[] { image.Name },
    body: new[] { title.Name, time.Name, venue.Name, seats.Name });
MessageTemplate movieTicketConfirmationTemplate = new MessageTemplate(templateName, templateLanguage, values, bindings);

Usare sample_happy_hour_announcement modello di esempio

Questo modello di esempio usa un video nell'intestazione e due parametri di testo nel corpo.

Screenshot that shows template details for template named sample_happy_hour_announcement.

In questo caso, l'intestazione del modello richiede un video:

{
  "type": "HEADER",
  "format": "VIDEO"
},

Il video deve essere un URL per il video mp4 ospitato. Per altre informazioni sui tipi di supporti supportati e sui limiti di dimensioni, vedi la documentazione di WhatsApp per i supporti di messaggio.

Il corpo del modello richiede due parametri di testo:

{
  "type": "BODY",
  "text": "Happy hour is here! 🍺😀🍸\nPlease be merry and enjoy the day. 🎉\nVenue: {{1}}\nTime: {{2}}"
},

Creare una MessageTemplateVideo e due MessageTemplateText variabili. Assemblare quindi l'elenco di MessageTemplateValue e MessageTemplateWhatsAppBindings specificando i parametri nell'ordine in cui i parametri vengono visualizzati nel contenuto del modello.

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");

IEnumerable<MessageTemplateValue> values = new List<MessageTemplateValue>
{
    video,
    venue,
    time
};
var bindings = new MessageTemplateWhatsAppBindings(
    header: new[] { video.Name },
    body: new[] { venue.Name, time.Name });

var happyHourAnnouncementTemplate = MessageTemplate(templateName, templateLanguage, values, bindings);

Usare un modello di esempio sample_flight_confirmation

Questo modello di esempio usa un documento nell'intestazione e tre parametri di testo nel corpo.

Screenshot that shows template details for template named sample_flight_confirmation.

In questo caso, l'intestazione del modello richiede un documento:

{
  "type": "HEADER",
  "format": "DOCUMENT"
},

Il documento deve essere un URL per il documento PDF ospitato. Per altre informazioni sui tipi di supporti supportati e sui limiti di dimensioni, vedi la documentazione di WhatsApp per i supporti di messaggio.

Il corpo del modello richiede tre parametri di testo:

{
  "type": "BODY",
  "text": "This is your flight confirmation for {{1}}-{{2}} on {{3}}."
},

Creare una MessageTemplateDocument e tre MessageTemplateText variabili. Assemblare quindi l'elenco di MessageTemplateValue e MessageTemplateWhatsAppBindings specificando i parametri nell'ordine in cui i parametri vengono visualizzati nel contenuto del modello.

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");

IEnumerable<MessageTemplateValue> values = new List<MessageTemplateValue>
{
    document,
    firstName,
    lastName,
    date
};
var bindings = new MessageTemplateWhatsAppBindings(
    header: new[] { document.Name },
    body: new[] { firstName.Name, lastName.Name, date.Name });

var flightConfirmationTemplate = new MessageTemplate(templateName, templateLanguage, values, bindings);

Usare un modello di esempio sample_issue_resolution

Questo modello di esempio aggiunge due pulsanti di risposta precompilato al messaggio. Include anche un parametro di testo nel corpo.

Screenshot that shows template details for template named sample_issue_resolution.

In questo caso, il corpo del modello richiede un parametro di testo:

{
  "type": "BODY",
  "text": "Hi {{1}}, were we able to solve the issue that you were facing?"
},

Il modello include due pulsanti di risposta precompilato e Yes No.

{
  "type": "BUTTONS",
  "buttons": [
    {
      "type": "QUICK_REPLY",
      "text": "Yes"
    },
    {
      "type": "QUICK_REPLY",
      "text": "No"
    }
  ]
}

I pulsanti di risposta rapida sono definiti come MessageTemplateQuickAction oggetti e hanno tre attributi:

  • name
    Viene name utilizzato per cercare il valore in MessageTemplateWhatsAppBindings.
  • text
    Usando i pulsanti di risposta rapida, l'attributo text non viene usato.
  • payload
    L'oggetto payload assegnato a un pulsante è disponibile in una risposta di messaggio se l'utente seleziona il pulsante.

Per altre informazioni sui pulsanti, vedi la documentazione di WhatsApp per l'oggetto parametro button.

Creare una MessageTemplateText e due MessageTemplateQuickAction variabili. Assemblare quindi l'elenco di MessageTemplateValue e MessageTemplateWhatsAppBindings specificando i parametri nell'ordine in cui i parametri vengono visualizzati nel contenuto del modello. L'ordine è importante anche quando si definiscono i pulsanti dell'associazione.

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");

IEnumerable<MessageTemplateValue> values = new List<MessageTemplateValue>
{
    name,
    yes,
    no
};
var bindings = new MessageTemplateWhatsAppBindings(
    body: new[] { name.Name },
    button: new[] {
        new KeyValuePair<string, MessageTemplateValueWhatsAppSubType>(yes.Name,
            MessageTemplateValueWhatsAppSubType.QuickReply),
        new KeyValuePair<string, MessageTemplateValueWhatsAppSubType>(no.Name,
            MessageTemplateValueWhatsAppSubType.QuickReply)
    });

var issueResolutionTemplate = new MessageTemplate(templateName, templateLanguage, values, bindings);

Usare sample_purchase_feedback modello di esempio

Questo modello di esempio aggiunge un pulsante con un collegamento URL dinamico al messaggio. Usa anche un'immagine nell'intestazione e un parametro di testo nel corpo.

Se si usa il modello sample_purchase_feedbackdi esempio precreato, è necessario modificare il tipo di URL del relativo pulsante da Static a Dynamic.
Vai ai modelli di messaggio nel gestore WhatsApp e modifica il modello per sample_purchase_feedback. Nell'elenco a discesa Tipo di URL modificarlo da Static a Dynamic. Se necessario, includere un URL di esempio.

Screenshot that shows editing URL Type in the WhatsApp manager.

Ora, se si visualizzano i dettagli del modello nella portale di Azure, viene visualizzato quanto segue:Screenshot that shows template details for template named sample_purchase_feedback.

In questo esempio l'intestazione del modello richiede un'immagine:

{
  "type": "HEADER",
  "format": "IMAGE"
},

In questo caso, il corpo del modello richiede un parametro di testo:

{
  "type": "BODY",
  "text": "Thank you for purchasing {{1}}! We value your feedback and would like to learn more about your experience."
},

Il modello include un pulsante URL dinamico con un parametro:

{
  "type": "BUTTONS",
  "buttons": [
    {
      "type": "URL",
      "text": "Take Survey",
      "url": "https://www.example.com/{{1}}"
    }
  ]
}

I pulsanti di chiamata all'azione per i collegamenti al sito Web sono definiti come MessageTemplateQuickAction oggetti e hanno tre attributi:

  • name
    Viene name utilizzato per cercare il valore in MessageTemplateWhatsAppBindings.
  • text
    Usando il pulsante call to action per i collegamenti al sito Web, l'attributo text definisce il testo aggiunto all'URL.
    Per questo esempio, il text valore è survey-code. Nel messaggio ricevuto dall'utente viene visualizzato un pulsante che li collega all'URL https://www.example.com/survey-code.
  • payload
    Usando il pulsante call to action per i collegamenti al sito Web, l'attributo payload non è obbligatorio.

Per altre informazioni sui pulsanti, vedi la documentazione di WhatsApp per l'oggetto parametro button.

Creare un MessageTemplateImageoggetto , uno MessageTemplateTexte una MessageTemplateQuickAction variabile. Assemblare quindi l'elenco di MessageTemplateValue e MessageTemplateWhatsAppBindings specificando i parametri nell'ordine in cui i parametri vengono visualizzati nel contenuto del modello. L'ordine è importante anche quando si definiscono i pulsanti dell'associazione.

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");

IEnumerable<MessageTemplateValue> values = new List<MessageTemplateValue>
{
    image,
    product,
    urlSuffix
};
var bindings = new MessageTemplateWhatsAppBindings(
    header: new[] { image.Name },
    body: new[] { product.Name },
    button: new[]
    {
        new KeyValuePair<string, MessageTemplateValueWhatsAppSubType>(urlSuffix.Name,
            MessageTemplateValueWhatsAppSubType.Url)
    });

var purchaseFeedbackTemplate = new MessageTemplate(templateName, templateLanguage, values, bindings);

Esempio di codice completo

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Threading.Tasks;
using Azure;
using Azure.Communication.Messages;

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);

            string channelRegistrationId = "<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 (MessageTemplateItem template in templates)
            {
                Console.WriteLine("Name: {0}\tLanguage: {1}\tStatus: {2}\tChannelType: {3}\nContent: {4}\n",
                    template.Name, template.Language, template.Status, template.ChannelType, template.WhatsApp.Content);
            }

            // Send Sample Template sample_template
            MessageTemplate sampleTemplate = AssembleSampleTemplate();
            var sampleTemplateMessageOptions = new SendMessageOptions(channelRegistrationId, recipientList, sampleTemplate);
            var result = await notificationMessagesClient.SendMessageAsync(sampleTemplateMessageOptions);
            PrintResponse(result);
           
            // Send sample template sample_shipping_confirmation
            MessageTemplate shippingConfirmationTemplate = AssembleSampleShippingConfirmation();
            var shippingConfirmationTemplateMessageOptions = new SendMessageOptions(channelRegistrationId, recipientList, shippingConfirmationTemplate);
            result = await notificationMessagesClient.SendMessageAsync(shippingConfirmationTemplateMessageOptions);
            PrintResponse(result);

            // Send sample template sample_movie_ticket_confirmation
            MessageTemplate movieTicketConfirmationTemplate = AssembleSampleMovieTicketConfirmation();
            var movieTicketConfirmationTemplateMessageOptions = new SendMessageOptions(channelRegistrationId, recipientList, movieTicketConfirmationTemplate);
            result = await notificationMessagesClient.SendMessageAsync(movieTicketConfirmationTemplateMessageOptions);
            PrintResponse(result);

            // Send sample template sample_happy_hour_announcement
            MessageTemplate happyHourTemplate = AssembleSampleHappyHourAnnouncement();
            var happyHourTemplateMessageOptions = new SendMessageOptions(channelRegistrationId, recipientList, happyHourTemplate);
            result = await notificationMessagesClient.SendMessageAsync(happyHourTemplateMessageOptions);
            PrintResponse(result);

            // Send sample template sample_flight_confirmation
            MessageTemplate flightConfirmationTemplate = AssembleSampleFlightConfirmation();
            var flightConfirmationTemplateMessageOptions = new SendMessageOptions(channelRegistrationId, recipientList, flightConfirmationTemplate);
            result = await notificationMessagesClient.SendMessageAsync(flightConfirmationTemplateMessageOptions);
            PrintResponse(result);

            // Send sample template sample_issue_resolution
            MessageTemplate issueResolutionTemplate = AssembleSampleIssueResolution();
            var issueResolutionTemplateMessageOptions = new SendMessageOptions(channelRegistrationId, recipientList, issueResolutionTemplate);
            result = await notificationMessagesClient.SendMessageAsync(issueResolutionTemplateMessageOptions);
            PrintResponse(result);

            // Send sample template sample_purchase_feedback
            MessageTemplate purchaseFeedbackTemplate = AssembleSamplePurchaseFeedback();
            var purchaseFeedbackTemplateMessageOptions = new SendMessageOptions(channelRegistrationId, recipientList, purchaseFeedbackTemplate);
            result = await notificationMessagesClient.SendMessageAsync(purchaseFeedbackTemplateMessageOptions);
            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");
            IEnumerable<MessageTemplateValue> values = new List<MessageTemplateValue>
            {
                threeDays
            };
            var bindings = new MessageTemplateWhatsAppBindings(
              body: new[] { threeDays.Name });

            return new MessageTemplate(templateName, templateLanguage, values, bindings);
        }

        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");

            IEnumerable<MessageTemplateValue> values = new List<MessageTemplateValue>
            {
                image,
                title,
                time,
                venue,
                seats
            };
            var bindings = new MessageTemplateWhatsAppBindings(
              header: new[] { image.Name },
              body: new[] { title.Name, time.Name, venue.Name, seats.Name });

            return new MessageTemplate(templateName, templateLanguage, values, bindings);
        }

        public static MessageTemplate AssembleSampleHappyHourAnnouncement()
        {
            string templateName = "sample_happy_hour_announcement";
            string templateLanguage = "en_us";
            var videoUrl = new Uri("< Your .mp4 Video URL >");

            var venue = new MessageTemplateText("venue", "Fourth Coffee");
            var time = new MessageTemplateText("time", "Today 2-4PM");
            var video = new MessageTemplateVideo("video", videoUrl);

            IEnumerable<MessageTemplateValue> values = new List<MessageTemplateValue>
            {
                venue,
                time,
                video
            };
            var bindings = new MessageTemplateWhatsAppBindings(
                header: new[] { video.Name },
                body: new[] { venue.Name, time.Name });

            return new MessageTemplate(templateName, templateLanguage, values, bindings);
        }

        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");

            IEnumerable<MessageTemplateValue> values = new List<MessageTemplateValue>
            {
                document,
                firstName,
                lastName,
                date
            };
            var bindings = new MessageTemplateWhatsAppBindings(
                header: new[] { document.Name },
                body: new[] { firstName.Name, lastName.Name, date.Name });

            return new MessageTemplate(templateName, templateLanguage, values, bindings);
        }

        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");

            IEnumerable<MessageTemplateValue> values = new List<MessageTemplateValue>
            {
                name,
                yes,
                no
            };
            var bindings = new MessageTemplateWhatsAppBindings(
                body: new[] { name.Name },
                button: new[] {
                    new KeyValuePair<string, MessageTemplateValueWhatsAppSubType>(yes.Name,
                        MessageTemplateValueWhatsAppSubType.QuickReply),
                    new KeyValuePair<string, MessageTemplateValueWhatsAppSubType>(no.Name,
                        MessageTemplateValueWhatsAppSubType.QuickReply)
                });

            return new MessageTemplate(templateName, templateLanguage, values, bindings);
        }

        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");

            IEnumerable<MessageTemplateValue> values = new List<MessageTemplateValue>
            {
                image,
                product,
                urlSuffix
            };
            var bindings = new MessageTemplateWhatsAppBindings(
                header: new[] { image.Name },
                body: new[] { product.Name },
                button: new[]
                {
                    new KeyValuePair<string, MessageTemplateValueWhatsAppSubType>(urlSuffix.Name,
                        MessageTemplateValueWhatsAppSubType.Url)
                });

            return new MessageTemplate(templateName, templateLanguage, values, bindings);
        }

        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");
        }
    }
}

Passaggi successivi