如何检查Google Play订阅在客户端或服务器端是否处于活动状态

基本上,我想要的是即使用户使用具有Firebase功能的Play Developer API使用iPhone或Web应用程序登录的用户,也可以检查用户帐户(带有Firestore的Firebase身份验证)中的链接订阅是否处于活动状态端)或特定平台代码(客户端),例如android kotlin。

更多信息

我正在使用云功能通过Pub / Sub在用户帐户(Firebase auth)中的Firestore上保存用户订阅,并将相同的订阅数据保存在本地db中。

我尝试过的事情

要检查用户帐户中的链接订阅是否处于活动状态,我正在检查expiryTimeMillis是否在当前日期之后或启用了autoRenewing

suspend fun isPremiumactive(userId: String): Boolean {
  val userSubscriptionData = localDB.getUserSubscription(userId)
        if (userSubscriptionData == null)
            return false
        else
            return Date(userSubscriptionData.expiryTimeMillis).after(Date()) ||
                    userSubscriptionData.autoRenewing
    }

但是使用Java Date有很多缺点,因为它受设备日期的影响

我考虑过使用服务器时间戳,但是这很难,因为用户订阅受时区限制(据我所知)。

还有其他方法可以检查订阅当前是否处于活动状态吗?我错过了什么吗?

一些用例

用户可以登录(在应用中使用Firebase身份验证),并且该帐户具有关联的订阅,因此即使关联的订阅有效,即使设备没有相同的帐户来支付费用,我也希望提供高级功能。订阅甚至用户正在使用iPhone,这就是为什么我无法拨打电话的原因:

billingClient.queryPurchases()

更新

此打字稿代码被认为可以安全地检查订阅是否处于活动状态:

const serverTime = admin.firestore.Timestamp.now().toDate()
const subscriptionTime = new Date(subscripton.exipryTimeInmilis)
if (subscripton.autoRenewing || subscriptionTime > serverTime)
    console.log(`subscription is active`);
iCMS 回答:如何检查Google Play订阅在客户端或服务器端是否处于活动状态

您的步伐非常正确,但是您有一个微妙的地方:

我考虑过使用服务器时间戳,但是这很难,因为用户订阅受时区限制(据我所知)。

这不是很正确。 expiryTimeMillis定义为自纪元(也称为Unix timestamps)以来的毫秒数,与时区无关。如链接文章所述,Unix时代是1970年1月1日世界标准时间(UTC)。同一时间是1960年12月31日太平洋标准时间下午4:00:00,但是这两个时间分别在各自的时区{ {3}}:0

因此,您的直觉是正确的:您应该使用服务器的时间戳在服务器端进行检查。出于您所描述的确切原因,对设备进行任何检查都将是不可靠的:这取决于设备的时间以及用户可能会用其设备的时间进行的恶作剧,它是否会及时前进以在他们喜欢的游戏中获取更多宝石,或者向后移动以尝试扩展已过期的订阅(也许是您的!)。

这还将解决检查设备是否未通过订阅登录到Google帐户或未使用iPhone的问题,因为您可以将系统中的帐户与后端的订阅相关联。

本文链接:https://www.f2er.com/2164752.html

大家都在问