앱에서 바로 소모성 제품 구매 사용하기

Store 상거래 플랫폼을 통해 소모성 앱 내 제품(다시 구입, 사용 및 구매할 수 있는 항목)을 제안하여 강력하고 신뢰할 수 있는 구매 환경을 고객에게 제공합니다. 이는 특정 파워업을 구매하는 데 사용할 수 있는 게임 내 통화(금, 동전 등)에 특히 유용합니다.

중요

이 문서는 Windows.ApplicationModel.Store 네임스페이스의 멤버를 사용하여 앱에서 바로 소모성 제품을 구매할 수 있도록 만드는 방법을 설명합니다. 이 네임스페이스는 더 이상 새 기능으로 업데이트되지 않으므로 Windows.Services.Store 네임스페이스를 대신 사용하는 것이 좋습니다. Windows.Services.Store 네임스페이스는 Store 관리 소모성 추가 기능 및 구독 등의 최신 추가 기능 유형을 지원하며 파트너 센터 및 Store에서 지원하는 이후 제품 및 기능 유형과 호환되도록 설계되었습니다. Windows.Services.Store 네임스페이스는 Windows 10 버전 1607에 도입되었으며 Windows 10 Anniversary Edition(10.0, 빌드 14393) 또는 Visual Studio의 최신 릴리스를 대상으로 하는 프로젝트에만 사용할 수 있습니다. Windows.Services.Store 네임스페이스를 사용하여 앱에서 바로 소모성 제품을 구매할 수 있도록 하는 방법에 대한 자세한 내용은 관련 문서를 참조하세요.

필수 조건

  • 이 항목은 소모성 앱 내 제품의 구매 및 처리 보고에 대해 설명합니다. 앱 내 제품에 익숙하지 않은 경우에는 앱 내 제품 구매 사용을 검토하여 라이선스 정보 및 앱 내 제품을 Store에 올바르게 나열하는 방법에 대해 알아볼 수 있습니다.
  • 새로운 앱 내 제품을 처음으로 코딩하고 테스트할 때는 CurrentApp 개체 대신에 CurrentAppSimulator 개체를 사용해야 합니다. 이렇게 하면 라이브 서버를 호출하는 대신 라이선스 서버에 대한 시뮬레이션된 호출을 사용하여 라이선스 논리를 확인할 수 있습니다. 이렇게 하려면 %userprofile%\AppData\local\packages\<package name>\LocalState\Microsoft\Windows Store\ApiData에 있는 WindowsStoreProxy.xml 파일을 사용자 지정해야 합니다. Microsoft Visual Studio 시뮬레이터는 앱을 처음 실행할 때 이 파일을 만들거나 런타임에 사용자 지정 파일을 로드할 수도 있습니다. 자세한 정보는 CurrentAppSimulator에서 WindowsStoreProxy.xml 파일 사용하기를 참조하세요.
  • 이 항목에서는 Store 샘플에 제공된 코드 예제도 참조합니다. 이 샘플은 UWP(유니버설 Windows 플랫폼) 앱에 제공되는 다양한 수익 창출 옵션을 사용하여 실습하기 좋은 방법입니다.

1단계: 구매 요청 만들기

초기 구매 요청은 Store를 통해 이루어진 다른 구매와 마찬가지로 RequestProductPurchaseAsync를 사용하여 수행됩니다. 소모성 앱 내 제품의 차이점은 구매가 성공한 후 앱이 스토어에 이전 구매가 성공적으로 이행되었다는 알림을 받을 때까지 고객이 동일한 제품을 다시 구매할 수 없다는 점입니다. 앱은 구매한 소모성 제품을 처리하고 스토어에 이행을 알려야 하는 책임이 있습니다.

다음 예제는 소모성 앱 내 제품 구매 요청을 보여 줍니다. 앱이 두 가지 시나리오에 대해 소모성 앱 내 제품의 로컬 이행을 수행해야 하는 경우(요청이 성공한 경우 및 동일한 제품의 미완료 구매로 인해 요청이 성공하지 못한 경우)를 나타내는 코드 주석을 확인할 수 있습니다.

