Bagikan melalui


Mengirim pesan templat WhatsApp

Dokumen ini menyediakan panduan untuk mengirim pesan Templat WhatsApp menggunakan SDK Pesan Komunikasi Tingkat Lanjut.

Mengapa saya perlu mengirim pesan templat?

Bisnis hanya dapat mengirim pesan templat hingga pengguna mengirim pesan ke bisnis.

Bisnis atau pengguna dapat memulai jendela percakapan, tetapi bisnis terbatas pada jenis pesan yang dapat mereka kirim. Hanya setelah pengguna mengirim pesan ke bisnis, bisnis diizinkan untuk mengirim pesan teks atau media kepada pengguna selama percakapan aktif. Setelah jendela percakapan 24 jam kedaluwarsa, percakapan harus diinisiasi kembali. Untuk mempelajari selengkapnya tentang percakapan, lihat definisi di WhatsApp Business Platform.

Untuk persyaratan WhatsApp lebih lanjut tentang templat, lihat referensi WHATSApp Business Platform API:

Memilih templat

Saat Akun WhatsApp Business dibuat melalui portal Azure selama pendaftaran yang disematkan, serangkaian templat sampel mungkin tersedia secara otomatis untuk Anda coba. Lihat penggunaan untuk beberapa templat sampel ini di Contoh.

Buat templat

Untuk membuat templat Anda sendiri, gunakan Meta WhatsApp Manager. Ikuti instruksi di Pusat Bantuan Meta Business di Membuat templat pesan untuk akun WhatsApp Business Anda.

Mencantumkan templat

Anda bisa menampilkan templat Anda di portal Azure dengan masuk ke Templat sumber daya > Azure Communication Service Anda.

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

Dengan memilih templat, Anda dapat melihat detail templat.
Bidang content detail templat mungkin menyertakan pengikatan parameter. Pengikatan parameter dapat ditandai sebagai:

  • Bidang "format" dengan nilai seperti IMAGE.
  • Tanda kurung ganda mengelilingi angka, seperti {{1}}. Angka, yang diindeks dimulai pada 1, menunjukkan urutan di mana nilai pengikatan harus disediakan untuk membuat templat pesan.

Screenshot that shows template details.

Atau, Anda dapat melihat dan mengedit semua templat Akun WhatsApp Business Anda di templat Pesan alat> Akun Pengelola> WhatsApp.

Untuk mencantumkan templat Anda secara terprogram, Anda dapat mengambil semua templat untuk ID saluran Anda:

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

Referensi cepat

Templat tanpa parameter

Jika templat tidak mengambil parameter, Anda tidak perlu menyediakan nilai atau pengikatan saat membuat MessageTemplate.

var messageTemplate = new MessageTemplate(templateName, templateLanguage); 

Contoh

Templat dengan parameter teks dalam isi

Gunakan MessageTemplateText untuk menentukan parameter dalam isi yang ditandai dengan tanda kurung ganda di sekitar angka, seperti {{1}}. Angka, yang diindeks dimulai pada 1, menunjukkan urutan di mana nilai pengikatan harus disediakan untuk membuat templat pesan.

Isi definisi templat:

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

Rakitan templat pesan:

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

Contoh

Templat dengan media di header

Gunakan MessageTemplateImage, MessageTemplateVideo, atau MessageTemplateDocument untuk menentukan parameter media di header.

Header definisi templat yang memerlukan media gambar:

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

"Format" dapat memerlukan jenis media yang berbeda. Di .NET SDK, setiap jenis media menggunakan jenis MessageTemplateValue yang sesuai.

Format Jenis MessageTemplateValue Tipe File
GAMBAR MessageTemplateImage png, jpg
VIDEO MessageTemplateVideo mp4
DOKUMEN MessageTemplateDocument pdf

Untuk informasi selengkapnya tentang jenis media dan batas ukuran yang didukung, lihat dokumentasi WhatsApp untuk media pesan.

Rakitan templat pesan untuk media gambar:

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

Contoh

Templat dengan tombol balasan cepat

Gunakan MessageTemplateQuickAction untuk menentukan payload untuk tombol balasan cepat.

MessageTemplateQuickAction objek dan memiliki tiga atribut berikut.
Khusus untuk tombol balasan cepat, ikuti panduan ini untuk membuat objek Anda MessageTemplateQuickAction .

  • name
    name digunakan untuk mencari nilai di MessageTemplateWhatsAppBindings.
  • text
    Atribut text tidak digunakan.
  • payload
    Tombol payload yang ditetapkan ke tersedia dalam balasan pesan jika pengguna memilih tombol .

