Поддержка покупок потребляемых продуктов из приложения (HTML)
[ Эта статья адресована разработчикам приложений среды выполнения Windows для Windows 8.x и Windows Phone 8.x. При разработке приложений для Windows 10 см. раздел последняя документация]
Предоставьте пользователям возможность покупки из приложения потребляемых товаров — товаров, которые можно покупать, использовать и покупать снова — через Магазин. Покупка из приложения — удобный и надежный способ приобрести товар. Он особенно удобен при покупке виртуальной валюты для игр (например, золота или монет), которую можно потом использовать в процессе игры.
Что необходимо знать
Технологии
- Windows Runtime
- Windows.ApplicationModel.Store
Необходимые условия
В этом разделе рассказывается о покупках потребляемых товаров и отчетах об исполнении сделок в ваших приложениях. Чтобы ознакомиться с продуктами из приложения, см. статью Поддержка покупок продуктов из приложения, из которой вы узнаете о лицензировании и о том, как правильно вносить продукты из приложения в список Магазина.
Когда вы создадите код для продаж продуктов из приложения и будете проверять его в первый раз, используйте объект CurrentAppSimulator вместо объекта CurrentApp. В этом случае вы сможете проверить логику лицензирования путем имитации обращения к серверу лицензирования вместо вызова реального сервера. Для этого в %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).
Важно Ваше приложение отвечает за предоставление в Магазин точного отчета об исполнении сделки. Это необходимо, чтобы сделка была честной и надежной.
Пример ниже демонстрирует, как использовать свойства PurchaseResults вызова RequestProductPurchaseAsync из предыдущего этапа, чтобы указать, что покупка товара выполнена. Для сохранения сведений о товаре в месте, на которое впоследствии можно будет сослаться, чтобы подтвердить, что приложение выполнило свою часть сделки, используется массив.
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
}
Следующий пример показывает, как использовать массив из предыдущего примера, чтобы получить доступ к паре кодов продукта и транзакции, которые в дальнейшем будут использоваться в отчетах о сделке для Магазина.
Важно Независимо от способа отслеживания и подтверждения сделки приложение должно продемонстрировать добросовестность и доказать, что клиент получил тот товар, за который заплатил.
function isLocallyFulfilled(productId, transactionId) {
for (var i in grantedIds[productId]) {
if (grantedIds[productId][i] === transactionId) {
return true;
}
}
return false;
}
Этап 3: Отправка в Магазин отчета об исполнении сделки
После выполнения приложением своей части сделки оно должно отправить вызов ReportConsumableFulfillmentAsync, содержащий данные о товаре productId и соответствующей сделке.
Важно Если информация о выполненной покупке потребляемого товара не будет передана в Магазин, пользователь не сможет снова купить тот же товар до поступления отчета о выполнении предыдущей сделки.
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.
});
});
Связанные разделы
Поддержка покупок продуктов из приложения