Aracılığıyla paylaş


WhatsApp şablon iletileri gönderme

Bu belge, Gelişmiş İletişim İletileri SDK'sını kullanarak WhatsApp Şablonu iletileri göndermek için rehberlik sağlar.

Neden şablon iletisi göndermem gerekiyor?

Bir işletme yalnızca kullanıcı işletmeye ileti gönderene kadar şablon iletileri gönderebilir.

bir işletme veya kullanıcı konuşma penceresi başlatabilir, ancak işletme gönderebileceği ileti türleriyle sınırlıdır. Yalnızca kullanıcı işletmeye bir ileti gönderdikten sonra, işletmenin etkin konuşma sırasında kullanıcıya metin veya medya iletileri göndermesine izin verilir. 24 saatlik konuşma penceresinin süresi dolduktan sonra konuşmanın yeniden başlatılması gerekir. Konuşmalar hakkında daha fazla bilgi edinmek için WhatsApp İş Platformu'ndaki tanıma bakın.

Şablonlarla ilgili diğer WhatsApp gereksinimleri için Bkz. WhatsApp İş Platformu API'sinin başvuruları:

Şablon seçme

Ekli kayıt sırasında Azure portalı üzerinden bir WhatsApp Business Hesabı oluşturulduğunda, denemeniz için bir dizi örnek şablon otomatik olarak kullanılabilir. Örnekler'de bu örnek şablonlardan birkaçının kullanımına bakın.

Şablon oluşturma

Kendi şablonlarınızı oluşturmak için Meta WhatsApp Manager'ı kullanın. WhatsApp Business hesabınız için ileti şablonları oluşturma başlığındaki Meta İş Yardım Merkezi'ndeki yönergeleri izleyin.

Liste şablonları

Azure İletişim Hizmeti kaynak > Şablonlarınıza giderek şablonlarınızı Azure portalında görüntüleyebilirsiniz.

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

Şablon seçerek şablon ayrıntılarını görüntüleyebilirsiniz.
content Şablon ayrıntılarının alanı parametre bağlamalarını içerebilir. Parametre bağlamaları şu şekilde belirtilebilir:

  • gibi IMAGEbir değere sahip bir "biçim" alanı.
  • Bir sayıyı çevreleyen çift köşeli ayraçlar, örneğin {{1}}. 1'den başlanan dizine alınan sayı, ileti şablonunu oluşturmak için bağlama değerlerinin hangi sırada sağlanması gerektiğini gösterir.

Screenshot that shows template details.

Alternatif olarak, WhatsApp Business Hesabınızın tüm şablonlarını WhatsApp Manager> Hesap araçları >İleti şablonları'nda görüntüleyebilir ve düzenleyebilirsiniz.

Şablonlarınızı program aracılığıyla listelemek için kanal kimliğiniz için tüm şablonları getirebilirsiniz:

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

Hızlı başvuru

Parametresiz şablonlar

Şablon parametre almazsa, oluştururken MessageTemplatedeğerleri veya bağlamaları sağlamanız gerekmez.

var messageTemplate = new MessageTemplate(templateName, templateLanguage); 

Örnek

Gövdede metin parametreleri olan şablonlar

Gövdede, gibi bir sayıyı çevreleyen çift köşeli ayraçlarla belirtilen parametreleri tanımlamak için {{1}}kullanınMessageTemplateText. 1'den başlanan dizine alınan sayı, ileti şablonunu oluşturmak için bağlama değerlerinin hangi sırada sağlanması gerektiğini gösterir.

Şablon tanımı gövdesi:

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

İleti şablonu derlemesi:

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

Örnekler

Üst bilgide medya bulunan şablonlar

Bir üst bilgide media parametresini tanımlamak için , MessageTemplateVideoveya MessageTemplateDocument kullanınMessageTemplateImage.

Görüntü medyası gerektiren şablon tanımı üst bilgisi:

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

"Biçim" farklı medya türleri gerektirebilir. .NET SDK'sında, her medya türü karşılık gelen bir MessageTemplateValue türü kullanır.

Biçimlendir MessageTemplateValue Türü Dosya Türü
GÖRÜNTÜ MessageTemplateImage png, jpg
VİDEO MessageTemplateVideo mp4
BELGE MessageTemplateDocument pdf

Desteklenen medya türleri ve boyut sınırları hakkında daha fazla bilgi için bkz . WhatsApp'ın ileti medyası belgeleri.

Görüntü medyası için ileti şablonu derlemesi:

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

Örnekler

Hızlı yanıt düğmelerine sahip şablonlar

Hızlı yanıt düğmelerinin yükünü tanımlamak için kullanın MessageTemplateQuickAction .

