Search code examples
c#windowswindows-runtimewindows-phone-8.1windows-store-apps

in app purchase issue in windows store app


I have created an app with in app purchase and tested it with CurrentAppSimulator and works fine but when i create the package for app it fails

This is my code for which i am creating package

public async System.Threading.Tasks.Task InAppInit()
{

    var listing = await CurrentApp.LoadListingInformationAsync();

    // Delux Unlock - Durable
    var unlockFeatureDelux = listing.ProductListings.FirstOrDefault(p => p.Value.ProductId == "deluxe" && p.Value.ProductType == ProductType.Durable);
    isDeluxPurchased = CurrentApp.LicenseInformation.ProductLicenses[unlockFeatureDelux.Value.ProductId].IsActive;
    deluxProductID = unlockFeatureDelux.Value.ProductId;

    // Standard Unlock - Durable
    var unlockFeatureStandard = listing.ProductListings.FirstOrDefault(p => p.Value.ProductId == "standard" && p.Value.ProductType == ProductType.Durable);
    isStarndardPurchased = CurrentApp.LicenseInformation.ProductLicenses[unlockFeatureStandard.Value.ProductId].IsActive;
    standardProductID = unlockFeatureStandard.Value.ProductId;

}

I am calling this method OnLaunched in App.xaml.cs


Solution

  • Based on our discussion here is what I would do:

    • The LoadListingInformationAsync method uses internet and if the user does not have an internet connection then it will throw an exception. So I suggest to wrap this whole stuff into a try/ctach block
    • As we see the ProductListings does not contain any item. I don't know how this list is populated, but as long as your app is not in the store I would not be surprised when that list is empty (Maybe someone can help out here... but i did not find anything regarding this in the docs). So for this I would just simply check if the feature you need is in the list... With this your package will pass the test you mentioned and you can upload it. If the list is also empty when the package is installed via the store, then something with the IAP setting is wrong (but that is related to the store..)
    • And a general comment: Obviously this code is not complete... You need some code for purchasing the IAPs and here we only get the Ids.. (But I think you only pasted the relevant part anyway.)

    So all this in code:

     public async System.Threading.Tasks.Task InAppInit()
        {
            try
            {
                var listing = await CurrentApp.LoadListingInformationAsync();
                if (listing.ProductListings.ContainsKey("deluxe"))
                {
                    // Delux Unlock - Durable
                    var unlockFeatureDelux = listing.ProductListings.FirstOrDefault(p => p.Value.ProductId == "deluxe" && p.Value.ProductType == ProductType.Durable);
                    isDeluxPurchased = CurrentApp.LicenseInformation.ProductLicenses[unlockFeatureDelux.Value.ProductId].IsActive;
                    deluxProductID = unlockFeatureDelux.Value.ProductId;
                }
                else
                {
                    //There is no deluxe IAP defined... so something with your IAP stuff is wrong...
                }
    
                if (listing.ProductListings.ContainsKey("standard"))
                {
                    // Standard Unlock - Durable
                    var unlockFeatureStandard = listing.ProductListings.FirstOrDefault(p => p.Value.ProductId == "standard" && p.Value.ProductType == ProductType.Durable);
                    isStarndardPurchased = CurrentApp.LicenseInformation.ProductLicenses[unlockFeatureStandard.Value.ProductId].IsActive;
                    standardProductID = unlockFeatureStandard.Value.ProductId;
                }
                else
                {
                    //same as for Delux
                }
            }
            catch
            {
                //Show  this on the UI...
            }
        }