次の方法で共有


WhatsApp テンプレート メッセージを送信する

このドキュメントでは、Advanced Communication Messages SDK を使用して WhatsApp テンプレート メッセージを送信するためのガイダンスを提供します。

テンプレート メッセージを送信する必要がある理由

ユーザーが企業にメッセージを送信するまで、企業はテンプレート メッセージのみを送信できます。

ビジネスまたはユーザーは会話ウィンドウを開始できますが、送信できるメッセージの種類に制限があります。 ユーザーが企業にメッセージを送信してはじめて、企業はアクティブな会話中にテキストまたはメディア メッセージをユーザーに送信できます。 24 時間の会話の期限が切れたら、会話を再開する必要があります。 会話の詳細については、WhatsApp Business Platform で定義を参照してください。

テンプレートに関する WhatsApp の要件については、以下の WhatsApp Business Platform API リファレンスを参照してください:

テンプレートの選択

埋め込みサインアップ中に Azure portal を通じて WhatsApp ビジネス アカウントが作成されると、一連のサンプル テンプレートが自動的に提供されるので、試してみることができます。これらのサンプル テンプレートのいくつかの使用法については、「」を参照してください。

テンプレートの作成

独自のテンプレートを作成するには、Meta WhatsApp Manager を使用します。 「WhatsApp ビジネス アカウントのメッセージ テンプレートを作成する」の Meta Business Help Center の指示に従います。

テンプレートの一覧を表示します。

Azure portal でテンプレートを表示するには、[Azure Communication Service リソース] > [テンプレート] に移動します。

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

テンプレートを選択すると、テンプレートの詳細を表示できます。
テンプレートの詳細の content フィールドには、パラメータ バインドを含めることができます。 パラメータ バインドは、次のように表すことができます。

  • IMAGE などの値を持つ "format" フィールド。
  • 数値を囲む二重括弧 ({{1}} など)。 1 から始まるインデックスが付けられた番号は、メッセージ テンプレートを作成するためにバインド値を指定する必要がある順序を示します。

Screenshot that shows template details.

または、[WhatsApp Manager] > [Account tools] > [Message templates] で、WhatsApp ビジネス アカウントのすべてのテンプレートを表示および編集することもできます。

プログラムを使用してテンプレートを一覧表示するには、自分のチャネル ID のすべてのテンプレートをフェッチします。

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

クイック リファレンス

パラメータのないテンプレート

テンプレートでパラメータを受け取らない場合は、MessageTemplate の作成時に値やバインドを指定する必要はありません。

var messageTemplate = new MessageTemplate(templateName, templateLanguage); 

本文にテキスト パラメータを含むテンプレート

MessageTemplateText を使用して、数値を囲む二重角かっこで示された本文のパラメータ ({{1}} など) を定義します。 1 から始まるインデックスが付けられた番号は、メッセージ テンプレートを作成するためにバインド値を指定する必要がある順序を示します。

テンプレート定義本文:

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

メッセージ テンプレート アセンブリ:

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

ヘッダーにメディアが含まれるテンプレート

ヘッダーでメディア パラメータを定義するには、MessageTemplateImageMessageTemplateVideoMessageTemplateDocument のいずれかを使用します。

イメージ メディアを必要とするテンプレート定義ヘッダー:

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

"format" には、さまざまなメディアの種類が必要な場合があります。 .NET SDK では、各メディアの型には対応する MessageTemplateValue 型が使用されます。

形式 MessageTemplateValue 型 ファイルの種類
IMAGE MessageTemplateImage png、jpg
ビデオ MessageTemplateVideo mp4
DOCUMENT MessageTemplateDocument PDF

サポートされているメディアの種類とサイズの制限の詳細については、メッセージ メディアに関する WhatsApp のドキュメントを参照してください。

イメージ メディアのメッセージ テンプレート アセンブリ:

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

クイック返信ボタンを含むテンプレート

MessageTemplateQuickAction を使用して、クイック返信ボタンのペイロードを定義します。

MessageTemplateQuickAction オブジェクトには次の 3 つの属性があります。
特にクイック返信ボタンの場合は、次のガイドラインに従って MessageTemplateQuickAction オブジェクトを作成します。

  • name
    name は、MessageTemplateWhatsAppBindings の値を検索するために使用されます。
  • text
    text 属性は使用されません。
  • payload
    ボタンに割り当てられた payload は、ユーザーがボタンを選択した場合にメッセージ応答で使用できます。

