使用服务器到服务器通知和 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,其中包括交易的 UserID 和 token。
云函数获取该 SubscriptionRequest 并使用 token 查询相关的 Google API 以获取订阅详细信息。这是使用 googleapis Node.js 库完成的。
最新的订阅详情以 Subscription 的形式保存在 Firestore 中,包括令牌(如 linkedPurchaseToken)和 UserID。
评估订阅的到期日期,如果未到期,则更新 Firebase 中的 User 并相应设置标志 hasActiveSubscription(包括 Google Play订阅的标识符,例如 monthly_sub 或 annual_sub,以及平台,在本例中为 android)。
Google Play 开发者通知
-
通过 Pub/Sub 云功能接收通知。
将使用相关的 Google API 和通知中的 token 获取相应的订阅详细信息。
如果数据库中不存在具有该令牌(如 linkedPurchaseToken)的 Subscription,我们将尝试在我们的数据库使用来自 (2) 中获取的订阅详细信息中的 linkedPurchaseToken。
如果在数据库中仍然找不到订阅,这显然意味着它是一个新订阅,将通过上述新订阅验证过程专门处理.原因是我无法将我的 UserID 和订阅关联起来。
如果找到订阅,则会使用最新的详细信息进行更新。
评估订阅的到期日期,如果未到期,则更新 Firebase 中的 User 并相应地设置标志 hasActiveSubscription。 [...]
这在相当长的一段时间内一直运行得非常好和强大。
据我所知,developerPayload 可用于传递,例如UserID,用于确定订阅属于谁,已弃用。 (Source)
您是否认为有更简单的方法可以做到这一点? 仅使用 Google Play 开发者通知?
我在订阅更改的每一步都会收到通知,我只是根据到期日期更新我的 Subscription 和 hasActiveSubscription 标志。这很好用,因为我在订阅到期时收到通知(通知类型SUBSCRIPTION_EXPIRED
),例如,订阅在任何时候都会延长。 (Source)
该验证逻辑中是否缺少任何内容或任何潜在风险?
到目前为止,这两个问题只是为了确保我没有遗漏一些重要的东西。同样,根据我的经验,这工作得很好。
在 iOS 上发布我的应用程序(顺便说一下,基于 Flutter)剩下的就是实现 iOS 的验证逻辑。
让 google 验证逻辑变得相当简单的一件事是,有一个 googleapis 库,它本质上为我提供了所有响应的模型类,例如作为通知或订阅详细信息。我一直无法为 Apple 找到类似的东西,我不确定是否有。
是否有任何(官方)库为我提供与 Node.js 的 googleapis 类似的功能?
对于新订阅,我目前正在查询 verifyReceipt 端点,该端点似乎运行良好。但是,Apple 似乎没有在任何地方说明需要准确验证哪些字段,以便为用户提供应用程序内的访问权限。我遵循相同的逻辑,意思是:如果我确实收到了来自端点的有效收据并且没有过期,我会授予访问权限。
这种逻辑对于新订阅是否足够,还是我遗漏了什么?
到目前为止,对于 Google,我只是存储了通过查询 api 收到的订阅详细信息,包括 UserID 和 token 。这样做主要是为了懒惰,因为收到的文档结构相当简单。 Apple 的响应要复杂得多,所以我很不确定要存储什么(如果你问我的话,记录也很差),所以我想知道:
对于 Google 和 Apple,我实际上需要哪些详细信息,尤其是当我依赖通知来更新订阅时?
关于订阅的更新,我想知道如何处理来自 Apple 的服务器到服务器通知。
它们究竟是什么时候发送的,我可以实现与上述 Android 相同的逻辑吗?
因为我似乎无法为这部分找到好的文档或教程:
您可能知道这些通知的任何好的教程吗?
非常感谢您的支持, 马蒂亚斯
【问题讨论】:
能否请您添加服务器端验证的代码示例? 【参考方案1】:我已经有一段时间没有提出这些问题了,虽然从技术上讲这些问题还没有得到解答,但我仍然想与大家分享我的解决方案。
我所寻求的解决方案是简单地实施 RevenueCat,它专注于为您管理应用内订阅,因此您无需再担心所有这些问题。
【讨论】:
以上是关于使用服务器到服务器通知和 Firebase Cloud Functions 对 iOS 和 Android 自动更新订阅进行服务器端验证的主要内容,如果未能解决你的问题,请参考以下文章
使用服务器到服务器通知和 Firebase Cloud Functions 对 iOS 和 Android 自动更新订阅进行服务器端验证
如何使用 Firebase 从我的服务器发送 iOS 推送通知?