Windows 10 UWP 上的应用内购买问题

In-App purchase trouble on Windows 10 UWP

我正在尝试在我的应用程序上启用应用内购买项目(已在 Windows 10 商店),但我在尝试购买该项目时总是收到相同的错误消息:

This in-App Purchase item is no longer available in MyAppName

代码相当简单,正是文档推荐的代码:

var itemName = "app.advanced_items.full";
if (CurrentApp.LicenseInformation.ProductLicenses[itemName].IsActive) {
    return true;
}
var results = await CurrentApp.RequestProductPurchaseAsync(itemName);

if (results.Status == ProductPurchaseStatus.Succeeded ||
    results.Status == ProductPurchaseStatus.AlreadyPurchased) {
    return true;
} else { 
    return false;
}

更多信息:

我怀疑问题可能与以下内容有关:

我把"display name"改成了应用全名,还是报错。我不知道将它发送到商店是否会改变这一点(我不想部署另一个有缺陷的版本来测试这个理论)

额外: 我在网上找到的关于这个问题的唯一资源是无用的,并且与 Windows 8: link

有关

建议?

请检查IAP的productId。我猜你在代码中提到的那个和商店里的不一样。

如果相同,我建议使用方法 LoadListingInformationAsync,其中 returns IAP 列表,然后 select 该列表中的所需 IAP . 如果名称不匹配,您将无法检索该 IAP。因为命名问题,所以我们将能够找到它。 我还为此添加了示例代码。试一试。

        try
        {
            var listing = await CurrentApp.LoadListingInformationAsync();
            var iap = listing.ProductListings.FirstOrDefault(p => p.Value.ProductId == "removeads");
            receipt = await CurrentApp.RequestProductPurchaseAsync(iap.Value.ProductId, true);
            if (CurrentApp.LicenseInformation.ProductLicenses[iap.Value.ProductId].IsActive)
            {
                CurrentApp.ReportProductFulfillment(iap.Value.ProductId);
                //your code after purchase is successful
            }
        }
        catch (Exception ex)
        {
            //exception 
        }

我认为这里的问题是您需要区分测试和生产。除非您在商店中发布,否则您不能使用生产模式。参见 CurrentApp and CurrentAppSimulator

来自 CurrentAppSimiulator 页面:

Remarks

Until the app has been listed in the Windows Store, the CurrentApp object won't work in the app. Use the CurrentAppSimulator to test your app's licensing and in-app products while you develop your app. After you test your app, and before you submit it to the Windows Store, you must replace the instances of CurrentAppSimulator with CurrentApp. Your app will fail certification if it uses CurrentAppSimulator.

这是我在我的应用程序中解决这个问题的方法,我为 testing/production 更改了 #define,以及在 CurrentApp 和 CurrentAppSimulator 之间切换的代理 class 使我的其他代码更容易眼睛。

App.xaml.cs, App()

            //
            // configure in-app purchasing
            //
#if false
#warning WARNING: You are using CurrentAppProxy in TEST MODE!
            CurrentAppProxy.SetTestMode(true); // true for test, false for production
#else
            CurrentAppProxy.SetTestMode(false); // true for test, false for production

CurrentAppProxy.cs

public static class CurrentAppProxy
{
    static bool? testmode = null;
    public static async void SetTestMode(bool mode)
    {
        testmode = mode;
        if (mode)
        {
            var file = await Package.Current.InstalledLocation.GetFileAsync("WindowsStoreProxy.xml");
            if (file != null)
            {
                await CurrentAppSimulator.ReloadSimulatorAsync(file);
            }
        }
    }

    public static LicenseInformation LicenseInformation
    {
        get
        {
            if (testmode == null) throw new NotSupportedException();
            else if (testmode.Value) return CurrentAppSimulator.LicenseInformation;
            else return CurrentApp.LicenseInformation;
        }
    }

    public static IAsyncOperation<IReadOnlyList<UnfulfilledConsumable>> GetUnfulfilledConsumablesAsync()
    {
        if (testmode == null) throw new NotSupportedException();
        else if (testmode.Value) return CurrentAppSimulator.GetUnfulfilledConsumablesAsync();
        else return CurrentApp.GetUnfulfilledConsumablesAsync();
    }

