다음을 통해 공유


고급 메시지를 사용하여 WhatsApp 템플릿 메시지 보내기

이 문서에서는 고급 통신 메시지 SDK를 사용하여 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 템플릿 메시지 만들기 및 관리

WhatsApp 메시지 템플릿은 기업이 알림을 옵트인한 사용자에게 알림 또는 고객 관리 메시지를 보내는 데 사용하는 특정 메시지 형식입니다. 메시지에는 약속 미리 알림, 배송 정보, 문제 해결 또는 결제 업데이트가 포함될 수 있습니다. 고급 메시징 SDK를 사용하여 템플릿 메시지를 보내기 전에 사용자는 WhatsApp Business Platform에서 필요한 템플릿을 만들어야 합니다.

템플릿에 대한 WhatsApp 요구 사항에 대한 자세한 내용은 WhatsApp에 비즈니스 플랫폼 API 참조를 참조하세요.

클라이언트 인증

메시지 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} 형식입니다.

'기본 키' 섹션의 '연결 문자열' 필드를 보는 Azure Portal의 Azure Communication Services 리소스를 보여 주는 스크린샷.

환경 변수 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 리소스의 채널 탭에 있는 포털에서 찾을 수 있습니다.

'채널' 탭을 보는 Azure Portal의 Azure Communication Services 리소스를 보여주는 스크린샷. '채널 ID' 필드의 복사 작업에 주의해야 합니다.

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)로 메시지를 보냅니다.

WhatsApp 비즈니스 계정 번호로 전송된 사용자 메시지를 보여 주는 웹에서 본 WhatsApp 대화입니다.

환경 설정

.NET 프로젝트 만들기

프로젝트를 만들려면 Visual Studio를 사용하여 .NET 콘솔 애플리케이션 만들기의 자습서를 따릅니다.

코드를 컴파일하려면 Ctrl+F7을 누릅니다.

패키지 설치

C# 프로젝트에 Azure.Communication.Messages NuGet 패키지를 설치합니다.

  1. Project > Manage NuGet Packages...에서 NuGet 패키지 관리자를 엽니다.
  2. 패키지 Azure.Communication.Messages를 검색합니다.
  3. 최신 릴리스를 설치합니다.

앱 프레임워크 설정

텍스트 편집기에서 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 Communication Service 리소스 >고급 메시징 템플릿으로 이동하여 Azure Portal에서 템플릿을>볼 수 있습니다.

고급 메시징 템플릿 탭을 보는 Azure Portal의 Azure Communication Services 리소스를 보여 주는 > 스크린샷

세부 정보를 보려면 템플릿을 선택합니다.

템플릿 세부 정보의 필드에는 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 사용하지 않습니다.

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 템플렛:

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 PDF

지원되는 미디어 유형 및 크기 제한에 대한 자세한 내용은 메시지 미디어에 대한 WhatsApp의 설명서를 참조하세요.

이미지 미디어에 대한 메시지 템플릿 어셈블리:

var url = new Uri("< Your media URL >");

var media = new MessageTemplateImage("image", url);
WhatsAppMessageTemplateBindings bindings = new();
bindings.Header.Add(new(media.Name));

var messageTemplate = new MessageTemplate(templateName, templateLanguage);
template.Bindings = bindings;
template.Values.Add(media);

예제

sample_movie_ticket_confirmation 템플렛:

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 변수를 만듭니다. 그런 다음, 매개 변수가 템플릿 콘텐츠에 표시되는 순서대로 매개 변수를 제공하여 MessageTemplateValueMessageTemplateWhatsAppBindings 목록을 어셈블합니다.

string templateName = "sample_movie_ticket_confirmation"; 
string templateLanguage = "en_us"; 
var imageUrl = new Uri("https://aka.ms/acsicon1");

var image = new MessageTemplateImage("image", imageUrl);
var title = new MessageTemplateText("title", "Contoso");
var time = new MessageTemplateText("time", "July 1st, 2023 12:30PM");
var venue = new MessageTemplateText("venue", "Southridge Video");
var seats = new MessageTemplateText("seats", "Seat 1A");

WhatsAppMessageTemplateBindings bindings = new();
bindings.Header.Add(new(image.Name));
bindings.Body.Add(new(title.Name));
bindings.Body.Add(new(time.Name));
bindings.Body.Add(new(venue.Name));
bindings.Body.Add(new(seats.Name));

MessageTemplate movieTicketConfirmationTemplate = new(templateName, templateLanguage);
movieTicketConfirmationTemplate.Values.Add(image);
movieTicketConfirmationTemplate.Values.Add(title);
movieTicketConfirmationTemplate.Values.Add(time);
movieTicketConfirmationTemplate.Values.Add(venue);
movieTicketConfirmationTemplate.Values.Add(seats);
movieTicketConfirmationTemplate.Bindings = bindings;

