Android: проверка квитанции о покупке inApp google play

Я использую кошелек Google в качестве своего платежного шлюза, после покупки продукта Google дал мне ответ ниже, который

{ 
 "orderId":"12999763169054705758.1371079406387615", 
 "packageName":"com.example.app",
 "productId":"exampleSku",
 "purchaseTime":1345678900000,
 "purchaseState":0,
 "developerPayload":"bGoa+V7g/yqDXvKRqq+JTFn4uQZbPiQJo4pf9RzJ",
 "purchaseToken":"rojeslcdyyiapnqcynkjyyjh"
 }

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

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


person Binil Surendran    schedule 01.02.2016    source источник
comment
Здравствуйте, Бинил, выполнили ли вы его для покупки подписки?   -  person Anshul Tyagi    schedule 24.02.2016
comment
свой продукт управления @Anshul Tyag   -  person Binil Surendran    schedule 24.02.2016
comment
@BinilSurendran .. Мой вопрос отличается от вашего, но мне нужно знать идентификатор электронной почты, который использовался для покупки в приложении. не могли бы вы помочь, как я могу получить это электронное письмо, так как оно мне нужно для дальнейшего использования в моем приложении   -  person Pallavi    schedule 19.10.2016
comment
@ Паллави. извините, у меня нет идеи получить идентификатор электронной почты покупателя. поскольку ответ Google после покупки не имеет email_id   -  person Binil Surendran    schedule 20.10.2016


Ответы (5)


Google обеспечивает проверку квитанции с помощью Google Play Developer API, в котором есть две конечные точки, которые могут вас заинтересовать больше всего: Purchases.products: get и Purchases.subscriptions: получить.

Purchases.products: get можно использовать для проверки покупки продукта без автоматического продления, где Purchases.subscriptions: get - для проверки и повторной проверки подписок на продукт с автоматическим продлением.

Чтобы использовать любую конечную точку, вы должны знать, packageName, productId, purchaseToken все это можно найти в полезной нагрузке, которую вы получили при покупке. Вам также понадобится access_token, который вы можете получить, создав учетную запись службы Google API.

Чтобы начать работу с учетной записью службы, сначала перейдите на страницу настроек доступа к API консоли разработчика Google Play. и нажмите кнопку Create new project:

Создайте новый Google  Проект API

Теперь вы должны увидеть новый связанный проект и несколько новых разделов. В разделе «Учетная запись службы» нажмите кнопку «Создать учетную запись службы».

Создать новую службу  Аккаунт

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

Откройте Google Developers  Консоль

Теперь нажмите Create new Client ID, выберите Service account из опций и нажмите Create Client ID.

Создать нового клиента  ID

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

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

Разрешить доступ

Затем в разделе «Выберите роль для этого пользователя» выберите «Финансы» и нажмите «Добавить пользователя».

Установите роль  Финансы

Теперь вы настроили свою учетную запись службы, и у нее есть все необходимые права для проверки квитанций. Далее следует обменять ваш JWT на access_token.

Срок действия access_token истекает через час обмена, поэтому вам понадобится код сервера, чтобы справиться с этим, и Google предоставил для этого несколько библиотек на многих языках (список не исчерпывающий):

Я не буду вдаваться в подробности, потому что существует множество документации по использованию этих библиотек, но я упомяну, что вы хотите использовать https://www.googleapis.com/auth/androidpublisher в качестве области OAuth2, client_email из JWT в качестве issuer и открытый ключ, который вы можете получить. из private_key, а кодовая фраза notasecret будет использоваться для signing_key.

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

Чтобы проверить статус покупки расходных материалов (без автоматического продления), отправьте http get запрос на: https://www.googleapis.com/androidpublisher/v2/applications/com.example.app/purchases/products/exampleSku/tokens/rojeslcdyyiapnqcynkjyyjh?access_token=your_access_token

Если вы получили код ответа 200 http, значит, все прошло как запланировано, и ваша покупка действительна. 404 означает, что ваш токен недействителен, поэтому покупка, скорее всего, была попыткой мошенничества. 401 будет означать, что ваш токен доступа недействителен, а 403 будет означать, что у вашей служебной учетной записи недостаточно доступа. Убедитесь, что вы включили Финансы для учетной записи доступа в консоли разработчика Google Play.

Ответ от 200 будет выглядеть примерно так:

{
  "kind": "androidpublisher#productPurchase",
  "purchaseTimeMillis": long,
  "purchaseState": integer,
  "consumptionState": integer,
  "developerPayload": string
}

Описание каждого свойства см. На странице https://developers.google.com/android-publisher/api-ref/purchases/products.

Подписки похожи, однако конечная точка выглядит так:

https://www.googleapis.com/androidpublisher/v2/applications/packageName/purchases/subscriptions/subscriptionId/tokens/token?access_token=you_access_token

И ответ должен содержать следующие свойства:

{
  "kind": "androidpublisher#subscriptionPurchase",
  "startTimeMillis": long,
  "expiryTimeMillis": long,
  "autoRenewing": boolean
}

