【问题标题】:In app auto-renewable subscriptions应用内自动续订订阅
【发布时间】:2011-07-16 19:20:21
【问题描述】:

对不起,关于 iTunes 订阅的第 100 万个问题,但我仍有一些疑问。

基本上,我在我的应用中实现了自动更新订阅,我想确保我做对了。以下是我想出的要采取的步骤列表:

  • 每当用户购买订阅时,将收据发送到服务器以进行验证
    • 如果收据有效,则将其保存在数据库中
  • 在应用程序加载时,询问服务器是否存在此 UDID 的收据(这是为了确定用户是否有有效的订阅)
    • 如果是,请检查是否在从订阅开始日期到到期日期的日期范围内在商店中添加了新项目
      • 如果有,以某种方式通知用户这些项目并将它们标记为可免费下载

这些步骤是否正确?如果是这样,为什么苹果文档会说:

在大多数情况下,您的 iOS 客户端应用程序不需要更改。事实上,您的客户端应用程序现在变得更简单,因为您可以使用与恢复非消耗性产品相同的代码来恢复自动更新订阅。这在“恢复交易”中进行了描述。您的应用程序会在订阅续订的每个时间段收到单独的交易;您的应用程序应分别验证每张收据。

在我看来,这似乎需要一些代码来处理我提到的所有各种情况。或者我完全错了。我是吗?

另外,我怎么知道订阅到期日期?我找不到在任何地方获取此信息的方法。我应该将其保存在我自己的数据库中吗?

更新:

自从我发布这个问题以来,我已经弄清楚了一些事情。如果我错了,请随时纠正我。

首先,我想我应该将订阅的长度存储在我自己的数据库中的某个位置,因为正如 Apple 文档中所述,您无法通过 Apple 的网络服务以任何方式检索它。实际上,每个订阅长度都有不同的产品标识符,因此您应该有一种方法可以将产品标识符转换为订阅长度。

另外,Sylvian has posted 详细介绍了他对自动更新订阅的实施,所以至少我知道我的想法并没有太大的缺陷。

现在唯一的问题是:我怎么知道一个用户有一个有效的订阅?我可以将这个信息存储在我的服务器上,是的,但是我如何将一个用户与一个已完成的订阅相关联交易?我应该保存设备的 UDID 吗?

【问题讨论】:

  • 您应该查看 deforums.apple.com 来解决问题。还没有人知道答案,但开发人员正在那里讨论它,
  • @honcheng 我在这里发帖是因为我在那里找不到答案。
  • 我正在为完全相同的问题而苦苦挣扎,最重要的是识别“同一用户 - 其他设备”。您对此有进一步了解吗?
  • 此链接stackoverflow.com/questions/22680059/… 可能会对您有所帮助。

标签: iphone in-app-purchase


【解决方案1】:

我想我找到了解决办法。它不需要额外的用户名/密码,它似乎正在工作。

注意:如果您认为这不合适,请在 cmets 中说明原因。谢谢。

基本上,每当用户购买订阅时,我都会根据我的服务器验证收据并将收据数据存储在用户默认值中。然后,当应用程序打开时,或者当我需要检查订阅是否仍然有效时,我会从用户默认值中检索先前保存的收据数据,并根据服务器对其进行验证。

我的网络服务只是返回订阅是否仍然有效或已过期,以及一些其他相关信息,例如订阅长度。为此,它只是像往常一样查询 iTunes 服务器,并检查状态响应是否为非零。 21006 表示订阅已过期。

【讨论】:

  • 如何处理多设备用户?
  • @Kai 我有一个调用restoreCompletedTransactions 的“恢复”按钮,就像许多其他应用程序一样。
  • 这不是苹果服务器的一点点开销吗?我通常会将验证过程中的过期日期保存到数据库中,但我不能相信苹果,因为在沙盒模式下,每月订阅会在 5 分钟后结束!!为什么?有没有更好的方法来验证订阅长度。我在 Apple 的文档中读到,订阅长度必须由应用程序(或服务器)计算。
  • 但是当我计算每月订阅的订阅长度并使用 30 天向用户提供内容时,我想会有一天丢失,我的服务不会向用户提供内容用户。总而言之,我建议 Apple 提供一种明确的方法来获取过期日期。
  • @NicTesla:在沙盒中订阅长度被缩短以使测试更容易。虽然它没有记录。检查这个dev-ios.blogspot.com/2011/05/…
