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

92

Я использую кошелек 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покупках.

Бинил Сурендран
источник
Здравствуйте, Бинил, выполнили ли вы его для покупки подписки?
Anshul Tyagi
свой продукт управления @Anshul Tyag
Бинил Сурендран
@BinilSurendran .. Мой вопрос отличается от вашего, но мне нужно знать идентификатор электронной почты, который использовался для покупки в приложении. Не могли бы вы помочь, как я могу получить это электронное письмо, поскольку оно мне нужно для дальнейшего использования в моем приложении
Паллави
@ Паллави. извините, у меня нет идеи получить идентификатор электронной почты покупателя. в ответе google после покупки нет email_id
Бинил Сурендран,

Ответы:

216

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

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

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

Чтобы начать работу с учетной записью службы, сначала перейдите на страницу настроек доступа к API консоли разработчика Google Play и нажмите кнопку «Создать новый проект»:

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

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

Создать новую учетную запись службы

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

Откройте консоль разработчика Google.

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

Создайте новый идентификатор клиента

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

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

Предоставление доступа

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

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

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

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

Я не буду вдаваться в подробности, потому что существует множество документации о том, как использовать эти библиотеки, но я упомяну, что вы хотите использовать область https://www.googleapis.com/auth/androidpublisherдействия OAuth2, объект client_emailJWT в качестве 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 будут меняться в зависимости от продолжительности подписки.

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

Марк Гринсток
источник
Я добавляю нового пользователя в консоль разработчика, и у меня есть сертификат JSON, который я получаю из консоли. Не могли бы вы помочь мне, как выполнить проверку квитанции с загруженным файлом @Marc Greenstock
Бинил Сурендран
@BinilS Вам нужно будет уточнить, на каком серверном языке вы будете писать свой код?
Марк Гринсток
Я использую Java на стороне сервера @Marc Greenstock
Бинил Сурендран
3
Я впервые вижу подробное руководство по внедрению валидации серверных платежей за 2 дня поиска. Пальцы вверх. Есть ли где-нибудь готовый к использованию серверный код? Мне очень странно, что я нигде не могу найти что-то подобное
Аноним
2
@MarcGreenstock Спасибо за подробный ответ.
Lavakush 07
28

Ответ Марка отличный. Я только добавлю, что клиентская библиотека 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();
...
Jeshurun
источник
Это код на сервере Java или выполняется на Android перед вызовом на произвольный сервер?
пользователь
2
@jeshurun ​​Спасибо за код. Другим читателям APP_NAME = APP_PACKAGE_NAME.
метель
1
А как насчет Python?
Бабкен Варданян
1
Спасибо! Для меня вместо того, чтобы getClass().getResourceAsStream(...использовать new FileInputStream(....
Антониу Алмейда,
Спасибо. Очень полезно. Однако мне также нужно было добавить: credential.refreshToken();между получением учетных данных и издателем.
grooble
5

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

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

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

Войцех Кулик
источник
2

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

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

парящий
источник
Вы можете добавить сюда описание. Еще один раз, если ссылка будет отозвана, ваш ответ станет недействительным
Мэтьюз Санни,
1
Какую роль должна быть добавлена ​​учетная запись?
Ади