API аннулированных покупок Google Play предоставляет список заказов, связанных с покупками, которые пользователь отменил. Информацию из этого списка можно использовать для реализации системы отзыва, которая заблокирует пользователю доступ к товарам из этих заказов.
Этот API применяется к разовым заказам в приложении и подпискам на приложение.
Покупку можно аннулировать следующими способами:
- Пользователь запрашивает возврат средств за свой заказ.
- Пользователь отменяет свой заказ.
- Заказ списан.
- Застройщик отменяет заказ или возвращает деньги. 
- Google отменяет или возвращает деньги за заказ. 
Используя этот API, вы помогаете создать более сбалансированный и справедливый опыт для всех пользователей вашего приложения, особенно если ваше приложение представляет собой игру.
Получение доступа
Для работы с API аннулированных покупок вам необходимо разрешение на просмотр финансовой информации. Авторизация осуществляется через OAuth-клиент или сервисную учётную запись. Если вы используете сервисную учётную запись, включите разрешение «Просмотр финансовых отчётов» в этой учётной записи.
Дополнительную информацию о получении авторизованного доступа к API разработчиков Google Play см. в следующих руководствах:
- Настройка клиентов API-доступа
- Добавьте пользователей учетной записи разработчика и управляйте разрешениями
Просмотр аннулированных покупок
 Используйте метод GET для запроса списка аннулированных покупок. В запросе укажите полное имя пакета вашего приложения, например, com.google.android.apps.maps , и токен авторизации, полученный при получении доступа к API.
GET https://www.googleapis.com/androidpublisher/v3/applications/ your_package_name/purchases/voidedpurchases?access_token=your_auth_token
Вы также можете включить в свой запрос следующие параметры, каждый из которых является необязательным:
- время начала
- Время (в миллисекундах с начала эпохи Unix ) самой старой аннулированной покупки, которую вы хотите увидеть в ответе. По умолчанию - startTimeравно 30 дням назад.- API может отображать только аннулированные покупки, совершённые за последние 30 дней. Более старые аннулированные покупки не включаются в ответ, независимо от значения, указанного для - startTime.
- время окончания
- Время (в миллисекундах с начала эпохи Unix ) последней аннулированной покупки, которую вы хотите увидеть в ответе. По умолчанию - endTimeравен текущему времени.
- maxResults
- Максимальное количество аннулированных покупок, отображаемых в каждом ответе. По умолчанию это значение равно 1000. Обратите внимание, что максимальное значение для этого параметра также равно 1000.
- токен
- Токен продолжения предыдущего ответа, позволяющий просмотреть больше результатов.
- тип
- Тип аннулированных покупок, отображаемых в каждом ответе. Если установлено значение 0, будут возвращены только аннулированные покупки в приложении. Если установлено значение 1, будут возвращены как аннулированные покупки в приложении, так и аннулированные покупки по подписке. Значение по умолчанию — 0. 
- включаюЧастичноеВозмещениеНаОсновеКоличества
- Включать ли аннулированные покупки в частичные возвраты на основе количества, которые применимы только к покупкам с несколькими суммами. Если - true, дополнительные аннулированные покупки могут быть возвращены с- voidedQuantity, указывающим сумму возврата при частичном возврате на основе количества. Значение по умолчанию —- false.
 Ответ представляет собой строку JSON, содержащую список аннулированных покупок. Если количество результатов превышает число, указанное в параметре запроса maxResults , ответ включает значение nextPageToken , которое можно передать в последующий запрос для просмотра дополнительных результатов. Первый результат в списке отображает самую старую аннулированную покупку.
{
  "tokenPagination": {
    "nextPageToken": "next_page_token"
  },
  "voidedPurchases": [
    {
      "kind": "androidpublisher#voidedPurchase",
      "purchaseToken": "some_purchase_token",
      "purchaseTimeMillis": "1468825200000",
      "voidedTimeMillis": "1469430000000",
      "orderId": "some_order_id",
      "voidedSource": "0",
      "voidedReason": "4"
    },
    {
      "kind": "androidpublisher#voidedPurchase",
      "purchaseToken": "some_other_purchase_token",
      "purchaseTimeMillis": "1468825100000",
      "voidedTimeMillis": "1470034800000",
      "orderId": "some_other_order_id",
      "voidedSource": "2",
      "voidedReason": "5"
    },
  ]
}
Квоты
API аннулированных покупок устанавливает следующие квоты для каждого пакета:
- 6000 запросов в день. (День начинается и заканчивается в полночь по тихоокеанскому времени.)
- 30 запросов в течение любого 30-секундного периода.
Руководство по первоначальным запросам
Во время первого запроса к API вам может потребоваться получить все доступные данные для вашего приложения. Хотя это маловероятно, этот процесс может исчерпать вашу дневную квоту. Чтобы получить данные об аннулированных покупках более безопасным и последовательным способом, следуйте этим рекомендациям:
-  Используйте значение по умолчанию для параметра maxResults. Таким образом, если вы используете всю квоту запросов за день, вы сможете получить информацию о 6 000 000 аннулированных покупок.
-  Если ответ содержит значение nextPageToken, присвойте это значение параметруtokenво время следующего запроса.
Лучшие практики
Используя этот API в своём приложении, помните, что существует множество причин для отмены покупки, и не существует универсального решения, подходящего во всех случаях. При разработке политик и стратегий отзыва следует учитывать интересы пользователей. Для этого можно использовать следующие рекомендации:
- Используйте этот API как один из многих элементов комплексной стратегии борьбы с нежелательным поведением. Запрет доступа к продуктам внутри приложения обычно более эффективен в сочетании с разумными ценами на покупки внутри приложения, дизайном, препятствующим нежелательному поведению, сильной пользовательской базой, культура которой отвергает такое поведение, а также отзывчивыми и эффективными каналами поддержки пользователей.
- Администрируйте политику отзыва единообразно, чтобы обеспечить справедливость для всех пользователей.
- Рассмотрите возможность создания поэтапной политики реагирования на нежелательное поведение. Например, начните с предупреждений в приложении о ранних нарушениях, а затем ужесточайте меры реагирования по мере продолжения нежелательного поведения пользователя. В крайнем случае, вы можете вообще запретить пользователю взаимодействовать с вашим приложением.
- При внедрении политики отзыва и при каждом её обновлении используйте каналы связи в вашем приложении, чтобы информировать пользователей об изменениях. Дайте пользователям время, чтобы чётко понять эти изменения, прежде чем они вступят в силу в вашем приложении.
- Будьте прозрачны для своих пользователей и сообщайте им о любых ваших действиях, например, о закрытии доступа к продукту в приложении. В идеале пользователи должны иметь возможность оспорить ваши решения, и такие споры должны рассматриваться справедливо.
- Следите за формами обратной связи и форумами сообщества, чтобы понять, что побуждает пользователей вести себя нежелательно и как они это делают. Используйте эти данные в качестве первой линии защиты.