【解决方案2】:

如果您的应用有一些用户管理,即您使用用户名/密码来使用该应用,那么您必须维护一个服务器来记录当前登录用户的购买/有效期。这适用于普通订阅和非消耗性购买。但是...如果您使用新的自动续订订阅,则无法在该应用中维护多个用户,因为:这种购买不能在订阅期内使用同一个 Apple ID 进行多次应用程序,我发现它真的很烦人,并为这种情况找到了更好的解决方案,即我在应用程序中有多个子帐户,但我想使用相同的 Apple-Id 为每个帐户购买自动更新订阅。而且我认为我必须使用旧的订阅模式。有什么新想法吗?

【讨论】:

  • 仍在我的多用户应用程序中与可更新订阅作斗争。正常订阅工作正常,但我们想使用新的自动更新。为应用程序中的每个新用户选择不同的 productId(相同类型和目的)时遇到问题。 :(
  • 您是否为多用户应用程序启用了自动续订功能?
  • 是否有任何关于多用户应用程序的解决方案,用于自动续订订阅?
【解决方案3】:

以下是我们如何在我的公司实施应用内购买,特别是新的自动更新产品。

应用程序将交易收据传输到我们的网络服务,如果我们正确处理它,我们会向应用程序返回 OK 并且 Apple 可以验证它。在这种情况下,我们更新了用户帐户(即数据库)以说“是的,他已付款并且他的订阅在收据到期日之前有效”。

在此 Web 服务的 OK 后,应用程序通过另一个 Web 服务重新加载帐户信息,并查看是否存在有效订阅。就是这样……直到出现可自动更新的产品。

我们现在必须实现一些每天运行的 CRON 作业:每天我们都会列出应该过期的通行证,并询问 Apple 原始收据是否仍然有效:神奇的是他们的回答,有一个字段latest-receipt 嵌入了最新收据。如果与我们的不一样,我们知道订阅已自动续订,我们存储最新的收据以供下次 cron 检查,并更新用户帐户以延长到期日期。

希望对你有帮助。

【讨论】:

  • 谢谢。我有一个问题:您说您在验证收据后更新数据库中的用户帐户。但是您对“用户帐户”的真正含义是什么?它是基于设备的 udid 在您的数据库中的记录吗?
  • 我们的客户必须登录,这样每个网络服务都知道用户调用他们的信息。我们在数据库中有一条记录表明该帐户有订阅。
  • 如果订阅已过期,只要用户在您的系统上有帐户,您是否每天检查可能的重新订阅(可以在 AppStore 中的应用程序之外进行)?那样的话,重新订阅不会立即产生影响。
  • @Sylvain - 我认为当用户 B 在用户 A 购买了您的应用内产品的设备上登录您的应用时,您的解决方案就会崩溃。因此,假设拥有 iOS 帐户 A' 的用户 A 购买了自动续订订阅。现在,A 退出您的应用程序,用户 B 登录。她尝试使用相同的 A' iOS 帐户购买您的产品。 Apple 说“OK”并且不再向用户收费,并且您的服务器现在将购买归功于用户 B。结果是您的购买数据库中有两条记录,但只有一笔付款。当订阅续订时,cron 作业将两个用户标记为良好。你解决了这个问题吗?
  • @psychotik,您提到的这个问题可以通过在收到收据时注册原始transactionid来解决。如果您收到的新订阅具有与某人相同的 transactionid,则您不会将此订阅永久保存给 B。
【解决方案4】:

据我了解,Apple 服务器会联系您(或使用他的 iPhone 的客户)并告诉“看这里,我有一个有效的购买给您”。在您的应用程序中,您阅读此消息并解锁相关内容以供使用。下一步就是告诉苹果服务器你已经回复了回执,苹果服务器就不会再显示这个消息了。

因此,通过可续订订阅,您会在每个时期收到一条新消息。如果我错了,请纠正我。

【讨论】:

    猜你喜欢
    • 2011-12-24
    • 2017-10-29
    • 1970-01-01
    • 2018-06-01
    • 2016-01-25
    • 2016-10-23
    • 1970-01-01
    • 2011-06-29
    • 1970-01-01
    相关资源
    最近更新 更多