스토어 서비스를 사용하여 광고 캠페인 실행

Microsoft Store 프로모션 API를 사용하여 사용자 또는 사용자 조직의 파트너 센터 계정에 등록된 앱에 대한 프로모션 광고 캠페인을 프로그래밍 방식으로 관리합니다. 이 API를 사용하여 대상 지정 및 창작 광고와 같은 캠페인 및 기타 관련 자산을 만들고 업데이트하고 모니터링할 수 있습니다. 이 API는 많은 양의 캠페인을 만들고 파트너 센터를 사용하지 않고 캠페인을 만들고자 하는 개발자에게 특히 유용합니다. 이 API는 Azure AD(Azure Active Directory)를 사용하여 앱 또는 서비스의 호출을 인증합니다.

다음 단계에서는 엔드투엔드 프로세스를 설명합니다.

  1. 모든 필수 조건을 충족하였는지 확인합니다.
  2. Microsoft Store 프로모션 API에서 메서드를 호출하기 전에 Azure AD 액세스 토큰을 가져옵니다. 토큰을 가져온 후 만료되기 전에 이 토큰을 Microsoft Store 프로모션 API에 대한 호출에 사용할 수 있는 시간은 60분입니다. 토큰이 만료된 후 새 토큰을 생성할 수 있습니다.
  3. Microsoft Store 프로모션 API를 호출합니다.

또는 파트너 센터를 사용하여 광고 캠페인을 만들고 관리할 수 있으며 Microsoft Store 프로모션 API를 통해 프로그래밍 방식으로 만든 모든 광고 캠페인도 파트너 센터에서 액세스할 수 있습니다. 파트너 센터에서 광고 캠페인을 관리하는 방법에 대한 자세한 내용은 앱용 광고 캠페인 만들기를 참조하세요.

참고 항목

파트너 센터 계정이 있는 개발자는 Microsoft Store 프로모션 API를 사용하여 앱에 대한 광고 캠페인을 관리할 수 있습니다. 광고회사는 광고주를 대리하여 광고 캠페인을 실행하기 위해 이 API에 대 한 액세스를 요청할 수도 있습니다. 이 API에 대한 자세한 내용을 알기 원하거나 이 API에 대한 액세스를 요청하려는 광고회사는 storepromotionsapi@microsoft.com으로 요청을 보내시기 바랍니다.

1단계: Microsoft Store 프로모션 API를 사용하기 위한 필수 조건 완료

Microsoft Store 프로모션 API를 호출하는 코드 작성을 시작하기 전에 다음 필수 조건을 완료했는지 확인합니다.

  • 이 API를 사용하여 광고 캠페인을 성공적으로 만들고 시작하려면 먼저 파트너 센터의 광고 캠페인 페이지를 사용하여 하나의 유료 광고 캠페인을 만들고 이 페이지에 하나 이상의 결제 방법을 추가해야 합니다. 이렇게 하면 이 API를 사용하여 광고 캠페인에 대한 청구 가능한 배달 라인을 성공적으로 만들 수 있습니다. 이 API를 사용하여 만든 광고 캠페인의 배송 라인은 파트너 센터의 광고 캠페인 페이지에서 선택한 기본 결제 방법에 자동으로 청구됩니다.

  • 사용자(또는 조직)에 Azure AD 디렉터리가 있어야 하며 디렉터리에 대한 전역 관리자 권한이 있어야 합니다. Microsoft 365 또는 Microsoft의 기타 비즈니스 서비스를 사용하고 있다면 Azure AD 디렉터리를 이미 보유하고 있습니다. 그렇지 않은 경우 추가 비용 없이 파트너 센터에서 새 Azure AD를 만들면 됩니다.

  • Azure AD 애플리케이션을 파트너 센터 계정과 연결하고 애플리케이션에 대한 테넌트 ID 및 클라이언트 ID를 검색하고 키를 생성해야 합니다. Azure AD 애플리케이션은 Microsoft Store 프로모션 API를 호출할 앱 또는 서비스입니다. API에 전달하는 Azure AD 액세스 토큰을 가져오려면 테넌트 ID, 클라이언트 ID 및 키가 필요합니다.

    참고 항목

    이 작업은 한 번만 수행하면 됩니다. 테넌트 ID, 클라이언트 ID 및 키가 있으면 새 Azure AD 액세스 토큰을 만들어야 할 때마다 다시 사용할 수 있습니다.

