Dela via


Skicka WhatsApp-mallmeddelanden

Det här dokumentet innehåller vägledning för att skicka WhatsApp-mallmeddelanden med hjälp av SDK för avancerade kommunikationsmeddelanden.

Varför behöver jag skicka ett mallmeddelande?

Ett företag kan bara skicka mallmeddelanden tills användaren skickar ett meddelande till företaget.

Ett företag eller en användare kan initiera ett konversationsfönster, men verksamheten är begränsad till vilka typer av meddelanden de kan skicka. Först när användaren har skickat ett meddelande till företaget kan företaget skicka text- eller mediemeddelanden till användaren under den aktiva konversationen. När konversationsfönstret på 24 timmar upphör att gälla måste konversationen initieras igen. Mer information om konversationer finns i definitionen på WhatsApp Business Platform.

Mer information om WhatsApp-krav för mallar finns i API-referenserna för WhatsApp Business Platform:

Välja en mall

När ett WhatsApp Business-konto skapas via Azure-portalen under inbäddad registrering kan en uppsättning exempelmallar vara automatiskt tillgängliga för dig att prova. Se användningen för några av dessa exempelmallar i Exempel.

Skapa mallen

Om du vill skapa egna mallar använder du Meta WhatsApp Manager. Följ anvisningarna i Meta Business Help Center i Skapa meddelandemallar för ditt WhatsApp Business-konto.

Lista mallar

Du kan visa dina mallar i Azure-portalen genom att gå till resursmallarna för Azure Communication Service > .

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

Genom att välja en mall kan du visa mallinformationen.
Fältet content i mallinformationen kan innehålla parameterbindningar. Parameterbindningarna kan betecknas som:

  • Ett formatfält med ett värde som IMAGE.
  • Dubbla hakparenteser som omger ett tal, till exempel {{1}}. Talet, indexerat som startades vid 1, anger i vilken ordning bindningsvärdena måste anges för att skapa meddelandemallen.

Screenshot that shows template details.

Du kan också visa och redigera alla mallar för ditt WhatsApp Business-konto i meddelandemallarna för WhatsApp Manager-kontoverktyg>>.

Om du vill visa en lista över dina mallar programmatiskt kan du hämta alla mallar för ditt kanal-ID:

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

Snabbreferens

Mallar utan parametrar

Om mallen inte tar några parametrar behöver du inte ange värdena eller bindningarna när du MessageTemplateskapar .

var messageTemplate = new MessageTemplate(templateName, templateLanguage); 

Exempel

Mallar med textparametrar i brödtexten

Använd MessageTemplateText för att definiera parametrar i brödtexten som anges med dubbla hakparenteser som omger ett tal, till exempel {{1}}. Talet, indexerat som startades vid 1, anger i vilken ordning bindningsvärdena måste anges för att skapa meddelandemallen.

Malldefinitionstext:

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

Sammansättning av meddelandemall:

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

Exempel

Mallar med media i rubriken

Använd MessageTemplateImage, MessageTemplateVideoeller MessageTemplateDocument för att definiera medieparametern i ett huvud.

Malldefinitionsrubrik som kräver bildmedia:

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

Formatet kan kräva olika medietyper. I .NET SDK använder varje medietyp en motsvarande MessageTemplateValue-typ.

Format MessageTemplateValue-typ Filtyp
AVBILDNING MessageTemplateImage png, jpg
VIDEO MessageTemplateVideo mp4
DOKUMENT MessageTemplateDocument pdf

Mer information om medietyper och storleksbegränsningar som stöds finns i WhatsApps dokumentation för meddelandemedier.

Sammansättning av meddelandemallar för bildmedia:

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

Exempel

Mallar med snabbsvarsknappar

Använd MessageTemplateQuickAction för att definiera nyttolasten för snabbsvarsknappar.

