WhatsApp テンプレート メッセージを送信する
このドキュメントでは、Advanced Communication Messages SDK を使用して WhatsApp テンプレート メッセージを送信するためのガイダンスを提供します。
テンプレート メッセージを送信する必要がある理由
ユーザーが企業にメッセージを送信するまで、企業はテンプレート メッセージのみを送信できます。
ビジネスまたはユーザーは会話ウィンドウを開始できますが、送信できるメッセージの種類に制限があります。 ユーザーが企業にメッセージを送信してはじめて、企業はアクティブな会話中にテキストまたはメディア メッセージをユーザーに送信できます。 24 時間の会話の期限が切れたら、会話を再開する必要があります。 会話の詳細については、WhatsApp Business Platform で定義を参照してください。
テンプレートに関する WhatsApp の要件については、以下の WhatsApp Business Platform API リファレンスを参照してください:
- テンプレートの作成と管理
- テンプレートのコンポーネント
- テンプレートメッセージの送信
- 企業は、WhatsApp ユーザーにメッセージを送信する前に、オプトイン要件にも従う必要があります
テンプレートの選択
埋め込みサインアップ中に Azure portal を通じて WhatsApp ビジネス アカウントが作成されると、一連のサンプル テンプレートが自動的に提供されるので、試してみることができます。これらのサンプル テンプレートのいくつかの使用法については、「例」を参照してください。
テンプレートの作成
独自のテンプレートを作成するには、Meta WhatsApp Manager を使用します。 「WhatsApp ビジネス アカウントのメッセージ テンプレートを作成する」の Meta Business Help Center の指示に従います。
テンプレートの一覧を表示します。
Azure portal でテンプレートを表示するには、[Azure Communication Service リソース] > [テンプレート] に移動します。
テンプレートを選択すると、テンプレートの詳細を表示できます。
テンプレートの詳細の content
フィールドには、パラメータ バインドを含めることができます。 パラメータ バインドは、次のように表すことができます。
IMAGE
などの値を持つ "format" フィールド。- 数値を囲む二重括弧 (
{{1}}
など)。 1 から始まるインデックスが付けられた番号は、メッセージ テンプレートを作成するためにバインド値を指定する必要がある順序を示します。
または、[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);
例
- サンプル テンプレート sample_shipping_confirmation を使用する
- サンプル テンプレート sample_movie_ticket_confirmation を使用する
- サンプル テンプレート sample_happy_hour_announcement を使用する
- サンプル テンプレート sample_flight_confirmation を使用する
- サンプル テンプレート sample_issue_resolution を使用する
- サンプル テンプレート sample_purchase_feedback を使用する
ヘッダーにメディアが含まれるテンプレート
ヘッダーでメディア パラメータを定義するには、MessageTemplateImage
、MessageTemplateVideo
、MessageTemplateDocument
のいずれかを使用します。
イメージ メディアを必要とするテンプレート定義ヘッダー:
{
"type": "HEADER",
"format": "IMAGE"
},
"format" には、さまざまなメディアの種類が必要な場合があります。 .NET SDK では、各メディアの型には対応する MessageTemplateValue 型が使用されます。
形式 | MessageTemplateValue 型 | ファイルの種類 |
---|---|---|
IMAGE | MessageTemplateImage |
png、jpg |
ビデオ | MessageTemplateVideo |
mp4 |
DOCUMENT | MessageTemplateDocument |
サポートされているメディアの種類とサイズの制限の詳細については、メッセージ メディアに関する 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);
例
- IMAGE: サンプル テンプレート sample_movie_ticket_confirmation を使用する
- IMAGE: サンプル テンプレート sample_purchase_feedback を使用する
- VIDEO: サンプル テンプレート sample_happy_hour_announcement を使用する
- DOCUMENT: サンプル テンプレート sample_flight_confirmation を使用する
クイック返信ボタンを含むテンプレート
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
という名前のサンプル テンプレートはパラメータを取りません。
ターゲット テンプレートの名前と言語を参照して、MessageTemplate
をアセンブルします。
string templateName = "sample_template";
string templateLanguage = "en_us";
var sampleTemplate = new MessageTemplate(templateName, templateLanguage);
サンプル テンプレート 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 を使用する
テンプレートには、テキストや画像など、さまざまな種類のパラメータが必要な場合があります。
このサンプルでは、テンプレートのヘッダーに画像が必要です。
{
"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
変数を作成します。 次に、パラメータがテンプレート コンテンツに表示される順序でパラメータを指定して、MessageTemplateValue
と MessageTemplateWhatsAppBindings
のリストをアセンブルします。
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 つのテキスト パラメータを使用します。
ここでは、テンプレートのヘッダーにビデオが必要です。
{
"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
変数を作成します。 次に、パラメータがテンプレート コンテンツに表示される順序でパラメータを指定して、MessageTemplateValue
と MessageTemplateWhatsAppBindings
のリストをアセンブルします。
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 つのテキスト パラメータを使用します。
ここでは、テンプレートのヘッダーにドキュメントが必要です。
{
"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
変数を作成します。 次に、パラメータがテンプレート コンテンツに表示される順序でパラメータを指定して、MessageTemplateValue
と MessageTemplateWhatsAppBindings
のリストをアセンブルします。
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 つのテキスト パラメータも含まれています。
ここでは、テンプレートの本文に 1 つのテキスト パラメータが必要です。
{
"type": "BODY",
"text": "Hi {{1}}, were we able to solve the issue that you were facing?"
},
テンプレートには、Yes
と No
の 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
変数を作成します。 次に、パラメータがテンプレート コンテンツに表示される順序でパラメータを指定して、MessageTemplateValue
と MessageTemplateWhatsAppBindings
のリストをアセンブルします。 この順序は、バインドのボタンを定義する際にも重要です。
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 を含めます。
Azure portal でテンプレートの詳細を表示すると、次の情報が表示されます:
このサンプルでは、テンプレートのヘッダーに画像が必要です。
{
"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
です。 ユーザーが受信したメッセージには、これらが URLhttps://www.example.com/survey-code
にリンクするボタンで表示されます。payload
Web サイト リンクの行動喚起ボタンを使用する場合、payload
属性は必要ありません。
ボタンの詳細については、Button Parameter Object に関する WhatsApp のドキュメントを参照してください。
MessageTemplateImage
、MessageTemplateText
、MessageTemplateQuickAction
の変数をそれぞれ 1 つ作成します。 次に、パラメータがテンプレート コンテンツに表示される順序でパラメータを指定して、MessageTemplateValue
と MessageTemplateWhatsAppBindings
のリストをアセンブルします。 この順序は、バインドのボタンを定義する際にも重要です。
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");
}
}
}