См. https://developers.google.com/android-publisher/api-ref/purchases/subscriptions для описания свойств и обратите внимание, что startTimeMillis и expiryTimeMillis могут быть изменены в зависимости от продолжительности подписки.

Удачного подтверждения!

person Marc Greenstock    schedule 01.02.2016
comment
Я добавляю нового пользователя в консоль разработчика, и у меня есть сертификат JSON, который я получаю из консоли. Не могли бы вы помочь мне, как выполнить проверку квитанции с помощью загруженного файла @Marc Greenstock - person Binil Surendran; 03.02.2016
comment
@BinilS Вам нужно будет уточнить, на каком серверном языке вы будете писать свой код? - person Marc Greenstock; 03.02.2016
comment
я использую Java на стороне сервера @Marc Greenstock - person Binil Surendran; 03.02.2016
comment
Спасибо @MarcGreenstock за прекрасный ответ. Как я могу обменять свой JWT на access_token в PHP? Любые идеи ? Спасибо ;) - person user1269586; 30.06.2017
comment
Я впервые вижу подробное руководство по внедрению валидации серверных платежей за 2 дня поиска. Пальцы вверх. Есть ли где-нибудь готовый к использованию серверный код? Мне очень странно, что я нигде не могу найти что-то подобное - person Anonymous; 24.09.2017
comment
Когда я запускаю этот процесс в тестовой подписке, я получаю код состояния 400. Мой ответ: <HttpError 400 when requesting https://www.googleapis.com/androidpublisher/v2/applications/com.frt.ballogyapp/purchases/subscriptions/android.test.purchased/tokens/inapp%3Acom.frt.ballogyapp%3Aandroid.test.purchased?alt=json returned "Invalid Value"> Это ожидаемое поведение или я что-то делаю не так? - person Muhammad Hassan; 10.10.2017
comment
Не могли бы вы помочь мне с этим вопросом, пожалуйста? - person StuartDTO; 27.11.2017
comment
@M Hassan Это ожидаемый результат, если вы передадите недопустимое значение токена. - person ZW1404; 30.11.2017
comment
@MarcGreenstock Спасибо за подробный ответ. - person Lavakush; 07.12.2017
comment
@MarcGreenstock можно ли использовать только ключ API вместо OAuth для проверки токенов покупки на моем собственном сервере? - person Pixel; 20.05.2018
comment
@Antinous Вы можете использовать процесс аутентификации, описанный на странице developers.google.com/android-publisher/authorization вместо этого может быть проще - person Marc Greenstock; 21.05.2018
comment
@MarcGreenstock В итоге я заставил его работать на PHP примерно за 5 строк кода. Было действительно прямолинейно. Вам просто нужно настроить учетную запись службы и передать ей credentials.json файл с идентификатором пакета, идентификатором sku и токеном покупки, который можно отправить на ваш сервер через TLS POST. PS отличный основной ответ :-D - person Pixel; 21.05.2018
comment
Я знаю, что проверка квитанции через Google API рекомендуется здесь. Однако, если квитанция подтверждена до шага 3, и сервер помнит, какой orderId был проверен ранее, нужен ли мне шаг 4? - person Comtaler; 29.05.2018
comment
@Marc Greenstock, не могли бы вы разместить ссылку на документы Google по кодам возврата (200, 4 **, 5 **)? Текущая документация Google по v3 api очень отрывочна. - person Petr; 15.10.2018
comment
Коды ответов @Comtaler можно найти здесь: developers.google.com/search -ads / v2 / стандартные-ошибки-ответы - person Marc Greenstock; 17.10.2018
comment
@MarcGreenstock ... токены / токены? Access_token = you_access_token неверны. Согласно их документам, на самом деле это должна быть покупка токен, выданный устройству игровым магазином. - person rmlarsen; 01.03.2019
comment
Спасибо за блестящий ответ! Это должно быть в официальных документах Google Play Store, но все, что я вижу, - это разные фрагменты информации, которые манипулируют условиями Google, такими как учетная запись службы, вместо того, чтобы давать простой, но четкий ответ, как вы это сделали там. Спасибо еще раз! - person GuardianX; 19.03.2020
comment
@MarcGreenstock Можете ли вы поделиться примером получения токена доступа? - person Muntasir Aonik; 07.04.2020

Ответ Марка отличный. Я только добавлю, что клиентская библиотека API разработчика Google Play для Java значительно упрощает подключение с вашего сервера к серверам Google Play. Библиотека автоматически обрабатывает обновление токена аутентификации, а также предоставляет безопасный API-интерфейс, поэтому вам не нужно возиться с URL-адресами.

Вот как вы настраиваете Publisher синглтон:

httpTransport = GoogleNetHttpTransport.newTrustedTransport();
jsonFactory = JacksonFactory.getDefaultInstance();      
credential = GoogleCredential.fromStream(getClass().getResourceAsStream("/path/to/your/key.json")).createScoped(Collections.singleton(AndroidPublisherScopes.ANDROIDPUBLISHER));
publisher = new AndroidPublisher.Builder(httpTransport, jsonFactory, credential).setApplicationName(APP_NAME).build();

Следующий код запрашивает покупку продукта:

ProductPurchase product = publisher.purchases().products().get(PACKAGE_NAME, sku, token).execute();
Integer purchaseState = product.getPurchaseState();
product.getPurchaseTimeMillis();
product.getConsumptionState();
product.getDeveloperPayload();

Вы можете аналогичным образом запросить подписки:

SubscriptionPurchase sub = publisher.purchases().subscriptions().get(PACKAGE_NAME, sku, token).execute();
sub.getAutoRenewing();
sub.getCancelReason();
...
person Jeshurun    schedule 18.03.2017
comment
Это код на сервере Java или выполняется на Android перед вызовом на произвольный сервер? - person user; 13.09.2017
comment
@jeshurun ​​Спасибо за код. Другим читателям APP_NAME = APP_PACKAGE_NAME. - person blizzard; 19.12.2017
comment
А как насчет Python? - person Babken Vardanyan; 31.01.2018
comment
Спасибо! Для меня вместо getClass().getResourceAsStream(... я использовал new FileInputStream(.... - person António Almeida; 20.03.2018
comment
Спасибо. Очень полезный. Однако мне также нужно было добавить: credential.refreshToken(); между получением учетных данных и издателем. - person grooble; 11.05.2019

@ marc-greenstock предоставил отличный ответ, однако есть очень важная вещь о проверке квитанции с помощью Google Play Android Developer API.

Если у вас возникли проблемы с использованием этого API, и вы добавили продукт для продажи в приложении ПЕРЕД предоставлением разрешения или привязкой к своей учетной записи службы, вам необходимо открыть «Продукты для продажи» и выполнить некоторое обновление. Вы можете, например, отредактировать описание вашего продукта и сохранить. Вы должны немедленно получить разрешение.

Я провел несколько часов, думая, что я сделал не так ...

person Wojciech Kulik    schedule 15.03.2020

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

См. Параметры create-play-service-credentials. Используйте ту же основную учетную запись, с которой вы создавали свои продукты для продажи.

Убедитесь, что вы удалили предыдущий.

Ссылка на проект разработчика Google. Ваша учетная запись разработчика Google Play должна быть связана с проектом разработчика Google.

1а. Откройте меню "Настройки"> "Учетная запись разработчика" и выберите "Доступ через API".

API-доступ

1б. Выберите "Ссылка", чтобы связать свою учетную запись Play с проектом Google Developer.

select-project-link

1c. Примите условия использования

согласен-условия-условия

2. Создание учетной записи службы Затем нам нужно создать учетную запись службы. Это делается из консоли Google API.

2а. Выберите "Создать учетную запись службы".

create-service-account

2б. Создайте учетные данные для ключа сервисного аккаунта

service-account

2c. Введите данные для служебного аккаунта

enter-service-account-details

2д. Загрузите свои учетные данные JSON:  json-credentials

3. Предоставить доступ

3а. В Play Console выберите "Предоставить доступ к вновь созданному сервисному аккаунту".

грант-доступ

3б. Предоставьте следующие разрешения:

apply-permissions

После этого подождите 48 часов, чтобы Google мог распространить все права доступа для API.

person Ankit Jindal    schedule 16.11.2020
comment
Привет, я выполнил следующие действия, чтобы получить доступ к Google Play Android Developer API. При предоставлении этого разрешения он просит меня пригласить пользователя .. что нам делать, он показывает мне, что идентификатор учетной записи службы будет приглашен для доступа к этой учетной записи разработчика .. любая идея ? - person Jay Rathod RJ; 11.12.2020
comment
Является ли это альтернативой sasikanth.dev/posts/iap-verification-using-cloud- функции? Я полностью сбит с толку, использовать ли Firebase ... что само по себе кажется недостаточным, поскольку существует потребность в базе данных (из блога) Я бы предложил сохранить информацию о покупке в базе данных и перекрестную проверку с другими пользователями, чтобы избегайте дублирующих подписок - person Rahul Kahale; 11.12.2020
comment
Странно, шаг 3 у меня не работает. Play Console по-прежнему не отображает созданный сервисный аккаунт. - person Houman; 26.03.2021
comment
@Houman Кажется, теперь требуется дополнительный шаг между 2d + 3 (май 21 г.). После 2d вам нужно щелкнуть IAM слева и добавить новую учетную запись службы в качестве нового участника. Затем он должен появиться в Play Console, чтобы перейти к шагу 3. - person dead_can_dance; 17.05.2021
comment
@dead_can_dance, можете ли вы добавить этот новый шаг между 2-м и 3-м? - person Ankit Jindal; 17.05.2021

Это отличный ответ. Еще одна проблема, с которой мы столкнулись, следуя указанию, заключалась в том, что учетная запись службы не отображалась в консоли Google Play. В итоге мы нашли это решение, которое помогло: Учетная запись службы не не отображаются в консоли Google после создания

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

person soarling    schedule 19.09.2018
comment
Можете добавить сюда описание. Еще один раз, если ссылка будет отозвана, ваш ответ станет недействительным - person Mathews Sunny; 19.09.2018
comment
Какую роль должна быть добавлена ​​учетная запись? - person Adi; 05.10.2019