使用服务器到服务器通知和 Firebase Cloud Functions 对 iOS 和 Android 自动更新订阅进行服务器端验证

Posted

技术标签:

【中文标题】使用服务器到服务器通知和 Firebase Cloud Functions 对 iOS 和 Android 自动更新订阅进行服务器端验证【英文标题】:Server-side validation of iOS and Android auto-renewable subscriptions using server-to-server notifications and Firebase Cloud Functions 【发布时间】:2020-05-17 19:18:46 【问题描述】:

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

新订阅验证

    用户在应用中购买订阅。 在我的 Firestore 数据库中创建了一个 SubscriptionRequest,其中包括交易的 UserIDtoken。 云函数获取该 SubscriptionRequest 并使用 token 查询相关的 Google API 以获取订阅详细信息。这是使用 googleapis Node.js 库完成的。 最新的订阅详情以 Subscription 的形式保存在 Firestore 中,包括令牌(如 linkedPurchaseToken)和 UserID。 评估订阅的到期日期,如果未到期,则更新 Firebase 中的 User 并相应设置标志 hasActiveSubscription(包括 Google Play订阅的标识符,例如 monthly_subannual_sub,以及平台,在本例中为 android)。

Google Play 开发者通知

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

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

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

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

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

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

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

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

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

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

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

这种逻辑对于订阅是否足够,还是我遗漏了什么?

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

对于 Google 和 Apple,我实际上需要哪些详细信息,尤其是当我依赖通知来更新订阅时?

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

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

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

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

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

【问题讨论】:

能否请您添加服务器端验证的代码示例? 【参考方案1】:

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

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

【讨论】:

以上是关于使用服务器到服务器通知和 Firebase Cloud Functions 对 iOS 和 Android 自动更新订阅进行服务器端验证的主要内容,如果未能解决你的问题,请参考以下文章

如何显示随服务器发送的FCM Firebase通知

使用服务器到服务器通知和 Firebase Cloud Functions 对 iOS 和 Android 自动更新订阅进行服务器端验证

如何使用 Firebase 从我的服务器发送 iOS 推送通知?

使用 NodeJS 的 Firebase 网络推送通知不起作用

Firebase 通知和云消息传递 [重复]

使用 NodeJs 服务器中的 firebase 云消息在特定时间和日期安排通知