#android #security #google-play #billing #in-app-billing
#Android #Безопасность #google-play #выставление счетов #выставление счетов в приложении
Вопрос:
Я пытаюсь внедрить систему для обновления / разблокировки различных функций моего приложения, используя «управляемые» покупки с выставлением счетов в приложении, и я увязаю в отсутствии подробной документации или примеров.
Цель моего приложения — извлекать / анализировать и отображать данные с моего собственного сервера и документацию по http://developer.android.com/guide/market/billing/billing_best_practices.html состояния:
Если вы используете удаленный сервер для доставки контента или управления им, попросите ваше приложение проверять состояние покупки разблокированного контента всякий раз, когда пользователь обращается к контенту.
Мой вопрос в том, каков наилучший способ сделать это с точки зрения фактического рабочего процесса?
Насколько я могу судить, при успешной покупке я бы сохранил информацию о покупке на своем сервере, а также локально в приложении. Когда приложение запускается, я отправляю идентификатор заказа на свой сервер, и сервер проверяет, действителен ли заказ (во-первых, проверяет, существует ли заказ в базе данных моего сервера, и, во-вторых, проверяет, не отозвал ли я заказ вручную по какой-либо причине).
Если это будет подтверждено, сервер отправит приложению ответ о том, что запрошенные функции «лицензированы», и приложение предоставит пользователю разблокированные функции / контент.
Очевидные проблемы, которые я вижу при этом, заключаются в:
- Корневой пользователь может легко просто изменить базу данных SQLITE локального приложения (или любой другой метод, который я использую для хранения информации о заказе), чтобы ввести действительный идентификатор заказа.
- Если доступ к сети отключен или мой сервер не работает, я все равно хочу, чтобы приложение могло запускаться (с кэшированными данными) со всеми приобретенными пользователем функциями.
Возможные способы решения первой проблемы, которую я вижу, включают отправку некоторого идентификатора устройства с запросом на проверку и отслеживание этого на стороне моего сервера — отзыв заказа, если большое количество устройств получают доступ к заказу за короткий промежуток времени.
Что касается второй проблемы, я не могу найти адекватного решения. Изначально я думал, что каждый раз, когда проверка проходит успешно, время, когда эта проверка состоялась, будет сохраняться. Затем приложение продолжало бы работать с разблокированными функциями, скажем, в течение 48 часов после последней успешной проверки. Проблема в том, как я могу безопасно сохранить это значение времени? Опять же, корневые пользователи могут просто изменить значение, и приложение ничего не узнает.
Кто-нибудь разработал серверную систему для управления покупками с выставлением счетов в приложении и может предложить некоторые предложения?
Ответ №1:
Лицензирование Google предоставляет способ, позволяющий сохранять сохраненный ответ «Ваша лицензия действительна».
Вы также можете зашифровать данные, которые вы храните. Если они заплатили за это, они получают возможность расшифровать это. Если доступ к сети недоступен, то реализуйте схему кэширования, аналогичную схеме лицензирования приложений (в настоящее время лицензируется по лицензии Apache версии 2.0).