MessageTemplateQuickAction ve aşağıdaki üç özniteliğe sahiptir.
Özellikle hızlı yanıt düğmeleri için, nesnenizi MessageTemplateQuickAction oluşturmak için bu yönergeleri izleyin.

  • name
    name içindeki değeri MessageTemplateWhatsAppBindingsaramak için kullanılır.
  • text
    text özniteliği kullanılmaz.
  • payload
    Bir payload düğmeye atanan, kullanıcı düğmeyi seçerse ileti yanıtında kullanılabilir.

Şablon tanımı düğmeleri:

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

Düğmelerin şablon tanımında görünme sırası, ile bağlamaları oluştururken düğmelerin tanımlanma sırasıyla MessageTemplateWhatsAppBindingseşleşmelidir.

İleti şablonu derlemesi:

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

Kullanıcıdan gelen hızlı yanıt yanıtlarındaki yük hakkında daha fazla bilgi için Hızlı Yanıt Düğmesi'nden Geri Çağrı Alındı için WhatsApp belgelerine bakın.

Örnek

Eylem çağrısı düğmelerine sahip şablonlar

Eyleme çağrı düğmelerinin URL son ekini tanımlamak için kullanın MessageTemplateQuickAction .

MessageTemplateQuickAction ve aşağıdaki üç özniteliğe sahiptir.
Özellikle eyleme çağrı düğmeleri için, nesnenizi MessageTemplateQuickAction oluşturmak için bu yönergeleri izleyin.

  • name
    name içindeki değeri MessageTemplateWhatsAppBindingsaramak için kullanılır.
  • text
    özniteliği, text URL'ye eklenen metni tanımlar.
  • payload
    payload Özniteliği gerekli değildir.

Şablon tanımı düğmeleri:

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

Düğmelerin şablon tanımında görünme sırası, ile bağlamaları oluştururken düğmelerin tanımlanma sırasıyla MessageTemplateWhatsAppBindingseşleşmelidir.

İleti şablonu derlemesi:

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

Örnek

Örnekler

Bu örneklerde, Azure portalı ekli kaydolma aracılığıyla oluşturulan WhatsApp Business Hesapları için sağlanan örnek şablonlar kullanılmaktadır.

Örnek şablon sample_template kullanma

adlı sample_template örnek şablon parametre almaz.

Screenshot that shows template details for template named sample_template.

Hedef şablonun MessageTemplate adına ve diline başvurarak öğesini derleyin.

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

var sampleTemplate = new MessageTemplate(templateName, templateLanguage); 

Örnek şablon sample_shipping_confirmation kullanma

Bazı şablonlar parametre alır. Yalnızca şablonun gerektirdiği parametreleri ekleyin. Şablonda olmayan parametrelerin dahil olması geçersiz.

Screenshot that shows template details for template named sample_shipping_confirmation.

Bu örnekte, şablonun gövdesinde bir parametre vardır:

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

Parametreler değerler ve MessageTemplateWhatsAppBindings bağlamalarla MessageTemplateValue tanımlanır. değerlerini ve bağlamalarını kullanarak derlemesini MessageTemplatekullanın.

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

Örnek şablon sample_movie_ticket_confirmation kullanma

Şablonlar, metin ve görüntü gibi çeşitli parametre türlerini gerektirebilir.

Screenshot that shows template details for template named sample_movie_ticket_confirmation.

Bu örnekte, şablonun üst bilgisi bir görüntü gerektirir:

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

Şablonun gövdesi dört metin parametresi gerektirir:

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

Bir MessageTemplateImage ve dört MessageTemplateText değişken oluşturun. Ardından, parametreleri şablon içeriğinde göründüğü sırayla sağlayarak ve listenizi MessageTemplateValue MessageTemplateWhatsAppBindings derleyin.

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;

Örnek şablon sample_happy_hour_announcement kullanma

Bu örnek şablon, üst bilgide bir video ve gövdede iki metin parametresi kullanır.

Screenshot that shows template details for template named sample_happy_hour_announcement.

Burada, şablonun üst bilgisi için bir video gerekir:

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

Video, barındırılan mp4 videonun URL'si olmalıdır. Desteklenen medya türleri ve boyut sınırları hakkında daha fazla bilgi için bkz . WhatsApp'ın ileti medyası belgeleri.

Şablonun gövdesi iki metin parametresi gerektirir:

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

Bir MessageTemplateVideo ve iki MessageTemplateText değişken oluşturun. Ardından, parametreleri şablon içeriğinde göründüğü sırayla sağlayarak ve listenizi MessageTemplateValue MessageTemplateWhatsAppBindings derleyin.

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;

Örnek şablon sample_flight_confirmation kullanma

