В основном я хочу иметь возможность проверить связанную подписку в учетной записи пользователя (аутентификация firebase с firestore) активна, даже если пользователь вошел в систему с помощью iPhone или веб-приложения, используя API разработчика игр с функциями firebase (на стороне сервера) или код конкретной платформы (на стороне клиента), например android kotlin.
Подробнее
Я использую сохранение пользовательской подписки в firestore в учетной записи пользователя (аутентификация Firebase), используя Pub/Sub, используя облачные функции, и я сохраняю те же данные подписки в локальной БД.
Что я пробовал
Чтобы убедиться, что связанная подписка в учетной записи пользователя активна, я проверяю, что expiryTimeMillis больше текущей даты или автопродление включен:
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`);