MessageTemplateQuickAction objekt och har följande tre attribut.
Mer specifikt för snabbsvarsknappar följer du dessa riktlinjer för att skapa ditt MessageTemplateQuickAction objekt.

  • name
    name Används för att slå upp värdet i MessageTemplateWhatsAppBindings.
  • text
    Attributet text används inte.
  • payload
    Den payload tilldelade knappen är tillgänglig i ett meddelandesvar om användaren väljer knappen.

Malldefinitionsknappar:

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

Ordningen som knapparna visas i malldefinitionen ska matcha i vilken ordning knapparna definieras när bindningarna skapas med MessageTemplateWhatsAppBindings.

Sammansättning av meddelandemall:

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

Mer information om nyttolasten i snabba svarssvar från användaren finns i WhatsApps dokumentation för mottaget återanrop från en snabbsvarsknapp.

Exempel

Mallar med knappar för anrop till åtgärd

Använd MessageTemplateQuickAction för att definiera url-suffixet för anrop till åtgärdsknappar.

MessageTemplateQuickAction objekt och har följande tre attribut.
För knappar för anrop till åtgärd följer du dessa riktlinjer för att skapa ditt MessageTemplateQuickAction objekt.

  • name
    name Används för att slå upp värdet i MessageTemplateWhatsAppBindings.
  • text
    Attributet text definierar den text som läggs till i URL:en.
  • payload
    Attributet payload krävs inte.

Malldefinitionsknappar:

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

Ordningen som knapparna visas i malldefinitionen ska matcha i vilken ordning knapparna definieras när bindningarna skapas med MessageTemplateWhatsAppBindings.

Sammansättning av meddelandemall:

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

Exempel

Exempel

I de här exemplen används exempelmallar som är tillgängliga för WhatsApp Business-konton som skapats via azure-portalens inbäddade registrering.

Använda exempelmallen sample_template

Exempelmallen med namnet sample_template tar inga parametrar.

Screenshot that shows template details for template named sample_template.

MessageTemplate Sammanställ genom att referera till målmallens namn och språk.

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

var sampleTemplate = new MessageTemplate(templateName, templateLanguage); 

Använda exempelmallen sample_shipping_confirmation

Vissa mallar tar parametrar. Inkludera endast de parametrar som mallen kräver. Att inkludera parametrar som inte finns i mallen är ogiltigt.

Screenshot that shows template details for template named sample_shipping_confirmation.

I det här exemplet har mallens brödtext en parameter:

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

Parametrar definieras med MessageTemplateValue värden och MessageTemplateWhatsAppBindings bindningar. Använd värdena och bindningarna för att montera 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);

Använda exempelmallen sample_movie_ticket_confirmation

Mallar kan kräva olika typer av parametrar, till exempel text och bilder.

Screenshot that shows template details for template named sample_movie_ticket_confirmation.

I det här exemplet kräver mallens huvud en bild:

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

Och brödtexten i mallen kräver fyra textparametrar:

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

Skapa en MessageTemplateImage och fyra MessageTemplateText variabler. Sedan sammanställer du din lista över MessageTemplateValue och dina MessageTemplateWhatsAppBindings genom att ange parametrarna i den ordning som parametrarna visas i mallinnehållet.

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;

Använda exempelmallen sample_happy_hour_announcement

Den här exempelmallen använder en video i rubriken och två textparametrar i brödtexten.

Screenshot that shows template details for template named sample_happy_hour_announcement.

Här kräver mallens huvud en video:

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

Videon ska vara en URL till mp4-video som värd. Mer information om medietyper och storleksbegränsningar som stöds finns i WhatsApps dokumentation för meddelandemedier.

Och brödtexten i mallen kräver två textparametrar:

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

Skapa en MessageTemplateVideo och två MessageTemplateText variabler. Sedan sammanställer du din lista över MessageTemplateValue och dina MessageTemplateWhatsAppBindings genom att ange parametrarna i den ordning som parametrarna visas i mallinnehållet.

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;

Använda exempelmallen sample_flight_confirmation