Bu örnek şablon, üst bilgide bir belge ve gövdede üç metin parametresi kullanır.

Screenshot that shows template details for template named sample_flight_confirmation.

Burada, şablonun üst bilgisi için bir belge gerekir:

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

Belge, barındırılan pdf belgesinin URL'si olmalıdır. Desteklenen medya türleri ve boyut sınırları hakkında daha fazla bilgi için bkz . WhatsApp'ın ileti medyası belgeleri.

Şablonun gövdesi için üç metin parametresi gerekir:

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

Bir MessageTemplateDocument ve üç MessageTemplateText değişken oluşturun. Ardından, parametreleri şablon içeriğinde göründüğü sırayla sağlayarak ve listenizi MessageTemplateValue MessageTemplateWhatsAppBindings derleyin.

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;

Örnek şablon sample_issue_resolution kullanma

Bu örnek şablon, iletiye önceden doldurulmuş iki yanıt düğmesi ekler. Ayrıca gövdede bir metin parametresi içerir.

Screenshot that shows template details for template named sample_issue_resolution.

Burada, şablonun gövdesi için bir metin parametresi gerekir:

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

Şablonda önceden doldurulmuş iki yanıt düğmesi Yes ve Nobulunur.

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

Hızlı yanıt düğmeleri nesne olarak MessageTemplateQuickAction tanımlanır ve üç özniteliği vardır:

  • name
    name içindeki değeri MessageTemplateWhatsAppBindingsaramak için kullanılır.
  • text
    Hızlı yanıt düğmeleri text kullanıldığında özniteliği kullanılmaz.
  • payload
    Bir payload düğmeye atanan, kullanıcı düğmeyi seçerse ileti yanıtında kullanılabilir.

Düğmeler hakkında daha fazla bilgi için Bkz. WhatsApp'ın Düğme Parametresi Nesnesi belgeleri.

Bir MessageTemplateText ve iki MessageTemplateQuickAction değişken oluşturun. Ardından, parametreleri şablon içeriğinde göründüğü sırayla sağlayarak ve listenizi MessageTemplateValue MessageTemplateWhatsAppBindings derleyin. Sıralama, bağlamanızın düğmelerini tanımlarken de önemlidir.

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;

Örnek şablon sample_purchase_feedback kullanma

Bu örnek şablon, iletiye dinamik URL bağlantısı olan bir düğme ekler. Ayrıca üst bilgide bir resim ve gövdede bir metin parametresi kullanır.

Önceden oluşturulmuş örnek şablonu sample_purchase_feedbackkullanıyorsanız, düğmesinin URL Türünü olarak Static Dynamicdeğiştirmeniz gerekir.
WhatsApp yöneticisinde İleti şablonlarınıza gidin ve şablonunu sample_purchase_feedbackdüzenleyin. URL Türü açılır listesinde olarak değiştirin Static Dynamic. Gerekirse örnek bir URL ekleyin.

Screenshot that shows editing URL Type in the WhatsApp manager.

Şimdi şablon ayrıntılarını Azure portalında görüntülerseniz şunları görürsünüz: Screenshot that shows template details for template named sample_purchase_feedback.

Bu örnekte, şablonun üst bilgisi bir görüntü gerektirir:

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

Burada, şablonun gövdesi için bir metin parametresi gerekir:

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

Şablonda tek parametreli bir dinamik URL düğmesi bulunur:

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

Web sitesi bağlantıları için eylem çağrısı düğmeleri nesne olarak MessageTemplateQuickAction tanımlanır ve üç özniteliği vardır:

  • name
    name içindeki değeri MessageTemplateWhatsAppBindingsaramak için kullanılır.
  • text
    Web sitesi bağlantıları için eylem çağrısı düğmesini kullanan öznitelik, text URL'ye eklenen metni tanımlar.
    Bu örnekte değerimiz text şeklindedir survey-code. Kullanıcı tarafından alınan iletide, url'sine https://www.example.com/survey-codebağlayan bir düğme gösterilir.
  • payload
    Web sitesi bağlantıları payload için eylem çağrısı düğmesini kullanarak özniteliği gerekli değildir.

Düğmeler hakkında daha fazla bilgi için Bkz. WhatsApp'ın Düğme Parametresi Nesnesi belgeleri.

Bir MessageTemplateImage, bir ve bir MessageTemplateTextMessageTemplateQuickAction değişken oluşturun. Ardından, parametreleri şablon içeriğinde göründüğü sırayla sağlayarak ve listenizi MessageTemplateValue MessageTemplateWhatsAppBindings derleyin. Sıralama, bağlamanızın düğmelerini tanımlarken de önemlidir.

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;

Tam kod örneği

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

Sonraki adımlar