代码之家  ›  专栏  ›  技术社区  ›  Brian Rak

plugin.inappbillingpurchaseToken在生产中有时为空

  •  0
  • Brian Rak  · 技术社区  · 6 年前

    我在用詹姆斯·蒙特马诺的 Plugin.InAppBilling 用于Xamarin进行iOS和Android应用内订阅的库。到目前为止,它基本上是正确的,只是偶尔,在ios上, InAppBillingPurchase.PurchaseToken 从调用返回空值 PurchaseAsync GetPurchasesAsync .

    例如,在还原购买逻辑中,我有类似的代码:

    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上。

    另外,我不确定这是否与问题有关,但我没有使用 异步采购 获取PurchasesAsync 哪一个 IInAppBillingVerifyPurchase ,因为我只使用服务器端验证(不使用客户端验证)。我的工作流程是进行购买,添加 InAppPurchase 对象到队列进行处理,然后作为单独的步骤将其发送到服务器,以进行验证并与用户帐户关联。但是,如果这不是有效的工作流或 如果知道有时PurchaseToken数据可以通过 IInAppBillingVerifyPurchase.VerifyPurchase 但不附属于 InAppBillingPurchase 从上述方法返回的对象 ,我当然想知道。(值得一提的是,我已经阅读了文档,但没有看到任何暗示这一点的内容。)

    提前谢谢你的帮助。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Brian Rak    6 年前

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

    首先,我明白了苹果所谓的“iOS6风格”和“iOS7风格”收据是什么意思。这些是真的 请参阅创建收据的IOS版本。(我最新的ios 12设备仍然可以并且确实生成“ios 6风格”的收据)相反,它们指的是两种不同的收据格式 介绍 在各自的ios版本中。

    • iOS6风格的收据来自 SKPaymentTransaction.transactionReceipt 并包含有关一个特定事务的信息。这个领域现在 不赞成 苹果公司。

    • iOS7风格的收据来自应用程序包,通过 NSBundle.mainBundle.appStoreReceiptUrl . 这些收据包含用户所做的所有购买的完整清单。收据也不会过期——您可以始终将其发送给Apple进行验证(不过,显然,其中包含的单个事务可能在响应中显示为过期)。这些是你应该要的收据。

    这很重要的原因是如果你使用 Plugin.InAppBilling 图书馆 InAppBillingPurchase 你打电话给 PurchaseAsync 在其 PurchaseToken 字段。

    我仍然不确定为什么有时会出现,有时会为空,但鉴于数据的底层源已被弃用,可以肯定的是,这种情况可能会发生。因此,尽快切换到ios 7风格的收据可能是有意义的。

    注意,当你打电话给 异步采购 ,如果指定 IInAppBillingVerifyPurchase 你的 IInAppBillingVerifyPurchase.VerifyPurchase 方法将接收更新的ios7收据。然而, 不买单购买 对象返回者 异步采购 仍然得到一个ios 6风格的收据(如果它得到任何东西的话)。

    就我个人而言,我喜欢 不买单购买 对象本身。它把有用的信息打包成一个方便的包裹。因为我想保持序列化 不买单购买 队列中的对象,以便在服务器、连接等出现问题时重试验证,我所做的是 立即更换 购买代币 属性,其中包含我从捆绑包中手动检索的ios 7样式的收据。

    如果这样做,请确保代码正确处理ios 6和ios 7收据稍微不同的格式。(我们之前的尝试有一些错误,是因为没有正确理解这些术语的含义。)

    我希望这对外面的人有用。祝你好运!