추가 예제

헤더에 위치가 있는 템플릿 메시지 보내기

헤더에서 위치 매개 변수를 정의하는 데 사용합니다 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 템플렛:

sample_location_template 템플릿에 대한 템플릿 세부 정보를 보여 주는 스크린샷

위치 기반 메시지 템플릿 어셈블리:

 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 템플렛:

sample_issue_resolution 템플릿에 대한 템플릿 세부 정보를 보여 주는 스크린샷

템플릿 본문에는 다음 하나의 텍스트 매개 변수가 필요합니다.

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

템플릿에는 미리 채워진 두 개의 회신 단추와 YesNo.

{
  "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
속성 nameMessageTemplateWhatsAppBindings의 값을 조회하는 데 사용됩니다. 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 유형 단추를 보여 주는 WhatsApp 관리자 단추 편집기 작업 호출 패널의 화면 캡처입니다.

이 샘플에서 템플릿의 헤더에는 이미지가 필요합니다.

{
  "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 링크가 있는 단추를 추가합니다. 또한 헤더의 이미지와 본문의 텍스트 매개 변수를 사용합니다.

purchase-feedback-static-template에 대한 세부 정보를 보여 주는 화면 캡처입니다.

이 샘플에서 템플릿의 헤더에는 이미지가 필요합니다.

{
  "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/"
    }
  ]
}

하나, 하나를 MessageTemplateImageMessageTemplateText만듭니다. 그런 다음 매개 변수가 템플릿 콘텐츠에 표시되는 순서대로 매개 변수를 제공하여 목록과 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 사용

이 샘플 템플릿은 헤더에 있는 비디오와 본문에 있는 두 개의 텍스트 매개 변수를 사용합니다.

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 사용

이 샘플 템플릿은 헤더에 있는 문서와 본문에 있는 세 개의 텍스트 매개 변수를 사용합니다.

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;

필수 조건

개체 모델

다음 클래스 및 인터페이스는 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 템플릿 메시지 만들기 및 관리

WhatsApp 메시지 템플릿은 기업이 알림을 옵트인한 사용자에게 알림 또는 고객 관리 메시지를 보내는 데 사용하는 특정 메시지 형식입니다. 메시지에는 약속 미리 알림, 배송 정보, 문제 해결 또는 결제 업데이트가 포함될 수 있습니다. 고급 메시징 SDK를 사용하여 템플릿 메시지를 보내기 전에 사용자는 WhatsApp Business Platform에서 필요한 템플릿을 만들어야 합니다.

템플릿에 대한 WhatsApp 요구 사항에 대한 자세한 내용은 WhatsApp에 비즈니스 플랫폼 API 참조를 참조하세요.

기업과 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} 형식입니다.

'기본 키' 섹션의 '연결 문자열' 필드를 보는 Azure Portal의 Azure Communication Services 리소스를 보여 주는 스크린샷.

환경 변수 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 리소스의 채널 탭에 있는 포털에서 조회할 수 있습니다.

'채널' 탭을 보는 Azure Portal의 Azure Communication Services 리소스를 보여주는 스크린샷. '채널 ID' 필드의 복사 작업에 주의해야 합니다.

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

환경 설정

메시지를 보내기 위한 환경을 설정하려면 다음 섹션의 단계를 완료합니다.

전제 조건

새 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에서 템플릿을 보려면 Azure Communication Services 리소스 >고급 메시징>템플릿으로 이동합니다.

고급 메시징 템플릿 탭을 보는 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 PDF

지원되는 미디어 유형 및 크기 제한에 대한 자세한 내용은 WhatsApp의 메시지 미디어 설명서를 참조하세요.

예시

