Гарантирует ли queryPurchases () из Play Billing Library получение действительной покупки?

Я использую библиотеку выставления счетов Google Play, и я прочитал документацию и все вопросы о проверке покупок на сервере и о том, как запрашивать покупки.

Однако некоторые моменты все еще не ясны, и я не смог найти здесь ответы на них.

Чтобы получить покупки в следующий раз, когда пользователь запустит приложение, в документации говорится, что мы должны использовать BillingClient.queryPurchases(), и о списке, полученном этим методом:

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

Из этого я понимаю, что только queryPurchases () гарантирует, что пользователь действительно купил элемент и должен получить к нему доступ.

Это правда?

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



Ответы (1)


Добро пожаловать в stackoverflow!

queryPurchases() полностью безопасен, если подпись полученных данных надежно проверена.

Проблема в том, что есть некоторые хакерские приложения, которые позволяют людям совершать мошеннические покупки, а также изменяют код устройства, чтобы оно нормально возвращалось при любой проверке подписи. Это возможно только на устройствах с root-доступом, и это маловероятно, потому что Google внимательно следит за проблемой, но это все еще возможно !.

У мошеннической покупки никогда не будет правильной подписи, поскольку она может быть сгенерирована только с помощью ключа, созданного Play Console специально для вашего приложения.

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

Когда Google обращается к проверке на стороне сервера, это относится к проверке подписи на сервере, а не к ведению параллельного списка покупок.

Вот пример того, как это сделать, данные для проверки - это данные purchase.getOriginalJson(), а подпись находится в purchase.getSignature() https://stackoverflow.com/a/48531877/7690376

Надеюсь, это поможет.

Обновление. Также удобно предусмотреть в коде другую альтернативу проверки подписи на случай, если ваш сервер не работает или нет доступа к Интернету.

person Lluis Felisart    schedule 10.05.2020
comment
Спасибо за ответ. Однако у меня нет проблем с проверкой покупок. Я делаю это на сервере, используя (SKU, токен покупки и имя пакета), когда пользователь впервые покупает товар. Но когда он в следующий раз воспользуется приложением, безопасно ли я просто запрашивать покупки, используя queryPurchases() в автономном режиме, или я должен каждый раз проверять эти покупки на сервере для покупок в queryPurchases()? Вскоре. Как лучше всего выпускать премиум-элементы, когда пользователь снова воспользуется приложением позже? - person Homam; 10.05.2020
comment
Если вы не подтверждаете подпись, вы не подтверждаете покупку. queryPurchases () безопасен только в том случае, если подпись полученных данных надежно проверена. - person Lluis Felisart; 10.05.2020
comment
Вы имеете в виду, что нужно проверять покупки, полученные от queryPurchases() на сервере каждый раз при запуске приложения и каждый раз, когда оно выходит из фона? - person Homam; 10.05.2020
comment
Каждый раз, когда ваш код вызывает queryPurchases(). Когда вы должны это называть, это часть общего дизайна вашего приложения, которую вы должны определить. - person Lluis Felisart; 10.05.2020