共用方式為


管理大型應用程式內產品目錄

如果您的應用程式提供大型應用程式內產品目錄,您可以選擇遵循本主題所述的程序,以協助管理您的目錄。 在 Windows 10 之前的版本中,Store 對每個開發人員帳戶有 200 個產品清單的限制,而本主題所述的程序可用來解決該限制。 從 Windows 10 開始,Store 對於每個開發人員帳戶的產品清單數目沒有限制,而且已不再需要本文所述的程序。

重要

本文示範如何使用 Windows.ApplicationModel.Store 命名空間的成員。 此命名空間不再以新功能更新,建議您改用 Windows.Services.Store 命名空間。 Windows.Services.Store 命名空間支援最新的附加元件類型,例如市集管理的消耗性附加元件和訂用帳戶,其設計目的是與合作夥伴中心和市集支援的未來產品和功能類型相容。 Windows.Services.Store 命名空間是在 Windows 10 版本 1607 中引進的,而且在 Visual Studio 中只能用於以 Windows 10 年度版本 (10.0;組建 14393) 或更新版本為目標的專案。 如需詳細資訊,請參閱應用程式內購買和試用版

若要啟用這項功能,您將針對特定的定價層建立一些產品項目,每個項目都能夠代表目錄中的數百個產品。 使用 RequestProductPurchaseAsync 方法多載,指定與 Store 中所列應用程式內產品相關聯的應用程式定義供應項目。 除了在呼叫期間指定供應項目和產品關聯之外,您的應用程式也應該傳遞 ProductPurchaseDisplayProperties 物件,其中包含大型目錄供應項目詳細資料。 如果未提供這些詳細資料,則會改用列出的產品詳細資料。

Store 只會在產生的 PurchaseResults,使用來自購買要求的 offerId。 此程序不會在 Store 中列出應用程式內產品時,直接修改原本提供的資訊。

必要條件

  • 本主題涵蓋 Store 支援使用 Store 中所列的單一應用程式內產品,來代表多個應用程式內的供應項目。 如果您不熟悉應用程式內購買,請檢閱啟用應用程式內產品購買以了解授權資訊,以及如何在 Store 中妥善地列出應用程式內購買。
  • 當您第一次撰寫程式碼並測試新的應用程式內供應項目時,您必須使用 CurrentAppSimulator 項目,而非CurrentApp 物件。 如此一來,您就可以對授權伺服器使用模擬呼叫來驗證授權邏輯,而不是呼叫即時伺服器。 若要這麼做,您必須在 %userprofile%\AppData\local\packages\<套件名稱>\LocalState\Microsoft\Windows Store\ApiData 中自訂名為 WindowsStoreProxy.xml 的檔案。 當您第一次執行應用程式時,Microsoft Visual Studio 模擬器會建立此檔案,您也可以在執行時間載入自訂檔案。 如需詳細資訊,請參閱 搭配 CurrentAppSimulator 使用 WindowsStoreProxy.xml 檔案
  • 本主題也會參考市集範例中提供的程式碼範例。 此範例是獲得實際操作體驗的絕佳方式,其中包含針對通用 Windows 平台 (UWP) 應用程式提供的不同獲利選項。

針對應用程式內產品提出購買要求

大型目錄中特定產品的購買要求處理方式,與應用程式內的任何其他購買要求大致相同。 當您的應用程式呼叫新的 RequestProductPurchaseAsync 方法多載時,應用程式同時提供 OfferId 和 ProductPurchaseDisplayProperties 物件,並填入應用程式內產品的名稱。

string offerId = "1234";
string displayPropertiesName = "MusicOffer1";
var displayProperties = new ProductPurchaseDisplayProperties(displayPropertiesName);

try
{
    PurchaseResults purchaseResults = await CurrentAppSimulator.RequestProductPurchaseAsync(
        "product1", offerId, displayProperties);
    switch (purchaseResults.Status)
    {
        case ProductPurchaseStatus.Succeeded:
            // 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:
            // 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;
        case ProductPurchaseStatus.NotPurchased:
            // Notify user that the purchase was not completed due to cancellation or error.
            break;
    }
}
catch (Exception)
{
    // Notify the user of the purchase error.
}

回報應用程式內供應項目的履行

當您的供應項目已在本機完成時,您的應用程式必須立即向 Store 回報產品履行。 在大型目錄案例中,如果您的應用程式未回報供應項目履行,使用者將無法使用相同的 Store 產品清單購買任何應用程式內供應項目。

如先前所述,Store 只會使用提供的供應項目資訊來填入 PurchaseResults,而且不會建立大型目錄供應項目與 Store 產品清單之間的持續關聯。 因此,您必須追蹤對於產品的使用者權利,並將產品特定內容 (例如所購買項目的名稱或詳細資料) 提供給 RequestProductPurchaseAsync 作業以外的使用者。

下列程式碼示範履行呼叫,以及插入特定供應項目資訊的 UI 傳訊模式。 在沒有特定產品資訊的情況下,此範例會使用來自產品 ListingInformation 的資訊。

string offerId = "1234";
product1ListingName = product1.Name;
string displayPropertiesName = "MusicOffer1";

if (String.IsNullOrEmpty(displayPropertiesName))
{
    displayPropertiesName = product1ListingName;
}
var offerIdMsg = " with offer id " + offerId;
if (String.IsNullOrEmpty(offerId))
{
    offerIdMsg = " with no offer id";
}

FulfillmentResult result = await CurrentAppSimulator.ReportConsumableFulfillmentAsync(productId, transactionId);
switch (result)
{
    case FulfillmentResult.Succeeded:
        Log("You bought and fulfilled " + displayPropertiesName + offerIdMsg);
        break;
    case FulfillmentResult.NothingToFulfill:
        Log("There is no purchased product 1 to fulfill.");
        break;
    case FulfillmentResult.PurchasePending:
        Log("You bought product 1. The purchase is pending so we cannot fulfill the product.");
        break;
    case FulfillmentResult.PurchaseReverted:
        Log("You bought product 1. But your purchase has been reverted.");
        // Since the user' s purchase was revoked, they got their money back.
        // You may want to revoke the user' s access to the consumable content that was granted.
        break;
    case FulfillmentResult.ServerError:
        Log("You bought product 1. There was an error when fulfilling.");
        break;
}