使用服务器到服务器通知和 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 播放的高级逻辑:
新订阅验证
- 用户在应用中购买订阅。
- 在我的 Firestore 数据库中创建了一个 SubscriptionRequest,其中包括 UserID 和 token 的交易。
- 云函数获取 SubscriptionRequest 并使用 token 查询相关的 Google API获取订阅详细信息。这是使用 googleapis Node.js 库完成的。
- 最新的订阅详细信息在 Firestore 中保存为 订阅,包括令牌(如 linkedPurchaseToken)和用户 ID.
- 评估订阅的到期日期,如果未过期,则更新 Firebase 中的 User 并标记 hasActiveSubscription 相应设置(包括 Google 订阅的播放标识符,例如 monthly_sub,或 annual_sub和平台,在本例中为 android).
Google Play 开发者通知
- 通过 Pub/Sub 云功能接收通知。
- 将使用通知中的相关 Google API 和 token 获取相应的订阅详细信息。
- 如果数据库中不存在具有该令牌的订阅(如linkedPurchaseToken),我们将尝试使用 linkedPurchaseToken 从在 (2) 中获取的订阅详细信息中找到我们数据库中现有的 Subscription。
- 如果在数据库中仍然找不到订阅,这显然意味着这是一个新的订阅,将通过新订阅验证来独占处理 过程如上所述。这样做的原因是我无法 link 我的 UserID 和订阅。
- 如果找到订阅,则会更新为最新的详细信息。
- 评估订阅的到期日期,如果未过期,则更新 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,它专注于为您管理应用内订阅,因此您无需再担心所有这些问题。
我已成功实现 Google Play 的订阅验证,但我很难理解 iOS 自动续订订阅的验证流程,并希望寻求您的帮助。以下是 Google 播放的高级逻辑:
新订阅验证
- 用户在应用中购买订阅。
- 在我的 Firestore 数据库中创建了一个 SubscriptionRequest,其中包括 UserID 和 token 的交易。
- 云函数获取 SubscriptionRequest 并使用 token 查询相关的 Google API获取订阅详细信息。这是使用 googleapis Node.js 库完成的。
- 最新的订阅详细信息在 Firestore 中保存为 订阅,包括令牌(如 linkedPurchaseToken)和用户 ID.
- 评估订阅的到期日期,如果未过期,则更新 Firebase 中的 User 并标记 hasActiveSubscription 相应设置(包括 Google 订阅的播放标识符,例如 monthly_sub,或 annual_sub和平台,在本例中为 android).
Google Play 开发者通知
- 通过 Pub/Sub 云功能接收通知。
- 将使用通知中的相关 Google API 和 token 获取相应的订阅详细信息。
- 如果数据库中不存在具有该令牌的订阅(如linkedPurchaseToken),我们将尝试使用 linkedPurchaseToken 从在 (2) 中获取的订阅详细信息中找到我们数据库中现有的 Subscription。
- 如果在数据库中仍然找不到订阅,这显然意味着这是一个新的订阅,将通过新订阅验证来独占处理 过程如上所述。这样做的原因是我无法 link 我的 UserID 和订阅。
- 如果找到订阅,则会更新为最新的详细信息。
- 评估订阅的到期日期,如果未过期,则更新 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,它专注于为您管理应用内订阅,因此您无需再担心所有这些问题。