У меня есть простое приложение (требуется вход в систему с учетной записью). Я предоставляю несколько дополнительных функций для платных пользователей, например больше новостей.
Мне нужно записать, купил ли пользователь этот предмет в базе данных моего сервера. Когда я предоставляю данные на устройство пользователя, я могу затем проверить статус пользователя и предоставить другой контент для платного пользователя.
Я проверил официальный образец Trivialdrive, предоставленный Google, он не предоставляет образец кода для проверки на стороне сервера, вот мои вопросы.
- Я обнаружил, что образец использует открытый ключ моего приложения внутри для проверки покупки, это выглядит не очень хорошо, я думаю, что могу просто перенести процесс проверки на свой сервер в сочетании с учетными данными пользователя, чтобы увидеть, завершена ли покупка пользователя, а затем обновить базу данных.
- Также есть API покупки, который я могу использовать для запроса, мне нужно передать покупной токен пользователя на сервер.
Я не уверен, какой метод мне следует использовать, чтобы проверить покупку пользователя и отметить статус пользователя в моей базе данных, может быть, и то, и другое?
И я боюсь, что может возникнуть ситуация, если пользователь купил этот предмет в Google Play, но по какой-то причине, как раз в то время, когда мое приложение запускало проверку на моем сервере, сетевое соединение не работает или мой собственный сервер не работает , пользователь только что заплатил деньги в Google Play, но я не записал покупку на моем сервере? Что мне делать, как я могу справиться с этой ситуацией.
Ответы:
Похоже, то, что вы ищете, - это способ проверить, включены ли у пользователя премиум-функции в его учетной записи, поэтому я бы начал с этого;
Убедитесь, что в вашей базе данных есть какой-то флаг, указывающий, есть ли у пользователя расширенные функции, и включите его в полезные данные ответа API при запросе информации об учетной записи. Этот флаг будет вашим основным авторитетом для «премиум-функций».
Когда пользователь совершает покупку в приложении, кэшируйте данные (токен, идентификатор заказа и идентификатор продукта) локально на клиенте (т. Е. В приложении), а затем отправьте их в свой API.
Затем ваш API должен отправить его
purchaseToken
в API разработчика Google Play для проверки.Отсюда может произойти несколько вещей:
В случае 1. или 2. (коды состояния 2xx или 4xx) ваш клиент очищает кеш с деталями покупки, потому что они ему больше не нужны, поскольку API указал, что они были получены.
После успешной проверки (случай 1.) вы должны установить
premium
для пользователя значение true.В случае 3. (код состояния 5xx) или тайм-аута сети клиент должен продолжать попытки, пока он не получит код состояния 2xx или 4xx от вашего API.
В зависимости от ваших требований вы можете заставить его подождать несколько секунд перед повторной отправкой или просто отправить детали в свой API, когда приложение снова запускается или выходит из фона, если детали покупки присутствуют в кеше приложения.
Такой подход должен учитывать тайм-ауты сети, недоступность серверов и т. Д.
Теперь вам нужно рассмотреть несколько вопросов:
Что должно произойти сразу после покупки? Следует ли приложению ждать, пока проверка будет успешной, прежде чем предоставлять премиум-контент, или оно должно предварительно предоставить доступ и забрать его, если проверка не удалась?
Предоставление предварительного доступа к премиум-функциям упрощает процесс для большинства ваших пользователей, но вы также будете предоставлять доступ ряду мошеннических пользователей, пока ваш API проверяет
purchaseToken
.Другими словами: покупка действительна до тех пор, пока не будет доказана ее подделка; мошеннические, пока не будет доказана достоверность?
Чтобы определить, есть ли у пользователя действующая подписка, когда истечет период подписки для продления, вам нужно будет запланировать повторную проверку
purchaseToken
для запуска на том,expiryTimeMillis
что было возвращено в результате .Если
expiryTimeMillis
это в прошлом, вы можете установитьpremium
флаг в значение false. Если это в будущем, перепланируйте его снова на новоеexpiryTimeMillis
.Наконец, чтобы убедиться, что у пользователя есть премиум-доступ (или нет), ваше приложение должно запрашивать у вашего API сведения о пользователях при запуске приложения или когда он выходит из фона.
источник
Документация по этому поводу сбивает с толку и странно многословна с вещами, которые почти не имеют значения, в то время как действительно важная документация почти не связана и ее очень трудно найти. Это должно отлично работать на самой популярной серверной платформе, которая может запускать клиентские библиотеки API Google, включая Java, Python, .Net и NodeJS, среди прочих. Примечание. Я тестировал только клиент API Python, как показано ниже.
Необходимые шаги:
Создайте проект API по ссылке API Access в консоли Google Play.
Создайте новую учетную запись службы, сохраните сгенерированный закрытый ключ JSON. Вам нужно будет перенести этот файл на свой сервер.
Нажмите Готово в разделе учетной записи службы консоли Play, чтобы обновить ее, а затем предоставить доступ к учетной записи службы.
Получите клиентскую библиотеку API Google для своей серверной платформы по адресу https://developers.google.com/api-client-library.
Используйте клиентскую библиотеку вашей конкретной платформы, чтобы создать интерфейс службы и напрямую прочитать результат проверки вашей покупки.
Вам не нужно беспокоиться об областях авторизации, выполнении пользовательских запросов, обновлении токенов доступа и т. Д., Клиентская библиотека api позаботится обо всем. Вот пример использования библиотеки Python для проверки подписки:
Сначала установите клиент API Google в свой pipenv следующим образом:
Затем вы можете настроить учетные данные клиента api, используя json-файл закрытого ключа для аутентификации учетной записи службы.
Теперь вы можете подтверждать покупки подписки или продуктов напрямую с помощью библиотеки.
Документация по служебному интерфейсу платформы для API разработчика игр не связана легким способом, для некоторых это просто трудно найти . Вот ссылки на популярные платформы, которые я нашел:
Python | Java | .NET | PHP | NodeJS (Github TS) | Перейти (Github JSON)
источник
Полный пример использования клиентской библиотеки Google API для PHP :
Настройте свой проект Google и получите доступ к Google Play для своей учетной записи службы, как описано в ответе Марка здесь https://stackoverflow.com/a/35138885/1046909 .
Установите библиотеку: https://developers.google.com/api-client-library/php/start/installation .
Теперь вы можете проверить квитанцию следующим образом:
После этой покупки $ будет экземпляром Google_Service_AndroidPublisher_SubscriptionPurchase
источник
Вы можете попробовать использовать Purchases.subscriptions: получить на стороне сервера. Он принимает в качестве параметров packageName, subscriptionId и токен и требует авторизации .
В случае успеха этот метод возвращает ресурс Purchases.subscriptions в теле ответа.
источник
Я отвечаю на это беспокойство
Ситуация такая:
Пользователь покупает элемент "abc" с помощью службы Google Play -> вернуть ОК -> не удалось подтвердить с сервером по некоторым причинам, таким как отсутствие подключения к Интернету.
Решение:
На стороне клиента, прежде чем показывать кнопку «Google Кошелек», вы проверяете, принадлежит ли уже элемент «abc».
https://developer.android.com/google/play/billing/billing_reference.html#getSkuDetails
источник