Подтвердить что ты не робот

Как проверить покупку приложения для Android на стороне сервера (Google Play в биллинге приложений v3)

У меня есть простое приложение (требуется учетная запись пользователя с учетной записью). Я предоставляю некоторые премиальные функции для платных пользователей, например, больше новостей.

Мне нужно записать, купил ли пользователь этот элемент в моей базе данных сервера. Когда я предоставляю содержимое данных пользовательскому устройству, я могу проверить статус пользователя и предоставить другой контент для платного пользователя.

Я проверил официальный образец Trivialdrive, предоставленный Google, он не предоставляет какой-либо пример кода для проверки на стороне сервера, вот мои вопросы.

  • Я нашел образец, использующий открытый ключ моего приложения для проверки покупки, выглядит не очень хорошо, я думаю, что могу просто перенести процесс проверки на свой сервер вместе с учетными данными пользователя, чтобы узнать, завершена ли покупка пользователя, а затем обновить базы данных.
  • Также есть API покупки. Я могу использовать для запроса, мне нужно передать пользовательскую покупкуToken на сервер.

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

И я боюсь, что возникнет ситуация, если пользователь купил этот товар из игры Google, но по какой-то причине именно в это время, когда мое приложение запустило проверку на моем сервере, сетевое подключение отключено или мой собственный сервер не работает, пользователь просто заплатил деньги в Google Play, но я не зарегистрировал покупку на своем сервере? Что мне делать, как я могу справиться с этой ситуацией.

4b9b3361

Ответ 1

Звучит то, что вы ищете, это способ проверить, включены ли функции премиум-класса в своей учетной записи, поэтому я начну,

Убедитесь, что в вашей базе есть какой-то флаг, указывающий, имеет ли пользователь премиум-функции и включает в себя полезную нагрузку на ответ API при запросе информации об учетной записи. Этот флаг будет вашим основным авторитетом для "премиальных функций".

Когда пользователь совершает покупку в приложении, кешируйте данные (токен, идентификатор заказа и идентификатор продукта) локально на клиенте (то есть приложение), а затем отправляйте его в свой API.

Затем ваш API должен отправить purchaseToken в API разработчика Google Play для проверки.

Несколько вещей могут произойти отсюда:

  • Квитанция действительна, ваш API отвечает клиенту кодом состояния 200 Ok
  • Квитанция недействительна, ваш API отвечает клиенту с кодом состояния 400 Bad Request
  • API Google Play не работает, ваш 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 для сведений о пользователях при запуске приложения или когда он выходит из фона.

Ответ 2

Вы можете попробовать использовать Purchases.subscriptions: получить серверную сторону. Он принимает packageName, subscriptionId и токен в качестве параметров и требует авторизацию.

Проверяет правильность покупки подписки пользователя и возвращает ее время истечения срока действия.

В случае успеха этот метод возвращает

ресурс Buy Purchases.subscriptions.

Ответ 3

Я отвечаю на эту озабоченность

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

Ситуация такова:

Пользователь покупает элемент "abc" с помощью сервиса google play → return OK → не удается проверить с сервером по некоторым причинам, таким как отсутствие подключения к Интернету.

Решение:

На клиентской стороне перед показом кнопки "Google Кошелек" вы проверяете, есть ли элемент "abc".

  • если да, проверьте с сервером снова
  • если нет, покажите кнопку "Google Кошелек".

Покупка покупки = mInventory.getPurchase('abc');

if (purchase != null) // Verify with server 

else // show Google Wallet button

https://developer.android.com/google/play/billing/billing_reference.html#getSkuDetails

Ответ 4

Полный пример использования Клиентская библиотека API Google для PHP:

  • Установите Проект Google и получите доступ к Google Play для вашей учетной записи службы, как описано в ответе Marc здесь fooobar.com/info/166279/....

  • Установите библиотеку: 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();
    ...