Магазин Windows В выпуске "Приобретение приложения" "Значение не попадает в ожидаемый диапазон"
При выполнении покупки в приложении из настольного приложения WPF с использованием StoreContext.RequestPurchaseAsync() из пространства имен Windows.services.Store мы получаем StorePurchaseResult с сообщением ExtendedError "Значение не попадает в ожидаемый диапазон".
Наше приложение опубликовано и доступно для загрузки из Магазина Windows.
Он был преобразован с помощью инструмента DesktopAppConverter. Мы устанавливаем manifest.appx в соответствии с описанием в Магазине (Identity Name, Publisher...).
Мы следовали приведенным ниже инструкциям по использованию покупки в приложении на C# из потока пользовательского интерфейса приложения для настольного компьютера Windows, в котором используется Desktop Bridge.
https://docs.microsoft.com/en-us/windows/uwp/monetize/in-app-purchases-and-trials https://docs.microsoft.com/en-us/windows/uwp/monetize/enable-in-app-purchases-of-apps-and-add-ons
В коде нашего приложения мы объявляем интерфейс IInitializeWithWindow:
[ComImport]
[Guid("3E68D4BD-7135-4D10-8018-9FB6D9F33FA1")]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IInitializeWithWindow
{
void Initialize(IntPtr hwnd);
}
Затем, когда наше приложение запускается, мы получаем StoreContext (сохраненный в атрибуте storeContext_), используя однопользовательский способ:
// Init the store context
storeContext_ = StoreContext.GetDefault();
IInitializeWithWindow initWindow = (IInitializeWithWindow)(object)storeContext_;
initWindow.Initialize(System.Diagnostics.Process.GetCurrentProcess().MainWindowHandle);
После этого нам удается получить StoreLicense (сохраненный в атрибуте storeLicense_) и вывести список связанных продуктов магазина без каких-либо ошибок.
// Get the current user license
storeLicense_ = await storeContext_.GetAppLicenseAsync();
if (storeLicense_ == null)
{
MessageBox.Show("An error occurred while retrieving the license.", "StoreLicenseApp Error");
return;
}
// Create a filtered list of the product AddOns I care about
string[] filterList = new string[] { "Durable" };
// Get list of Add Ons this app can sell, filtering for the types we know about
StoreProductQueryResult addOns = await storeContext_.GetAssociatedStoreProductsAsync(filterList);
if (addOns.ExtendedError != null)
{
MessageBox.Show("Impossible to retreive the list of the products on the store.\n" + addOns.ExtendedError.Message,
"Get Associated Store Products Error");
}
Как только идентификаторы товаров получены из магазина, мы ждем, пока пользователь нажмет кнопку покупки, которая вызывает обратный вызов ниже.
private async void PurchaseButton_Clicked(object sender, RoutedEventArgs e)
{
StorePurchaseResult result = await storeContext_.RequestPurchaseAsync(selectedStoreId);
// Capture the error message for the operation, if any.
string extendedError = string.Empty;
if (result.ExtendedError != null)
{
extendedError = result.ExtendedError.Message;
}
[...]
}
RequestPurchaseAsync()
вернуть ошибку вместо отображения интерфейса Metro для покупки продукта. Вот возвращенная расширенная ошибка:
Сообщение = "Значение не попадает в ожидаемый диапазон".
HResult = -2147024809
Любой ключ к решению этой проблемы?
2 ответа
RequestPurchaseAsync()
называется в нашем PurchaseButton_Clicked()
функция возвращала ошибку, потому что мы инициализировали контекст хранилища в другой функции при запуске приложения.
Мы решили проблему, поместив инструкции по инициализации контекста магазина в PurchaseButton_Clicked()
следующим образом:
public async void PurchaseSelectedProduct(ProductModel product){
if (product == null){
MessageBox.Show("Product not valid", "PurchaseInApp Error");
return;
}
// Init store context for purchase
IInitializeWithWindow initWindow = (IInitializeWithWindow)(object)storeContext_;
initWindow.Initialize(System.Diagnostics.Process.GetCurrentProcess().MainWindowHandle);
// Buy through in app purchase sdk
StorePurchaseResult result = null;
try { result = await product.StoreProduct.RequestPurchaseAsync(); }
}
Вот журналы ошибок из категории задач покупки в приложении, собранные с помощью WSCOLLECT.exe:
1) Сообщение Windows::Services::Store::StoreContext::RequestPurchaseAsync(9PMRHM0MJ85K) вызвано. (CV:+hcSKxR9+UGX7BQ/.1.3) Функция Windows:: Services:: Store:: StoreContext:: RequestPurchaseAsync Код ошибки -1 Источник \storecontext.cpp Номер строки 1194
2) Сообщение: ChkHr(hrGetTicket) Функция: Windows::Services::Store::PurchaseOperation::_PromptForPasswordAndEnterOrderWithRetry Код ошибки: -2147024809 Источник: \purchaseoperation.cpp Номер строки 506
3) Сообщение: ChkHr(_PromptForPasswordAndEnterOrderWithRetry(fPromptForCredentials)) Функция: Windows::Services::Store::PurchaseOperation::_ProceedToPurchase Код ошибки: -2147024809 Источник: \purchaseoperation.cpp Номер строки: 630
4) Сообщение: ChkHr(_ProceedToPurchase(needsToSignIn)) Функция: Windows:: Services:: Store:: PurchaseOperation:: _ Код ошибки покупки: -2147024809 Источник: \purchaseoperation.cpp Номер строки: 792
5) Сообщение ChkHr(_hresultOfOperation) Функция Windows::Services::Store::RequestPurchaseOperation::DoWork Код ошибки -2147024809 Source \requestpurchaseoperation.cpp Номер строки 115