API разработчика Google Play - почему connectedPurchaseToken не обнаруживается, когда пользователь выполняет повторную подписку?

На нашем внутреннем сервере, когда пользователь

  1. Отменить подписку.
  2. Подпишитесь снова через несколько дней.

Для нас крайне важно знать, что старый и новый токены покупки относятся к одному и тому же пользователю.

Причина в том, что ранее пользователь уже создал некоторые данные на сервере, используя старый токен отмененной покупки подписки.

Когда пользователь отменяет подписку и повторно подписывается снова, мы хотим убедиться, что пользователь по-прежнему авторизован для доступа к старым данным, используя новый токен покупки.

Мы ожидаем, что сможем получить информацию от linkedPurchaseToken, где новый токен покупки будет указывать на старый токен покупки.

Это описано в https://medium.com/androiddevelopers/implementing-linkedpurchasetoken-correctly-to-prevent-duplicate-subscriptions-82dfbf7167da

Однако, судя по результатам нашего теста, это не так.

API разработчика Google Play

credentials = service_account.Credentials.from_service_account_file(
    constant.PATH_TO_SERVICE_ACCOUNT_JSON, 
    scopes = constant.SCOPES
)
    
androidpublisher = googleapiclient.discovery.build(
    'androidpublisher', 
    'v3', 
    credentials = credentials
)

product = androidpublisher.purchases().subscriptions().get(
    packageName = "com.xxx.yyy",
    subscriptionId = product_id,
    token = token
).execute()

return product

Текущая активная подписка

{
   'startTimeMillis':'1619245597271',
   'expiryTimeMillis':'1619246015249',
   'autoRenewing':True,
   'priceCurrencyCode':'SGD',
   'priceAmountMicros':'6980000',
   'countryCode':'SG',
   'developerPayload':'',
   'paymentState':1,
   'orderId':'GPA.3314-4833-2752-47988',
   'purchaseType':0,
   'acknowledgementState':1,
   'kind':'androidpublisher#subscriptionPurchase'
}

Предыдущая аннулированная подписка

{
   'startTimeMillis':'1619244776697',
   'expiryTimeMillis':'1619245074590',
   'autoRenewing':False,
   'priceCurrencyCode':'SGD',
   'priceAmountMicros':'6980000',
   'countryCode':'SG',
   'developerPayload':'',
   'cancelReason':3,
   'orderId':'GPA.3358-9904-1003-13416',
   'purchaseType':0,
   'acknowledgementState':1,
   'kind':'androidpublisher#subscriptionPurchase'
}

У нас нет linkedPurchaseToken информации. Следовательно, у нас нет возможности узнать, обе подписки относятся к одному и тому же пользователю.

В консоли Google Play он может определить, что подписки принадлежат одному и тому же пользователю, даже если идентификатор заказа отличается. Однако невозможно узнать это через ответ Google Play Developer API.

введите описание изображения здесь


По нашему первоначальному предположению, это может быть связано с тем, что функция Повторной подписки не включена в нашей консоли Google Play.

введите описание изображения здесь

Но в настоящее время все наши производственные / бета-версии / тестеры APK уже давно обновлены до версии 3.0.1. Поэтому мы не уверены, есть ли такое сообщение Повторная подписка в настоящее время недоступна для ваших пользователей, поскольку ваше приложение не использует Библиотеку биллинга 2.0 во всех активных APK.

Есть идеи, как мы можем узнать, действительно ли последняя активная подписка и отмененная неактивная подписка относятся к одному и тому же пользователю?


person Cheok Yan Cheng    schedule 24.04.2021    source источник


Ответы (1)


При повторной подписке до истечения срока действия исходной отмененной подписки будет повторно использоваться тот же токен покупки. Повторная подписка после истечения срока действия исходной подписки рассматривается как новая покупка, поэтому вы получите новый токен покупки, а поле connectedPurchaseToken не будет установлено. Поле связанного токена покупки будет действительно настроено только для потоков обновления и понижения. См. документы по токенам покупки и идентификаторам заказов.

Раньше connectedPurchaseToken был настроен для потоков повторной подписки, что происходило бы, если бы вы отменили и повторно подписались до истечения срока действия исходной подписки. С повторной подпиской этого больше не происходит. (Обратите внимание, что в статье Medium есть обновленное примечание с этой информацией - отказ от ответственности я являюсь автором этой статьи). В частности, из документов для повторной подписки:

В восстановленной подписке используется тот же токен покупки, который использовался при отмене подписки. Все поля отмены удалены из ресурса.

Таким образом, connectedPurchaseToken не будет установлен. Примечание: это происходит только тогда, когда повторная подписка происходит до истечения срока первоначальной подписки.

В приведенном выше примере покупок мне кажется, что вторая покупка произошла после истечения срока действия первоначальной первой подписки. ('startTimeMillis':'1619245597271' из новой подписки больше, чем 'expiryTimeMillis':'1619245074590' из старой подписки, поэтому срок действия старой подписки уже истек. В этом случае новая подписка рассматривается как совершенно новая подписка с новым токеном покупки.

В ответ на ваш вопрос о том, как вы можете связать две покупки вместе, ответ заключается в том, что вы не можете по замыслу использовать только информацию, предоставленную Google Play. Каждый токен покупки и связанная с ним информация не содержат информации, позволяющей идентифицировать пользователя.

Однако когда вы говорите, что на сервере есть данные, сохраненные с момента первой покупки, это наводит меня на мысль, что у вас есть внутренний сервер с какими-то учетными записями пользователей. В этом случае именно на вашем внутреннем сервере и в вашем собственном коде вы должны связать две покупки с конкретным пользователем. Это правильный способ (см. образец классного такси).

Примечание. Я заметил документы об обновлении / переходе на более раннюю версию по-прежнему упоминайте о повторной регистрации, которая устарела.

person Emilie    schedule 24.04.2021
comment
Оценил подробный ответ. ржу не могу. Я прочитал всю среднюю статью, например, библию, о реализации на стороне сервера. Только сейчас я понимаю, что информация устарела. - person Cheok Yan Cheng; 24.04.2021