Как проверить покупку для android-приложения на стороне сервера (google play в App billing v3)
У меня есть простое приложение (требуется логин пользователя с учетной записью). Я предоставляю некоторые премиум-функции для платных пользователей, например, больше новостного контента.
Мне нужно записать, если пользователь купил этот элемент в моей базе данных сервера. Когда я предоставляю данные на устройство пользователя, я могу проверить состояние пользователя и предоставить другой контент для платного пользователя.
Я проверил официальный образец Trivialdrive, предоставленный Google, он не предоставляет пример кода для серверной части проверка, вот мои вопросы.
- Я нашел образец использовать открытый ключ моего приложения внутри, чтобы проверить покупку, это выглядит не хорошо, я думаю, что я могу просто переместить процесс проверки на мой сервер в сочетании с учетными данными пользователя, чтобы увидеть, завершена ли покупка пользователя, а затем обновить базу данных.
- есть купить API Я могу использовать для запроса, что мне нужно, это передать purchaseToken пользователя на сервер.
Я не уверен, какой метод я должен принять, чтобы проверить покупку пользователя и отметить статус пользователя в моей базе данных, может быть, оба?
и я боюсь, что есть ситуация, если пользователь купил этот элемент из google play, но по какой-то причине, как раз в то время, когда мое приложение запустило проверку на мой сервер,подключение к сети или сервер не работает, пользователь только что заплатил деньги в google play, но я не записал покупку на своем сервере? Что мне делать, как Я справляюсь с этой ситуацией.
5 ответов
похоже, что вы ищете способ проверить, есть ли у пользователя премиум-функции, включенные в их учетной записи, поэтому я бы начал с этого;
убедитесь, что в вашей базе данных есть флаг, указывающий, имеет ли пользователь премиум-функции, и включите его в полезную нагрузку ответа API при запросе информации об учетной записи. Этот флаг будет вашим основным авторитетом для "премиум-функций".
когда пользователь делает покупку в приложении, кэшируйте детали (токен, идентификатор заказа, и id продукта) локально на клиенте (i.e приложение), затем отправьте его в свой API.
ваш API должен затем отправить purchaseToken
до Google Play разработчик API для проверки.
несколько вещей могут произойти отсюда:
- квитанция действительна, ваш API отвечает клиенту с кодом состояния 200 Ok
- квитанция недействительна, ваш API отвечает клиенту с кодом состояния 400 Bad Request
- Google Play API не работает, ваш API отвечает кодом состояния 502 Bad Gateway
в случае 1. или 2. (2xx или 4xx коды состояния) ваш клиент очищает кэш деталей покупки, потому что он больше не нуждается в нем, потому что API указал, что он был получен.
после успешной проверки (случай 1.), вы должны установить premium
флаг true для пользователей.
в случае 3. (Код состояния 5xx) или сетевой таймаут клиент должен держать попытка, пока он не получит код состояния 2xx или 4xx из вашего API.
в зависимости от ваших требований, вы можете заставить его подождать несколько секунд перед отправкой снова или просто отправить детали в свой API, когда приложение запускается снова или выходит из фона, если детали покупки присутствуют в кэше приложения.
этот подход должен позаботиться о сетевых таймаутах, недоступности серверов и т. д.
есть несколько вопросов, которые вы должны подумайте:
что должно произойти сразу после покупки? Следует ли приложению дождаться успешной проверки, прежде чем предоставлять премиум-контент, или предварительно предоставить доступ и забрать его, если проверка не удалась?
предоставление предварительного доступа к премиум-функциям сглаживает процесс для большинства ваших пользователей, но вы также будете предоставлять доступ ряду мошеннических пользователей, пока ваш API проверяет purchaseToken
.
чтобы положить это в другой способ: покупка действительна до тех пор, пока не доказана мошенническая или; мошенническая до тех пор, пока не доказана действительность?
для того, чтобы определить, если пользователь все еще имеет действительную подписку, когда их период подписки подходит для продления, вам нужно будет запланировать повторную проверку на purchaseToken
на expiryTimeMillis
, который был возвращен в результат.
если expiryTimeMillis
- это в прошлом, вы можете установить premium
флаг в false. Если это в будущем, перепланируйте его снова для новый expiryTimeMillis
.
наконец, чтобы гарантировать, что пользователь имеет премиум-доступ (или нет), ваше приложение должно запросить ваш API для деталей пользователей при запуске приложения или когда он выходит из фона.
вы можете попробовать использовать покупки.подписки: get на стороне сервера. Он принимает packageName, subscriptionId и токен в качестве параметров и требует авторизация.
проверяет правильность покупки подписки пользователя и возвращает ее время истечения срока действия.
в случае успеха этот метод возвращает покупки.ресурс подписки в тело ответа.
пример использования клиентская библиотека Google API для PHP:
настройки Проект Google и к Google Play для учетная запись службы как описано в ответе Марка здесь https://stackoverflow.com/a/35138885/1046909.
установить библиотеку: https://developers.google.com/api-client-library/php/start/installation.
-
теперь вы можете проверить получение следующим образом:
$client = new \Google_Client(); $client->setAuthConfig('/path/to/service/account/credentials.json'); $client->addScope('https://www.googleapis.com/auth/androidpublisher'); $service = new \Google_Service_AndroidPublisher($client); $purchase = $service->purchases_subscriptions->get($packageName, $productId, $token);
после этого $ purchase является экземпляром Google_Service_AndroidPublisher_subscriptionpurchase
$purchase->getAutoRenewing(); $purchase->getCancelReason(); ...
документация по этому вопросу запутана и странно многословна с вещами, которые почти несущественны, оставляя фактически важную документацию почти несвязанной и очень трудно найти. Это должно отлично работать на самой популярной серверной платформе, которая может запускать клиентские библиотеки Google api, включая Java, Python, .Net и NodeJS. Примечание. Я тестировал только клиент API Python, как показано ниже.
необходимые действия:
сделать проект API, из ссылки доступа к API в консоли Google Play
создать новую учетную запись службы, сохранить закрытый ключ JSON, который генерируется. Вам нужно отнести этот файл на сервер.
Нажмите кнопку Готово в разделе Учетная запись службы Play console, чтобы обновить, а затем предоставить доступ к учетной записи службы
Go получить клиентскую библиотеку Google api для вашей серверной платформы от https://developers.google.com/api-client-library
- используйте клиентскую библиотеку вашей конкретной платформы, чтобы создать интерфейс службы и непосредственно прочитать результат проверки покупки.
ты не нужно беспокоиться об областях авторизации,совершать пользовательские запросы, обновлять токены доступа и т. д. клиентская библиотека api заботится обо всем. Вот пример использования библиотеки для проверки подписка:
во-первых, установите клиент Google api в pipenv следующим образом:
$ pipenv install google-api-python-client
затем вы можете настроить учетные данные клиента api с помощью файла JSON закрытого ключа для проверки подлинности учетной записи службы.
credentials = service_account.Credentials.from_service_account_file("service_account.json")
Теперь вы можете проверить покупки подписки или покупки продукта, используя библиотеку, напрямую.
#Build the "service" interface to the API you want
service = googleapiclient.discovery.build("androidpublisher", "v3", credentials=credentials)
#Use the token your API got from the app to verify the purchase
result = service.purchases().subscriptions().get(packageName="your.app.package.id", subscriptionId="sku.name", token="token-from-app").execute()
#result is a python object that looks like this ->
# {'kind': 'androidpublisher#subscriptionPurchase', 'startTimeMillis': '1534326259450', 'expiryTimeMillis': '1534328356187', 'autoRenewing': False, 'priceCurrencyCode': 'INR', 'priceAmountMicros': '70000000', 'countryCode': 'IN', 'developerPayload': '', 'cancelReason': 1, 'orderId': 'GPA.1234-4567-1234-1234..5', 'purchaseType': 0}
документация для интерфейса службы платформы для API разработчика play не связана в легко найти путь, для некоторых это прямо трудно найти. Вот ссылки на популярные платформы, которые я нашел:
Python | Java | .NET/ PHP | NodeJS (Github TS) | Go (Github JSON)
я отвечаю на это беспокойство
подключение к сети или свой собственный сервер, пользователь просто заплатил деньги в google play, но я не записал покупку в свой сервер? Что мне делать, как я могу справиться с этой ситуацией.
ситуация:
пользователь покупает элемент " abc " с помощью Google play service -> return OK -> не удается проверить с сервером по некоторым причинам, таким как отсутствие подключения к интернету.
решение:
на стороне клиента, прежде чем показывать кнопку "Google Wallet", вы проверяете, если элемент " abc " уже принадлежит.
- если да, проверьте с сервером еще раз
- если нет, покажите кнопку "Google Wallet".
Купить Купить = минвентори.getPurchase ('abc');
if (purchase != null) // Verify with server else // show Google Wallet button
https://developer.android.com/google/play/billing/billing_reference.html#getSkuDetails