В приложении нет входа пользователя. При первом запуске мы генерируем случайный UUID локально как «идентификатор пользователя». Если приложение переустанавливается, генерируется новый UUID, поэтому мы не можем надежно сопоставить его с каким-либо прошлым локальным состоянием. На практике единственным надежным источником является библиотека платежей Google Play на клиенте.
Текущая логика клиента (упрощенная):
Код: Выделить всё
// 1) Check if user currently has an active sub
val active = billingClient.queryPurchasesAsync(QueryPurchasesParams.newBuilder()
.setProductType(BillingClient.ProductType.SUBS)
// 2) If active -> set old token for upgrade/downgrade
if (active.hasPurchase) {
val oldToken = active.purchasesList.first().purchaseToken
launchBillingFlow(
BillingFlowParams.newBuilder()
.setSubscriptionUpdateParams(
SubscriptionUpdateParams.newBuilder()
.setOldPurchaseToken(oldToken)
.build()
)
.build()
)
} else {
// 3) If not active -> treat as new purchase (no old token)
launchBillingFlow(BillingFlowParams.newBuilder().build())
}
Когда предыдущая подписка пользователя приостановлена, queryPurchasesAsync() не сообщает о ней как об активной. Поэтому приложение рассматривает это как «нет текущей подписки» и разрешает новую покупку. Позже, когда приостановленная подписка автоматически возобновляется, у пользователя остаются две одновременные подписки (нарушается наше правило «только один план за раз»).
Я знаю, что Play Console может отключить «паузу» глобально, но, пожалуйста, не предлагайте этого — я пытаюсь понять технические параметры, когда используется пауза. включено.
Что я пытаюсь выяснить (устаревшая версия, нет предложений):
- Обнаружение на стороне клиента: Есть ли способ, используя только библиотеку платежей Play на устройстве, обнаружить, что в текущем аккаунте Play приостановлена подписка (для нашего SKU) перед началом нового процесса покупки?
- Получение старого токена: Есть ли какой-либо поддерживаемый способ получить токен покупки предыдущей (приостановленной) подписки на устройстве, чтобы я мог передать его
и убедиться, что это становится изменением/обновлением, а не второй параллельной подпиской?
Код: Выделить всё
SubscriptionUpdateParams#setOldPurchaseToken(...) - Пути восстановления: Любая комбинация queryPurchasesAsync() и/или API-интерфейсов «восстановления» покупки возвращает достаточно информации для приостановленных подписок? (Насколько я понимаю, нет, но я не смог доказать это окончательно.)
- Нет внутренней идентификации: Поскольку нет входа и локальный UUID меняется при переустановке, я не могу надежно найти прошлый токен на сервере. Даже если я добавлю логин, этот идентификатор может не совпадать с аккаунтом Google, используемым для покупок в Play, поэтому он сам по себе не будет авторитетным.
- Устаревшие подписки (предварительное предложение).
- Два плана должны быть взаимоисключающими. — никогда и то, и другое одновременно.
- Пожалуйста, не предлагайте «отключить паузу в консоли»; Я специально спрашиваю о том, что возможно на клиенте (или с API-интерфейсами Play, которые не требуют знания токена).
В устаревшей модели (без предложения) как приложение может предотвратить создание второй подписки, пока предыдущая приостановлена, если нет входа в систему и у нас есть только клиентские API-интерфейсы для выставления счетов? Существует ли какой-либо официально поддерживаемый способ (а) обнаружить приостановленную подписку или (б) восстановить старый PurchaseToken, необходимый для setOldPurchaseToken(...) при этих ограничениях?
Любые авторитетные рекомендации или официальные документы, разъясняющие ожидаемое поведение/ограничения, будут весьма признательны.
Подробнее здесь: https://stackoverflow.com/questions/798 ... ons-when-t
Мобильная версия