使用服务器到服务器通知和 Firebase 云函数对 iOS 和 Android 自动续订订阅进行服务器端验证

Server-side validation of iOS and Android auto-renewable subscriptions using server-to-server notifications and Firebase Cloud Functions

我已成功实现 Google Play 的订阅验证,但我很难理解 iOS 自动续订订阅的验证流程,并希望寻求您的帮助。以下是 Google 播放的高级逻辑:

新订阅验证

  1. 用户在应用中购买订阅。
  2. 在我的 Firestore 数据库中创建了一个 SubscriptionRequest,其中包括 UserIDtoken 的交易。
  3. 云函数获取 SubscriptionRequest 并使用 token 查询相关的 Google API获取订阅详细信息。这是使用 googleapis Node.js 库完成的。
  4. 最新的订阅详细信息在 Firestore 中保存为 订阅,包括令牌(如 linkedPurchaseToken)和用户 ID.
  5. 评估订阅的到期日期,如果未过期,则更新 Firebase 中的 User 并标记 hasActiveSubscription 相应设置(包括 Google 订阅的播放标识符,例如 monthly_sub,或 annual_sub和平台,在本例中为 android).

Google Play 开发者通知

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

这在相当长的一段时间内一直运行得非常好且稳健。

据我所知,developerPayload,可用于传递,例如UserID,以确定订阅属于谁,已弃用。 (Source)

Do you think there is an easier way of doing this, possibly only using Google Play Developer notifications?

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

Is there anything missing in that validation logic or any potential risk?

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

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

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

Is there any (official) library that is providing me with similar features as googleapis for Node.js?

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

Is that logic sufficient for new subscriptions or am I missing something?

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

Which details do I actually need, for both Google and Apple, especially if I rely on notifications for updating the subscription?

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

When exactly are they being send and can I implement the same logic as described above for Android?

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

Do you possibly know any good tutorials for these notifications?

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

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

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