Sdílet prostřednictvím


Odeslání zpráv šablony WhatsApp

Tento dokument obsahuje pokyny k odesílání zpráv šablon Aplikace WhatsApp pomocí sady SDK pro pokročilé komunikační zprávy.

Proč potřebuji odeslat zprávu šablony?

Firma může posílat zprávy šablony jenom do doby, než uživatel odešle zprávu do firmy.

Firma nebo uživatel může zahájit okno konverzace, ale firma je omezená na typy zpráv, které může odeslat. Až po odeslání zprávy uživateli do firmy může firma během aktivní konverzace odesílat textové nebo mediální zprávy. Jakmile vyprší platnost 24hodinového okna konverzace, musí se konverzace znovu zahájit. Další informace o konverzacích najdete v definici aplikace WhatsApp Business Platform.

Další požadavky WhatsAppu na šablony najdete v referenčních informacích k rozhraní WhatsApp Business Platform API:

Výběr šablony

Když se během vložené registrace vytvoří účet WhatsApp Business prostřednictvím webu Azure Portal, může být sada ukázkových šablon automaticky k dispozici, abyste si to vyzkoušeli. Podívejte se na použití několika z těchto ukázkových šablon v příkladech.

Vytvoření šablony

Pokud chcete vytvořit vlastní šablony, použijte Meta WhatsApp Manager. Postupujte podle pokynů v Centru nápovědy Meta Business při vytváření šablon zpráv pro váš účet WhatsApp Business.

Výpis šablon

Šablony můžete zobrazit na webu Azure Portal tak, že přejdete na šablony prostředků > služby Azure Communication Service.

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

Výběrem šablony můžete zobrazit podrobnosti o šabloně.
Pole content podrobností šablony může zahrnovat vazby parametrů. Vazby parametrů lze oznamovat takto:

  • Pole "format" s hodnotou, například IMAGE.
  • Dvojité závorky obklopují číslo, například {{1}}. Číslo indexované na 1 označuje pořadí, ve kterém musí být zadány hodnoty vazby k vytvoření šablony zprávy.

Screenshot that shows template details.

Případně můžete zobrazit a upravit všechny šablony vašeho účtu WhatsApp Business v nástrojích> Pro účty WhatsApp Manageru> Šablony zpráv.

Pokud chcete zobrazit seznam šablon prostřednictvím kódu programu, můžete načíst všechny šablony pro ID kanálu:

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

Stručná referenční příručka

Šablony bez parametrů

Pokud šablona nepřijímá žádné parametry, nemusíte při vytváření zadávat MessageTemplatehodnoty ani vazby .

var messageTemplate = new MessageTemplate(templateName, templateLanguage); 

Příklad

Šablony s textovými parametry v textu

Slouží MessageTemplateText k definování parametrů v těle označeném dvojitými hranatými závorkami kolem čísla, například {{1}}. Číslo indexované na 1 označuje pořadí, ve kterém musí být zadány hodnoty vazby k vytvoření šablony zprávy.

Tělo definice šablony:

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

Sestavení šablony zpráv:

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

Příklady

Šablony s multimédii v záhlaví

Použijte MessageTemplateImage, MessageTemplateVideonebo MessageTemplateDocument definujte parametr média v hlavičce.

Hlavička definice šablony vyžadující médium obrázku:

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

Formát může vyžadovat různé typy médií. V sadě .NET SDK každý typ média používá odpovídající typ MessageTemplateValue.

Formát MessageTemplateValue – typ Typ souboru
IMAGE MessageTemplateImage png, jpg
VIDEO MessageTemplateVideo mp4
DOKUMENTU MessageTemplateDocument pdf

Další informace o podporovaných typech médií a omezení velikosti najdete v dokumentaci aplikace WhatsApp k médiím zpráv.

Sestavení šablony zpráv pro médium obrázku:

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

Příklady

Šablony s tlačítky pro rychlé odpovědi

Slouží MessageTemplateQuickAction k definování datové části pro tlačítka pro rychlé odpovědi.

MessageTemplateQuickAction objekty a mají následující tři atributy.
Konkrétně pro tlačítka rychlých odpovědí postupujte podle těchto pokynů a vytvořte objekt MessageTemplateQuickAction .

  • name
    Slouží name k vyhledání hodnoty v MessageTemplateWhatsAppBindings.
  • text
    Atribut text se nepoužívá.
  • payload
    Přiřazení payload k tlačítku je k dispozici ve zprávě odpovědět, pokud uživatel tlačítko vybere.