Tombol definisi templat:

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

Urutan tombol yang muncul dalam definisi templat harus cocok dengan urutan di mana tombol ditentukan saat membuat pengikatan dengan MessageTemplateWhatsAppBindings.

Rakitan templat pesan:

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

Untuk informasi selengkapnya tentang payload dalam respons balasan cepat dari pengguna, lihat dokumentasi WhatsApp untuk Menerima Panggilan Balik dari Tombol Balasan Cepat.

Contoh

Templat dengan tombol ajakan bertindak

Gunakan MessageTemplateQuickAction untuk menentukan akhiran url untuk tombol ajakan bertindak.

MessageTemplateQuickAction objek dan memiliki tiga atribut berikut.
Khusus untuk tombol ajakan bertindak, ikuti panduan ini untuk membuat objek Anda MessageTemplateQuickAction .

  • name
    name digunakan untuk mencari nilai di MessageTemplateWhatsAppBindings.
  • text
    Atribut text menentukan teks yang ditambahkan ke URL.
  • payload
    Atribut payload tidak diperlukan.

Tombol definisi templat:

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

Urutan tombol yang muncul dalam definisi templat harus cocok dengan urutan di mana tombol ditentukan saat membuat pengikatan dengan MessageTemplateWhatsAppBindings.

Rakitan templat pesan:

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

Contoh

Contoh

Contoh-contoh ini menggunakan templat sampel yang tersedia untuk Akun WhatsApp Business yang dibuat melalui pendaftaran yang disematkan portal Azure.

Gunakan contoh templat sample_template

Templat sampel bernama sample_template tidak mengambil parameter.

Screenshot that shows template details for template named sample_template.

Merakit MessageTemplate dengan merujuk nama dan bahasa templat target.

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

var sampleTemplate = new MessageTemplate(templateName, templateLanguage); 

Gunakan contoh templat sample_shipping_confirmation

Beberapa templat mengambil parameter. Hanya sertakan parameter yang diperlukan templat. Menyertakan parameter yang tidak ada dalam templat tidak valid.

Screenshot that shows template details for template named sample_shipping_confirmation.

Dalam sampel ini, isi templat memiliki satu parameter:

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

Parameter didefinisikan dengan MessageTemplateValue nilai dan MessageTemplateWhatsAppBindings pengikatan. Gunakan nilai dan pengikatan untuk merakit 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);

Gunakan contoh templat sample_movie_ticket_confirmation

Templat dapat memerlukan berbagai jenis parameter seperti teks dan gambar.

Screenshot that shows template details for template named sample_movie_ticket_confirmation.

Dalam sampel ini, header templat memerlukan gambar:

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

Dan isi templat memerlukan empat parameter teks:

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

Buat satu MessageTemplateImage dan empat MessageTemplateText variabel. Kemudian, kumpulkan daftar MessageTemplateValue Dan Anda MessageTemplateWhatsAppBindings dengan menyediakan parameter dalam urutan parameter muncul dalam konten templat.

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;

Menggunakan contoh sample_happy_hour_announcement templat

Templat sampel ini menggunakan video di header dan dua parameter teks dalam isi.

Screenshot that shows template details for template named sample_happy_hour_announcement.

Di sini, header templat memerlukan video:

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

Video harus berupa URL untuk menghosting video mp4. Untuk informasi selengkapnya tentang jenis media dan batas ukuran yang didukung, lihat dokumentasi WhatsApp untuk media pesan.

Dan isi templat memerlukan dua parameter teks:

{
  "type": "BODY",
  "text": "Happy hour is here! πŸΊπŸ˜€πŸΈ\nPlease be merry and enjoy the day. πŸŽ‰\nVenue: {{1}}\nTime: {{2}}"
},

Buat satu MessageTemplateVideo dan dua MessageTemplateText variabel. Kemudian, kumpulkan daftar MessageTemplateValue Dan Anda MessageTemplateWhatsAppBindings dengan menyediakan parameter dalam urutan parameter muncul dalam konten templat.

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;

Menggunakan contoh sample_flight_confirmation templat

Templat sampel ini menggunakan dokumen di header dan tiga parameter teks dalam isi.

