Как проверить покупку для android-приложения на стороне сервера (google play в App billing v3)



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



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



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




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

  2. есть купить API Я могу использовать для запроса, что мне нужно, чтобы передать purchaseToken пользователя в сервер.


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



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

661   5  

5 ответов:

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

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

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

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

отсюда может произойти несколько вещей:

  1. квитанция действительна, ваш API отвечает клиенту с кодом состояния 200 Ok
  2. квитанция недействительна, ваш API отвечает клиенту с кодом состояния 400 Bad Request
  3. Google Играть API не работает, ваш API отвечает с 502 плохой код состояния шлюза

в случае 1. или 2. (2xx или 4xx коды состояния) ваш клиент очищает кэш деталей покупки, потому что он больше не нужен, потому что API указал, что он был получен.

после успешной проверки (случай 1.), вы должны установить premium флаг true для пользователей.

в случае 3. (5xx код состояния) или тайм-аут сети клиент должен сохранить попытка, пока он не получит код состояния 2xx или 4xx от вашего API.

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

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

есть несколько вопросов, которые вы должны рассмотрим:

что должно произойти сразу после покупки? Должно ли приложение ждать, пока проверка не будет успешной, прежде чем предоставлять премиум-контент, или оно должно предварительно предоставить доступ и забрать его, если проверка не удастся?

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

чтобы положить это в другой способ: покупка действительна, пока не доказана мошенническая или; мошенническая, пока не доказана действительная?

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

если expiryTimeMillis - это в прошлом, вы можете установить premium флаг в false. Если это в будущем, перепланируйте его снова для новый expiryTimeMillis.

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

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

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

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

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

  1. настройки Google Project и к Google Play для учетная запись службы как описано в ответе Марка здесь https://stackoverflow.com/a/35138885/1046909.

  2. установить библиотеку: https://developers.google.com/api-client-library/php/start/installation.

  3. теперь вы можете проверить свою квитанцию следующим образом:

    $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, как показано ниже.

необходимые действия:

  1. сделать проект API, из ссылки доступа к API в вашей консоли Google Play

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

  3. Нажмите кнопку Готово в разделе Учетная запись службы Play console, чтобы обновить, а затем предоставить доступ к учетной записи службы

  4. перейти получить клиентскую библиотеку Google api для вашей серверной платформы от https://developers.google.com/api-client-library

  5. используйте клиентскую библиотеку вашей конкретной платформы, чтобы построить интерфейс службы и непосредственно прочитать результат проверки покупки.

ты не нужно заморачиваться с областями авторизации, что делает пользовательские запросы звонки, освежающий маркеры доступа и т. д. клиентская библиотека 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}

документация для интерфейса сервиса платформы для play developer API не связана в легко найти кстати, для некоторых это прямо трудно найти. Вот ссылки на популярные платформы, которые я нашел:

Python/Java | .NET | PHP/NodeJS (Github TS)/ Go (Github JSON)

я отвечаю на это беспокойство

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

ситуация:

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

решение:

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

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

Купить Купить = минвентория.getPurchase ('abc');

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

else // show Google Wallet button

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

Comments

    Ничего не найдено.