Tlačítka definice šablony:

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

Pořadí, ve kterém se tlačítka zobrazují v definici šablony, by se měla shodovat s pořadím, ve kterém jsou tlačítka definována při vytváření vazeb pomocí MessageTemplateWhatsAppBindings.

Sestavení šablony zpráv:

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

Další informace o datové části v rychlých odpovědích od uživatele najdete v dokumentaci aplikace WhatsApp k přijetí zpětného volání z tlačítka Rychlá odpověď.

Příklad

Šablony s tlačítky pro volání akcí

Slouží MessageTemplateQuickAction k definování přípony adresy URL pro tlačítka akcí volání.

MessageTemplateQuickAction objekty a mají následující tři atributy.
Konkrétně pro tlačítka akcí volání, postupujte podle těchto pokynů a vytvořte objekt MessageTemplateQuickAction .

  • name
    Slouží name k vyhledání hodnoty v MessageTemplateWhatsAppBindings.
  • text
    Atribut text definuje text, který je připojen k adrese URL.
  • payload
    Atribut payload není povinný.

Tlačítka definice šablony:

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

Pořadí, ve kterém se tlačítka zobrazují v definici šablony, by se měla shodovat s pořadím, ve kterém jsou tlačítka definována při vytváření vazeb pomocí MessageTemplateWhatsAppBindings.

Sestavení šablony zpráv:

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

Příklad

Příklady

Tyto příklady využívají ukázkové šablony, které jsou k dispozici pro účty WhatsApp Business vytvořené prostřednictvím integrované registrace na webu Azure Portal.

Použití ukázkové šablony sample_template

Ukázková šablona s názvem sample_template nepřijímá žádné parametry.

Screenshot that shows template details for template named sample_template.

MessageTemplate Sestavte odkazování na název a jazyk cílové šablony.

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

var sampleTemplate = new MessageTemplate(templateName, templateLanguage); 

Použití ukázkové šablony sample_shipping_confirmation

Některé šablony přebírají parametry. Zahrnout pouze parametry, které šablona vyžaduje. Zahrnutí parametrů, které nejsou v šabloně, je neplatné.

Screenshot that shows template details for template named sample_shipping_confirmation.

V této ukázce má tělo šablony jeden parametr:

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

Parametry jsou definovány s MessageTemplateValue hodnotami a MessageTemplateWhatsAppBindings vazbami. K sestavení MessageTemplatepoužijte hodnoty a vazby .

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

Použití ukázkové šablony sample_movie_ticket_confirmation

Šablony mohou vyžadovat různé typy parametrů, jako je text a obrázky.

Screenshot that shows template details for template named sample_movie_ticket_confirmation.

V této ukázce vyžaduje hlavička šablony obrázek:

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

Text šablony vyžaduje čtyři textové parametry:

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

Vytvořte jednu MessageTemplateImage a čtyři MessageTemplateText proměnné. Pak seznam sestavíte tak, že poskytnete MessageTemplateValueMessageTemplateWhatsAppBindings parametry v pořadí, v jakém se parametry zobrazí v obsahu šablony.

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;

Použití ukázkové šablony sample_happy_hour_announcement

Tato ukázková šablona používá video v záhlaví a dva textové parametry v těle.

Screenshot that shows template details for template named sample_happy_hour_announcement.

Záhlaví šablony vyžaduje video:

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

Video by mělo být adresa URL hostovaného videa mp4. Další informace o podporovaných typech médií a omezení velikosti najdete v dokumentaci aplikace WhatsApp k médiím zpráv.

Text šablony vyžaduje dva textové parametry:

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

Vytvořte jednu MessageTemplateVideo a dvě MessageTemplateText proměnné. Pak seznam sestavíte tak, že poskytnete MessageTemplateValueMessageTemplateWhatsAppBindings parametry v pořadí, v jakém se parametry zobrazí v obsahu šablony.

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;

Použití ukázkové šablony sample_flight_confirmation

Tato ukázková šablona používá dokument v záhlaví a tři textové parametry v textu.