Screenshot that shows template details for template named sample_flight_confirmation.

Di sini, header templat memerlukan dokumen:

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

Dokumen harus berupa URL untuk menghosting dokumen pdf. Untuk informasi selengkapnya tentang jenis media dan batas ukuran yang didukung, lihat dokumentasi WhatsApp untuk media pesan.

Dan isi templat memerlukan tiga parameter teks:

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

Buat satu MessageTemplateDocument dan tiga MessageTemplateText variabel. Kemudian, kumpulkan daftar MessageTemplateValue Dan Anda MessageTemplateWhatsAppBindings dengan menyediakan parameter dalam urutan parameter muncul dalam konten templat.

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;

Gunakan contoh templat sample_issue_resolution

Templat sampel ini menambahkan dua tombol balasan yang telah diisi sebelumnya ke pesan. Ini juga mencakup satu parameter teks dalam isi.

Screenshot that shows template details for template named sample_issue_resolution.

Di sini, isi templat memerlukan satu parameter teks:

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

Dan templat menyertakan dua tombol balasan yang telah diisi sebelumnya, Yes dan No.

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

Tombol balasan cepat didefinisikan sebagai MessageTemplateQuickAction objek dan memiliki tiga atribut:

  • name
    name digunakan untuk mencari nilai di MessageTemplateWhatsAppBindings.
  • text
    Menggunakan tombol balasan cepat, text atribut tidak digunakan.
  • payload
    Tombol payload yang ditetapkan ke tersedia dalam balasan pesan jika pengguna memilih tombol .

Untuk informasi selengkapnya tentang tombol, lihat dokumentasi WhatsApp untuk Objek Parameter Tombol.

Buat satu MessageTemplateText dan dua MessageTemplateQuickAction variabel. Kemudian, kumpulkan daftar MessageTemplateValue Dan Anda MessageTemplateWhatsAppBindings dengan menyediakan parameter dalam urutan parameter muncul dalam konten templat. Pesanan juga penting saat menentukan tombol pengikatan Anda.

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;

Menggunakan contoh sample_purchase_feedback templat

Templat sampel ini menambahkan tombol dengan tautan URL dinamis ke pesan. Ini juga menggunakan gambar di header dan parameter teks dalam isi.

Jika menggunakan templat sample_purchase_feedbacksampel yang dibuat sebelumnya, Anda perlu memodifikasi Jenis URL tombolnya dari Static ke Dynamic.
Buka Templat pesan Anda di manajer WhatsApp dan edit templat untuk sample_purchase_feedback. Di menu dropdown untuk Jenis URL, ubah dari Static ke Dynamic. Sertakan URL sampel jika perlu.

Screenshot that shows editing URL Type in the WhatsApp manager.

Sekarang, jika Anda melihat detail templat di portal Azure, Anda akan melihat:Screenshot that shows template details for template named sample_purchase_feedback.

Dalam sampel ini, header templat memerlukan gambar:

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

Di sini, isi templat memerlukan satu parameter teks:

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

Dan templat menyertakan tombol URL dinamis dengan satu parameter:

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

Tombol ajakan bertindak untuk tautan situs web didefinisikan sebagai MessageTemplateQuickAction objek dan memiliki tiga atribut:

  • name
    name digunakan untuk mencari nilai di MessageTemplateWhatsAppBindings.
  • text
    Menggunakan tombol ajakan bertindak untuk tautan situs web, text atribut menentukan teks yang ditambahkan ke URL.
    Untuk contoh ini, nilai kami text adalah survey-code. Dalam pesan yang diterima oleh pengguna, mereka disajikan dengan tombol yang menautkannya ke URL https://www.example.com/survey-code.
  • payload
    Menggunakan tombol ajakan bertindak untuk tautan situs web, payload atribut tidak diperlukan.

Untuk informasi selengkapnya tentang tombol, lihat dokumentasi WhatsApp untuk Objek Parameter Tombol.

Buat satu MessageTemplateImage, satu MessageTemplateText, dan satu MessageTemplateQuickAction variabel. Kemudian, kumpulkan daftar MessageTemplateValue Dan Anda MessageTemplateWhatsAppBindings dengan menyediakan parameter dalam urutan parameter muncul dalam konten templat. Pesanan juga penting saat menentukan tombol pengikatan Anda.

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;

Contoh kode lengkap

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

Langkah berikutnya