Azure AD 애플리케이션을 파트너 센터 계정에 연결하고 필요한 값을 검색하려면 다음을 수행합니다.

  1. 파트너 센터에서 조직의 Azure AD 디렉터리에 조직의 파트너 센터 계정을 연결합니다.

  2. 그런 다음 파트너 센터의 계정 설정 섹션에 있는 사용자 페이지에서 파트너 센터 계정의 프로모션 캠페인을 관리하는 데 사용할 앱 또는 서비스를 나타내는 Azure AD 애플리케이션을 추가합니다. 이 응용 프로그램에 관리자 역할을 할당해야 합니다. 애플리케이션이 Azure AD 디렉터리에 아직 없는 경우에는 파트너 센터에서 새 Azure AD 애플리케이션 만들기로 진행할 수 있습니다.

  3. 사용자 페이지로 돌아가서 Azure AD 응용 프로그램의 이름을 클릭하여 응용 프로그램 설정으로 이동하고 테넌트 ID클라이언트 ID 값을 복사합니다.

  4. 새 키 추가를 클릭합니다. 다음 화면에서 값을 복사합니다. 이 페이지를 나간 후에는 이 정보에 다시 액세스할 수 없습니다. 자세한 내용은 Azure AD 애플리케이션에 대한 키 관리를 참조하세요.

2단계: Azure AD 액세스 토큰 가져오기

Microsoft Store 프로모션 API에서 메서드를 호출하기 전에 먼저 API에 있는 각 메서드의 Authorization 헤더에 전달하는 Azure AD 액세스 토큰을 가져와야 합니다. 액세스 토큰을 가져온 후 만료되기까지 60분이 걸립니다. 토큰이 만료된 후 API에 대한 추가 호출에서 계속 사용할 수 있도록 토큰을 새로 고칠 수 있습니다.

액세스 토큰을 가져오려면 클라이언트 자격 증명을 사용하여 서비스 간 호출의 지침에 따라 HTTP POST를 엔드포인트 https://login.microsoftonline.com/<tenant_id>/oauth2/token(으)로 보냅니다. 샘플 요청은 다음과 같습니다.

POST https://login.microsoftonline.com/<tenant_id>/oauth2/token HTTP/1.1
Host: login.microsoftonline.com
Content-Type: application/x-www-form-urlencoded; charset=utf-8

grant_type=client_credentials
&client_id=<your_client_id>
&client_secret=<your_client_secret>
&resource=https://manage.devcenter.microsoft.com

POST URI의 tenant_id 값, client_idclient_secret 매개 변수에는 이전 섹션의 파트너 센터에서 검색한 애플리케이션의 테넌트 ID, 클라이언트 ID 및 키를 지정합니다. 리소스 매개 변수의 경우에는 https://manage.devcenter.microsoft.com을 지정해야 합니다.

액세스 토큰이 만료되면 여기에 있는 지침에 따라 새로 고칠 수 있습니다.

3단계: Microsoft Store 프로모션 API 호출

Azure AD 액세스 토큰이 있으면 Microsoft Store 프로모션 API를 호출할 준비가 된 것입니다. 액세스 토큰을 각 메서드의 권한 부여 헤더에 전달해야 합니다.

Microsoft Store 프로모션 API 컨텍스트에서 광고 캠페인은 캠페인에 대한 고급 정보를 포함하는 캠페인 개체와 광고 캠페인에 대한 배달 라인, 타기팅 프로필크리에이티브를 나타내는 추가 개체로 구성됩니다. API는 이러한 개체 유형으로 그룹화된 일련의 메서드를 포함합니다. 캠페인을 만들려면 일반적으로 이들 각 개체에 대해 다른 POST 메서드를 호출합니다. 또한 API는 모든 개체를 검색하는 데 사용할 수 있는 GET 메서드와 캠페인, 배달 라인 및 타기팅 프로필 개체를 편집하는 데 사용할 수 있는 PUT 메서드도 제공합니다.

이러한 개체 및 관련 메서드에 대한 자세한 내용은 다음 표를 참조하세요.

Object 설명
캠페인 이 개체는 광고 캠페인을 나타내며, 광고 캠페인의 개체 모델 계층에서 상단에 위치합니다. 이 개체는 실행 중인 캠페인의 유형(유료, 하우스 또는 커뮤니티), 캠페인 목표, 캠페인의 배달 라인 및 기타 세부 정보를 식별합니다. 각 캠페인은 한 앱에만 연결할 수 있습니다.

이 개체와 관련된 메서드에 대한 자세한 내용은 광고 캠페인 관리를 참조하세요.

참고 광고 캠페인을 만든 후 Microsoft Store 분석 API광고 캠페인 성과 데이터 가져오기 메서드를 사용하여 캠페인의 성과 데이터를 검색할 수 있습니다.
배달 라인 각 캠페인에는 인벤토리를 구매하고 광고를 전달하는 데 사용되는 배달 라인이 하나 이상 있습니다. 각 배달 라인에 대해 타기팅을 설정하고, 입찰 가격을 설정할 수 있으며, 예산을 설정하고 사용할 크리에이티브와 연결하여 지출할 금액을 결정할 수 있습니다.

