Магазин 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

Другие вопросы по тегам