Screenshot that shows template details for template named sample_flight_confirmation.

Záhlaví šablony vyžaduje dokument:

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

Dokument by měl být adresa URL hostovaného dokumentu PDF. Další informace o podporovaných typech médií a omezení velikosti najdete v dokumentaci aplikace WhatsApp k médiím zpráv.

Text šablony vyžaduje tři textové parametry:

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

Vytvořte jednu MessageTemplateDocument a tři MessageTemplateText proměnné. Pak seznam sestavíte tak, že poskytnete MessageTemplateValueMessageTemplateWhatsAppBindings parametry v pořadí, v jakém se parametry zobrazí v obsahu šablony.

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;

Použití ukázkové šablony sample_issue_resolution

Tato ukázková šablona přidá do zprávy dvě předvyplněná tlačítka pro odpovědi. Obsahuje také jeden textový parametr v těle.

Screenshot that shows template details for template named sample_issue_resolution.

Tady text šablony vyžaduje jeden textový parametr:

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

Šablona obsahuje dvě předvyplněná tlačítka Yes pro odpovědi a No.

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

Tlačítka pro rychlé odpovědi jsou definována jako MessageTemplateQuickAction objekty a mají tři atributy:

  • name
    Slouží name k vyhledání hodnoty v MessageTemplateWhatsAppBindings.
  • text
    Pomocí tlačítek text pro rychlé odpovědi se atribut nepoužívá.
  • payload
    Přiřazení payload k tlačítku je k dispozici ve zprávě odpovědět, pokud uživatel tlačítko vybere.

Další informace o tlačítkách najdete v dokumentaci aplikace WhatsApp k objektu parametru tlačítka.

Vytvořte jednu MessageTemplateText a dvě MessageTemplateQuickAction proměnné. Pak seznam sestavíte tak, že poskytnete MessageTemplateValueMessageTemplateWhatsAppBindings parametry v pořadí, v jakém se parametry zobrazí v obsahu šablony. Pořadí také záleží při definování tlačítek vazby.

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;

Použití ukázkové šablony sample_purchase_feedback

Tato ukázková šablona přidá do zprávy tlačítko s dynamickým odkazem na adresu URL. Používá také obrázek v záhlaví a textový parametr v těle.

Pokud používáte předem vytvořenou ukázkovou šablonu sample_purchase_feedback, je nutné upravit typ adresy URL jeho tlačítka z Static do Dynamic.
Přejděte do šablon zpráv ve Správci WhatsApp a upravte šablonu pro sample_purchase_feedback. V rozevíracím seznamu pro typ adresy URL ho změňte na StaticDynamic. V případě potřeby zahrňte ukázkovou adresu URL.

Screenshot that shows editing URL Type in the WhatsApp manager.

Pokud teď na webu Azure Portal zobrazíte podrobnosti o šabloně, uvidíte: Screenshot that shows template details for template named sample_purchase_feedback.

V této ukázce vyžaduje hlavička šablony obrázek:

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

Tady text šablony vyžaduje jeden textový parametr:

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

Šablona obsahuje tlačítko dynamické adresy URL s jedním parametrem:

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

Tlačítka akcí volání pro odkazy na web jsou definována jako MessageTemplateQuickAction objekty a mají tři atributy:

  • name
    Slouží name k vyhledání hodnoty v MessageTemplateWhatsAppBindings.
  • text
    Pomocí tlačítka akce volání pro odkazy text na web definuje atribut text, který je připojen k adrese URL.
    V tomto příkladu je survey-codenaše text hodnota . Ve zprávě přijaté uživatelem se zobrazí tlačítko, které je propojí s adresou URL https://www.example.com/survey-code.
  • payload
    Při použití tlačítka akce volat na odkazy payload na web není atribut povinný.

Další informace o tlačítkách najdete v dokumentaci aplikace WhatsApp k objektu parametru tlačítka.

Vytvořte jednu MessageTemplateImage, jednu MessageTemplateTexta jednu proměnnou MessageTemplateQuickAction . Pak seznam sestavíte tak, že poskytnete MessageTemplateValueMessageTemplateWhatsAppBindings parametry v pořadí, v jakém se parametry zobrazí v obsahu šablony. Pořadí také záleží při definování tlačítek vazby.

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;

Příklad úplného kódu

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

Další kroky