PurchaseResults purchaseResults = await CurrentAppSimulator.RequestProductPurchaseAsync("product1");
switch (purchaseResults.Status)
{
    case ProductPurchaseStatus.Succeeded:
        product1TempTransactionId = purchaseResults.TransactionId;

        // Grant the user their purchase here, and then pass the product ID and transaction ID to
        // CurrentAppSimulator.ReportConsumableFulfillment to indicate local fulfillment to the
        // Windows Store.
        break;

    case ProductPurchaseStatus.NotFulfilled:
        product1TempTransactionId = purchaseResults.TransactionId;

        // First check for unfulfilled purchases and grant any unfulfilled purchases from an
        // earlier transaction. Once products are fulfilled pass the product ID and transaction ID
        // to CurrentAppSimulator.ReportConsumableFulfillment to indicate local fulfillment to the
        // Windows Store.
        break;
}

2단계: 소모품의 로컬 처리 추적하기

고객에게 소모성 앱 내 제품에 대한 액세스 권한을 부여할 때는 처리된 제품(productId) 및 처리가 연결된 트랜잭션(transactionId)을 추적하는 것이 중요합니다.

중요

앱은 Store에 이행을 정확하게 보고할 책임이 있습니다. 이 단계는 고객에게 공정하고 신뢰할 수 있는 구매 환경을 유지 관리하는 데 필수적입니다.

다음 예제는 이전 단계의 RequestProductPurchaseAsync 호출에서 PurchaseResults 속성을 사용하여 구매한 제품을 처리할 수 있도록 식별하는 방법을 보여 줍니다. 컬렉션은 나중에 참조할 수 있는 위치에 제품 정보를 저장하여 로컬 이행이 성공했는지 확인하는 데 사용됩니다.

private void GrantFeatureLocally(string productId, Guid transactionId)
{
    if (!grantedConsumableTransactionIds.ContainsKey(productId))
    {
        grantedConsumableTransactionIds.Add(productId, new List<Guid>());
    }
    grantedConsumableTransactionIds[productId].Add(transactionId);

    // Grant the user their content. You will likely increase some kind of gold/coins/some other asset count.
}

다음 예제는 이전 예제의 배열을 사용하여 나중에 Microsoft Store에 이행을 보고할 때 사용되는 제품 ID/트랜잭션 ID 쌍에 액세스하는 방법을 보여 줍니다.

중요

앱에서 처리를 추적하고 확인하는 데 사용하는 방법에 관계없이 고객이 받지 않은 항목에 대해 비용을 지불하지 않도록 하려면 앱이 적절한 노력을 기울여야 합니다.

private Boolean IsLocallyFulfilled(string productId, Guid transactionId)
{
    return grantedConsumableTransactionIds.ContainsKey(productId) &&
        grantedConsumableTransactionIds[productId].Contains(transactionId);
}

3단계: Store에 제품 이행 보고하기

앱은 로컬 이행이 완료된 후 productid 및 제품 구매가 포함된 트랜잭션을 포함하는 ReportConsumableFulfillmentAsync 호출을 수행해야 합니다.

중요

이행된 앱에서 Store에 구매 소모성 제품을 보고하지 못하면 사용자는 이전 구매에 대한 이행이 보고될 때까지 해당 제품을 다시 구매할 수 없습니다.

FulfillmentResult result = await CurrentAppSimulator.ReportConsumableFulfillmentAsync(
    "product2", product2TempTransactionId);

4단계: 이행되지 않은 구매 식별하기

앱은 GetUnfulfilledConsumablesAsync 메서드를 사용하여 이행되지 않은 소모성 앱 내 제품에 대해 언제든 검사할 수 있습니다. 이 메서드는 네트워크 연결 중단 또는 앱 종료와 같은 예기치 않은 앱 이벤트로 인해 수행되지 않은 소모품에 대해 검사하기 위해 정기적으로 호출되어야 합니다.

다음 예제는 GetUnfulfilledConsumablesAsync를 사용하여 충족되지 않은 소모성 요소를 열거하는 방법과 앱이 이 목록을 반복하여 로컬 처리를 완료하는 방법을 보여 줍니다.

private async void GetUnfulfilledConsumables()
{
    products = await CurrentApp.GetUnfulfilledConsumablesAsync();

    foreach (UnfulfilledConsumable product in products)
    {
        logMessage += "\nProduct Id: " + product.ProductId + " Transaction Id: " + product.TransactionId;
        // This is where you would pass the product ID and transaction ID to
        // currentAppSimulator.reportConsumableFulfillment to indicate local fulfillment to the Windows Store.
    }
}