Den här exempelmallen använder ett dokument i rubriken och tre textparametrar i brödtexten.

Screenshot that shows template details for template named sample_flight_confirmation.

Här kräver mallens huvud ett dokument:

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

Dokumentet ska vara en URL till ett pdf-dokument med värd. Mer information om medietyper och storleksbegränsningar som stöds finns i WhatsApps dokumentation för meddelandemedier.

Och brödtexten i mallen kräver tre textparametrar:

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

Skapa en MessageTemplateDocument och tre MessageTemplateText variabler. Sedan sammanställer du din lista över MessageTemplateValue och dina MessageTemplateWhatsAppBindings genom att ange parametrarna i den ordning som parametrarna visas i mallinnehållet.

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;

Använda exempelmallen sample_issue_resolution

Den här exempelmallen lägger till två förifyllda svarsknappar i meddelandet. Den innehåller också en textparameter i brödtexten.

Screenshot that shows template details for template named sample_issue_resolution.

Här kräver brödtexten i mallen en textparameter:

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

Och mallen innehåller två förifyllda svarsknappar och YesNo.

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

Snabbsvarsknappar definieras som MessageTemplateQuickAction objekt och har tre attribut:

  • name
    name Används för att slå upp värdet i MessageTemplateWhatsAppBindings.
  • text
    Med snabbsvarsknapparna text används inte attributet.
  • payload
    Den payload tilldelade knappen är tillgänglig i ett meddelandesvar om användaren väljer knappen.

Mer information om knappar finns i WhatsApps dokumentation för Knappparameterobjekt.

Skapa en MessageTemplateText och två MessageTemplateQuickAction variabler. Sedan sammanställer du din lista över MessageTemplateValue och dina MessageTemplateWhatsAppBindings genom att ange parametrarna i den ordning som parametrarna visas i mallinnehållet. Ordningen är också viktig när du definierar bindningens knappar.

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;

Använda exempelmallen sample_purchase_feedback

Den här exempelmallen lägger till en knapp med en dynamisk URL-länk till meddelandet. Den använder också en bild i rubriken och en textparameter i brödtexten.

Om du använder den förskapade exempelmallen sample_purchase_feedbackmåste du ändra URL-typen för dess knapp från Static till Dynamic.
Gå till dina meddelandemallar i WhatsApp Manager och redigera mallen för sample_purchase_feedback. I listrutan för URL-typ ändrar du den från Static till Dynamic. Inkludera en exempel-URL om det behövs.

Screenshot that shows editing URL Type in the WhatsApp manager.

Om du nu visar mallinformationen i Azure-portalen ser du: Screenshot that shows template details for template named sample_purchase_feedback.

I det här exemplet kräver mallens huvud en bild:

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

Här kräver brödtexten i mallen en textparameter:

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

Och mallen innehåller en dynamisk URL-knapp med en parameter:

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

Anrop till åtgärdsknappar för webbplatslänkar definieras som MessageTemplateQuickAction objekt och har tre attribut:

  • name
    name Används för att slå upp värdet i MessageTemplateWhatsAppBindings.
  • text
    Med knappen anrop till åtgärd för webbplatslänkar text definierar attributet den text som läggs till i URL:en.
    I det här exemplet är survey-codevårt text värde . I meddelandet som tas emot av användaren visas en knapp som länkar dem till URL:en https://www.example.com/survey-code.
  • payload
    Med knappen anrop till åtgärd för webbplatslänkar payload krävs inte attributet.

Mer information om knappar finns i WhatsApps dokumentation för Knappparameterobjekt.

Skapa en MessageTemplateImage, en MessageTemplateTextoch en MessageTemplateQuickAction variabel. Sedan sammanställer du din lista över MessageTemplateValue och dina MessageTemplateWhatsAppBindings genom att ange parametrarna i den ordning som parametrarna visas i mallinnehållet. Ordningen är också viktig när du definierar bindningens knappar.

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;

Fullständigt kodexempel

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

Nästa steg