8

我已经成功地为 Google Play 实施了订阅验证,但我很难理解 iOS 自动更新订阅的验证流程,并且想寻求您的帮助。以下是 Google Play 的高级逻辑:

新订阅验证

  1. 用户在应用程序中购买订阅。
  2. 在我的 Firestore 数据库中创建了一个SubscriptionRequest ,其中包括用户 ID和交易令牌
  3. 云函数获取该SubscriptionRequest并使用令牌查询相关的 Google API以获取订阅详细信息。这是使用googleapis Node.js 库完成的。
  4. 最新的订阅详细信息作为Subscription保存在 Firestore 中,包括令牌(作为linkedPurchaseToken)和UserID
  5. 评估订阅的到期日期,如果未到期,则更新 Firebase 中的用户并相应设置标志hasActiveSubscription(包括订阅的 Google Play 标识符,例如, monthly_subyearly_sub和平台,在此案例安卓)。

Google Play 开发者通知

  1. 通过 Pub/Sub 云功能接收通知。
  2. 将使用相关的 Google API 和通知中的令牌获取相应的订阅详细信息。
  3. 如果数据库中不存在具有该令牌的订阅(如linkedPurchaseToken),我们将尝试使用从 (2) 中获取的订阅详细信息中的linkedPurchaseToken在我们的数据库中查找现有订阅。
  4. 如果在数据库中仍然找不到订阅,这显然意味着它是一个新订阅,它将通过上述新订阅验证过程专门处理。这样做的原因是我无法将我的UserID和订阅链接起来。
  5. 如果找到订阅,则会使用最新的详细信息对其进行更新。
  6. 评估订阅的到期日期,如果未到期,则更新 Firebase 中的用户并相应地设置标志hasActiveSubscription。[...]

这在相当长的一段时间内一直运行得非常好和强大。

据我所见,可用于传递的developerPayload ,例如UserID,以确定订阅属于谁,已被弃用。(来源

您是否认为有更简单的方法可以做到这一点,可能 使用 Google Play 开发者通知?

我在订阅更改的每一步都收到通知,我只是根据到期日期更新我的订阅hasActiveSubscription标志。这很好用,因为我在订阅到期时收到通知(通知类型SUBSCRIPTION_EXPIRED),并且在任何时候订阅都会延长,例如。(来源

该验证逻辑中是否缺少任何内容或任何潜在风险?

到目前为止,这两个问题只是为了确保我没有遗漏一些重要的东西。同样,根据我的经验,这工作得很好。

在 iOS 上发布我的应用程序(顺便说一下,基于 Flutter)剩下的就是实现 iOS 的验证逻辑。

使 google 验证逻辑变得相当简单的一件事是googleapis库,它本质上为我提供了所有响应的模型类,例如通知或订阅详细信息。我一直无法为 Apple 找到类似的东西,我不确定是否有。

是否有任何(官方)库为我提供与Node.js的googleapis类似的功能?

对于新订阅,我目前正在查询verifyReceipt端点,该端点似乎运行良好。但是,Apple 似乎没有在任何地方说明需要准确验证哪些字段,以便为用户提供应用程序内的访问权限。我遵循相同的逻辑,意思是:如果我确实收到了来自端点的有效收据并且没有过期,我会授予访问权限。

这种逻辑对于新订阅是否足够,或者我错过了什么?

到目前为止,对于 Google,我只是存储了通过查询 api 收到的订阅详细信息,包括UserIDtoken。这样做主要是为了懒惰,因为收到的文档结构相当简单。苹果的反应要复杂得多,所以我很不确定要存储什么(如果你问我,文件记录很差),所以我想知道:

对于 Google 和 Apple,我实际上需要哪些详细信息,尤其是在我依赖通知更新订阅的情况下?

关于订阅的更新,我想知道如何使用来自 Apple 的服务器到服务器通知。

它们究竟是什么时候发送的,我可以实现与上述 Android 相同的逻辑吗?

因为我似乎找不到这部分的好文档或教程:

您可能知道这些通知的任何好的教程吗?

非常感谢您的支持,马蒂亚斯

4

1 回答 1

1

自从我提出这些问题以来已经有一段时间了,虽然从技术上讲这些问题还没有得到回答,但我仍然想与大家分享我的解决方案。

我所寻求的解决方案是简单地实施 RevenueCat,它专注于为您管理应用内订阅,因此无需再担心所有这些问题。

于 2021-12-05T04:51:02.983 回答