sample_happy_hour_announcement 템플렛:

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 변수를 만듭니다. 그런 다음, 매개 변수가 템플릿 콘텐츠에 표시되는 순서대로 매개 변수를 제공하여 MessageTemplateValueMessageTemplateWhatsAppBindings 목록을 어셈블합니다.

 /*
    * 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 템플렛:

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 링크가 있는 단추를 추가합니다. 또한 헤더의 이미지와 본문의 텍스트 매개 변수를 사용합니다.

WhatsApp 관리자의 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 변수를 만듭니다. 그런 다음, 매개 변수가 템플릿 콘텐츠에 표시되는 순서대로 매개 변수를 제공하여 MessageTemplateValueMessageTemplateWhatsAppBindings 목록을 어셈블합니다. 바인딩 단추를 정의할 때도 순서가 중요합니다.

/*
* 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()));
}

코드 실행

  1. 파일이 포함된 pom.xml 디렉터리를 열고 명령을 사용하여 프로젝트를 컴파일합니다 mvn .

    mvn compile
    
  2. 다음 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 템플릿 메시지 만들기 및 관리

WhatsApp 메시지 템플릿은 기업이 알림을 옵트인한 사용자에게 알림 또는 고객 관리 메시지를 보내는 데 사용하는 특정 메시지 형식입니다. 메시지에는 약속 미리 알림, 배송 정보, 문제 해결 또는 결제 업데이트가 포함될 수 있습니다. 고급 메시징 SDK를 사용하여 템플릿 메시지를 보내기 전에 사용자는 WhatsApp Business Platform에서 필요한 템플릿을 만들어야 합니다.

템플릿에 대한 WhatsApp 요구 사항에 대한 자세한 내용은 WhatsApp에 비즈니스 플랫폼 API 참조를 참조하세요.

기업과 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} 형식입니다.

'기본 키' 섹션의 '연결 문자열' 필드를 보는 Azure Portal의 Azure Communication Services 리소스를 보여 주는 스크린샷.

환경 변수 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 리소스의 채널 탭에 있는 포털에서 조회할 수 있습니다.

'채널' 탭을 보는 Azure Portal의 Azure Communication Services 리소스를 보여주는 스크린샷. '채널 ID' 필드의 복사 작업에 주의해야 합니다.

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 애플리케이션 만들기

  1. 앱에 대한 새 디렉터리를 만들고 터미널 또는 명령 창에서 엽니다.

  2. 다음 명령을 실행합니다.

    mkdir advance-messages-quickstart && cd advance-messages-quickstart
    
  3. 다음 명령을 실행하여 기본 설정으로 package.json 파일을 만듭니다.

    npm init -y
    
  4. 텍스트 편집기를 사용하여 프로젝트 루트 디렉터리에 호출 send-messages.js 된 파일을 만듭니다.

  5. 파일에 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에서 WhatsApp 템플릿 나열

Azure Portal에서 템플릿을 보려면 Azure Communication Services 리소스 >고급 메시징>템플릿으로 이동합니다.

고급 메시징 템플릿 탭을 보는 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 템플렛:

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에서 이 샘플에 대한 최종 코드를 찾습니다.

필수 조건

개체 모델

다음 클래스 및 인터페이스는 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 템플릿 메시지 만들기 및 관리

WhatsApp 메시지 템플릿은 기업이 알림을 옵트인한 사용자에게 알림 또는 고객 관리 메시지를 보내는 데 사용하는 특정 메시지 형식입니다. 메시지에는 약속 미리 알림, 배송 정보, 문제 해결 또는 결제 업데이트가 포함될 수 있습니다. 고급 메시징 SDK를 사용하여 템플릿 메시지를 보내기 전에 사용자는 WhatsApp Business Platform에서 필요한 템플릿을 만들어야 합니다.

템플릿에 대한 WhatsApp 요구 사항에 대한 자세한 내용은 WhatsApp에 비즈니스 플랫폼 API 참조를 참조하세요.

클라이언트 인증

메시지 전송은 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} 형식입니다.

'키' 섹션의 '기본 키' 필드를 보는 Azure Portal의 Azure Communication Services 리소스를 보여 주는 스크린샷.

환경 변수 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 리소스의 채널 탭에 있는 포털에서 찾을 수 있습니다.

'채널' 탭을 보는 Azure Portal의 Azure Communication Services 리소스를 보여주는 스크린샷. '채널 ID' 필드의 복사 작업에 주의해야 합니다.

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)로 메시지를 보냅니다.

WhatsApp 비즈니스 계정 번호로 전송된 사용자 메시지를 보여 주는 웹에서 본 WhatsApp 대화입니다.

환경 설정

새 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 Communication Service 리소스 >고급 메시징 템플릿으로 이동하여 Azure Portal에서 템플릿을>볼 수 있습니다.

'템플릿' 탭을 보는 Azure Portal의 Azure Communication Services 리소스를 보여 주는 스크린샷

템플릿을 선택하여 템플릿 세부 정보를 봅니다.

템플릿 세부 정보의 필드에는 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 변수가 없습니다.

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 템플렛:

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 PDF

지원되는 미디어 유형 및 크기 제한에 대한 자세한 내용은 WhatsApp의 메시지 미디어 설명서를 참조하세요.

예제

sample_movie_ticket_confirmation 템플렛:

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 템플렛:

sample_issue_resolution 템플릿에 대한 템플릿 세부 정보를 보여 주는 스크린샷

템플릿 본문에는 다음 하나의 텍스트 매개 변수가 필요합니다.

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

템플릿에는 미리 채워진 두 개의 회신 단추와 YesNo.

{
  "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 템플렛:

sample_location_template 템플릿에 대한 템플릿 세부 정보를 보여 주는 스크린샷

위치 기반 메시지 템플릿 어셈블리:

 # 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 만듭니다.

WhatsApp 관리자의 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 어셈블합니다. 바인딩 단추를 정의할 때도 순서가 중요합니다.

# 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>>

다음 단계