我已经在我的 flutter 应用程序中实现了应用程序购买中的非消耗品。在应用程序购买包升级后,购买对话框未显示,并给出以下错误:
PlatformException(INVALID_OFFER_TOKEN,每月产品的优惠令牌为空无效。请确保仅传递属于该产品的优惠令牌。要获取产品的优惠令牌,请获取产品。如何获取产品的示例可以是在这里找到:https://github.com/flutter/packages/blob/main/packages/in_app_purchase/in_app_purchase/README.md#loading-products-for-sale,null,null)
我的基本计划没有任何优惠。 如有任何帮助,我们将不胜感激。
我找到了解决办法。要解决Flutter中应用内购买库的相关问题,您可以使用该库的3.1.5版本。
内购库最新版本3.1.7,内部依赖了版本为^0.3.0+8的in_app_purchase_android库。在此版本中,优惠令牌是强制性的,这可能会导致无效优惠令牌的问题,无论您是否在 Play 商店中添加了令牌。
为了避免这些问题,您可以专门使用 in_app_purchase 库的 3.1.5 版本。此版本不应该有强制性的优惠令牌要求,可以帮助解决问题。
确保在依赖项部分下使用以下行更新您的
pubspec.yaml
文件:
dependencies:
in_app_purchase: 3.1.5
保存文件后,运行
flutter pub get
以获取指定版本的库并解决问题。
通过使用 in_app_purchase 库的 3.1.5 版本,您应该能够避免与强制报价令牌要求相关的问题。
我建议使用从
queryProductDetails
返回的产品详细信息。我遇到了同样的问题并解决了它。
这是一个示例,请务必使用正确的产品 ID 进行更新。
Future<void> purchaseSubscription() async {
final productDetailsResponse = await InAppPurchase.instance.queryProductDetails({YOUR_PRODUCT_ID});
final productDetails = productDetailsResponse.productDetails.firstOrNull;
if (productDetails != null) {
final purchaseParam = PurchaseParam(productDetails: productDetails);
await InAppPurchase.instance.buyNonConsumable(purchaseParam: purchaseParam);
}
}
编辑:我的问题的背景
我创建了自己的模型,它从返回的
ProductDetails
复制了属性,这样我就不需要再次调用 queryProductDetails
。问题是 Android 上从 queryProductDetails
返回的模型是 GooglePlayProductDetails
。我没有检查类型是否为 GooglePlayProductDetails
,只是将其视为 ProductDetails
来处理。 GooglePlayProductDetails
有额外的属性,但这些属性没有被复制,因此丢失了。为了进行购买,我实例化了 ProductDetails
,然后将其用于实例化 PurchaseParam
,这意味着附加字段不存在,因此购买失败并出现此错误。
上述解决方案之所以有效,是因为它使用了
GooglePlayProductDetails
,它具有所需的所有属性。
事后看来,我的“优化”尝试并没有经过深思熟虑,因为将来如果将更多属性添加到
GooglePlayProductDetails
,那么我将不得不将它们添加到我自己的自定义模型中,这似乎是非常糟糕的事情。很容易错过。这就是为什么我认为这是一个更好的解决方案。