앱에서 바로 소모성 제품 구매 사용(HTML)

[ 이 문서는 Windows 런타임 앱을 작성하는 Windows에서 8.x 및 Windows Phone 8.x 개발자를 대상으로 합니다. Windows 10용으로 개발하는 경우에는 최신 설명서를 참조하세요.]

스토어 상거래 플랫폼을 통해 소모성 앱 내 제품(구매, 사용 및 필요에 따라 다시 구매할 수 있는 항목)을 제공하여 강력하고 안정적인 구매 환경을 고객에게 제공합니다. 이 기능은 특정 회복 아이템을 구매하여 사용할 수 있는 게임 내 통화(금, 동전 등) 등에 특히 유용합니다.

알아야 할 사항

기술

사전 요구 사항

  • 이 항목에서는 소모성 앱 내 제품의 구매 및 이행 보고에 대해 설명합니다. 앱 내 제품에 익숙하지 않은 경우 라이선스 정보 및 스토어에 앱 내 제품을 제대로 나열하는 방법을 알아보려면 앱에서 바로 제품 구매 사용을 검토하세요.

  • 새 앱 내 제품을 처음 코딩하고 테스트할 때는 CurrentApp 개체 대신 CurrentAppSimulator 개체를 사용해야 합니다. 이렇게 하면 라이브 서버를 호출하는 대신 라이선스 서버에 대한 호출을 시뮬레이션하여 라이선스 논리를 확인할 수 있습니다. 이렇게 하려면 %userprofile%\AppData\local\packages\<package name>\LocalState\Microsoft\Windows Store\ApiData에 있는 "WindowsStoreProxy.xml" 파일을 사용자 지정해야 합니다. 처음으로 앱이 실행될 때 Microsoft Visual Studio 시뮬레이터에서 이 파일을 만들거나 런타임에 사용자 지정 파일을 로드할 수도 있습니다. 자세한 내용은 CurrentAppSimulator 설명서를 참조하세요.

  • 또한 이 항목에서는 MSDN 코드 갤러리에서 사용할 수 있는 체험 앱 및 앱에서 바로 구매 샘플에 제공된 코드 예제를 참조합니다. 이 샘플은 Windows 스토어 앱에 제공된 다양한 화폐화 옵션을 실습할 수 있는 좋은 방법입니다.

지침

단계 1: 구매 요청

초기 구매 요청은 스토어를 통해 수행하는 다른 모든 구매와 마찬가지로 RequestProductPurchaseAsync를 사용하여 수행합니다. 소모성 앱 내 제품의 차이는 성공적인 구매 후 앱이 이전 구매가 성공적으로 이행되었음을 스토어에 알린 다음에야 고객이 동일한 제품을 구매할 수 있다는 점입니다. 구매한 소모성 항목을 이행하고 스토어에 해당 이행을 알리는 것은 앱의 책임입니다.

다음 예제에서는 앱에서 바로 소모성 제품 구매 요청을 보여 줍니다. 구매 요청이 성공한 경우와 동일한 제품의 구매 불이행으로 인해 구매 요청이 실패한 경우의 두 가지 다른 시나리오에서 앱이 소모성 앱 내 제품의 로컬 이행을 수행해야 하는 경우를 나타내는 코드 주석을 확인할 수 있습니다.


function purchaseProduct1() {
    CurrentAppSimulator.requestProductPurchaseAsync("product1").done(
        function (purchaseResults) {
            if (purchaseResults.status === ProductPurchaseStatus.succeeded) {
                tempTransactionId["product1"] = purchaseResults.transactionId;

        // Grant the user their purchase here, and then pass the product ID and transaction ID to currentApp.reportConsumableFulfillment
        // To indicate local fulfillment to the Windows Store.

            } else if (purchaseResults.status === ProductPurchaseStatus.notFulfilled) {
                tempTransactionId["product1"] = 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 currentApp.reportConsumableFulfillment
        // To indicate local fulfillment to the Windows Store.
            }
        }
    );
}

단계 2: 소모성 항목의 로컬 이행 추적

고객에게 소모성 앱 내 제품에 대한 액세스 권한을 부여하는 경우 이행되고 있는 제품(productId)과 이행이 연결된 거래(transactionId)를 추적해야 합니다.

중요  앱은 스토어에 이행을 정확하게 보고할 책임이 있습니다. 이 단계는 고객을 위해 공정하고 믿을 만한 구매 환경을 유지하는 데 필요합니다.

 

다음 예제에서는 이전 단계의 RequestProductPurchaseAsync 호출에서 PurchaseResults 속성을 사용하여 이행할 구매한 제품을 확인하는 것을 보여 줍니다. 배열은 나중에 로컬 이행이 성공했는지 확인하기 위해 참조할 수 있는 위치에 제품 정보를 저장하는 데 사용됩니다.

function grantFeatureLocally(productId, transactionId) {
    var nextIndex = grantedIds[productId].length;
    grantedIds[productId][nextIndex] = transactionId;

    // Grant the user the content, such as by increasing some kind of asset count
}

다음 예제에서는 이전 예제의 배열을 사용하여 제품 ID/거래 ID 쌍에 액세스하는 방법을 보여 줍니다. 이러한 쌍은 나중에 스토어에 이행을 보고할 때 사용됩니다.

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

 

function isLocallyFulfilled(productId, transactionId) {
    for (var i in grantedIds[productId]) {
        if (grantedIds[productId][i] === transactionId) {
            return true;
        }
    }
    return false;
}

단계 3: 스토어에 제품 이행 보고

로컬 이행이 완료되면 앱은 productId 및 제품 구매가 포함된 거래를 포함하는 ReportConsumableFulfillmentAsync를 호출해야 합니다.

중요  이행된 소모성 앱 내 제품을 스토어에 보고하지 못하면 이전 구매에 대한 이행이 보고될 때까지 사용자가 해당 제품을 다시 구매할 수 없습니다.

 


var result = FulfillmentResult; 
result = CurrentAppSimulator.reportConsumableFulfillmentAsync("product1", tempTransactionId["product1"]);

단계 4: 이행되지 않은 구매 확인

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

다음 예제에서는 GetUnfulfilledConsumablesAsync를 사용하여 이행되지 않은 소모성 항목을 열거하는 방법 및 앱에서 로컬 이행을 완료하기 위해 이 목록을 반복하는 방법을 보여 줍니다.

CurrentAppSimulator.getUnfulfilledConsumablesAsync().done(
function (unfulfilledList) {

    unfulfilledList.forEach(function (product) {
        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.
    });
});

관련 항목

앱에서 바로 제품 구매 사용

체험 앱 및 앱에서 바로 구매 샘플

Windows.ApplicationModel.Store