    public static IAsyncOperation<ListingInformation> LoadListingInformationAsync()
    {
        if (testmode == null) throw new NotSupportedException();
        else if (testmode.Value) return CurrentAppSimulator.LoadListingInformationAsync();
        else return CurrentApp.LoadListingInformationAsync();
    }

    public static IAsyncOperation<FulfillmentResult> ReportConsumableFulfillmentAsync(string productId, Guid transactionId)
    {
        if (testmode == null) throw new NotSupportedException();
        else if (testmode.Value) return CurrentAppSimulator.ReportConsumableFulfillmentAsync(productId, transactionId);
        else return CurrentApp.ReportConsumableFulfillmentAsync(productId, transactionId);
    }

    public static IAsyncOperation<PurchaseResults> RequestProductPurchaseAsync(string productId)
    {
        if (testmode == null) throw new NotSupportedException();
        else if (testmode.Value) return CurrentAppSimulator.RequestProductPurchaseAsync(productId);
        else return CurrentApp.RequestProductPurchaseAsync(productId);
    }
}

在我的应用程序中的使用...

    private async Task RefreshInAppOffers()
    {
        // in-app offers
        List<KeyValuePair<string, ProductListing>> products = null;
        UnfulfilledConsumable unfulfilledConsumable = null;

        InAppOffers.Children.Clear();

        try
        {
            var listinginfo = await CurrentAppProxy.LoadListingInformationAsync();
            products = listinginfo.ProductListings.ToList();
            products.Sort((p1, p2) => p1.Value.FormattedPrice.CompareTo(p2.Value.FormattedPrice));

CurrentAppProxy 是他们的关键。如果它适用于模拟器,它应该适用于您的生产项目。您只需要为所有各种条件准备好所有其他部件。一些测试在调试器中最容易进行。

我也遇到了同样的问题。在我的情况下,解决方案是在 IAP 中添加所有语言描述,然后就可以正常工作了

我的新 UWP 应用 "Midi Player" 也遇到了类似的问题。 IAP 可在认证和发布后立即在 WP 8.1 上购买,但在 W10M(Windows 10 Mobile)平台上显示相同的错误(我相信,所有 Windows 10 UWP 应用程序都具有相同的商店)。 我已经向 Microsoft 提出了问题,但他们帮不了我。幸运的是,现在问题已经解决了:) 我做了什么:

  • 已发布初始应用修订版
  • 已创建 IAP
  • 已测试 IAP(适用于 WP8.1,不适用于 W10M)
  • 我发现我的 Package.appxmanifest 文件略有更改(字符串 mp:PhoneIdentity PhoneProductId="7f32ab79-xxx-xxx- aff3-ce228745b36f" PhonePublisherId="00000000-0000-0000-0000-000000000000") 发布后
  • 我更改了版本(次要编号)并提交了更改后的新版本 Package.appxmanifest
  • 今天,我在 W10M Lumia 950 上检查了 IAP,它可以正常工作。

所以,我的结论是:

  • 您需要re-publish应用创建IAP
  • 之后
  • 你稍微等一下

我尝试就此问题与 Microsoft 联系,他们要求我使 IAP 不可用,然后再使其可用。 我必须说它没有解决我的问题,但如果您想尝试一下,请按照以下步骤操作:

  1. 为 IAP 创建更新
  2. 在 Distribution 和 Visibility 下将 IAP 设置为 Not available for purchase
  3. 提交更新
  4. 等待更新发布
  5. 为 IAP 创建新更新
  6. 将分发和可见性设置回可供购买
  7. 提交更新
  8. 此更新发布后,重新测试 IAP

在那之后,他们告诉我尝试将整个应用程序向所有国家/地区提供并发布。然后反其道而行之。也没有成功...

在与 Microsoft 支持人员交谈 2 个月后,他们终于解决了一些问题,我的 IAP 开始工作了。

我相信该修复是全球性的,但如果您的 IAP 仍然不起作用,请联系他们重新发布它。

以下是他们发给我的电子邮件的摘录:

We have issued a republish for your IAPs in this app. This should correct the situation as soon as the process completes. You may want to check periodically over the next few hours to see if you are able to confirm the fix worked for you. Let me know what you see.