テンプレート定義ボタン:

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

テンプレート定義にボタンが表示される順序は、MessageTemplateWhatsAppBindings でバインドを作成するときにボタンが定義される順序と一致する必要があります。

メッセージ テンプレート アセンブリ:

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

ユーザーからのクイック返信応答のペイロードの詳細については、クイック返信ボタンからのコールバックの受信に関する WhatsApp のドキュメントを参照してください。

行動喚起ボタンを含むテンプレート

MessageTemplateQuickAction を使用して、行動喚起ボタンの URL サフィックスを定義します。

MessageTemplateQuickAction オブジェクトには次の 3 つの属性があります。
特に行動喚起ボタンの場合は、次のガイドラインに従って MessageTemplateQuickAction オブジェクトを作成します。

  • name
    name は、MessageTemplateWhatsAppBindings の値を検索するために使用されます。
  • text
    text 属性は、URL に追加されるテキストを定義します。
  • payload
    payload 属性は必要ありません。

テンプレート定義ボタン:

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

テンプレート定義にボタンが表示される順序は、MessageTemplateWhatsAppBindings でバインドを作成するときにボタンが定義される順序と一致する必要があります。

メッセージ テンプレート アセンブリ:

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

これらの例では、Azure portal の埋め込みサインアップを使用して作成された WhatsApp ビジネス アカウントで使用できるサンプル テンプレートを利用します。

サンプル テンプレート sample_template を使用する

sample_template という名前のサンプル テンプレートはパラメータを取りません。

Screenshot that shows template details for template named sample_template.

ターゲット テンプレートの名前と言語を参照して、MessageTemplate をアセンブルします。

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

var sampleTemplate = new MessageTemplate(templateName, templateLanguage); 

サンプル テンプレート sample_shipping_confirmation を使用する

一部のテンプレートはパラメータを受け取ります。 テンプレートに必要なパラメータのみを含めます。 テンプレートに含まれていないパラメータは無効です。

Screenshot that shows template details for template named sample_shipping_confirmation.

このサンプルでは、テンプレートの本文に 1 つのパラメータがあります。

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

パラメータは、MessageTemplateValue 値と MessageTemplateWhatsAppBindings バインドで定義されます。 この値とバインドを使用して、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);

サンプル テンプレート sample_movie_ticket_confirmation を使用する

テンプレートには、テキストや画像など、さまざまな種類のパラメータが必要な場合があります。

Screenshot that shows template details for template named sample_movie_ticket_confirmation.

このサンプルでは、テンプレートのヘッダーに画像が必要です。

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

テンプレートの本文には、次の 4 つのテキスト パラメータが必要です。

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

1 つの MessageTemplateImage と 4 つの MessageTemplateText 変数を作成します。 次に、パラメータがテンプレート コンテンツに表示される順序でパラメータを指定して、MessageTemplateValueMessageTemplateWhatsAppBindings のリストをアセンブルします。

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;

サンプル テンプレート sample_happy_hour_announcement を使用する

このサンプル テンプレートでは、ヘッダーで 1 つのビデオ、本文で 2 つのテキスト パラメータを使用します。

Screenshot that shows template details for template named sample_happy_hour_announcement.

ここでは、テンプレートのヘッダーにビデオが必要です。

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

このビデオは、ホストされている mp4 ビデオの URL である必要があります。 サポートされているメディアの種類とサイズの制限の詳細については、メッセージ メディアに関する WhatsApp のドキュメントを参照してください。

テンプレートの本文には、次の 2 つのテキスト パラメータが必要です。

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

1 つの MessageTemplateVideo と 2 つの MessageTemplateText 変数を作成します。 次に、パラメータがテンプレート コンテンツに表示される順序でパラメータを指定して、MessageTemplateValueMessageTemplateWhatsAppBindings のリストをアセンブルします。

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;

サンプル テンプレート sample_flight_confirmation を使用する

このサンプル テンプレートでは、ヘッダーで 1 つのドキュメント、本文で 3 つのテキスト パラメータを使用します。

Screenshot that shows template details for template named sample_flight_confirmation.

