- Ресурс: SubscriptionPurchaseV2
- Состояние подписки
- PausedStateContext
- CanceledStateContext
- Отмена по инициативе пользователя
- ОтменитьРезультатОпроса
- Причина отмены опроса
- SystemInitiatedCancellation
- Отмена по инициативе разработчика
- ЗаменаОтмена
- Тестовая покупка
- Состояние подтверждения
- Внешние идентификаторы учетных записей
- Подпишитесь на GoogleInfo
- Позиция покупки подписки
- План с автоматическим продлением
- SubscriptionItemPriceChangeDetails
- Режим изменения цены
- Изменение цены
- План рассрочки
- Ожидающая отмена
- Информация о согласии PriceStepUp
- ConsentState
- Предоплаченный план
- Подробности предложения
- Отложенная замена товара
- DeferredItemRemoval
- SignupPromotion
- OneTimeCode
- VanityCode
- Замена элемента
- Режим замены
- OutOfAppPurchaseContext
- Методы
Ресурс: SubscriptionPurchaseV2
Указывает на статус покупки подписки пользователем.
| JSON-представление |
|---|
{ "kind": string, "regionCode": string, "lineItems": [ { object ( |
| Поля | |
|---|---|
kind | Этот тип представляет собой объект SubscriptionPurchaseV2 в службе androidpublisher. |
regionCode | Код страны/региона ISO 3166-1 alpha-2, используемый для выставления счетов пользователем на момент оформления подписки. |
lineItems[] | Информация об отдельных товарах при оформлении подписки. Все товары в одной покупке должны быть либо с автоматическим продлением, либо с предоплаченным тарифом. |
startTime | Время предоставления подписки. Не указано для ожидающих подписок (подписка была создана, но ожидала оплаты во время регистрации). Используется RFC 3339, согласно которому генерируемый вывод всегда будет Z-нормализован и будет содержать 0, 3, 6 или 9 дробных знаков. Допускаются также смещения, отличные от "Z". Примеры: |
subscriptionState | Текущее состояние подписки. |
latestOrderId | Устарело: используйте lineItems.latest_successful_order_id вместо этого. Идентификатор заказа последнего заказа, связанного с покупкой подписки. Для подписки с автоматическим продлением это идентификатор заказа при регистрации, если он еще не продлен, или идентификатор последнего повторяющегося заказа (успешный, ожидающий или отклоненный заказ). Для предоплаченной подписки это идентификатор заказа, связанного с запрошенным токеном покупки. |
linkedPurchaseToken | Токен покупки старой подписки, если эта подписка относится к одной из следующих категорий: * Повторная регистрация отмененной, но не истекшей подписки; * Повышение/понижение уровня предыдущей подписки; * Переход с предоплаченной подписки на подписку с автоматическим продлением; * Переход с подписки с автоматическим продлением на предоплаченную; * Пополнение предоплаченной подписки. |
pausedStateContext | Дополнительная информация о приостановленных подписках. Присутствует только в том случае, если текущее состояние подписки — SUBSCRIPTION_STATE_PAUSED. |
canceledStateContext | Дополнительная информация об отмененных подписках. Присутствует только в том случае, если текущее состояние подписки имеет значение SUBSCRIPTION_STATE_CANCELED или SUBSCRIPTION_STATE_EXPIRED. |
testPurchase | Эта функция доступна только в том случае, если данная подписка приобретена в тестовом режиме. |
acknowledgementState | Состояние подтверждения подписки. |
externalAccountIdentifiers | Идентификатор учетной записи пользователя в стороннем сервисе. |
subscribeWithGoogleInfo | Профиль пользователя, связанный с покупками, совершенными с помощью функции «Подписаться через Google». |
outOfAppPurchaseContext | Дополнительная информация о покупках вне приложения. Эта информация отображается только для повторных подписок (покупок подписки, совершенных после истечения срока действия предыдущей подписки на тот же продукт) через центр подписок Google Play. Это поле будет удалено после подтверждения подписки. |
Состояние подписки
Возможные состояния подписки, например, активна она или отменена. В рамках подписки могут быть как планы с автоматическим продлением, так и предоплаченные планы.
| Перечисления | |
|---|---|
SUBSCRIPTION_STATE_UNSPECIFIED | Состояние подписки не указано. |
SUBSCRIPTION_STATE_PENDING | Подписка была оформлена, но ожидает оплаты во время регистрации. В этом состоянии все товары ожидают оплаты. |
SUBSCRIPTION_STATE_ACTIVE | Подписка активна. - (1) Если подписка является автоматически продлеваемой, по крайней мере один элемент имеет статус autoRenewEnabled и не истек. - (2) Если подписка является предоплаченной, по крайней мере один элемент не истек. |
SUBSCRIPTION_STATE_PAUSED | Подписка приостановлена. Это состояние доступно только при наличии автоматического продления подписки. В этом состоянии все элементы находятся в режиме паузы. |
SUBSCRIPTION_STATE_IN_GRACE_PERIOD | Подписка находится в льготном периоде. Это состояние доступно только при автоматическом продлении подписки. В этом состоянии все товары находятся в льготном периоде. |
SUBSCRIPTION_STATE_ON_HOLD | Подписка приостановлена. Это состояние доступно только при автоматическом продлении подписки. В этом состоянии все товары приостановлены. |
SUBSCRIPTION_STATE_CANCELED | Подписка отменена, но срок ее действия еще не истек. Это состояние доступно только при наличии автоматического продления подписки. Для всех элементов параметр autoRenewEnabled установлен в значение false. |
SUBSCRIPTION_STATE_EXPIRED | Срок действия подписки истек. Время истечения срока действия всех товаров истекло. |
SUBSCRIPTION_STATE_PENDING_PURCHASE_CANCELED | Незавершенная транзакция по подписке отменена. Если эта незавершенная покупка была оформлена на существующую подписку, используйте linkedPurchaseToken, чтобы получить текущее состояние этой подписки. |
PausedStateContext
Информация, относящаяся к подписке, находящейся в приостановленном состоянии.
| JSON-представление |
|---|
{ "autoResumeTime": string } |
| Поля | |
|---|---|
autoResumeTime | Время, по которому подписка будет автоматически возобновлена. Используется RFC 3339, согласно которому генерируемый вывод всегда будет Z-нормализован и будет содержать 0, 3, 6 или 9 дробных знаков. Допускаются также смещения, отличные от "Z". Примеры: |
CanceledStateContext
Информация, относящаяся к подписке, находящейся в состоянии SUBSCRIPTION_STATE_CANCELED или SUBSCRIPTION_STATE_EXPIRED.
| JSON-представление |
|---|
{ // Union field |
| Поля | |
|---|---|
Поле объединения cancellation_reason . Причина отмены подписки. cancellation_reason может принимать только одно из следующих значений: | |
userInitiatedCancellation | Подписка была отменена пользователем. |
systemInitiatedCancellation | Подписка была отменена системой, например, из-за проблемы с выставлением счетов. |
developerInitiatedCancellation | Подписка была отменена разработчиком. |
replacementCancellation | Подписка была заменена новой подпиской. |
Отмена по инициативе пользователя
Информация, касающаяся отмены заказов по инициативе пользователей.
| JSON-представление |
|---|
{
"cancelSurveyResult": {
object ( |
| Поля | |
|---|---|
cancelSurveyResult | Информация, предоставляемая пользователем при прохождении процедуры отмены подписки (опрос о причинах отмены). |
cancelTime | Время, когда пользователь отменил подписку. Пользователь может сохранить доступ к подписке и после этого времени. Используйте lineItems.expiry_time, чтобы определить, сохранил ли пользователь доступ. Используется RFC 3339, согласно которому генерируемый вывод всегда будет Z-нормализован и будет содержать 0, 3, 6 или 9 дробных знаков. Допускаются также смещения, отличные от "Z". Примеры: |
ОтменитьРезультатОпроса
Результаты опроса об отмене подписки, проведенного пользователем.
| JSON-представление |
|---|
{
"reason": enum ( |
| Поля | |
|---|---|
reason | Причина, указанная пользователем в опросе об отмене. |
reasonUserInput | Этот параметр устанавливается только для CANCEL_SURVEY_REASON_OTHERS. Это свободный ответ пользователя на опрос. |
Причина отмены опроса
Причина, указанная пользователем в опросе об отмене.
| Перечисления | |
|---|---|
CANCEL_SURVEY_REASON_UNSPECIFIED | Причина отмены опроса не указана. |
CANCEL_SURVEY_REASON_NOT_ENOUGH_USAGE | Недостаточное использование подписки. |
CANCEL_SURVEY_REASON_TECHNICAL_ISSUES | Технические проблемы при использовании приложения. |
CANCEL_SURVEY_REASON_COST_RELATED | Вопросы, связанные с затратами. |
CANCEL_SURVEY_REASON_FOUND_BETTER_APP | Пользователь нашел приложение получше. |
CANCEL_SURVEY_REASON_OTHERS | Другие причины. |
SystemInitiatedCancellation
Этот тип не содержит полей.
Информация, относящаяся к отменам, инициированным системой Google.
Отмена по инициативе разработчика
Этот тип не содержит полей.
Информация, касающаяся отмены заказов по инициативе разработчиков.
ЗаменаОтмена
Этот тип не содержит полей.
Информация, касающаяся отмены подписки в связи с ее заменой.
Тестовая покупка
Этот тип не содержит полей.
Является ли эта покупка подписки пробной.
Состояние подтверждения
Возможные варианты подтверждения подписки.
| Перечисления | |
|---|---|
ACKNOWLEDGEMENT_STATE_UNSPECIFIED | Состояние подтверждения не указано. |
ACKNOWLEDGEMENT_STATE_PENDING | Подписка пока не подтверждена. |
ACKNOWLEDGEMENT_STATE_ACKNOWLEDGED | Подписка подтверждена. |
Внешние идентификаторы учетных записей
Идентификатор учетной записи пользователя в стороннем сервисе.
| JSON-представление |
|---|
{ "externalAccountId": string, "obfuscatedExternalAccountId": string, "obfuscatedExternalProfileId": string } |
| Поля | |
|---|---|
externalAccountId | Идентификатор учетной записи пользователя в стороннем сервисе. Присутствует только в том случае, если привязка учетной записи произошла в процессе покупки подписки. |
obfuscatedExternalAccountId | Зашифрованная версия идентификатора, уникально связанного с учетной записью пользователя в вашем приложении. Присутствует при следующих покупках: * Если привязка учетной записи произошла в процессе покупки подписки. * Если идентификатор был указан с помощью https://developer.android.com/reference/com/android/billingclient/api/BillingFlowParams.Builder#setobfuscatedaccountid при совершении покупки. |
obfuscatedExternalProfileId | Зашифрованная версия идентификатора, уникально связанного с профилем пользователя в вашем приложении. Присутствует только в том случае, если указан с помощью https://developer.android.com/reference/com/android/billingclient/api/BillingFlowParams.Builder#setobfuscatedprofileid при совершении покупки. |
Подпишитесь на GoogleInfo
Информация, связанная с покупками, совершенными с помощью функции «Подписаться через Google».
| JSON-представление |
|---|
{ "profileId": string, "profileName": string, "emailAddress": string, "givenName": string, "familyName": string } |
| Поля | |
|---|---|
profileId | Идентификатор профиля Google пользователя на момент покупки подписки. |
profileName | Имя пользователя в профиле на момент приобретения подписки. |
emailAddress | Адрес электронной почты пользователя на момент покупки подписки. |
givenName | Имя пользователя, указанное при покупке подписки. |
familyName | Фамилия пользователя на момент приобретения подписки. |
Позиция покупки подписки
Информация об отдельных товарах при покупке подписки.
| JSON-представление |
|---|
{ "productId": string, "expiryTime": string, "latestSuccessfulOrderId": string, // Union field |
| Поля | |
|---|---|
productId | Идентификатор приобретенного товара (например, 'monthly001'). |
expiryTime | Время, по истечении которого срок действия подписки истек или истечет, если доступ не будет продлен (например, путем обновления). Используется RFC 3339, согласно которому генерируемый вывод всегда будет Z-нормализован и будет содержать 0, 3, 6 или 9 дробных знаков. Допускаются также смещения, отличные от "Z". Примеры: |
latestSuccessfulOrderId | Идентификатор заказа последнего успешно выполненного заказа, связанного с этим товаром. Отсутствует, если товар еще не принадлежит пользователю (например, товар, на который отложена замена). |
Поле объединения plan_type . Тип плана подписки. plan_type может принимать только одно из следующих значений: | |
autoRenewingPlan | Подписка автоматически продлевается. |
prepaidPlan | Товар оплачен заранее. |
offerDetails | Подробности предложения по данному товару. |
Поле объединения deferred_item_change . Это поле присутствует, когда у элемента есть отложенное изменение. Оно может быть удалено или заменено. deferred_item_change может принимать только одно из следующих значений: | |
deferredItemReplacement | Информация о замещении отложенных товаров. |
deferredItemRemoval | Информация об отложенном удалении предмета. |
signupPromotion | Информация о рекламной акции для этого товара. Отображается только в том случае, если акция была применена при регистрации. |
itemReplacement | Подробная информация о заменяемом товаре. Это поле заполняется только в том случае, если данный товар заменил другой товар в предыдущей подписке, и доступно только в течение 60 дней после покупки. |
План с автоматическим продлением
Информация, касающаяся плана с автоматическим продлением.
| JSON-представление |
|---|
{ "autoRenewEnabled": boolean, "recurringPrice": { object ( |
| Поля | |
|---|---|
autoRenewEnabled | Если в данный момент подписка настроена на автоматическое продление, например, пользователь не отменил подписку. |
recurringPrice | Текущая цена плана с автоматическим продлением подписки. Обратите внимание, что цена не учитывает скидки и не включает налоги (цена указана без учета налогов). Если вам необходимы подробные сведения о транзакции, воспользуйтесь API |
priceChangeDetails | Информация о последнем изменении цены товара с момента оформления подписки. |
installmentDetails | Информация о плане рассрочки платежей и сведения, касающиеся штата, для плана автоматического продления. |
priceStepUpConsentDetails | Информация о последнем соглашении о повышении цен. |
SubscriptionItemPriceChangeDetails
Информация об изменении цены на подписку.
| JSON-представление |
|---|
{ "newPrice": { object ( |
| Поля | |
|---|---|
newPrice | Новая фиксированная цена для подписки. |
priceChangeMode | Режим изменения цены определяет, как изменяется цена подписки. |
priceChangeState | Укажите текущее изменение цены. |
expectedNewPriceChargeTime | Время продления подписки, когда изменение цены вступит в силу для пользователя. Это время может измениться (на более поздний срок) в случае, если время продления подписки сдвинуто, например, на паузу. Это поле заполняется только в том случае, если изменение цены еще не вступило в силу. Используется RFC 3339, согласно которому генерируемый вывод всегда будет Z-нормализован и будет содержать 0, 3, 6 или 9 дробных знаков. Допускаются также смещения, отличные от "Z". Примеры: |
Режим изменения цены
Мода изменения цены.
| Перечисления | |
|---|---|
PRICE_CHANGE_MODE_UNSPECIFIED | Режим изменения цены не указан. Это значение никогда не следует устанавливать. |
PRICE_DECREASE | Если цена подписки снижается. |
PRICE_INCREASE | Если стоимость подписки повышается, и пользователю необходимо это принять. |
OPT_OUT_PRICE_INCREASE | Если цена подписки увеличивается при отказе от участия. |
Изменение цены
Состояние изменения цен.
| Перечисления | |
|---|---|
PRICE_CHANGE_STATE_UNSPECIFIED | Состояние изменения цены не указано. Это значение использовать не следует. |
OUTSTANDING | Ожидание согласия пользователя на изменение цены. |
CONFIRMED | Изменение цены подтверждено для пользователя. |
APPLIED | Изменение цены вступило в силу, то есть с пользователя начала взиматься плата по новой цене. |
CANCELED | Изменение цены было отменено. |
План рассрочки
Информация о плане рассрочки.
| JSON-представление |
|---|
{
"initialCommittedPaymentsCount": integer,
"subsequentCommittedPaymentsCount": integer,
"remainingCommittedPaymentsCount": integer,
"pendingCancellation": {
object ( |
| Поля | |
|---|---|
initialCommittedPaymentsCount | Общее количество платежей, на которые пользователь изначально обязуется. |
subsequentCommittedPaymentsCount | Общее количество платежей, которые пользователь будет обязан совершить после каждого периода действия договора. Пустое поле означает, что после первоначального действия договора план платежей вернется к обычному автоматическому продлению подписки. |
remainingCommittedPaymentsCount | Общее количество подтвержденных платежей, которые еще предстоит произвести в этом цикле продления. |
pendingCancellation | Если такой план оплаты существует, он ожидает отмены. Отмена произойдет только после того, как пользователь произведет все запланированные платежи. |
Ожидающая отмена
Этот тип не содержит полей.
Это индикатор наличия незавершенной заявки на отмену виртуального плана рассрочки. Отмена произойдет только после того, как пользователь завершит все запланированные платежи.
Информация о согласии PriceStepUp
Информация, касающаяся повышения цены, требующего согласия пользователя.
| JSON-представление |
|---|
{ "state": enum ( |
| Поля | |
|---|---|
state | Только вывод. Состояние согласия на повышение цен. |
consentDeadlineTime | Крайний срок, до которого пользователь должен дать согласие. Если согласие не будет предоставлено к этому времени, подписка будет аннулирована. Используется RFC 3339, согласно которому генерируемый вывод всегда будет Z-нормализован и будет содержать 0, 3, 6 или 9 дробных знаков. Допускаются также смещения, отличные от "Z". Примеры: |
newPrice | Новая цена, для установки которой требуется согласие пользователя. |
ConsentState
Состояние соглашения о поэтапном повышении цен.
| Перечисления | |
|---|---|
CONSENT_STATE_UNSPECIFIED | Штат, в котором не указано согласие. |
PENDING | Пользователь еще не дал согласия. |
CONFIRMED | Пользователь дал согласие, и новая цена ожидает вступления в силу. |
COMPLETED | Пользователь дал согласие, и новая цена вступила в силу. |
Предоплаченный план
Информация, относящаяся к предоплаченному тарифному плану.
| JSON-представление |
|---|
{ "allowExtendAfterTime": string } |
| Поля | |
|---|---|
allowExtendAfterTime | Если указан этот параметр, это время, по истечении которого разрешены пополнения предоплаченного тарифа. Для тарифов с истекшим сроком действия предоплаченных тарифов этот параметр отсутствует. Используется RFC 3339, согласно которому генерируемый вывод всегда будет Z-нормализован и будет содержать 0, 3, 6 или 9 дробных знаков. Допускаются также смещения, отличные от "Z". Примеры: |
Подробности предложения
Предоставьте подробную информацию по каждой позиции заказа.
| JSON-представление |
|---|
{ "offerTags": [ string ], "basePlanId": string, "offerId": string } |
| Поля | |
|---|---|
offerTags[] | Последние теги предложения, связанные с данным предложением. Включает теги, унаследованные от базового тарифного плана. |
basePlanId | Идентификатор базового тарифного плана. Присутствует для всех базовых тарифных планов и предложений. |
offerId | Идентификатор предложения. Указывается только для предложений со скидкой. |
Отложенная замена товара
Информация, касающаяся отложенной замены товара.
| JSON-представление |
|---|
{ "productId": string } |
| Поля | |
|---|---|
productId | Идентификатор продукта (productId) заменит существующий идентификатор продукта (productId). |
DeferredItemRemoval
Этот тип не содержит полей.
Информация, касающаяся отложенной замены товара.
SignupPromotion
Акция действовала на этот товар при покупке.
| JSON-представление |
|---|
{ // Union field |
| Поля | |
|---|---|
Поле объединения promotion_type . Тип акции, применяемой к товару. promotion_type может принимать только одно из следующих значений: | |
oneTimeCode | Был применен одноразовый код. |
vanityCode | Был применен декоративный код. |
OneTimeCode
Этот тип не содержит полей.
Промокод для одноразового использования.
VanityCode
Многоразовый, заранее определенный промокод.
| JSON-представление |
|---|
{ "promotionCode": string } |
| Поля | |
|---|---|
promotionCode | Промокод. |
Замена элемента
Подробная информация о заменяемой позиции в подписке.
| JSON-представление |
|---|
{
"productId": string,
"replacementMode": enum ( |
| Поля | |
|---|---|
productId | Идентификатор продукта заменяемой позиции подписки. |
replacementMode | Способ замены, примененный при покупке. |
basePlanId | Идентификатор базового тарифного плана для заменяемой позиции подписки. |
offerId | Идентификатор предложения заменяемой позиции подписки, если таковая имеется. |
Режим замены
Способ замены подписки.
| Перечисления | |
|---|---|
REPLACEMENT_MODE_UNSPECIFIED | Неуказанный способ замены. |
WITH_TIME_PRORATION | По новому плану расчет будет произведен пропорционально и зачтен из средств, предусмотренных старым планом. |
CHARGE_PRORATED_PRICE | С пользователя будет взиматься пропорциональная плата за новый тарифный план. |
WITHOUT_PRORATION | Новый план заменит старый без пропорционального перерасчета времени. |
CHARGE_FULL_PRICE | С пользователя будет взиматься полная стоимость нового тарифного плана. |
DEFERRED | Старый план будет отменен, и новый план вступит в силу после истечения срока действия старого. |
KEEP_EXISTING | После этой замены план останется неизменным. |
OutOfAppPurchaseContext
Информация, относящаяся к покупке, совершенной вне приложения.
| JSON-представление |
|---|
{
"expiredExternalAccountIdentifiers": {
object ( |
| Поля | |
|---|---|
expiredExternalAccountIdentifiers | Идентификатор учетной записи пользователя из последней истекшей подписки для данного артикула. |
expiredPurchaseToken | Токен покупки последней истекшей подписки. Этот токен покупки следует использовать только для идентификации пользователя, если связь между токеном покупки и пользователем хранится в вашей базе данных. Его нельзя использовать для вызова API разработчиков Google, если с момента истечения срока действия прошло более 60 дней. |
Методы | |
|---|---|
| Отменить подписку для пользователя. |
| Получить метаданные о подписке |
| Отменить покупку подписки для пользователя. |
коды ошибок
При работе с этим ресурсом возвращаются следующие коды ошибок HTTP:
| Код ошибки | Причина | Описание | Разрешение |
|---|---|---|---|
400 / 410 | subscriptionExpired | Срок действия подписки истек, и запрошенная операция не может быть выполнена. | Проверьте срок действия подписки. Эта операция не допускается для подписок с истекшим сроком действия. |
400 | subscriptionInvalidArgument | В запросе на подписку был указан недопустимый аргумент. | Ознакомьтесь с документацией API и убедитесь, что все необходимые поля заполнены и правильно отформатированы. |
400 | invalidPurchaseState | Покупка находится в недействительном состоянии для выполнения запрошенной операции. Например, вы можете пытаться подтвердить уже совершенную покупку или отменить неактивную подписку. | Перед выполнением операции проверьте текущее состояние ресурса с помощью соответствующего API-запроса Get. Убедитесь, что ресурс находится в подходящем состоянии для выполнения действия. |
400 | invalidValue | В запросе было предоставлено недопустимое значение. Такая ошибка часто возникает при получении некорректного или недействительного токена покупки. | Исправьте недопустимое значение поля в теле запроса или параметрах в соответствии со справочником API. |
400 | prepaidSubscriptionNotSupported | Данная операция не поддерживается для предоплаченных подписок. | Убедитесь, что операция применима к типу подписки. Эта ошибка характерна именно для таких методов, как «Отмена», «Отсрочка», «Возврат средств» или «Отзыв». |
400 | productNotOwnedByUser | Предоставленный токен покупки действителен, но пользователь в данный момент не является владельцем продукта. Это может произойти, если покупка была возвращена, аннулирована или истек срок ее действия до подтверждения. | Перед выполнением операции проверьте текущее состояние ресурса с помощью соответствующего API-запроса Get. Убедитесь, что ресурс находится в подходящем состоянии для выполнения действия. |
400 | purchaseTokenMismatch | Предоставленный токен покупки не соответствует покупке, названию пакета, идентификатору подписки или идентификатору продукта. | Убедитесь, что все данные в запросе верны и соответствуют друг другу. |
400 | required | В запросе отсутствует обязательное поле или параметр. | Ознакомьтесь с документацией API, чтобы убедиться в наличии всех обязательных полей и параметров. |
400 | unsupportedIabType | Данная операция не поддерживается для указанного типа внутриигровых покупок. | Убедитесь, что метод API совместим с управляемым типом элемента. |
403 | userInsufficientPermission | У пользователя недостаточно прав для выполнения запрошенной операции. | Убедитесь, что авторизованный пользователь имеет необходимые разрешения в консоли Google Play. Дополнительные сведения см. в разделе «Использование служебной учетной записи» . |
404 | notFound | Запрошенный ресурс не найден. | Убедитесь в правильности идентификаторов (например, токен покупки, название пакета, идентификатор продукта, идентификатор подписки). |
409 | concurrentUpdate | Была предпринята попытка обновить объект, который обновляется одновременно с первым. | Повторите запрос с экспоненциальной задержкой. Избегайте одновременных изменений одного и того же ресурса. |
410 | purchaseTokenNoLongerValid | Токен покупки окончательно недействителен, поскольку связанная с ним учетная запись пользователя была удалена или запись о покупке больше не существует. | Прекратите использование этого токена покупки. |
410 | subscriptionNoLongerAvailable | Возможность приобретения подписки больше недоступна для запроса, поскольку срок ее действия истек слишком давно. | Эта ошибка указывает на то, что срок действия подписки истек более 60 дней назад. Вам больше не следует запрашивать информацию по этим подпискам. |
5xx | Generic error | Общая ошибка на сервере Google Play. | Повторите запрос. Если проблема не исчезнет, обратитесь к своему менеджеру аккаунта Google Play или отправьте запрос в службу поддержки. Рекомендуем проверить панель состояния Play на наличие известных сбоев. |