고급 메시지를 사용하여 WhatsApp 템플릿 메시지 보내기
이 문서에서는 고급 통신 메시지 SDK를 사용하여 WhatsApp 템플릿 메시지를 보내는 방법을 설명합니다.
필수 조건
- Azure Communication Services 리소스에 WhatsApp Business 계정을 등록합니다.
- WhatsApp 템플릿 메시지를 만듭니다.
- 메시지를 받을 활성 WhatsApp 전화 번호입니다.
개체 모델
다음 클래스 및 인터페이스는 .NET용 Azure Communication Services 메시지 SDK의 주요 기능 중 일부를 처리합니다.
클래스 이름 | 설명 |
---|---|
NotificationMessagesClient |
Azure Communication Services 리소스에 연결합니다. 메시지를 보냅니다. |
MessageTemplate |
사용하는 템플릿과 메시지에 대한 템플릿 속성의 콘텐츠를 정의합니다. |
TemplateNotificationContent |
보낼 템플릿 메시지의 "who" 및 "what"을 정의합니다. |
참고 항목
자세한 내용은 .NET용 Azure SDK 참조 Azure.Communication.Messages 네임스페이스를 참조하세요.
지원되는 WhatsApp 템플릿 형식
템플릿 유형 | 설명 |
---|---|
텍스트 기반 메시지 템플릿 | WhatsApp 메시지 템플릿은 매개 변수가 있거나 없는 특정 메시지 형식입니다. |
미디어 기반 메시지 템플릿 | 헤더 구성 요소에 대한 미디어 매개 변수가 있는 WhatsApp 메시지 템플릿입니다. |
대화형 메시지 템플릿 | 대화형 메시지 템플릿은 구성 요소 개체를 사용하는 대화형 단추를 포함하여 받는 사람에게 보낼 수 있는 콘텐츠를 확장합니다. 작업 호출 및 빠른 회신이 모두 지원됩니다. |
위치 기반 메시지 템플릿 | 헤더 구성 요소에 대한 경도 및 위도 측면에서 위치 매개 변수가 있는 WhatsApp 메시지 템플릿입니다. |
일반적인 구성
다음 단계에 따라 필요한 코드 조각을 파일의 Main 함수에 추가합니다 Program.cs
.
- WhatsApp 템플릿 메시지를 만들고 관리합니다.
- 클라이언트를 인증합니다.
- 채널 등록 ID를 설정합니다.
- 받는 사람 목록을 설정합니다.
WhatsApp 템플릿 메시지 만들기 및 관리
WhatsApp 메시지 템플릿은 기업이 알림을 옵트인한 사용자에게 알림 또는 고객 관리 메시지를 보내는 데 사용하는 특정 메시지 형식입니다. 메시지에는 약속 미리 알림, 배송 정보, 문제 해결 또는 결제 업데이트가 포함될 수 있습니다. 고급 메시징 SDK를 사용하여 템플릿 메시지를 보내기 전에 사용자는 WhatsApp Business Platform에서 필요한 템플릿을 만들어야 합니다.
템플릿에 대한 WhatsApp 요구 사항에 대한 자세한 내용은 WhatsApp에 비즈니스 플랫폼 API 참조를 참조하세요.
- 템플릿을 만들고 관리합니다.
- 템플릿 구성 요소를 봅니다.
- 템플릿 메시지를 보냅니다.
- 또한 기업은 WhatsApp 사용자에게 메시지를 보내기 전에 옵트인 요구 사항을 준수해야 합니다.
클라이언트 인증
메시지 SDK는 메시지를 보내는 데 사용합니다 NotificationMessagesClient
. 이 메서드는 NotificationMessagesClient
Azure Portal의 Azure Communication Services 리소스에서 획득한 연결 문자열 사용하여 인증합니다. 연결 문자열 대한 자세한 내용은 access-your-connection-strings-and-service-endpoints를 참조하세요.
간단히 하기 위해 이 빠른 시작에서는 연결 문자열을 사용하여 인증합니다. 프로덕션 환경에서는 서비스 주체를 사용하는 것이 좋습니다.
Azure Portal의 Azure Communication Services 리소스에서 연결 문자열을 가져옵니다. 왼쪽에서 Keys
탭으로 이동합니다. 기본 키의 Connection string
필드를 복사합니다. 연결 문자열은 endpoint=https://{your Azure Communication Services resource name}.communication.azure.com/;accesskey={secret key}
형식입니다.
환경 변수 COMMUNICATION_SERVICES_CONNECTION_STRING
을 연결 문자열 값으로 설정합니다.
콘솔 창을 열고 다음 명령을 입력합니다.
setx COMMUNICATION_SERVICES_CONNECTION_STRING "<your connection string>"
환경 변수를 추가한 후에는 콘솔 창을 포함하여 실행 중인 프로그램 중에서 환경 변수를 읽어야 하는 프로그램을 다시 시작해야 할 수도 있습니다. 예를 들어 편집기로 Visual Studio를 사용하는 경우 Visual Studio를 다시 시작한 후 예제를 실행합니다.
시스템의 환경 변수를 설정하는 방법에 대한 자세한 내용은 환경 변수에 연결 문자열 저장의 단계를 수행합니다.
NotificationMessagesClient
를 인스턴스화하려면 다음 코드를 Main
메서드에 추가합니다.
// Retrieve connection string from environment variable
string connectionString =
Environment.GetEnvironmentVariable("COMMUNICATION_SERVICES_CONNECTION_STRING");
// Instantiate the client
var notificationMessagesClient = new NotificationMessagesClient(connectionString);
채널 등록 ID 설정
채널 등록 중에 채널 등록 ID GUID를 만들었습니다. Azure Communication Services 리소스의 채널 탭에 있는 포털에서 찾을 수 있습니다.
channelRegistrationId라는 변수에 할당합니다.
var channelRegistrationId = new Guid("<your channel registration ID GUID>");
수신자 목록 설정
WhatsApp 계정과 연결된 활성 전화 번호를 제공해야 합니다. 이 WhatsApp 계정은 이 빠른 시작에서 보낸 템플릿, 문자 및 미디어 메시지를 받습니다.
이 예제에서는 개인 전화 번호를 사용할 수 있습니다.
수신자 전화 번호는 WhatsApp 채널 등록과 연결된 회사 전화 번호(발신자 ID)일 수 없습니다. 발신자 ID는 수신자에게 보낸 텍스트 및 미디어 메시지의 발신자로 표시됩니다.
전화 번호에는 국가 코드가 포함되어야 합니다. 전화 번호 서식에 대한 자세한 내용은 전화 번호 형식에 대한 WhatsApp 설명서를 참조하세요.
참고 항목
현재 수신자 목록에서는 전화 번호가 하나만 지원됩니다.
다음과 같이 수신자 목록을 만듭니다.
var recipientList = new List<string> { "<to WhatsApp phone number>" };
예시:
// Example only
var recipientList = new List<string> { "+14255550199" };
기업과 WhatsApp 사용자 간에 메시지 보내기 시작
WhatsApp 비즈니스 계정과 WhatsApp 사용자 간의 대화는 다음 두 가지 방법 중 하나로 시작할 수 있습니다.
- 기업은 WhatsApp 사용자에게 템플릿 메시지를 보냅니다.
- WhatsApp 사용자는 비즈니스 번호로 메시지를 보냅니다.
비즈니스는 대화형 대화를 시작할 수 없습니다. 비즈니스는 사용자로부터 메시지를 받은 후에만 대화형 메시지를 보낼 수 있습니다. 비즈니스는 활성 대화 중에 사용자에게 대화형 메시지만 보낼 수 있습니다. 24시간 대화 창이 만료되면 사용자만 대화형 대화를 다시 시작할 수 있습니다. 대화에 대한 자세한 내용은 WhatsApp Business Platform의 정의를 참조하세요.
개인 WhatsApp 계정에서 대화형 대화를 시작하려면 비즈니스 번호(보낸 사람 ID)로 메시지를 보냅니다.
환경 설정
.NET 프로젝트 만들기
프로젝트를 만들려면 Visual Studio를 사용하여 .NET 콘솔 애플리케이션 만들기의 자습서를 따릅니다.
코드를 컴파일하려면 Ctrl+F7을 누릅니다.
패키지 설치
C# 프로젝트에 Azure.Communication.Messages NuGet 패키지를 설치합니다.
-
Project
>Manage NuGet Packages...
에서 NuGet 패키지 관리자를 엽니다. - 패키지
Azure.Communication.Messages
를 검색합니다. - 최신 릴리스를 설치합니다.
앱 프레임워크 설정
텍스트 편집기에서 Program.cs
파일을 엽니다.
Program.cs
의 내용을 다음 코드로 바꿉니다.
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Azure;
using Azure.Communication.Messages;
namespace AdvancedMessagingQuickstart
{
class Program
{
public static async Task Main(string[] args)
{
Console.WriteLine("Azure Communication Services - Advanced Messages quickstart samples.");
// Quickstart code goes here
}
}
}
고급 메시징 기능을 사용하려면 네임스페이 using
스를 포함 Azure.Communication.Messages
하도록 지시문을 추가합니다.
using Azure.Communication.Messages;
코드 예제
다음 단계에 따라 필요한 코드 조각을 파일의 Main 함수에 추가합니다 Program.cs
.
- Azure Portal에서 WhatsApp 템플릿을 나열합니다.
- 매개 변수 없이 템플릿 메시지를 보냅니다.
- 본문에 텍스트 매개 변수가 있는 템플릿 메시지를 보냅니다.
- 헤더에 미디어 매개 변수가 있는 템플릿 메시지를 보냅니다.
- 헤더에 위치가 있는 템플릿 메시지를 보냅니다.
- 빠른 회신 단추가 있는 템플릿 메시지를 보냅니다.
- 동적 링크가 있는 작업 호출 단추가 있는 템플릿 메시지를 보냅니다.
- 정적 링크가 있는 작업 호출 단추가 있는 템플릿 메시지를 보냅니다.
Azure Portal에서 WhatsApp 템플릿 나열
Azure Communication Service 리소스 >고급 메시징 템플릿으로 이동하여 Azure Portal에서 템플릿을>볼 수 있습니다.
세부 정보를 보려면 템플릿을 선택합니다.
템플릿 세부 정보의 필드에는 content
매개 변수 바인딩이 포함될 수 있습니다. 매개 변수 바인딩은 다음과 같이 표시될 수 있습니다.
-
format
와 같은IMAGE
값이 있는 필드입니다. - 번호를 둘러싼 이중 대괄호(예:
{{1}}
). 1부터 시작하는 인덱싱된 번호는 메시지 템플릿을 만들기 위해 바인딩 값을 제공해야 하는 순서를 나타냅니다.
또는 WhatsApp Manager> 계정 도구 >메시지 템플릿에서 모든 WhatsApp 비즈니스 계정 템플릿을 보고 편집할 수 있습니다.
프로그래밍 방식으로 템플릿을 나열하려면 다음과 같이 채널 ID에 대한 모든 템플릿을 가져올 수 있습니다.
MessageTemplateClient messageTemplateClient = new MessageTemplateClient(connectionString);
Pageable<MessageTemplateItem> templates = messageTemplateClient.GetTemplates(channelRegistrationId);
매개 변수 없이 템플릿 메시지 보내기
템플릿에 매개 변수가 필요하지 않은 경우 만들 MessageTemplate
때 값이나 바인딩을 제공할 필요가 없습니다.
var messageTemplate = new MessageTemplate(templateName, templateLanguage);
예시
매개 변수를 sample_template
사용하지 않습니다.
MessageTemplate
대상 템플릿 이름 및 언어를 참조하여 어셈블합니다.
string templateName = "sample_template";
string templateLanguage = "en_us";
var sampleTemplate = new MessageTemplate(templateName, templateLanguage);
본문에 텍스트 매개 변수가 있는 템플릿 메시지 보내기
MessageTemplateText
를 사용하여 번호를 둘러싼 이중 대괄호(예: {{1}}
)로 표시된 본문의 매개 변수를 정의합니다. 1에서 시작된 인덱스 번호는 메시지 템플릿을 만들기 위해 바인딩 값을 제공해야 하는 순서를 나타냅니다. 템플릿에 없는 매개 변수를 포함하는 것은 유효하지 않습니다.
두 매개 변수가 있는 템플릿 정의:
{
"type": "BODY",
"text": "Message with two parameters: {{1}} and {{2}}"
}
예제
sample_shipping_confirmation
템플렛:
이 샘플에서 템플릿 본문에는 하나의 매개 변수가 있습니다.
{
"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);
헤더에 미디어 매개 변수가 있는 템플릿 메시지 보내기
MessageTemplateImage
, MessageTemplateVideo
또는 MessageTemplateDocument
를 사용하여 헤더에 미디어 매개 변수를 정의합니다.
헤더에 이미지 미디어 매개 변수가 있는 템플릿 정의:
{
"type": "HEADER",
"format": "IMAGE"
},
WhatsApp format
에서 지원하는 미디어 유형이 다를 수 있습니다. .NET SDK에서 각 미디어 형식은 해당 MessageTemplateValue 형식을 사용합니다.
형식 | MessageTemplateValue 형식 | 파일 유형 |
---|---|---|
IMAGE |
MessageTemplateImage |
png, jpg |
VIDEO |
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);
예제
sample_movie_ticket_confirmation
템플렛:
이 샘플에서 템플릿의 헤더에는 이미지가 필요합니다.
{
"type": "HEADER",
"format": "IMAGE"
},
템플릿 본문에는 다음 네 개의 텍스트 매개 변수가 필요합니다.
{
"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;
추가 예제
헤더에 위치가 있는 템플릿 메시지 보내기
헤더에서 위치 매개 변수를 정의하는 데 사용합니다 MessageTemplateLocation
.
위치가 필요한 헤더 구성 요소에 대한 템플릿 정의는 다음과 같습니다.
{
"type": "header",
"parameters": [
{
"type": "location",
"location": {
"latitude": "<LATITUDE>",
"longitude": "<LONGITUDE>",
"name": "<NAME>",
"address": "<ADDRESS>"
}
}
]
}
다른 미디어 유형이 format
필요할 수 있습니다. .NET SDK에서 각 미디어 형식은 해당 MessageTemplateValue 형식을 사용합니다.
속성 | 설명 | Type |
---|---|---|
ADDRESS |
메시지 맨 위에 있는 NAME 제네릭 맵 아래 값 뒤의 주소입니다. |
string |
LATITUDE |
위치 위도입니다. | double |
LONGITUDE |
위치 경도입니다. | double |
LOCATIONNAME |
메시지 맨 위에 있는 제네릭 맵 바로 아래에 표시되는 텍스트입니다. | string |
위치 기반 템플릿에 대한 자세한 내용은 메시지 미디어에 대한 WhatsApp의 설명서를 참조 하세요.
예시
sample_movie_location
템플렛:
위치 기반 메시지 템플릿 어셈블리:
var location = new MessageTemplateLocation("location");
location.LocationName = "Pablo Morales";
location.Address = "1 Hacker Way, Menlo Park, CA 94025";
location.Position = new Azure.Core.GeoJson.GeoPosition(longitude: 122.148981, latitude: 37.483307);
WhatsAppMessageTemplateBindings location_bindings = new();
location_bindings.Header.Add(new(location.Name));
var messageTemplateWithLocation = new MessageTemplate(templateNameWithLocation, templateLanguage);
messageTemplateWithLocation.Values.Add(location);
messageTemplateWithLocation.Bindings = location_bindings;
빠른 회신 단추가 있는 템플릿 메시지 보내기
빠른 회신 단추에 대한 페이로드를 정의하는 데 사용 MessageTemplateQuickAction
되며 MessageTemplateQuickAction
개체에는 다음 세 가지 특성이 있습니다.
속성 | 설명 | Type |
---|---|---|
속성 | 에서 name 값을 조회하는 데 사용되는 값입니다 MessageTemplateWhatsAppBindings . |
string |
Text | 선택적 빠른 작업 text 입니다. |
string |
페이로드 |
payload 사용자가 단추를 선택하는 경우 메시지 회신에서 사용할 수 있는 단추에 할당됩니다. |
string |
빠른 회신 단추가 있는 템플릿 정의:
{
"type": "BUTTONS",
"buttons": [
{
"type": "QUICK_REPLY",
"text": "Yes"
},
{
"type": "QUICK_REPLY",
"text": "No"
}
]
}
템플릿 정의에 단추가 표시되는 순서는 바인딩을 만들 때 단추가 정의된 순서와 MessageTemplateWhatsAppBindings
일치해야 합니다.
사용자의 빠른 회신 응답 페이로드에 대한 자세한 내용은 빠른 회신 단추에서 수신된 콜백에 대한 WhatsApp 설명서를 참조하세요.
예시
sample_issue_resolution
템플렛:
템플릿 본문에는 다음 하나의 텍스트 매개 변수가 필요합니다.
{
"type": "BODY",
"text": "Hi {{1}}, were we able to solve the issue that you were facing?"
},
템플릿에는 미리 채워진 두 개의 회신 단추와 Yes
No
.
{
"type": "BUTTONS",
"buttons": [
{
"type": "QUICK_REPLY",
"text": "Yes"
},
{
"type": "QUICK_REPLY",
"text": "No"
}
]
}
1개의 MessageTemplateText
및 2개의 MessageTemplateQuickAction
변수를 만듭니다. 그런 다음 매개 변수가 템플릿 콘텐츠에 표시되는 순서대로 매개 변수를 제공하여 목록과 MessageTemplateWhatsAppBindings
사용자의 목록을 MessageTemplateValue
어셈블합니다. 바인딩 단추를 정의할 때도 순서가 중요합니다.
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;
동적 링크가 있는 작업 호출 단추가 있는 템플릿 메시지 보내기
동작 호출 단추에 대한 URL 접미사를 정의하는 데 사용 MessageTemplateQuickAction
되며 MessageTemplateQuickAction
개체에는 다음과 같은 두 가지 특성이 있습니다.
속성 | 설명 | Type |
---|---|---|
속성 |
name 은 MessageTemplateWhatsAppBindings 의 값을 조회하는 데 사용됩니다. |
string |
Text |
text URL에 추가되는 값입니다. |
string |
템플릿 정의 단추:
{
"type": "BUTTONS",
"buttons": [
{
"type": "URL",
"text": "Take Survey",
"url": "https://www.example.com/{{1}}"
}
]
}
템플릿 정의에 단추가 표시되는 순서는 바인딩을 만들 때 단추가 정의된 순서와 MessageTemplateWhatsAppBindings
일치해야 합니다.
예시
sample_purchase_feedback
템플렛:
이 샘플 템플릿은 메시지에 동적 URL 링크가 있는 단추를 추가합니다. 또한 헤더의 이미지와 본문의 텍스트 매개 변수를 사용합니다.
이 샘플에서 템플릿의 헤더에는 이미지가 필요합니다.
{
"type": "HEADER",
"format": "IMAGE"
},
템플릿 본문에는 다음 하나의 텍스트 매개 변수가 필요합니다.
{
"type": "BODY",
"text": "Thank you for purchasing {{1}}! We value your feedback and would like to learn more about your experience."
},
템플릿에는 하나의 매개 변수가 있는 동적 URL 단추가 포함됩니다.
{
"type": "BUTTONS",
"buttons": [
{
"type": "URL",
"text": "Take Survey",
"url": "https://www.example.com/{{1}}"
}
]
}
하나의 MessageTemplateImage
, 하나의 MessageTemplateText
및 하나의 MessageTemplateQuickAction
변수를 만듭니다. 그런 다음 매개 변수가 템플릿 콘텐츠에 표시되는 순서대로 매개 변수를 제공하여 목록과 MessageTemplateWhatsAppBindings
사용자의 목록을 MessageTemplateValue
어셈블합니다. 바인딩 단추를 정의할 때도 순서가 중요합니다.
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;
정적 링크가 있는 작업 호출 단추가 있는 템플릿 메시지 보내기
정적 링크의 경우 WhatsApp 템플릿에 사용자의 입력이 필요 없는 정적 CallToAction
링크가 있으므로 모델을 포함 MessageTemplateQuickAction
할 필요가 없습니다.
템플릿 정의 단추:
{
"type": "BUTTONS",
"buttons": [
{
"type": "URL",
"text": "Take Survey",
"url": "https://www.example.com/{{1}}"
}
]
}
예시
purchase_feedback_static
템플렛:
이 샘플 템플릿은 메시지에 정적 URL 링크가 있는 단추를 추가합니다. 또한 헤더의 이미지와 본문의 텍스트 매개 변수를 사용합니다.
이 샘플에서 템플릿의 헤더에는 이미지가 필요합니다.
{
"type": "HEADER",
"format": "IMAGE"
},
템플릿 본문에는 다음 하나의 텍스트 매개 변수가 필요합니다.
{
"type": "BODY",
"text": "Hello {{1}}, \nHope you are great day!.\n Please click on given link to explore about our program.."
},
템플릿에는 하나의 매개 변수가 있는 동적 URL 단추가 포함됩니다.
{
"type": "BUTTONS",
"buttons": [
{
"type": "URL",
"text": "Take Survey",
"url": "https://www.example.com/"
}
]
}
하나, 하나를 MessageTemplateImage
MessageTemplateText
만듭니다. 그런 다음 매개 변수가 템플릿 콘텐츠에 표시되는 순서대로 매개 변수를 제공하여 목록과 MessageTemplateWhatsAppBindings
사용자의 목록을 MessageTemplateValue
어셈블합니다. 바인딩 단추를 정의할 때도 순서가 중요합니다.
// Send sample template sample_template
string templateNameWithcta = "purchase_feedback_static";
var bodyParam1 = new MessageTemplateText(name: "customer", text: "Joe");
var image = new MessageTemplateImage("image", new Uri("https://aka.ms/acsicon1"));
WhatsAppMessageTemplateBindings cta_bindings = new();
cta_bindings.Body.Add(new(bodyParam1.Name));
cta_bindings.Header.Add(new(image.Name));
var messageTemplateWithcta = new MessageTemplate(templateNameWithcta, templateLanguage);
messageTemplateWithcta.Values.Add(bodyParam1);
messageTemplateWithcta.Values.Add(image);
messageTemplateWithcta.Bindings = cta_bindings;
TemplateNotificationContent templateContent4 =
new TemplateNotificationContent(channelRegistrationId, recipientList, messageTemplateWithcta);
Response<SendMessageResult> sendTemplateMessageResult4 =
notificationMessagesClient.Send(templateContent4);
코드 실행
프로그램을 빌드하고 실행합니다.
WhatsApp 사용자에게 문자 및 미디어 메시지를 보내려면 WhatsApp 비즈니스 계정과 WhatsApp 사용자 간에 활성 대화가 있어야 합니다.
활성 대화가 없는 경우 이 예제의 목적을 위해 템플릿 메시지를 보내고 문자 메시지를 보내는 것 사이에 대기를 추가할 수 있습니다. 이렇게 추가된 지연으로 인해 사용자의 WhatsApp 계정으로 비즈니스에 회신할 수 있는 충분한 시간이 제공됩니다. 참조를 위해 지정된 예제에서는 다음 메시지를 보내기 전에 수동 사용자 입력을 묻는 메시지를 표시합니다. 자세한 내용은 샘플 코드의 전체 예제를 참조하세요. 성공하면 사용자의 WhatsApp 계정에서 세 개의 메시지를 받게 됩니다.
프로그램을 빌드하고 실행합니다.
dotnet build
dotnet run
전체 코드 예시
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");
}
}
}
추가 예제
이러한 예제에서는 Azure Portal 임베디드 등록을 통해 만든 WhatsApp Business 계정에 사용할 수 있는 샘플 템플릿을 사용합니다.
샘플 템플릿 sample_happy_hour_announcement 사용
이 샘플 템플릿은 헤더에 있는 비디오와 본문에 있는 두 개의 텍스트 매개 변수를 사용합니다.
템플릿의 헤더에는 비디오가 필요합니다.
{
"type": "HEADER",
"format": "VIDEO"
},
비디오는 호스트된 mp4 비디오의 URL이어야 합니다.
지원되는 미디어 유형 및 크기 제한에 대한 자세한 내용은 WhatsApp의 메시지 미디어 설명서를 참조하세요.
템플릿 본문에는 다음 두 개의 텍스트 매개 변수가 필요합니다.
{
"type": "BODY",
"text": "Happy hour is here! 🍺😀🍸\nPlease be merry and enjoy the day. 🎉\nVenue: {{1}}\nTime: {{2}}"
},
1개의 MessageTemplateVideo
및 2개의 MessageTemplateText
변수를 만듭니다. 그런 다음 매개 변수가 템플릿 콘텐츠에 표시되는 순서대로 매개 변수를 제공하여 목록과 MessageTemplateWhatsAppBindings
사용자의 목록을 MessageTemplateValue
어셈블합니다.
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 사용
이 샘플 템플릿은 헤더에 있는 문서와 본문에 있는 세 개의 텍스트 매개 변수를 사용합니다.
서식 파일의 머리글에는 다음 문서가 필요합니다.
{
"type": "HEADER",
"format": "DOCUMENT"
},
문서는 호스트된 PDF 문서의 URL이어야 합니다.
지원되는 미디어 유형 및 크기 제한에 대한 자세한 내용은 WhatsApp의 메시지 미디어 설명서를 참조하세요.
템플릿 본문에는 다음 세 개의 텍스트 매개 변수가 필요합니다.
{
"type": "BODY",
"text": "This is your flight confirmation for {{1}}-{{2}} on {{3}}."
},
1개의 MessageTemplateDocument
및 3개의 MessageTemplateText
변수를 만듭니다. 그런 다음 매개 변수가 템플릿 콘텐츠에 표시되는 순서대로 매개 변수를 제공하여 목록과 MessageTemplateWhatsAppBindings
사용자의 목록을 MessageTemplateValue
어셈블합니다.
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;
필수 조건
- Azure Communication Services 리소스에 WhatsApp Business 계정을 등록합니다.
- WhatsApp 템플릿 메시지를 만듭니다.
- 메시지를 받을 활성 WhatsApp 전화 번호입니다.
개체 모델
다음 클래스 및 인터페이스는 Java용 Azure Communication Services 메시지 SDK의 주요 기능 중 일부를 처리합니다.
클래스 이름 | 설명 |
---|---|
NotificationMessagesClient |
Azure Communication Services 리소스에 연결합니다. 메시지를 보냅니다. |
MessageTemplate |
사용하는 템플릿과 메시지에 대한 템플릿 속성의 콘텐츠를 정의합니다. |
TemplateNotificationContent |
보낼 템플릿 메시지의 "who" 및 "what"을 정의합니다. |
참고 항목
자세한 내용은 com.azure.communication.messages Package에서 Java용 Azure SDK 참조를 참조하세요.
지원되는 WhatsApp 템플릿 형식
템플릿 유형 | 설명 |
---|---|
텍스트 기반 메시지 템플릿 | WhatsApp 메시지 템플릿은 매개 변수가 있거나 없는 특정 메시지 형식입니다. |
미디어 기반 메시지 템플릿 | 헤더 구성 요소에 대한 미디어 매개 변수가 있는 WhatsApp 메시지 템플릿입니다. |
대화형 메시지 템플릿 | 대화형 메시지 템플릿은 구성 요소 개체를 사용하는 대화형 단추를 포함하여 받는 사람에게 보낼 수 있는 콘텐츠를 확장합니다. 작업 호출 및 빠른 회신이 모두 지원됩니다. |
위치 기반 메시지 템플릿 | 헤더 구성 요소에 대한 경도 및 위도 측면에서 위치 매개 변수가 있는 WhatsApp 메시지 템플릿입니다. |
일반적인 구성
다음 단계에 따라 필요한 코드 조각을 파일의 기본 함수에 추가합니다 App.java
.
- WhatsApp 템플릿 메시지를 만들고 관리합니다.
- 클라이언트를 인증합니다.
- 채널 등록 ID를 설정합니다.
- 받는 사람 목록을 설정합니다.
WhatsApp 템플릿 메시지 만들기 및 관리
WhatsApp 메시지 템플릿은 기업이 알림을 옵트인한 사용자에게 알림 또는 고객 관리 메시지를 보내는 데 사용하는 특정 메시지 형식입니다. 메시지에는 약속 미리 알림, 배송 정보, 문제 해결 또는 결제 업데이트가 포함될 수 있습니다. 고급 메시징 SDK를 사용하여 템플릿 메시지를 보내기 전에 사용자는 WhatsApp Business Platform에서 필요한 템플릿을 만들어야 합니다.
템플릿에 대한 WhatsApp 요구 사항에 대한 자세한 내용은 WhatsApp에 비즈니스 플랫폼 API 참조를 참조하세요.
- 템플릿을 만들고 관리합니다.
- 템플릿 구성 요소를 봅니다.
- 템플릿 메시지를 보냅니다.
- 또한 기업은 WhatsApp 사용자에게 메시지를 보내기 전에 옵트인 요구 사항을 준수해야 합니다.
기업과 WhatsApp 사용자 간에 메시지 보내기 시작
WhatsApp 비즈니스 계정과 WhatsApp 사용자 간의 대화는 다음 두 가지 방법 중 하나로 시작할 수 있습니다.
- 기업은 WhatsApp 사용자에게 템플릿 메시지를 보냅니다.
- WhatsApp 사용자는 비즈니스 번호로 메시지를 보냅니다.
대화가 시작된 방식에 관계없이 기업은 사용자가 기업에 메시지를 보낼 때까지 템플릿 메시지만 보낼 수 있습니다. 사용자가 기업에 메시지를 보낸 후에만 기업은 활성 대화 중에 사용자에게 문자 또는 미디어 메시지를 보낼 수 있습니다. 24시간 대화 창이 만료되면 대화를 다시 시작해야 합니다. 대화에 대해 자세히 알아보려면 WhatsApp Business Platform의 정의를 참조하세요.
클라이언트 인증
메시지 클라이언트를 인증하는 데 사용할 수 있는 몇 가지 옵션이 있습니다.
클라이언트를 인증하려면 연결 문자열로 NotificationMessagesClient
또는 MessageTemplateClient
를 인스턴스화합니다.
com.azure.core.http.HttpClient
인터페이스를 구현하는 사용자 지정 HTTP 클라이언트로 클라이언트를 초기화할 수도 있습니다.
간단히 하기 위해 이 빠른 시작에서는 연결 문자열을 사용하여 인증합니다. 프로덕션 환경에서는 서비스 주체를 사용하는 것이 좋습니다.
Azure Portal의 Azure Communication Services 리소스에서 연결 문자열을 가져옵니다. 왼쪽에서 Keys
탭으로 이동합니다. Primary key
에 대한 Connection string
필드를 복사합니다. 연결 문자열은 endpoint=https://{your Azure Communication Services resource name}.communication.azure.com/;accesskey={secret key}
형식입니다.
환경 변수 COMMUNICATION_SERVICES_CONNECTION_STRING
을 연결 문자열 값으로 설정합니다.
콘솔 창을 열고 다음 명령을 입력합니다.
setx COMMUNICATION_SERVICES_CONNECTION_STRING "<your connection string>"
시스템의 환경 변수를 설정하는 방법에 대한 자세한 내용은 환경 변수에 연결 문자열 저장의 단계를 수행합니다.
NotificationMessagesClient를 인스턴스화하려면 main
메서드에 다음 코드를 추가합니다.
// You can get your connection string from your resource in the Azure portal.
String connectionString = System.getenv("COMMUNICATION_SERVICES_CONNECTION_STRING");
NotificationMessagesClient notificationClient = new NotificationMessagesClientBuilder()
.connectionString(connectionString)
.buildClient();
채널 등록 ID 설정
채널 등록 ID GUID는 채널 등록 중에 만들어졌습니다. Azure Communication Services 리소스의 채널 탭에 있는 포털에서 조회할 수 있습니다.
channelRegistrationId라는 변수에 할당합니다.
String channelRegistrationId = "<your channel registration id GUID>";
수신자 목록 설정
WhatsApp 계정과 연결된 실제 전화 번호를 제공해야 합니다. 이 WhatsApp 계정은 이 빠른 시작에서 보낸 텍스트 및 미디어 메시지를 받습니다. 이 빠른 시작에서는 이 전화 번호가 개인 전화 번호일 수 있습니다.
수신자 전화 번호는 WhatsApp 채널 등록과 연결된 회사 전화 번호(발신자 ID)일 수 없습니다. 발신자 ID는 수신자에게 보낸 텍스트 및 미디어 메시지의 발신자로 표시됩니다.
전화 번호에는 국가 번호가 포함되어야 합니다. 전화 번호 형식에 대한 자세한 내용은 전화 번호 형식에 대한 WhatsApp 설명서를 참조하세요.
참고 항목
현재 수신자 목록에서는 전화 번호가 하나만 지원됩니다.
다음과 같이 수신자 목록을 만듭니다.
List<String> recipientList = new ArrayList<>();
recipientList.add("<to WhatsApp phone number>");
예시:
// Example only
List<String> recipientList = new ArrayList<>();
recipientList.add("+14255550199");
환경 설정
메시지를 보내기 위한 환경을 설정하려면 다음 섹션의 단계를 완료합니다.
전제 조건
- Azure Communication Services 리소스에 등록된 WhatsApp Business 계정.
- 메시지를 받을 활성 WhatsApp 전화 번호입니다.
- JDK(Java Development Kit) 버전 8 이상
- Apache Maven.
새 Java 애플리케이션 만들기
터미널 또는 명령 창을 열고 Java 애플리케이션을 만들 디렉터리로 이동합니다. 다음 명령을 실행하여 템플릿에서 Java 프로젝트를 생성합니다 maven-archetype-quickstart
.
mvn archetype:generate -DgroupId="com.communication.quickstart" -DartifactId="communication-quickstart" -DarchetypeArtifactId="maven-archetype-quickstart" -DarchetypeVersion="1.4" -DinteractiveMode="false"
generate
목표는 artifactId
값과 동일한 이름으로 디렉터리를 만듭니다. 이 디렉터리 src/main/java
아래에는 프로젝트 소스 코드가 포함되고, src/test/java
디렉터리에는 테스트 소스가 포함되고 pom.xml
, 파일은 프로젝트의 POM(프로젝트 개체 모델)입니다.
패키지 설치
텍스트 편집기에서 pom.xml
파일을 엽니다. 종속성 그룹에 다음 종속성 요소를 추가합니다.
<dependency>
<groupId>com.azure</groupId>
<artifactId>azure-communication-messages</artifactId>
</dependency>
앱 프레임워크 설정
텍스트 편집기에서 열고 /src/main/java/com/communication/quickstart/App.java
import 지시문을 추가하고 문을 제거 System.out.println("Hello world!");
합니다.
package com.communication.quickstart;
import com.azure.communication.messages.*;
import com.azure.communication.messages.models.*;
import java.util.ArrayList;
import java.util.List;
public class App
{
public static void main( String[] args )
{
// Quickstart code goes here.
}
}
코드 예제
파일의 주 함수에 필요한 코드 조각을 추가하려면 다음 단계를 수행합니다 App.java
.
- Azure Portal에서 WhatsApp 템플릿을 나열합니다.
- 본문에 텍스트 매개 변수가 있는 템플릿 메시지를 보냅니다.
- 헤더에 미디어 매개 변수가 있는 템플릿 메시지를 보냅니다.
- 빠른 회신 단추가 있는 템플릿 메시지를 보냅니다.
- 작업 호출 단추 및 동적 링크가 있는 템플릿 메시지를 보냅니다.
Azure Portal에서 WhatsApp 템플릿 나열
Azure Portal에서 템플릿을 보려면 Azure Communication Services 리소스 >고급 메시징>템플릿으로 이동합니다.
템플릿 세부 정보를 볼 템플릿을 선택합니다.
템플릿 세부 정보의 콘텐츠 필드에는 매개 변수 바인딩이 포함될 수 있습니다. 매개 변수 바인딩은 다음과 같이 표시될 수 있습니다.
-
"format"
와 같은IMAGE
값이 있는 필드입니다. - 번호를 둘러싼 이중 대괄호(예:
{{1}}
). 1에서 시작된 인덱스 번호는 메시지 템플릿을 만들기 위해 바인딩 값을 제공해야 하는 순서를 나타냅니다.
또는 WhatsApp Manager> 계정 도구 >메시지 템플릿에서 모든 WhatsApp 비즈니스 계정 템플릿을 보고 편집할 수 있습니다.
프로그래밍 방식으로 템플릿을 나열하려면 다음 코드를 사용하여 채널 ID에 대한 모든 템플릿을 가져올 수 있습니다.
public static void getMessageTemplateWithConnectionString() {
MessageTemplateClient templateClient =
new MessageTemplateClientBuilder()
.connectionString(connectionString)
.buildClient();
PagedIterable<MessageTemplateItem> response = templateClient.listTemplates(channelRegistrationId);
response.stream().forEach(t -> {
WhatsAppMessageTemplateItem template = (WhatsAppMessageTemplateItem) t ;
System.out.println("===============================");
System.out.println("Template Name :: "+template.getName());
System.out.println("Template Language :: "+template.getLanguage());
System.out.println("Template Status :: "+template.getStatus());
System.out.println("Template Content :: "+template.getContent());
System.out.println("===============================");
});
}
본문에 텍스트 매개 변수가 있는 템플릿 메시지 보내기
템플릿에서 매개 변수를 사용하지 않는 경우 만들 때 MessageTemplate
값이나 바인딩을 제공할 필요가 없습니다.
/*
* This sample shows how to send template message with below details
* Name: sample_shipping_confirmation, Language: en_US
* [
{
"type": "BODY",
"text": "Your package has been shipped. It will be delivered in {{1}} business days."
},
{
"type": "FOOTER",
"text": "This message is from an unverified business."
}
]
* */
private static void sendTemplateMessage() {
//Update Template Name and language according your template associate to your channel.
MessageTemplate template = new MessageTemplate("sample_shipping_confirmation", "en_US");
//Update template parameter type and value
List<MessageTemplateValue> messageTemplateValues = new ArrayList<>();
messageTemplateValues.add(new MessageTemplateText("Days", "5"));
template.setValues(messageTemplateValues);
//Update template parameter binding
List<WhatsAppMessageTemplateBindingsComponent> components = new ArrayList<>();
components.add(new WhatsAppMessageTemplateBindingsComponent("Days"));
MessageTemplateBindings bindings =new WhatsAppMessageTemplateBindings()
.setBody(components);
template.setBindings(bindings);
NotificationMessagesClient client = createClientWithTokenCredential();
SendMessageResult result = client.send(
new TemplateNotificationContent(CHANNEL_ID, recipients, template));
result.getReceipts().forEach(r -> System.out.println("Message sent to:"+r.getTo() + " and message id:"+ r.getMessageId()));
}
헤더에 미디어 매개 변수가 있는 템플릿 메시지 보내기
MessageTemplateImage
, MessageTemplateVideo
또는 MessageTemplateDocument
를 사용하여 헤더에 미디어 매개 변수를 정의합니다.
헤더에 이미지 미디어 매개 변수가 있는 템플릿 정의:
{
"type": "HEADER",
"format": "VIDEO"
},
WhatsApp "format"
에서 지원하는 네 가지 미디어 유형 중에서 사용할 수 있습니다. .NET SDK에서 각 미디어 형식은 해당 MessageTemplateValue
형식을 사용합니다.
형식 | MessageTemplateValue 형식 | 파일 유형 |
---|---|---|
IMAGE | MessageTemplateImage |
png, jpg |
동영상 | MessageTemplateVideo |
mp4 |
DOCUMENT | MessageTemplateDocument |
지원되는 미디어 유형 및 크기 제한에 대한 자세한 내용은 WhatsApp의 메시지 미디어 설명서를 참조하세요.
예시
sample_happy_hour_announcement
템플렛:
여기서 템플릿의 헤더에는 비디오가 필요합니다.
{
"type": "HEADER",
"format": "VIDEO"
},
비디오는 호스트된 mp4 비디오의 URL이어야 합니다.
지원되는 미디어 유형 및 크기 제한에 대한 자세한 내용은 WhatsApp의 메시지 미디어 설명서를 참조하세요.
템플릿 본문에는 다음 두 개의 텍스트 매개 변수가 필요합니다.
{
"type": "BODY",
"text": "Happy hour is here! 🍺😀🍸\nPlease be merry and enjoy the day. 🎉\nVenue: {{1}}\nTime: {{2}}"
},
1개의 MessageTemplateVideo
및 4개의 MessageTemplateText
변수를 만듭니다. 그런 다음, 매개 변수가 템플릿 콘텐츠에 표시되는 순서대로 매개 변수를 제공하여 MessageTemplateValue
및 MessageTemplateWhatsAppBindings
목록을 어셈블합니다.
/*
* This sample shows how to send template message with below details
* Name: sample_happy_hour_announcement, Language: en_US
* [
{
"type": "HEADER",
"format": "VIDEO"
},
{
"type": "BODY",
"text": "Happy hour is here! 🍺😀🍸\nPlease be merry and enjoy the day. 🎉\nVenue: {{1}}\nTime: {{2}}"
},
{
"type": "FOOTER",
"text": "This message is from an unverified business."
}
]
* */
private static void sendTemplateMessageWithVideo() {
//Update Template Name and language according your template associate to your channel.
MessageTemplate template = new MessageTemplate("sample_happy_hour_announcement", "en_US");
//Add template parameter type with value in a list
List<MessageTemplateValue> messageTemplateValues = new ArrayList<>();
messageTemplateValues.add(new MessageTemplateVideo("HeaderVideo", "https://sample-videos.com/video123/mp4/720/big_buck_bunny_720p_1mb.mp4"));
messageTemplateValues.add(new MessageTemplateText("VenueInfoInBody", "Starbucks"));
messageTemplateValues.add(new MessageTemplateText("TimeInfoInBody", "Today 2-4PM"));
// Add parameter binding for template header in a list
List<WhatsAppMessageTemplateBindingsComponent> templateHeaderBindings = new ArrayList<>();
templateHeaderBindings.add(new WhatsAppMessageTemplateBindingsComponent("HeaderVideo"));
// Add parameter binding for template body in a list
List<WhatsAppMessageTemplateBindingsComponent> templateBodyBindings = new ArrayList<>();
templateBodyBindings.add(new WhatsAppMessageTemplateBindingsComponent("VenueInfoInBody"));
templateBodyBindings.add(new WhatsAppMessageTemplateBindingsComponent("TimeInfoInBody"));
MessageTemplateBindings templateBindings = new WhatsAppMessageTemplateBindings()
.setHeaderProperty(templateHeaderBindings) // Set the parameter binding for template header
.setBody(templateBodyBindings); // Set the parameter binding for template body
template
.setBindings(templateBindings)
.setValues(messageTemplateValues);
NotificationMessagesClient client = createClientWithConnectionString();
SendMessageResult result = client.send(
new TemplateNotificationContent(CHANNEL_ID, recipients, template));
result.getReceipts().forEach(r -> System.out.println("Message sent to:"+r.getTo() + " and message id:"+ r.getMessageId()));
}
빠른 회신 단추가 있는 템플릿 메시지 보내기
빠른 회신 단추에 대한 페이로드를 정의하는 데 사용 MessageTemplateQuickAction
되며 MessageTemplateQuickAction
개체에는 다음 세 가지 특성이 있습니다.
속성 | 설명 | Type |
---|---|---|
속성 | 에서 name 값을 조회하는 데 사용되는 값입니다 MessageTemplateWhatsAppBindings . |
string |
Text | 빠른 작업 text 옵션입니다. |
string |
페이로드 |
payload 사용자가 단추를 선택하는 경우 메시지 회신에서 사용할 수 있는 단추에 할당됩니다. |
string |
빠른 회신 단추가 있는 템플릿 정의:
{
"type": "BUTTONS",
"buttons": [
{
"type": "QUICK_REPLY",
"text": "Yes"
},
{
"type": "QUICK_REPLY",
"text": "No"
}
]
}
템플릿 정의에 단추가 표시되는 순서는 바인딩을 만들 때 단추가 정의된 순서와 MessageTemplateWhatsAppBindings
일치해야 합니다.
사용자의 빠른 회신 응답 페이로드에 대한 자세한 내용은 빠른 회신 단추에서 수신된 콜백에 대한 WhatsApp의 설명서를 참조하세요.
예시
sample_issue_resolution
템플렛:
템플릿 본문에는 다음 하나의 텍스트 매개 변수가 필요합니다.
/*
* This sample shows how to send template message with below details
* Name: sample_issue_resolution, Language: en_US
* [
{
"type": "BODY",
"text": "Hi {{1}}, were we able to solve the issue that you were facing?"
},
{
"type": "FOOTER",
"text": "This message is from an unverified business."
},
{
"type": "BUTTONS",
"buttons": [
{
"type": "QUICK_REPLY",
"text": "Yes"
},
{
"type": "QUICK_REPLY",
"text": "No"
}
]
}
]
* */
private static void sendTextTemplateMessageWithQuickReply() {
//Add template parameter type with value in a list
List<MessageTemplateValue> messageTemplateValues = new ArrayList<>();
messageTemplateValues.add(new MessageTemplateText("Name", "Arif"));
messageTemplateValues.add(new MessageTemplateQuickAction("Yes").setPayload("Yes"));
messageTemplateValues.add(new MessageTemplateQuickAction("No").setPayload("No"));
// Add parameter binding for template body in a list
List<WhatsAppMessageTemplateBindingsComponent> templateBodyBindings = new ArrayList<>();
templateBodyBindings.add(new WhatsAppMessageTemplateBindingsComponent("Name"));
// Add parameter binding for template buttons in a list
List<WhatsAppMessageTemplateBindingsButton> templateButtonBindings = new ArrayList<>();
templateButtonBindings.add( new WhatsAppMessageTemplateBindingsButton(WhatsAppMessageButtonSubType.QUICK_REPLY, "Yes"));
templateButtonBindings.add( new WhatsAppMessageTemplateBindingsButton(WhatsAppMessageButtonSubType.QUICK_REPLY, "No"));
MessageTemplateBindings templateBindings = new WhatsAppMessageTemplateBindings()
.setBody(templateBodyBindings) // Set the parameter binding for template body
.setButtons(templateButtonBindings); // Set the parameter binding for template buttons
MessageTemplate messageTemplate = new MessageTemplate("sample_issue_resolution", "en_US")
.setBindings(templateBindings)
.setValues(messageTemplateValues);
NotificationMessagesClient client = createClientWithConnectionString();
SendMessageResult result = client.send(
new TemplateNotificationContent(CHANNEL_ID, recipients, messageTemplate));
result.getReceipts().forEach(r -> System.out.println("Message sent to:"+r.getTo() + " and message id:"+ r.getMessageId()));
}
작업 호출 단추 및 동적 링크가 있는 템플릿 메시지 보내기
동작 호출 단추에 대한 URL 접미사를 정의하는 데 사용 MessageTemplateQuickAction
되며 MessageTemplateQuickAction
개체에는 다음과 같은 두 가지 특성이 있습니다.
속성 | 설명 | Type |
---|---|---|
속성 | 에서 name 값을 조회하는 데 사용되는 값입니다 MessageTemplateWhatsAppBindings . |
string |
Text |
text URL에 추가된 값입니다. |
string |
템플릿 정의 단추:
{
"type": "BUTTONS",
"buttons": [
{
"type": "URL",
"text": "Take Survey",
"url": "https://www.example.com/{{1}}"
}
]
}
템플릿 정의에 단추가 표시되는 순서는 바인딩을 만들 때 단추가 정의된 순서와 MessageTemplateWhatsAppBindings
일치해야 합니다.
예시
sample_purchase_feedback
템플렛:
이 샘플 템플릿은 메시지에 동적 URL 링크가 있는 단추를 추가합니다. 또한 헤더의 이미지와 본문의 텍스트 매개 변수를 사용합니다.
이 샘플에서 템플릿의 헤더에는 이미지가 필요합니다.
{
"type": "HEADER",
"format": "IMAGE"
},
템플릿 본문에는 다음 하나의 텍스트 매개 변수가 필요합니다.
{
"type": "BODY",
"text": "Thank you for purchasing {{1}}! We value your feedback and would like to learn more about your experience."
},
템플릿에는 하나의 매개 변수가 있는 동적 URL 단추가 포함됩니다.
{
"type": "BUTTONS",
"buttons": [
{
"type": "URL",
"text": "Take Survey",
"url": "https://www.example.com/{{1}}"
}
]
}
하나의 MessageTemplateImage
, 하나의 MessageTemplateText
및 하나의 MessageTemplateQuickAction
변수를 만듭니다. 그런 다음, 매개 변수가 템플릿 콘텐츠에 표시되는 순서대로 매개 변수를 제공하여 MessageTemplateValue
및 MessageTemplateWhatsAppBindings
목록을 어셈블합니다. 바인딩 단추를 정의할 때도 순서가 중요합니다.
/*
* This sample shows how to send template message with below details
* Name: sample_purchase_feedback, Language: en_US
* [
{
"type": "HEADER",
"format": "IMAGE"
},
{
"type": "BODY",
"text": "Thank you for purchasing {{1}}! We value your feedback and would like to learn more about your experience."
},
{
"type": "FOOTER",
"text": "This message is from an unverified business."
},
{
"type": "BUTTONS",
"buttons": [
{
"type": "URL",
"text": "Take Survey",
"url": "https://www.example.com/"
}
]
}
]
* */
private static void sendTemplateMessageWithImage() {
//Update Template Name and language according your template associate to your channel.
MessageTemplate template = new MessageTemplate("sample_purchase_feedback", "en_US");
//Add template parameter type with value in a list
List<MessageTemplateValue> messageTemplateValues = new ArrayList<>();
messageTemplateValues.add(new MessageTemplateImage("HeaderImage", "https://upload.wikimedia.org/wikipedia/commons/3/30/Building92microsoft.jpg"));
messageTemplateValues.add(new MessageTemplateText("ProductInfoInBody", "Microsoft Office"));
// Add parameter binding for template header in a list
List<WhatsAppMessageTemplateBindingsComponent> templateHeaderBindings = new ArrayList<>();
templateHeaderBindings.add(new WhatsAppMessageTemplateBindingsComponent("HeaderImage"));
// Add parameter binding for template body in a list
List<WhatsAppMessageTemplateBindingsComponent> templateBodyBindings = new ArrayList<>();
templateBodyBindings.add(new WhatsAppMessageTemplateBindingsComponent("ProductInfoInBody"));
MessageTemplateBindings templateBindings = new WhatsAppMessageTemplateBindings()
.setHeaderProperty(templateHeaderBindings) // Set the parameter binding for template header
.setBody(templateBodyBindings); // Set the parameter binding for template body
template
.setBindings(templateBindings)
.setValues(messageTemplateValues);
NotificationMessagesClient client = createClientWithConnectionString();
SendMessageResult result = client.send(
new TemplateNotificationContent(CHANNEL_ID, recipients, template));
result.getReceipts().forEach(r -> System.out.println("Message sent to:"+r.getTo() + " and message id:"+ r.getMessageId()));
}
코드 실행
파일이 포함된
pom.xml
디렉터리를 열고 명령을 사용하여 프로젝트를 컴파일합니다mvn
.mvn compile
다음
mvn
명령을 실행하여 앱을 실행합니다.mvn exec:java -D"exec.mainClass"="com.communication.quickstart.App" -D"exec.cleanupDaemonThreads"="false"
전체 샘플 코드
GitHub에서 이 빠른 시작에 대한 최종 코드를 찾습니다.
필수 조건
- Azure Communication Services 리소스에 WhatsApp Business 계정을 등록합니다.
- WhatsApp 템플릿 메시지를 만듭니다.
- 메시지를 받을 활성 WhatsApp 전화 번호입니다.
- Node.js 활성 LTS 및 유지 관리 LTS 버전(8.11.1 및 10.14.1 권장)
-
Node.js 활성 LTS 및 유지 관리 LTS 버전(8.11.1 및 10.14.1 권장)
- 터미널 또는 명령 창에서
node --version
을 실행하여 Node.js가 설치되어 있는지 확인합니다.
- 터미널 또는 명령 창에서
개체 모델
다음 클래스 및 인터페이스는 Javascript용 Azure Communication Services 메시지 SDK의 주요 기능 중 일부를 처리합니다.
클래스 이름 | 설명 |
---|---|
NotificationMessagesClient |
Azure Communication Services 리소스에 연결합니다. 메시지를 보냅니다. |
MessageTemplate |
사용하는 템플릿과 메시지에 대한 템플릿 속성의 콘텐츠를 정의합니다. |
TemplateNotificationContent |
보낼 템플릿 메시지의 "who" 및 "what"을 정의합니다. |
참고 항목
자세한 내용은 JavaScript용 Azure SDK 참조 @azure-rest/communication-messages 패키지를 참조하세요.
지원되는 WhatsApp 템플릿 형식
템플릿 유형 | 설명 |
---|---|
텍스트 기반 메시지 템플릿 | WhatsApp 메시지 템플릿은 매개 변수가 있거나 없는 특정 메시지 형식입니다. |
미디어 기반 메시지 템플릿 | 헤더 구성 요소에 대한 미디어 매개 변수가 있는 WhatsApp 메시지 템플릿입니다. |
대화형 메시지 템플릿 | 대화형 메시지 템플릿은 구성 요소 개체를 사용하는 대화형 단추를 포함하여 받는 사람에게 보낼 수 있는 콘텐츠를 확장합니다. 작업 호출 및 빠른 회신이 모두 지원됩니다. |
위치 기반 메시지 템플릿 | 헤더 구성 요소에 대한 경도 및 위도 측면에서 위치 매개 변수가 있는 WhatsApp 메시지 템플릿입니다. |
일반적인 구성
다음 단계에 따라 필요한 코드 조각을 파일의 기본 함수에 추가합니다 send-messages.js
.
- WhatsApp 템플릿 메시지를 만들고 관리합니다.
- 클라이언트를 인증합니다.
- 채널 등록 ID를 설정합니다.
- 받는 사람 목록을 설정합니다.
WhatsApp 템플릿 메시지 만들기 및 관리
WhatsApp 메시지 템플릿은 기업이 알림을 옵트인한 사용자에게 알림 또는 고객 관리 메시지를 보내는 데 사용하는 특정 메시지 형식입니다. 메시지에는 약속 미리 알림, 배송 정보, 문제 해결 또는 결제 업데이트가 포함될 수 있습니다. 고급 메시징 SDK를 사용하여 템플릿 메시지를 보내기 전에 사용자는 WhatsApp Business Platform에서 필요한 템플릿을 만들어야 합니다.
템플릿에 대한 WhatsApp 요구 사항에 대한 자세한 내용은 WhatsApp에 비즈니스 플랫폼 API 참조를 참조하세요.
- 템플릿을 만들고 관리합니다.
- 템플릿 구성 요소를 봅니다.
- 템플릿 메시지를 보냅니다.
- 또한 기업은 WhatsApp 사용자에게 메시지를 보내기 전에 옵트인 요구 사항을 준수해야 합니다.
기업과 WhatsApp 사용자 간에 메시지 보내기 시작
WhatsApp 비즈니스 계정과 WhatsApp 사용자 간의 대화는 다음 두 가지 방법 중 하나로 시작할 수 있습니다.
- 기업은 WhatsApp 사용자에게 템플릿 메시지를 보냅니다.
- WhatsApp 사용자는 비즈니스 번호로 메시지를 보냅니다.
대화가 시작된 방식에 관계없이 기업은 사용자가 기업에 메시지를 보낼 때까지 템플릿 메시지만 보낼 수 있습니다. 사용자가 기업에 메시지를 보낸 후에만 기업은 활성 대화 중에 사용자에게 문자 또는 미디어 메시지를 보낼 수 있습니다. 24시간 대화 창이 만료되면 대화를 다시 시작해야 합니다. 대화에 대해 자세히 알아보려면 WhatsApp Business Platform의 정의를 참조하세요.
클라이언트 인증
다음 코드는 dotenv 패키지를 사용하여 COMMUNICATION_SERVICES_CONNECTION_STRING
이라는 환경 변수에서 리소스에 대한 연결 문자열을 검색합니다.
간단히 하기 위해 이 빠른 시작에서는 연결 문자열을 사용하여 인증합니다. 프로덕션 환경에서는 서비스 주체를 사용하는 것이 좋습니다.
Azure Portal의 Azure Communication Services 리소스에서 연결 문자열을 가져옵니다. 왼쪽에서 Keys
탭으로 이동합니다. Primary key
에 대한 Connection string
필드를 복사합니다. 연결 문자열은 endpoint=https://{your Azure Communication Services resource name}.communication.azure.com/;accesskey={secret key}
형식입니다.
환경 변수 COMMUNICATION_SERVICES_CONNECTION_STRING
을 연결 문자열 값으로 설정합니다.
콘솔 창을 열고 다음 명령을 입력합니다.
setx COMMUNICATION_SERVICES_CONNECTION_STRING "<your connection string>"
시스템의 환경 변수를 설정하는 방법에 대한 자세한 내용은 환경 변수에 연결 문자열 저장의 단계를 수행합니다.
NotificationClient를 인스턴스화하려면 메서드에 다음 코드를 Main
추가합니다.
const NotificationClient = require("@azure-rest/communication-messages").default;
// Set Connection string
const connectionString = process.env["COMMUNICATION_SERVICES_CONNECTION_STRING"];
// Instantiate the client
const client = NotificationClient(connectionString);
채널 등록 ID 설정
채널 등록 ID GUID는 채널 등록 중에 만들어졌습니다. Azure Communication Services 리소스의 채널 탭에 있는 포털에서 조회할 수 있습니다.
channelRegistrationId라는 변수에 할당합니다.
const channelRegistrationId = "<your channel registration id GUID>";
수신자 목록 설정
WhatsApp 계정과 연결된 실제 전화 번호를 제공해야 합니다. 이 WhatsApp 계정은 이 빠른 시작에서 보낸 템플릿, 문자 및 미디어 메시지를 받습니다. 이 빠른 시작에서는 이 전화 번호가 개인 전화 번호일 수 있습니다.
수신자 전화 번호는 WhatsApp 채널 등록과 연결된 회사 전화 번호(발신자 ID)일 수 없습니다. 발신자 ID는 수신자에게 보낸 텍스트 및 미디어 메시지의 발신자로 표시됩니다.
전화 번호에는 국가 번호가 포함되어야 합니다. 전화 번호 형식에 대한 자세한 내용은 전화 번호 형식에 대한 WhatsApp 설명서를 참조하세요.
참고 항목
현재 수신자 목록에서는 전화 번호가 하나만 지원됩니다.
다음과 같이 수신자 목록을 만듭니다.
const recipientList = ["<to WhatsApp phone number>"];
예시:
// Example only
const recipientList = ["+14255550199"];
설정
메시지를 보내기 위한 환경을 설정하려면 다음 섹션의 단계를 완료합니다.
새 Node.js 애플리케이션 만들기
앱에 대한 새 디렉터리를 만들고 터미널 또는 명령 창에서 엽니다.
다음 명령을 실행합니다.
mkdir advance-messages-quickstart && cd advance-messages-quickstart
다음 명령을 실행하여 기본 설정으로
package.json
파일을 만듭니다.npm init -y
텍스트 편집기를 사용하여 프로젝트 루트 디렉터리에 호출
send-messages.js
된 파일을 만듭니다.파일에
send-messages.js
다음 코드 조각을 추가합니다.async function main() { // Quickstart code goes here. } main().catch((error) => { console.error("Encountered an error while sending message: ", error); process.exit(1); });
다음 섹션을 완료하여 이 예제 send-messages.js
의 소스 코드를 만든 파일에 추가합니다.
패키지 설치
npm install
명령을 사용하여 JavaScript용 Azure Communication Services 고급 메시징 SDK를 설치합니다.
npm install @azure-rest/communication-messages --save
--save
옵션은 라이브러리를 package.json 파일의 종속성으로 나열합니다.
코드 예제
파일의 주 함수에 필요한 코드 조각을 추가하려면 다음 단계를 수행합니다 send-messages.js
.
Azure Portal에서 WhatsApp 템플릿 나열
Azure Portal에서 템플릿을 보려면 Azure Communication Services 리소스 >고급 메시징>템플릿으로 이동합니다.
템플릿 세부 정보를 볼 템플릿을 선택합니다.
템플릿 세부 정보의 콘텐츠 필드에는 매개 변수 바인딩이 포함될 수 있습니다. 매개 변수 바인딩은 다음과 같이 표시될 수 있습니다.
-
"format"
와 같은IMAGE
값이 있는 필드입니다. - 번호를 둘러싼 이중 대괄호(예:
{{1}}
). 1에서 시작된 인덱스 번호는 메시지 템플릿을 만들기 위해 바인딩 값을 제공해야 하는 순서를 나타냅니다.
또는 WhatsApp Manager> 계정 도구 >메시지 템플릿에서 모든 WhatsApp 비즈니스 계정 템플릿을 보고 편집할 수 있습니다.
프로그래밍 방식으로 템플릿을 나열하려면 다음 코드를 사용하여 채널 ID에 대한 모든 템플릿을 가져올 수 있습니다.
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT License.
/**
* @summary Get Template list for a channel
*/
const MessageTemplateClient = require("@azure-rest/communication-messages").default,
{ isUnexpected } = require("@azure-rest/communication-messages");
// Load the .env file if it exists
require("dotenv").config();
async function main() {
const connectionString = process.env.COMMUNICATION_LIVETEST_STATIC_CONNECTION_STRING || "";
const client = MessageTemplateClient(connectionString);
console.log("Fetch Templates...");
const response = await client
.path("/messages/channels/{channelId}/templates", process.env.CHANNEl_ID || "")
.get({
queryParameters: { maxPageSize: 2 },
});
if (isUnexpected(response)) {
throw new Error("Failed to get template for the channel.");
}
// The paginate helper creates a paged async iterator using metadata from the first page.
const items = paginate(client, response);
// We get an PageableAsyncIterator so we need to do `for await`.
for await (const item of items) {
console.log(JSON.stringify(item, null, 2));
}
}
main().catch((error) => {
console.error("Encountered an error while sending message: ", error);
throw error;
});
본문에 텍스트 매개 변수가 있는 템플릿 메시지 보내기
sample_shipping_confirmation
템플렛:
이 샘플에서 템플릿 본문에는 하나의 매개 변수가 있습니다.
{
"type": "BODY",
"text": "Your package has been shipped. It will be delivered in {{1}} business days."
},
매개 변수는 values
값 및 bindings
바인딩으로 정의됩니다. 값 및 바인딩을 사용하여 개체를 어셈블합니다 template
.
/*
* This sample shows how to send template message with below details
* Name: sample_shipping_confirmation, Language: en_US
* [
{
"type": "BODY",
"text": "Your package has been shipped. It will be delivered in {{1}} business days."
},
{
"type": "FOOTER",
"text": "This message is from an unverified business."
}
]
* */
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT License.
/**
* @summary Use AAD token credentials when sending a whatsapp template message.
*/
const { isNode } = require("@azure/core-util");
const { ClientSecretCredential, DefaultAzureCredential } = require("@azure/identity");
const NotificationClient = require("@azure-rest/communication-messages").default,
{ isUnexpected } = require("@azure-rest/communication-messages");
// Load the .env file if it exists
require("dotenv").config();
async function main() {
// You will need to set this environment variable or edit the following values
const endpoint = process.env.ACS_URL || "";
// Azure AD Credential information is required to run this sample:
if (
!process.env.AZURE_TENANT_ID ||
!process.env.AZURE_CLIENT_ID ||
!process.env.AZURE_CLIENT_SECRET
) {
console.error(
"Azure AD authentication information not provided, but it is required to run this sample. Exiting.",
);
return;
}
// get credentials
const credential = isNode
? new DefaultAzureCredential()
: new ClientSecretCredential(
process.env.AZURE_TENANT_ID,
process.env.AZURE_CLIENT_ID,
process.env.AZURE_CLIENT_SECRET,
);
const client = NotificationClient(endpoint, credential);
const DaysTemplateValue = {
kind: "text",
name: "Days",
text: "5",
};
const templateBindings = {
kind: "whatsApp",
body: [
{
refValue: "Days",
},
],
};
const template = {
name: "sample_shipping_confirmation",
language: "en_US",
bindings: templateBindings,
values: [DaysTemplateValue],
};
const result = await client.path("/messages/notifications:send").post({
contentType: "application/json",
body: {
channelRegistrationId: process.env.CHANNEL_ID || "",
to: [process.env.RECIPIENT_PHONE_NUMBER || ""],
kind: "template",
template: template,
},
});
console.log("Response: " + JSON.stringify(result, null, 2));
if (isUnexpected(result)) {
throw new Error("Failed to send message");
}
const response = result;
response.body.receipts.forEach((receipt) => {
console.log("Message sent to:" + receipt.to + " with message id:" + receipt.messageId);
});
}
main().catch((error) => {
console.error("Encountered an error while sending message: ", error);
throw error;
});
module.exports = { main };
코드 실행
node 명령을 사용하여 send-messages.js 파일에 추가한 코드를 실행합니다.
node ./send-messages.js
전체 샘플 코드
GitHub에서 이 샘플에 대한 최종 코드를 찾습니다.
필수 조건
- Azure Communication Services 리소스에 WhatsApp Business 계정을 등록합니다.
- WhatsApp 템플릿 메시지를 만듭니다.
- 메시지를 받을 활성 WhatsApp 전화 번호입니다.
개체 모델
다음 클래스 및 인터페이스는 Python용 Azure Communication Services 메시지 SDK의 주요 기능 중 일부를 처리합니다.
클래스 이름 | 설명 |
---|---|
NotificationMessagesClient |
Azure Communication Services 리소스에 연결합니다. 메시지를 보냅니다. |
MessageTemplate |
사용하는 템플릿과 메시지에 대한 템플릿 속성의 콘텐츠를 정의합니다. |
TemplateNotificationContent |
보낼 템플릿 메시지의 "who" 및 "what"을 정의합니다. |
참고 항목
자세한 내용은 Python용 Azure SDK 참조 메시지 패키지를 참조하세요.
지원되는 WhatsApp 템플릿 형식
템플릿 유형 | 설명 |
---|---|
텍스트 기반 메시지 템플릿 | WhatsApp 메시지 템플릿은 매개 변수가 있거나 없는 특정 메시지 형식입니다. |
미디어 기반 메시지 템플릿 | 헤더 구성 요소에 대한 미디어 매개 변수가 있는 WhatsApp 메시지 템플릿입니다. |
대화형 메시지 템플릿 | 대화형 메시지 템플릿은 구성 요소 개체를 사용하는 대화형 단추를 포함하여 받는 사람에게 보낼 수 있는 콘텐츠를 확장합니다. 작업 호출 및 빠른 회신이 모두 지원됩니다. |
위치 기반 메시지 템플릿 | 헤더 구성 요소에 대한 경도 및 위도 측면에서 위치 매개 변수가 있는 WhatsApp 메시지 템플릿입니다. |
일반적인 구성
다음 단계에 따라 필요한 코드 messages-quickstart.py
조각을 Python 프로그램에 추가합니다.
- WhatsApp 템플릿 메시지를 만들고 관리합니다.
- 클라이언트를 인증합니다.
- 채널 등록 ID를 설정합니다.
- 받는 사람 목록을 설정합니다.
WhatsApp 템플릿 메시지 만들기 및 관리
WhatsApp 메시지 템플릿은 기업이 알림을 옵트인한 사용자에게 알림 또는 고객 관리 메시지를 보내는 데 사용하는 특정 메시지 형식입니다. 메시지에는 약속 미리 알림, 배송 정보, 문제 해결 또는 결제 업데이트가 포함될 수 있습니다. 고급 메시징 SDK를 사용하여 템플릿 메시지를 보내기 전에 사용자는 WhatsApp Business Platform에서 필요한 템플릿을 만들어야 합니다.
템플릿에 대한 WhatsApp 요구 사항에 대한 자세한 내용은 WhatsApp에 비즈니스 플랫폼 API 참조를 참조하세요.
- 템플릿을 만들고 관리합니다.
- 템플릿 구성 요소를 봅니다.
- 템플릿 메시지를 보냅니다.
- 또한 기업은 WhatsApp 사용자에게 메시지를 보내기 전에 옵트인 요구 사항을 준수해야 합니다.
클라이언트 인증
메시지 전송은 NotificationMessagesClient를 사용하여 수행됩니다. NotificationMessagesClient는 Azure Portal의 Azure Communication Services 리소스에서 획득한 연결 문자열을 사용하여 인증됩니다. 연결 문자열에 대한 자세한 내용은 access-your-connection-strings-and-service-endpoints를 참조하세요.
스크린샷에 제공된 대로 Azure Portal에서 Azure Communication Resource 연결 문자열 가져옵니다. 왼쪽에서 Keys
탭으로 이동합니다. 기본 키의 Connection string
필드를 복사합니다. 연결 문자열은 endpoint=https://{your Azure Communication Services resource name}.communication.azure.com/;accesskey={secret key}
형식입니다.
환경 변수 COMMUNICATION_SERVICES_CONNECTION_STRING
을 연결 문자열 값으로 설정합니다.
콘솔 창을 열고 다음 명령을 입력합니다.
setx COMMUNICATION_SERVICES_CONNECTION_STRING "<your connection string>"
환경 변수를 추가한 후에는 콘솔 창을 포함하여 실행 중인 프로그램 중에서 환경 변수를 읽어야 하는 프로그램을 다시 시작해야 할 수도 있습니다. 예를 들어 편집기로 Visual Studio를 사용하는 경우 Visual Studio를 다시 시작한 후 예제를 실행합니다.
시스템의 환경 변수를 설정하는 방법에 대한 자세한 내용은 환경 변수에 연결 문자열 저장의 단계를 수행합니다.
# Get a connection string to our Azure Communication Services resource.
connection_string = os.getenv("COMMUNICATION_SERVICES_CONNECTION_STRING")
def send_template_message(self):
from azure.communication.messages import NotificationMessagesClient
# Create NotificationMessagesClient Client
messaging_client = NotificationMessagesClient.from_connection_string(self.connection_string)
채널 등록 ID 설정
채널 등록 중에 채널 등록 ID GUID를 만들었습니다. Azure Communication Services 리소스의 채널 탭에 있는 포털에서 찾을 수 있습니다.
channelRegistrationId라는 변수에 할당합니다.
channelRegistrationId = os.getenv("WHATSAPP_CHANNEL_ID_GUID")
수신자 목록 설정
WhatsApp 계정과 연결된 활성 전화 번호를 제공해야 합니다. 이 WhatsApp 계정은 이 빠른 시작에서 보낸 템플릿, 문자 및 미디어 메시지를 받습니다.
이 예제에서는 개인 전화 번호를 사용할 수 있습니다.
수신자 전화 번호는 WhatsApp 채널 등록과 연결된 회사 전화 번호(발신자 ID)일 수 없습니다. 발신자 ID는 수신자에게 보낸 텍스트 및 미디어 메시지의 발신자로 표시됩니다.
전화 번호에는 국가 코드가 포함되어야 합니다. 전화 번호 서식에 대한 자세한 내용은 전화 번호 형식에 대한 WhatsApp 설명서를 참조하세요.
참고 항목
현재 수신자 목록에서는 전화 번호가 하나만 지원됩니다.
다음과 같이 수신자 목록을 설정합니다.
phone_number = os.getenv("RECIPIENT_WHATSAPP_PHONE_NUMBER")
사용 예제:
# Example only
to=[self.phone_number],
기업과 WhatsApp 사용자 간에 메시지 보내기 시작
WhatsApp 비즈니스 계정과 WhatsApp 사용자 간의 대화는 다음 두 가지 방법 중 하나로 시작할 수 있습니다.
- 기업은 WhatsApp 사용자에게 템플릿 메시지를 보냅니다.
- WhatsApp 사용자는 비즈니스 번호로 메시지를 보냅니다.
비즈니스는 대화형 대화를 시작할 수 없습니다. 비즈니스는 사용자로부터 메시지를 받은 후에만 대화형 메시지를 보낼 수 있습니다. 비즈니스는 활성 대화 중에 사용자에게 대화형 메시지만 보낼 수 있습니다. 24시간 대화 창이 만료되면 사용자만 대화형 대화를 다시 시작할 수 있습니다. 대화에 대한 자세한 내용은 WhatsApp Business Platform의 정의를 참조하세요.
개인 WhatsApp 계정에서 대화형 대화를 시작하려면 비즈니스 번호(보낸 사람 ID)로 메시지를 보냅니다.
환경 설정
새 Python 애플리케이션 만들기
터미널 또는 콘솔 창에서 애플리케이션에 대한 새 폴더를 만들고 엽니다.
mkdir messages-quickstart && cd messages-quickstart
패키지 설치
Python 1.1.0 이상용 Azure Communication Messages 클라이언트 라이브러리를 사용합니다.
콘솔 프롬프트에서 다음 명령을 실행합니다.
pip install azure-communication-messages
InteractiveMessages, 반응 및 스티커의 경우 아래 베타 버전을 사용하세요.
pip install azure-communication-messages==1.2.0b1
앱 프레임워크 설정
messages-quickstart.py
라는 새 파일을 만들고 기본 프로그램 구조를 추가합니다.
type nul > messages-quickstart.py
기본 프로그램 구조
import os
class MessagesQuickstart(object):
print("Azure Communication Services - Advanced Messages SDK Quickstart")
if __name__ == '__main__':
messages = MessagesQuickstart()
기본 프로그램 구조
import os
class MessagesQuickstart(object):
print("Azure Communication Services - Advanced Messages SDK Quickstart")
if __name__ == '__main__':
messages = MessagesQuickstart()
코드 예제
다음 단계에 따라 필요한 코드 messages-quickstart.py
조각을 Python 프로그램에 추가합니다.
- Azure Portal에서 WhatsApp 템플릿을 나열합니다.
- 매개 변수 없이 템플릿 메시지를 보냅니다.
- 본문에 텍스트 매개 변수가 있는 템플릿 메시지를 보냅니다.
- 헤더에 미디어 매개 변수가 있는 템플릿 메시지를 보냅니다.
- 헤더에 위치가 있는 템플릿 메시지를 보냅니다.
- 빠른 회신 단추가 있는 템플릿 메시지를 보냅니다.
- 동적 링크가 있는 작업 호출 단추가 있는 템플릿 메시지를 보냅니다.
Azure Portal에서 WhatsApp 템플릿 나열
Azure Communication Service 리소스 >고급 메시징 템플릿으로 이동하여 Azure Portal에서 템플릿을>볼 수 있습니다.
템플릿을 선택하여 템플릿 세부 정보를 봅니다.
템플릿 세부 정보의 필드에는 content
매개 변수 바인딩이 포함될 수 있습니다. 매개 변수 바인딩은 다음과 같이 표시될 수 있습니다.
-
format
와 같은IMAGE
값이 있는 필드입니다. - 번호를 둘러싼 이중 대괄호(예:
{{1}}
). 1에서 시작된 인덱스 번호는 메시지 템플릿을 만들기 위해 바인딩 값을 제공해야 하는 순서를 나타냅니다.
또는 WhatsApp Manager> 계정 도구 >메시지 템플릿에서 WhatsApp Business 계정의 모든 템플릿을 보고 편집할 수 있습니다.
프로그래밍 방식으로 템플릿을 나열하려면 다음과 같이 채널 ID에 대한 모든 템플릿을 가져올 수 있습니다.
def get_templates_list(self):
from azure.communication.messages import MessageTemplateClient
message_template_client = MessageTemplateClient.from_connection_string(self.connection_string)
# calling send() with whatsapp message details
template_list = message_template_client.list_templates(self.channel_id)
count_templates = len(list(template_list))
print("Successfully retrieved {} templates from channel_id {}.".format(count_templates, self.channel_id))
매개 변수 없이 템플릿 메시지 보내기
템플릿에 매개 변수가 필요하지 않은 경우 값을 만들 MessageTemplate
때 값이나 바인딩을 제공할 필요가 없습니다.
예시
매개 sample_template
변수가 없습니다.
MessageTemplate
대상 템플릿 이름 및 언어를 참조하여 어셈블합니다.
input_template: MessageTemplate = MessageTemplate(name="gathering_invitation", language="ca") # Name of the WhatsApp Template
본문에 텍스트 매개 변수가 있는 템플릿 메시지 보내기
MessageTemplateText
를 사용하여 번호를 둘러싼 이중 대괄호(예: {{1}}
)로 표시된 본문의 매개 변수를 정의합니다. 1에서 시작된 인덱스 번호는 메시지 템플릿을 만들기 위해 바인딩 값을 제공해야 하는 순서를 나타냅니다. 템플릿에 없는 매개 변수를 포함하려는 시도가 잘못되었습니다.
두 매개 변수가 있는 템플릿 정의:
{
"type": "BODY",
"text": "Message with two parameters: {{1}} and {{2}}"
}
예제
sample_shipping_confirmation
템플렛:
이 샘플에서 템플릿 본문에는 하나의 매개 변수가 있습니다.
{
"type": "BODY",
"text": "Your package has been shipped. It will be delivered in {{1}} business days."
},
값 및 MessageTemplateWhatsAppBindings
바인딩을 MessageTemplateValue
사용하여 매개 변수를 정의합니다. 값 및 바인딩을 사용하여 MessageTemplate
을 어셈블합니다.
# Setting template options
templateName = "sample_shipping_confirmation"
templateLanguage = "en_us"
shippingConfirmationTemplate: MessageTemplate = MessageTemplate(name=templateName, language=templateLanguage )
threeDays = MessageTemplateText(name="threeDays", text="3")
bindings = WhatsAppMessageTemplateBindings(body=[WhatsAppMessageTemplateBindingsComponent(ref_value=threeDays.name)])
shippingConfirmationTemplate.bindings = bindings
shippingConfirmationTemplate.template_values=[threeDays]
template_options = TemplateNotificationContent(
channel_registration_id=self.channel_id, to=[self.phone_number], template=shippingConfirmationTemplate
)
헤더에 미디어 매개 변수가 있는 템플릿 메시지 보내기
MessageTemplateImage
, MessageTemplateVideo
또는 MessageTemplateDocument
를 사용하여 헤더에 미디어 매개 변수를 정의합니다.
헤더에 이미지 미디어 매개 변수가 있는 템플릿 정의:
{
"type": "HEADER",
"format": "IMAGE"
},
WhatsApp format
에서 지원하는 미디어 유형이 다를 수 있습니다. .NET SDK에서 각 미디어 형식은 해당 MessageTemplateValue
형식을 사용합니다.
형식 | MessageTemplateValue 형식 | 파일 유형 |
---|---|---|
IMAGE | MessageTemplateImage |
png, jpg |
동영상 | MessageTemplateVideo |
mp4 |
DOCUMENT | MessageTemplateDocument |
지원되는 미디어 유형 및 크기 제한에 대한 자세한 내용은 WhatsApp의 메시지 미디어 설명서를 참조하세요.
예제
sample_movie_ticket_confirmation
템플렛:
이 샘플에서 템플릿의 헤더에는 이미지가 필요합니다.
{
"type": "HEADER",
"format": "IMAGE"
},
템플릿 본문에는 다음 네 개의 텍스트 매개 변수가 필요합니다.
{
"type": "BODY",
"text": "Your ticket for *{{1}}*\n*Time* - {{2}}\n*Venue* - {{3}}\n*Seats* - {{4}}"
},
1개의 MessageTemplateImage
및 4개의 MessageTemplateText
변수를 만듭니다. 그런 다음 매개 변수가 템플릿 콘텐츠에 표시되는 순서대로 매개 변수를 제공하여 목록과 MessageTemplateWhatsAppBindings
사용자의 목록을 MessageTemplateValue
어셈블합니다.
# Setting template options
templateName = "sample_movie_ticket_confirmation"
templateLanguage = "en_us"
imageUrl = "https://aka.ms/acsicon1"
sample_movie_ticket_confirmation: MessageTemplate = MessageTemplate(name=templateName, language=templateLanguage )
image = MessageTemplateImage(name="image", url=imageUrl)
title = MessageTemplateText(name="title", text="Contoso")
time = MessageTemplateText(name="time", text="July 1st, 2023 12:30PM")
venue = MessageTemplateText(name="venue", text="Southridge Video")
seats = MessageTemplateText(name="seats", text="Seat 1A")
bindings = WhatsAppMessageTemplateBindings(header=[WhatsAppMessageTemplateBindingsComponent(ref_value=image.name)],
body=[WhatsAppMessageTemplateBindingsComponent(ref_value=title.name),
WhatsAppMessageTemplateBindingsComponent(ref_value=time.name),
WhatsAppMessageTemplateBindingsComponent(ref_value=venue.name),
WhatsAppMessageTemplateBindingsComponent(ref_value=seats.name)])
sample_movie_ticket_confirmation.bindings = bindings
sample_movie_ticket_confirmation.template_values=[image,title,time,venue,seats]
template_options = TemplateNotificationContent(
channel_registration_id=self.channel_id, to=[self.phone_number], template=sample_movie_ticket_confirmation)
빠른 회신 단추가 있는 템플릿 메시지 보내기
빠른 회신 단추에 대한 페이로드를 정의하는 데 사용 MessageTemplateQuickAction
되며 MessageTemplateQuickAction
개체에는 다음 세 가지 특성이 있습니다.
속성 | 설명 | Type |
---|---|---|
속성 |
name 에서 값을 조회할 값입니다MessageTemplateWhatsAppBindings . |
string |
Text | 빠른 작업 text 옵션입니다. |
string |
페이로드 |
payload 사용자가 단추를 선택하는 경우 메시지 회신에서 사용할 수 있는 단추에 할당됩니다. |
string |
빠른 회신 단추가 있는 템플릿 정의:
{
"type": "BUTTONS",
"buttons": [
{
"type": "QUICK_REPLY",
"text": "Yes"
},
{
"type": "QUICK_REPLY",
"text": "No"
}
]
}
템플릿 정의에 단추가 표시되는 순서는 바인딩을 만들 때 단추가 정의된 순서와 MessageTemplateWhatsAppBindings
일치해야 합니다.
사용자의 빠른 회신 응답 페이로드에 대한 자세한 내용은 빠른 회신 단추에서 수신된 콜백에 대한 WhatsApp의 설명서를 참조하세요.
예시
sample_issue_resolution
템플렛:
템플릿 본문에는 다음 하나의 텍스트 매개 변수가 필요합니다.
{
"type": "BODY",
"text": "Hi {{1}}, were we able to solve the issue that you were facing?"
},
템플릿에는 미리 채워진 두 개의 회신 단추와 Yes
No
.
{
"type": "BUTTONS",
"buttons": [
{
"type": "QUICK_REPLY",
"text": "Yes"
},
{
"type": "QUICK_REPLY",
"text": "No"
}
]
}
1개의 MessageTemplateText
및 2개의 MessageTemplateQuickAction
변수를 만듭니다. 그런 다음 매개 변수가 템플릿 콘텐츠에 표시되는 순서대로 매개 변수를 제공하여 목록과 MessageTemplateWhatsAppBindings
사용자의 목록을 MessageTemplateValue
어셈블합니다. 바인딩 단추를 정의할 때도 순서가 중요합니다.
# Setting template options
templateName = "sample_issue_resolution"
templateLanguage = "en_us"
shippingConfirmationTemplate: MessageTemplate = MessageTemplate(name=templateName, language=templateLanguage )
name = MessageTemplateText(name="first", text="Joe")
yes = MessageTemplateQuickAction(name="Yes", payload="Joe said yes")
no = MessageTemplateQuickAction(name="No", payload = "Joe said no")
bindings = WhatsAppMessageTemplateBindings(body=[WhatsAppMessageTemplateBindingsComponent(ref_value=name.name)])
bindings.buttons = [WhatsAppMessageTemplateBindingsButton(sub_type=WhatsAppMessageButtonSubType.QUICK_REPLY, ref_value=yes.name),
WhatsAppMessageTemplateBindingsButton(sub_type=WhatsAppMessageButtonSubType.QUICK_REPLY, ref_value=no.name)]
shippingConfirmationTemplate.bindings = bindings
shippingConfirmationTemplate.template_values=[name,yes,no]
template_options = TemplateNotificationContent(
channel_registration_id=self.channel_id, to=[self.phone_number], template=shippingConfirmationTemplate
)
헤더에 위치가 있는 템플릿 메시지 보내기
헤더에서 위치 매개 변수를 정의하는 데 사용합니다 MessageTemplateLocation
.
위치가 필요한 헤더 구성 요소에 대한 템플릿 정의는 다음과 같습니다.
{
"type": "header",
"parameters": [
{
"type": "location",
"location": {
"latitude": "<LATITUDE>",
"longitude": "<LONGITUDE>",
"name": "<NAME>",
"address": "<ADDRESS>"
}
}
]
}
다른 미디어 유형이 format
필요할 수 있습니다. .NET SDK에서 각 미디어 형식은 해당 MessageTemplateValue
형식을 사용합니다.
속성 | 설명 | Type |
---|---|---|
ADDRESS |
메시지 맨 위에 있는 NAME 제네릭 맵 아래 값 뒤의 주소입니다. |
string |
LATITUDE |
위치 위도입니다. | double |
LONGITUDE |
위치 경도입니다. | double |
LOCATIONNAME |
메시지 맨 위에 있는 제네릭 맵 바로 아래에 표시되는 텍스트입니다. | string |
위치 기반 템플릿에 대한 자세한 내용은 메시지 미디어에 대한 WhatsApp의 설명서를 참조 하세요.
예시
sample_movie_location
템플렛:
위치 기반 메시지 템플릿 어셈블리:
# Setting template options
templateName = "sample_movie_location"
templateLanguage = "en_us"
sample_movie_location: MessageTemplate = MessageTemplate(name=templateName, language=templateLanguage )
name = MessageTemplateText(name="first", text="Joe")
location = MessageTemplateLocation(name="location", location_name="Pablo Morales",
address="1 Hacker Way, Menlo Park, CA 94025",
latitude=37.483307,longitude=122.148981)
bindings = WhatsAppMessageTemplateBindings(body=[WhatsAppMessageTemplateBindingsComponent(ref_value=name.name)],
header=[WhatsAppMessageTemplateBindingsComponent(ref_value=location.name)])
sample_movie_location.bindings = bindings
sample_movie_location.template_values=[name,location]
template_options = TemplateNotificationContent(
channel_registration_id=self.channel_id, to=[self.phone_number], template=sample_movie_location)
동적 링크가 있는 작업 호출 단추가 있는 템플릿 메시지 보내기
동작 호출 단추에 대한 URL 접미사를 정의하는 데 사용 MessageTemplateQuickAction
되며 MessageTemplateQuickAction
개체에는 다음과 같은 두 가지 특성이 있습니다.
속성 | 설명 | Type |
---|---|---|
속성 | 에서 name 값을 조회하는 데 사용되는 값입니다 MessageTemplateWhatsAppBindings . |
string |
Text |
text URL에 추가된 값입니다. |
string |
템플릿 정의 단추:
{
"type": "BUTTONS",
"buttons": [
{
"type": "URL",
"text": "Take Survey",
"url": "https://www.example.com/{{1}}"
}
]
}
템플릿 정의에 단추가 표시되는 순서는 바인딩을 만들 때 단추가 정의된 순서와 MessageTemplateWhatsAppBindings
일치해야 합니다.
예시
sample_purchase_feedback
템플렛:
이 샘플 템플릿은 메시지에 동적 URL 링크가 있는 단추를 추가합니다. 또한 헤더의 이미지와 본문의 텍스트 매개 변수를 사용합니다. 작업 유형에 대한 URL 형식을 사용하여 Dynamic
작업 단추 템플릿에 대한 호출을 View website
만듭니다.
이 샘플에서 템플릿의 헤더에는 이미지가 필요합니다.
{
"type": "HEADER",
"format": "IMAGE"
},
템플릿 본문에는 다음 하나의 텍스트 매개 변수가 필요합니다.
{
"type": "BODY",
"text": "Thank you for purchasing {{1}}! We value your feedback and would like to learn more about your experience."
},
템플릿에는 하나의 매개 변수가 있는 동적 URL 단추가 포함됩니다.
{
"type": "BUTTONS",
"buttons": [
{
"type": "URL",
"text": "Take Survey",
"url": "https://www.example.com/{{1}}"
}
]
}
하나의 MessageTemplateImage
, 하나의 MessageTemplateText
및 하나의 MessageTemplateQuickAction
변수를 만듭니다. 그런 다음 매개 변수가 템플릿 콘텐츠에 표시되는 순서대로 매개 변수를 제공하여 목록과 MessageTemplateWhatsAppBindings
사용자의 목록을 MessageTemplateValue
어셈블합니다. 바인딩 단추를 정의할 때도 순서가 중요합니다.
# Setting template options
templateName = "sample_purchase_feedback"
templateLanguage = "en_us"
imageUrl = "https://aka.ms/acsicon1"
sample_purchase_feedback: MessageTemplate = MessageTemplate(name=templateName, language=templateLanguage )
name = MessageTemplateText(name="first", text="Joe")
image = MessageTemplateImage(name="image", url=imageUrl)
uri_to_click = MessageTemplateQuickAction(name="url", text="questions")
bindings = WhatsAppMessageTemplateBindings(body=[WhatsAppMessageTemplateBindingsComponent(ref_value=name.name)],
header=[WhatsAppMessageTemplateBindingsComponent(ref_value=image.name)],
buttons=[WhatsAppMessageTemplateBindingsButton(sub_type=WhatsAppMessageButtonSubType.URL,
ref_value=uri_to_click.name)])
sample_purchase_feedback.bindings = bindings
sample_purchase_feedback.template_values=[name, image, uri_to_click]
template_options = TemplateNotificationContent(
channel_registration_id=self.channel_id, to=[self.phone_number], template=sample_purchase_feedback)
전체 예제
import os
import sys
sys.path.append("..")
class SendWhatsAppTemplateMessageSample(object):
connection_string = os.getenv("COMMUNICATION_SAMPLES_CONNECTION_STRING")
phone_number = os.getenv("RECIPIENT_PHONE_NUMBER")
channel_id = os.getenv("WHATSAPP_CHANNEL_ID")
def send_template_message_without_parameters(self):
from azure.communication.messages import NotificationMessagesClient
from azure.communication.messages.models import ( TemplateNotificationContent , MessageTemplate )
# client creation
messaging_client = NotificationMessagesClient.from_connection_string(self.connection_string)
input_template: MessageTemplate = MessageTemplate(
name="<<TEMPLATE_NAME>>",
language="<<LANGUAGE>>")
template_options = TemplateNotificationContent(
channel_registration_id=self.channelRegistrationId,
to=[self.phone_number],
template=input_template
)
# calling send() with WhatsApp template details.
message_responses = messaging_client.send(template_options)
response = message_responses.receipts[0]
if (response is not None):
print("WhatsApp Templated Message with message id {} was successfully sent to {}"
.format(response.message_id, response.to))
else:
print("Message failed to send")
def send_template_message_with_parameters(self):
from azure.communication.messages import NotificationMessagesClient
from azure.communication.messages.models import (TemplateNotificationContent, MessageTemplate,
MessageTemplateText, WhatsAppMessageTemplateBindings, WhatsAppMessageTemplateBindingsComponent)
messaging_client = NotificationMessagesClient.from_connection_string(self.connection_string)
# Setting template options
templateName = "sample_shipping_confirmation"
templateLanguage = "en_us"
shippingConfirmationTemplate: MessageTemplate = MessageTemplate(name=templateName, language=templateLanguage )
threeDays = MessageTemplateText(name="threeDays", text="3")
bindings = WhatsAppMessageTemplateBindings(body=[WhatsAppMessageTemplateBindingsComponent(ref_value=threeDays.name)])
shippingConfirmationTemplate.bindings = bindings
shippingConfirmationTemplate.template_values=[threeDays]
template_options = TemplateNotificationContent(
channel_registration_id=self.channel_id, to=[self.phone_number], template=shippingConfirmationTemplate
)
# calling send() with whatsapp message details
message_responses = messaging_client.send(template_options)
response = message_responses.receipts[0]
print("WhatsApp text parameters Templated Message with message id {} was successfully sent to {}"
.format(response.message_id, response.to))
def send_template_message_with_media(self):
from azure.communication.messages import NotificationMessagesClient
from azure.communication.messages.models import (TemplateNotificationContent, MessageTemplate,
MessageTemplateText, WhatsAppMessageTemplateBindings, WhatsAppMessageTemplateBindingsComponent,
MessageTemplateImage)
messaging_client = NotificationMessagesClient.from_connection_string(self.connection_string)
# Setting template options
templateName = "sample_movie_ticket_confirmation"
templateLanguage = "en_us"
imageUrl = "https://aka.ms/acsicon1"
sample_movie_ticket_confirmation: MessageTemplate = MessageTemplate(name=templateName, language=templateLanguage )
image = MessageTemplateImage(name="image", url=imageUrl)
title = MessageTemplateText(name="title", text="Contoso")
time = MessageTemplateText(name="time", text="July 1st, 2023 12:30PM")
venue = MessageTemplateText(name="venue", text="Southridge Video")
seats = MessageTemplateText(name="seats", text="Seat 1A")
bindings = WhatsAppMessageTemplateBindings(header=[WhatsAppMessageTemplateBindingsComponent(ref_value=image.name)],
body=[WhatsAppMessageTemplateBindingsComponent(ref_value=title.name),
WhatsAppMessageTemplateBindingsComponent(ref_value=time.name),
WhatsAppMessageTemplateBindingsComponent(ref_value=venue.name),
WhatsAppMessageTemplateBindingsComponent(ref_value=seats.name)])
sample_movie_ticket_confirmation.bindings = bindings
sample_movie_ticket_confirmation.template_values=[image,title,time,venue,seats]
template_options = TemplateNotificationContent(
channel_registration_id=self.channel_id, to=[self.phone_number], template=sample_movie_ticket_confirmation)
# calling send() with whatsapp message details
message_responses = messaging_client.send(template_options)
response = message_responses.receipts[0]
print("WhatsApp media parameters in templated message header with message id {} was successfully sent to {}"
.format(response.message_id, response.to))
def send_template_message_with_buttons(self):
from azure.communication.messages import NotificationMessagesClient
from azure.communication.messages.models import (TemplateNotificationContent, MessageTemplate,
MessageTemplateText, WhatsAppMessageTemplateBindings, WhatsAppMessageTemplateBindingsComponent,
MessageTemplateQuickAction, WhatsAppMessageTemplateBindingsButton, WhatsAppMessageButtonSubType)
messaging_client = NotificationMessagesClient.from_connection_string(self.connection_string)
# Setting template options
templateName = "sample_issue_resolution"
templateLanguage = "en_us"
shippingConfirmationTemplate: MessageTemplate = MessageTemplate(name=templateName, language=templateLanguage )
name = MessageTemplateText(name="first", text="Joe")
yes = MessageTemplateQuickAction(name="Yes", payload="Joe said yes")
no = MessageTemplateQuickAction(name="No", payload = "Joe said no")
bindings = WhatsAppMessageTemplateBindings(body=[WhatsAppMessageTemplateBindingsComponent(ref_value=name.name)])
bindings.buttons = [WhatsAppMessageTemplateBindingsButton(sub_type=WhatsAppMessageButtonSubType.QUICK_REPLY, ref_value=yes.name),
WhatsAppMessageTemplateBindingsButton(sub_type=WhatsAppMessageButtonSubType.QUICK_REPLY, ref_value=no.name)]
shippingConfirmationTemplate.bindings = bindings
shippingConfirmationTemplate.template_values=[name,yes,no]
template_options = TemplateNotificationContent(
channel_registration_id=self.channel_id, to=[self.phone_number], template=shippingConfirmationTemplate
)
# calling send() with whatsapp message details
message_responses = messaging_client.send(template_options)
response = message_responses.receipts[0]
print("WhatsApp Quick Button Templated Message with message id {} was successfully sent to {}"
.format(response.message_id, response.to))
def send_template_message_with_location(self):
from azure.communication.messages import NotificationMessagesClient
from azure.communication.messages.models import (TemplateNotificationContent, MessageTemplate,
MessageTemplateText, WhatsAppMessageTemplateBindings, WhatsAppMessageTemplateBindingsComponent,
MessageTemplateLocation)
messaging_client = NotificationMessagesClient.from_connection_string(self.connection_string)
# Setting template options
templateName = "sample_movie_location"
templateLanguage = "en_us"
sample_movie_location: MessageTemplate = MessageTemplate(name=templateName, language=templateLanguage )
name = MessageTemplateText(name="first", text="Joe")
location = MessageTemplateLocation(name="location", location_name="Pablo Morales",
address="1 Hacker Way, Menlo Park, CA 94025",
latitude=37.483307,longitude=122.148981)
bindings = WhatsAppMessageTemplateBindings(body=[WhatsAppMessageTemplateBindingsComponent(ref_value=name.name)],
header=[WhatsAppMessageTemplateBindingsComponent(ref_value=location.name)])
sample_movie_location.bindings = bindings
sample_movie_location.template_values=[name,location]
template_options = TemplateNotificationContent(
channel_registration_id=self.channel_id, to=[self.phone_number], template=sample_movie_location)
# calling send() with whatsapp message details
message_responses = messaging_client.send(template_options)
response = message_responses.receipts[0]
print("WhatsApp Location Templated Message with message id {} was successfully sent to {}"
.format(response.message_id, response.to))
def send_template_message_with_call_to_action(self):
from azure.communication.messages import NotificationMessagesClient
from azure.communication.messages.models import (TemplateNotificationContent, MessageTemplate,
MessageTemplateText, WhatsAppMessageTemplateBindings, WhatsAppMessageTemplateBindingsComponent,
MessageTemplateQuickAction, MessageTemplateImage, WhatsAppMessageTemplateBindingsButton,
WhatsAppMessageButtonSubType)
messaging_client = NotificationMessagesClient.from_connection_string(self.connection_string)
# Setting template options
templateName = "sample_purchase_feedback"
templateLanguage = "en_us"
imageUrl = "https://aka.ms/acsicon1"
sample_purchase_feedback: MessageTemplate = MessageTemplate(name=templateName, language=templateLanguage )
name = MessageTemplateText(name="first", text="Joe")
image = MessageTemplateImage(name="image", url=imageUrl)
uri_to_click = MessageTemplateQuickAction(name="url", text="questions")
bindings = WhatsAppMessageTemplateBindings(body=[WhatsAppMessageTemplateBindingsComponent(ref_value=name.name)],
header=[WhatsAppMessageTemplateBindingsComponent(ref_value=image.name)],
buttons=[WhatsAppMessageTemplateBindingsButton(sub_type=WhatsAppMessageButtonSubType.URL,
ref_value=uri_to_click.name)])
sample_purchase_feedback.bindings = bindings
sample_purchase_feedback.template_values=[name, image, uri_to_click]
template_options = TemplateNotificationContent(
channel_registration_id=self.channel_id, to=[self.phone_number], template=sample_purchase_feedback)
# calling send() with whatsapp message details
message_responses = messaging_client.send(template_options)
response = message_responses.receipts[0]
print("WhatsApp Call To Action Templated Message with message id {} was successfully sent to {}"
.format(response.message_id, response.to))
if __name__ == "__main__":
sample = SendWhatsAppTemplateMessageSample()
sample.send_template_message_without_parameters()
sample.send_template_message_with_parameters()
sample.send_template_message_with_buttons()
sample.send_template_message_with_location()
sample.send_template_message_with_call_to_action()
코드 실행
코드를 실행하려면 messages-quickstart.py
파일이 있는 디렉터리에 있는지 확인합니다.
python messages-quickstart.py
Azure Communication Services - Advanced Messages Quickstart
WhatsApp Templated Message with message id <<GUID>> was successfully sent to <<ToRecipient>>