如何管理大型的應用程式內產品型錄 (HTML)
[ 本文的目標對象是撰寫 Windows 執行階段 App 的 Windows 8.x 和 Windows Phone 8.x 開發人員。如果您正在開發適用於 Windows 10 的 App,請參閱 最新文件 ]
市集對於在應用程式內產品型錄的限制是每個開發人員帳戶 200 個產品清單,Windows 8.1 和 Windows Phone 8.1 針對提供超過此上限的應用程式引進了一個新的解決方案。這個解決方案可讓您只針對特定的價格區間建立一些產品項目,其中每個產品項目都能夠代表型錄中的數百個產品。
為了啟用這個功能,引進了 RequestProductPurchaseAsync 方法的新多載,以購買應用程式定義的選項 (與市集中所列的 App 內產品相關聯)。除了在呼叫期間指定購買選項和產品關聯,您的應用程式也應該傳送包含大型型錄購買選項詳細資料的 ProductPurchaseDisplayProperties 物件。如果未提供這些詳細資料,即會改用所列出產品的詳細資料。
市集只會使用產生的 PurchaseResults 中來自購買要求的 OfferId。 這個程序不會直接修改在市集中列出應用程式內的產品時原本提供的資訊。
您必須知道的事
技術
先決條件
本主題涵蓋在市集中使用單一應用程式內產品清單呈現多個應用程式內產品的市集支援。如果您不熟悉 App 內產品,請檢閱啟用 App 內產品購買,以了解授權資訊及如何在市集中正確列出您的 App 內產品。
本主題也會參照 MSDN 程式庫提供的試用版應用程式和 App 內購買範例中的程式碼範例。這個範例很適合實際操作 Windows 執行階段應用程式提供的不同貨幣選項。
初次撰寫並測試新應用程式內產品的程式碼時,您必須使用 CurrentAppSimulator 物件,而不是 CurrentApp 物件。如此一來,您就可以利用對授權伺服器進行模擬呼叫來驗證授權邏輯,而不是呼叫使用中的伺服器。若要這樣做,您必須自訂 %userprofile%\AppData\local\packages\<package name>\LocalState\Microsoft\Windows Store\ApiData 中名為 "WindowsStoreProxy.xml" 的檔案。Microsoft Visual Studio 模擬器會在您第一次執行您的應用程式時建立這個檔案,或者您也可以在執行階段載入自訂的檔案。如需詳細資訊,請參閱 CurrentAppSimulator 文件。
針對 App 內產品提出購買要求
處理針對大型型錄內特定產品的購買要求時,方式與處理應用程式內的任何其他購買要求大致相同。您的應用程式在呼叫新的 RequestProductPurchaseAsync 方法多載時,會提供 OfferId,以及當中已填入應用程式內產品名稱的 ProductPurchaseDisplayProperties 物件。
function purchaseAndFulfillOfferAsProduct() {
var offerId = "1234";
var displayPropertiesName = "MusicOffer1";
var displayProperties = new ProductPurchaseDisplayProperties(displayPropertiesName);
currentApp.requestProductPurchaseAsync("product1", offerId, displayProperties).done(
function (purchaseResults) {
if (purchaseResults.status === ProductPurchaseStatus.succeeded) {
grantFeatureLocally("product1", purchaseResults.transactionId);
fulfillProduct1("product1", purchaseResults.transactionId, purchaseResults.offerId);
} else if (purchaseResults.status === ProductPurchaseStatus.notFulfilled) {
if (isNotLocallyFulfilled("product1", purchaseResults.transactionId)) {
grantFeatureLocally("product1", purchaseResults.transactionId);
}
fulfillProduct1("product1", purchaseResults.transactionId, purchaseResults.offerId);
} else if (purchaseResults.status === ProductPurchaseStatus.notPurchased) {
log("Product 1 was not purchased.", "sample", "status");
}
},
function () {
log("Unable to buy product 1.", "sample", "error");
});
}
回報應用程式產品的履行
當購買選項已在本機履行之後,您的應用程式需要儘速將產品履行回報給市集。 在大型型錄案例中,如果您的應用程式未回報購買選項已履行,使用者將無法使用該相同市集產品清單來購買任何 App 內的購買選項。
如先前所提及,市集只會使用提供的購買選項資訊來填入 PurchaseResults,不會在大型型錄購買選項和市集產品清單之間建立永久性關聯。因此,您需要追蹤使用者對產品的權益,並除了 RequestProductPurchaseAsync 操作之外,為使用者提供產品專屬內容 (例如所購買項目的名稱,或項目相關詳細資料)。
下列程式碼會示範履行呼叫,並示範當中插入特定購買選項資訊的 UI 訊息模式。 如果沒有該特定產品資訊,此範例就會使用來自產品 ListingInformation 的資訊。
function fulfillProduct1(productId, transactionId, offerId) {
var displayPropertiesName = document.getElementById("displayPropertiesName").value;
if (displayPropertiesName === "") {
displayPropertiesName = product1ListingName;
}
var offerIdMsg = " with offer id " + offerId;
if (!offerId) {
offerIdMsg = " with no offer id";
}
currentApp.reportConsumableFulfillmentAsync(productId, transactionId).done(
function (result) {
switch (result) {
case FulfillmentResult.succeeded:
log("You bought and fulfilled " + displayPropertiesName + offerIdMsg, "sample", "status");
break;
case FulfillmentResult.nothingToFulfill:
log("There is no purchased product 1 to fulfill.", "sample", "status");
break;
case FulfillmentResult.purchasePending:
log("You bought product 1. The purchase is pending so we cannot fulfill the product.", "sample", "status");
break;
case FulfillmentResult.purchaseReverted:
log("You bought product 1. But your purchase has been reverted.", "sample", "status");
// 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.", "sample", "status");
break;
}
},
function (error) {
log("You bought Product 1. There was an error when attempting to fulfill.", "sample", "error");
});
}