ここでは、テンプレートのヘッダーにドキュメントが必要です。

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

このドキュメントは、ホストされている PDF ドキュメントの URL である必要があります。 サポートされているメディアの種類とサイズの制限の詳細については、メッセージ メディアに関する WhatsApp のドキュメントを参照してください。

テンプレートの本文には、次の 3 つのテキスト パラメータが必要です。

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

1 つの MessageTemplateDocument と 3 つの MessageTemplateText 変数を作成します。 次に、パラメータがテンプレート コンテンツに表示される順序でパラメータを指定して、MessageTemplateValueMessageTemplateWhatsAppBindings のリストをアセンブルします。

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;

サンプル テンプレート sample_issue_resolution を使用する

このサンプル テンプレートは、メッセージに 2 つの事前入力された返信ボタンを追加します。 本文には、1 つのテキスト パラメータも含まれています。

Screenshot that shows template details for template named sample_issue_resolution.

ここでは、テンプレートの本文に 1 つのテキスト パラメータが必要です。

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

テンプレートには、YesNoの 2 つの事前入力された返信ボタンが含まれています。

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

クイック返信ボタンは、MessageTemplateQuickAction オブジェクトとして定義され、次の 3 つの属性があります。

  • name
    name は、MessageTemplateWhatsAppBindings の値を検索するために使用されます。
  • text
    クイック返信ボタンを使用すると、text 属性は使用されません。
  • payload
    ボタンに割り当てられた payload は、ユーザーがボタンを選択した場合にメッセージ応答で使用できます。

ボタンの詳細については、Button Parameter Object に関する WhatsApp のドキュメントを参照してください。

1 つの MessageTemplateText と 2 つの MessageTemplateQuickAction 変数を作成します。 次に、パラメータがテンプレート コンテンツに表示される順序でパラメータを指定して、MessageTemplateValueMessageTemplateWhatsAppBindings のリストをアセンブルします。 この順序は、バインドのボタンを定義する際にも重要です。

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;

サンプル テンプレート sample_purchase_feedback を使用する

このサンプル テンプレートでは、動的 URL リンクを含むボタンをメッセージに追加します。 また、ヘッダーには 1 つの画像が使用され、本文には 1 つのテキスト パラメータが使用されます。

事前に作成されたサンプル テンプレート sample_purchase_feedback を使用する場合は、そのボタンの [URL の種類] を Static から Dynamic に変更する必要があります。
WhatsApp Manager で [Message templates] に移動し、sample_purchase_feedback のテンプレートを編集します。 [URL の種類] のドロップダウンで、Static から Dynamic に変更します。 必要に応じてサンプル URL を含めます。

Screenshot that shows editing URL Type in the WhatsApp manager.

Azure portal でテンプレートの詳細を表示すると、次の情報が表示されます: Screenshot that shows template details for template named sample_purchase_feedback.

このサンプルでは、テンプレートのヘッダーに画像が必要です。

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

ここでは、テンプレートの本文に 1 つのテキスト パラメータが必要です。

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

このテンプレートには、1 つのパラメータを含む動的 URL ボタンが含まれています。

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

Web サイト リンクの行動喚起ボタンは、MessageTemplateQuickAction オブジェクトとして定義され、次の 3 つの属性を持ちます。

  • name
    name は、MessageTemplateWhatsAppBindings の値を検索するために使用されます。
  • text
    text 属性は、Web サイト リンクの行動喚起ボタンを使用して、URL に追加されるテキストを定義します。
    この例では、text 値は survey-code です。 ユーザーが受信したメッセージには、これらが URL https://www.example.com/survey-code にリンクするボタンで表示されます。
  • payload
    Web サイト リンクの行動喚起ボタンを使用する場合、payload 属性は必要ありません。

ボタンの詳細については、Button Parameter Object に関する WhatsApp のドキュメントを参照してください。

MessageTemplateImageMessageTemplateTextMessageTemplateQuickAction の変数をそれぞれ 1 つ作成します。 次に、パラメータがテンプレート コンテンツに表示される順序でパラメータを指定して、MessageTemplateValueMessageTemplateWhatsAppBindings のリストをアセンブルします。 この順序は、バインドのボタンを定義する際にも重要です。

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;

完全なコード例

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

次のステップ