이 개체와 관련된 메서드에 대한 자세한 내용은 광고 캠페인 배달 라인 관리를 참조하세요.
타기팅 프로필 각 배달 라인에는 타깃으로 설정할 사용자, 지역 및 인벤토리 유형을 지정하는 타기팅 프로필이 하나씩 있습니다. 타기팅 프로필은 템플릿으로 만들고 배달 라인 사이에서 공유할 수 있습니다.

이 개체와 관련된 메서드에 대한 자세한 내용은 광고 캠페인 타기팅 프로필 관리를 참조하세요.
크리에이티브 모든 배달 라인에는 캠페인의 일부로서 고객에게 표시되는 광고를 나타내는 크리에이티브가 하나 이상 있습니다. 크리에이티브는 하나 이상의 배달 라인과 연결될 수 있으며, 항상 동일한 앱을 나타내는 경우 여러 광고 캠페인에서 공유될 수도 있습니다.

이 개체와 관련된 메서드에 대한 자세한 내용은 광고 캠페인 크리에이티브 관리를 참조하세요.

다음 다이어그램은 캠페인, 배달 라인, 타기팅 프로필 및 크리에이티브 간 관계를 보여 줍니다.

Ad campaign hierarchy

코드 예

다음 코드 예제는 Azure AD 액세스 토큰을 얻고 C# 콘솔 앱에서 Microsoft Store 프로모션 API를 호출하는 방법을 보여 줍니다. 이 코드 예제를 사용하려면 tenantId, clientId, clientSecret, 및 appID 변수를 시나리오에 적합한 값에 할당합니다. 이 예제에서 Microsoft Store 프로모션 API가 반환한 JSON 데이터를 역직렬화하려면 Newtonsoft의 Json.NET 패키지가 필요합니다.

using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;

namespace TestPromotionsAPI
{
    class Program
    {
        static void Main(string[] args)
        {
            string tenantId = "<your tenant ID>";
            string clientId = "<your client ID>";
            string clientSecret = "<your secret>";

            string scope = "https://manage.devcenter.microsoft.com";

            // Retrieve an Azure AD access token
            string accessToken = GetClientCredentialAccessToken(
                    tenantId,
                    clientId,
                    clientSecret,
                    scope).Result;

            int pageSize = 100;
            int startPageIndex = 0;

            // This is your app's Store ID. This ID is available on
            // the App identity page of the Dev Center dashboard.
            string appID = "<your app's Store ID>";


            // Call the Windows Store promotions API
            CallPromotionsAPI(accessToken, appID, pageSize, startPageIndex);

            Console.Read();
        }

        private static void CallPromotionsAPI(string accessToken, string appID, int fetch, int skip)
        {
            string requestURI;

            // Get ad campaigns.
            requestURI = string.Format(
                "https://manage.devcenter.microsoft.com/v1.0/my/promotion/campaign?applicationId={0}&fetch={1}&skip={2}&campaignSetSortColumn=createdDateTime",
                appID, fetch, skip);

            HttpRequestMessage requestMessage = new HttpRequestMessage(HttpMethod.Get, requestURI);
            requestMessage.Headers.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);

            WebRequestHandler handler = new WebRequestHandler();
            HttpClient httpClient = new HttpClient(handler);

            HttpResponseMessage response = httpClient.SendAsync(requestMessage).Result;

            Console.WriteLine(response);
            Console.WriteLine(response.Content.ReadAsStringAsync().Result);

            response.Dispose();
        }

        public static async Task<string> GetClientCredentialAccessToken(string tenantId, string clientId, string clientSecret, string scope)
        {
            string tokenEndpointFormat = "https://login.microsoftonline.com/{0}/oauth2/token";
            string tokenEndpoint = string.Format(tokenEndpointFormat, tenantId);

            dynamic result;
            using (HttpClient client = new HttpClient())
            {
                string tokenUrl = tokenEndpoint;
                using (
                    HttpRequestMessage request = new HttpRequestMessage(
                        HttpMethod.Post,
                        tokenUrl))
                {
                    string content =
                        string.Format(
                            "grant_type=client_credentials&client_id={0}&client_secret={1}&resource={2}",
                            clientId,
                            clientSecret,
                            scope);

                    request.Content = new StringContent(content, Encoding.UTF8, "application/x-www-form-urlencoded");

                    using (HttpResponseMessage response = await client.SendAsync(request))
                    {
                        string responseContent = await response.Content.ReadAsStringAsync();
                        result = JsonConvert.DeserializeObject(responseContent);
                    }
                }
            }

            return result.access_token;
        }
    }
}