¿Cómo implementar compras dentro de la aplicación en aplicaciones de Windows 10?

Quiero integrar la compra en la aplicación en mi aplicación universal de Windows. Hago lo siguiente antes de codificar.

  • Hacer aplicación en el Centro de desarrollo de Windows

  • Agregue productos con detalles en la sección IAP y envíelos a la Tienda como puede ver en Imagen

  • Después de eso, uso el siguiente código en mi aplicación para obtener la lista de productos de compra dentro de la aplicación y el botón para comprar producto. También utilicé CurrentApp lugar de CurrentAppSimulator en mi código pero va en excepción.
 private async void RenderStoreItems() { picItems.Clear(); try { //StoreManager mySM = new StoreManager(); ListingInformation li = await CurrentAppSimulator.LoadListingInformationAsync(); System.Diagnostics.Debug.WriteLine(li); foreach (string key in li.ProductListings.Keys) { ProductListing pListing = li.ProductListings[key]; System.Diagnostics.Debug.WriteLine(key); string status = CurrentAppSimulator.LicenseInformation.ProductLicenses[key].IsActive ? "Purchased" : pListing.FormattedPrice; string imageLink = string.Empty; picItems.Add( new ProductItem { imgLink = key.Equals("BaazarMagzine101") ? "block-ads.png" : "block-ads.png", Name = pListing.Name, Status = status, key = key, BuyNowButtonVisible = CurrentAppSimulator.LicenseInformation.ProductLicenses[key].IsActive ? false : true } ); } pics.ItemsSource = picItems; } catch (Exception e) { System.Diagnostics.Debug.WriteLine(e.ToString()); } } private async void ButtonBuyNow_Clicked(object sender, RoutedEventArgs e) { Button btn = sender as Button; string key = btn.Tag.ToString(); if (!CurrentAppSimulator.LicenseInformation.ProductLicenses[key].IsActive) { ListingInformation li = await CurrentAppSimulator.LoadListingInformationAsync(); string pID = li.ProductListings[key].ProductId; string receipt = await CurrentAppSimulator.RequestProductPurchaseAsync(pID, true); System.Diagnostics.Debug.WriteLine(receipt); // RenderStoreItems(); } } 

También asocio mi aplicación con la tienda y mi paquete de aplicaciones es el mismo que en la aplicación MS Dev Center, como puede ver en la imagen

Cuando ejecuto mi aplicación y hago clic en el botón Comprar, aparece este cuadro de diálogo, como se puede ver en la Imagen, después de eso no obtuve los datos del recibo de la Tienda.

Si lo estoy haciendo mal, por favor, dame la guía adecuada para implementar la compra desde la aplicación y prueba la compra desde la aplicación en mi dispositivo portátil.

    También tuve este problema y el problema estaba en el archivo WindowsStoreProxy.xml .

    Solución en breve

    De forma predeterminada, en el WindowsStoreProxy.xml IsTrial se establece en verdadero y en ese modo las compras dentro de la aplicación no parecen funcionar. Cuando lo cambié a falso empezó a funcionar para mí.

    Solución un poco más larga.

    • En primer lugar, aquí estamos hablando de la simulación de una compra dentro de la aplicación en tiempo de desarrollo (utilizando la clase CurrentAppSimulator ). En ese caso, necesita un archivo WindowsStoreProxy.xml . Se describe aqui

    • Ahora la ventana que mostró se abre con la línea CurrentAppSimulator.RequestProductPurchaseAsync . Básicamente, controla el valor de retorno de un método nativo de Windows Runtime (lo cual es muy extraño para mí … creo que no es intencional por parte de Microsoft … allí se debe hacer otra cosa), pero si lo devuelve S_OK ese es básicamente el caso cuando usuario pagado por la compra en la aplicación.

      Captura de pantalla de la ventana de simulación de compra.

    • Cuando no devuelve nada, entonces con muy alta probabilidad algo en el WindowsStoreProxy.xml es incorrecto. Le sugiero que cree su propio WindowsStoreProxy.xml y que lo lea con el método CurrentAppSimulator.ReloadSimulatorAsync como este:

       var file = await Windows.ApplicationModel.Package.Current.InstalledLocation.GetFileAsync(@"Testing\WindowsStoreProxy.xml"); await CurrentAppSimulator.ReloadSimulatorAsync(file); 
    • Para mí, usar el predeterminado de C:\Users\\AppData\Local\Packages\\LocalState\Microsoft\Windows Store\ApiData\WindowsStoreProxy.xml no funcionó, pero un solo cambio ya está resuelto El problema: cambié esta parte

         true true   

      A esto:

         true false   

      (Así que IsTrial se estableció en falso …)

    • Ahora, en este punto, también me gustaría mencionar que esto fue un poco extraño, ya que en el WindowsStoreProxy.xml predeterminado no había ningún producto definido para mi compra dentro de la aplicación. Así que para mis “Eliminar anuncios”, un WindowsStoreProxy.xml adecuado sería algo como esto:

           00000000-0000-0000-0000-000000000000 http://apps.microsoft.com/webpdp/app/00000000-0000-0000-0000-000000000000 en-US 3  AppName AppDescription 1.00 $ USD     RemoveAds 1.00 $ USD      true false   true       
    • Otra cosa que me gustaría señalar es que el CurrentAppSimulator.RequestProductPurchaseAsync con dos parámetros está obsoleto. Deje el parámetro verdadero fuera y obtendrá la instancia de PurchaseResults como resultado, que contiene el recibo en la propiedad ReceiptXML .

    WindowsStoreProxy.xml a c # codifica y serializa a archivo xml

     public static CurrentApp LoadCurrentApp(string productKey = "Premium", bool isActive = false, bool isTrial = false) { CurrentApp currentApp = new CurrentApp(); currentApp.ListingInformation = new ListingInformation() { App = new App() { AgeRating = "3", AppId = BasicAppInfo.AppId, CurrentMarket = "en-us", LinkUri = "", MarketData = new MarketData() { Name = "In-app purchases", Description = "AppDescription", Price = "5.99", CurrencySymbol = "$", CurrencyCode = "USD", } }, Product = new Product() { ProductId = productKey, MarketData = new MarketData() { Lang = "en-us", Name = productKey, Description = "AppDescription", Price = "5.99", CurrencySymbol = "$", CurrencyCode = "USD", } } }; currentApp.LicenseInformation = new LicenseInformation() { App = new App() { IsActive = isActive.ToString(), IsTrial = isTrial.ToString(), }, Product = new Product() { ProductId = productKey, IsActive = isActive.ToString(), } }; return currentApp; } 

    Modelo base xml

     [XmlRoot(ElementName = "MarketData")] public class MarketData { [XmlElement(ElementName = "Name")] public string Name { get; set; } [XmlElement(ElementName = "Description")] public string Description { get; set; } [XmlElement(ElementName = "Price")] public string Price { get; set; } [XmlElement(ElementName = "CurrencySymbol")] public string CurrencySymbol { get; set; } [XmlElement(ElementName = "CurrencyCode")] public string CurrencyCode { get; set; } [XmlAttribute(AttributeName = "lang", Namespace = "http://www.w3.org/XML/1998/namespace")] public string Lang { get; set; } } [XmlRoot(ElementName = "App")] public class App { [XmlElement(ElementName = "AppId")] public string AppId { get; set; } [XmlElement(ElementName = "LinkUri")] public string LinkUri { get; set; } [XmlElement(ElementName = "CurrentMarket")] public string CurrentMarket { get; set; } [XmlElement(ElementName = "AgeRating")] public string AgeRating { get; set; } [XmlElement(ElementName = "MarketData")] public MarketData MarketData { get; set; } [XmlElement(ElementName = "IsActive")] public string IsActive { get; set; } [XmlElement(ElementName = "IsTrial")] public string IsTrial { get; set; } } [XmlRoot(ElementName = "Product")] public class Product { [XmlElement(ElementName = "MarketData")] public MarketData MarketData { get; set; } [XmlAttribute(AttributeName = "ProductId")] public string ProductId { get; set; } [XmlElement(ElementName = "IsActive")] public string IsActive { get; set; } } [XmlRoot(ElementName = "ListingInformation")] public class ListingInformation { [XmlElement(ElementName = "App")] public App App { get; set; } [XmlElement(ElementName = "Product")] public Product Product { get; set; } } [XmlRoot(ElementName = "LicenseInformation")] public class LicenseInformation { [XmlElement(ElementName = "App")] public App App { get; set; } [XmlElement(ElementName = "Product")] public Product Product { get; set; } } [XmlRoot(ElementName = "CurrentApp")] public class CurrentApp { [XmlElement(ElementName = "ListingInformation")] public ListingInformation ListingInformation { get; set; } [XmlElement(ElementName = "LicenseInformation")] public LicenseInformation LicenseInformation { get; set; } } 

    Obtener XmlFile

     public async static Task GetWindowsStoreProxyXmlAsync(string productKey, bool isActive = false, bool isTrial = false) { StorageFile xmlFile = null; var currentApp = LoadCurrentApp(productKey, isActive, isTrial); var xml = StorageHelper.SerializeToXML(currentApp); if (!string.IsNullOrEmpty(xml)) { xmlFile = await StorageHelper.LocalFolder.CreateFileAsync("MarketData.xml", CreationCollisionOption.ReplaceExisting); await FileIO.WriteTextAsync(xmlFile, xml); } return xmlFile; }