首页 > 解决方案 > Plugin.InAppBilling InAppBillingPurchase.PurchaseToken 在生产中有时为空

问题描述

我正在使用 James Montemagno 的Plugin.InAppBillingXamarin 库来执行 iOS 和 Android 应用内订阅。到目前为止,它基本上工作正常,除了偶尔,仅在 iOS 上,从对andInAppBillingPurchase.PurchaseToken的调用返回 null 。PurchaseAsyncGetPurchasesAsync

例如,在我的恢复购买逻辑中,我有类似这样的代码:

var purchases = await CrossInAppBilling.Current.GetPurchasesAsync(ItemType.Subscription);

// Sometimes we receive purchases with no PurchaseToken.
// Can't verify the purchase without a token.
var verifiable = purchases.Where(p => !string.IsNullOrWhiteSpace(p.PurchaseToken));

此时,verifiable有时计数 (0) 与purchases(1) 不同。

到目前为止,这似乎发生在用户使用商店信用礼品卡购买时,并且仅在 iOS 上。

另外,我不确定这是否与问题有关,但我没有使用PurchaseAsyncand GetPurchasesAsyncwhich take的重载IInAppBillingVerifyPurchase,因为我专门使用服务器端验证(没有客户端验证)。我的工作流程是进行购买,将生成的InAppPurchase对象添加到队列中进行处理,然后将其作为单独的步骤发送到我们的服务器,以进行验证和与用户帐户的关联。但是,如果这不是一个有效的工作流程,或者如果知道有时 PurchaseToken 数据可以通过IInAppBillingVerifyPurchase.VerifyPurchase但不附加到InAppBillingPurchase从上述方法返回的对象上,我当然想知道这一点。(对于它的价值,我已经阅读了文档并且没有看到任何暗示这一点的东西。)

提前感谢您的帮助。

标签: xamarinxamarin.iosin-app-purchasein-app-subscription

解决方案


好的,我想我已经学到了足够的知识,可以为其他处理这个问题的人提供有用的信息。

首先,我弄清楚了 Apple 所说的“iOS 6 风格”和“iOS 7 风格”收据是什么意思。这些不是指创建收据的 iOS 版本。(我最新的 iOS 12 设备仍然可以并且确实生成“iOS 6 风格”收据。)相反,这些是指在各自的 iOS 版本中引入的两种不同的收据格式。

  • iOS 6 风格的收据来自SKPaymentTransaction.transactionReceipt并包含有关一项特定交易的信息。Apple现已弃用此字段。

  • iOS 7 风格的收据来自 app bundle,通过NSBundle.mainBundle.appStoreReceiptUrl. 这些收据包含用户曾经进行的所有购买的完整清单。收据也不会过期——您始终可以将它们发送给 Apple 进行验证(但显然,其中包含的单个交易可能会在响应中显示为过期)。这些是您应该喜欢的收据。

这很重要的原因是,如果您使用该Plugin.InAppBilling库,则InAppBillingPurchase通过调用类似的对象获得的对象PurchaseAsync在其PurchaseToken字段中包含已弃用的 iOS 6 样式收据。

我仍然不确定为什么它有时会出现,有时会为空,但鉴于数据的基础来源已被弃用,因此可以安全地假设这会发生并且将会发生。因此,尽快切换到 iOS 7 风格的收据可能是有意义的。

请注意,当您调用 时PurchaseAsync,如果您指定了 的实现IInAppBillingVerifyPurchase,您的IInAppBillingVerifyPurchase.VerifyPurchase方法将收到更新的 iOS7 收据。但是,InAppBillingPurchase返回的对象PurchaseAsync仍然会获得 iOS 6 样式的收据(如果它得到任何东西)。

就个人而言,我喜欢这个InAppBillingPurchase对象本身。它把有用的信息打包成一个方便的包。由于我想将序列化InAppBillingPurchase对象保留在队列中,以便在我们的服务器、连接等出现问题时重试验证,我正在做的是立即用PurchaseToken我手动检索的 iOS 7 样式收据替换该属性捆绑。

如果您这样做,请确保您的代码正确处理 iOS 6 和 iOS 7 收据的格式略有不同。(我们早期的尝试由于没有正确理解这些术语的含义而出现了一些错误。)

我希望这对那里的人有用。祝你好运!


推荐阅读