Учебный класс для продажи продуктов In-app в Android предлагает использовать полезную нагрузку при оформлении запроса на покупку:
Пятый аргумент содержит "полезную строку разработчика", которую вы можете использовать для отправки дополнительной информации о заказе (это может быть пустая строка). Как правило, это используется для передачи в токенах строк, которые однозначно идентифицируют этот запрос на покупку. Если вы укажете строковое значение, Google Play вернет эту строку вместе с ответом на покупку. Впоследствии, когда вы делаете запросы об этой покупке, Google Play возвращает эту строку вместе с деталями покупки.
Рекомендация по безопасности:. Хорошая практика - передать строку, которая помогает вашему приложению идентифицировать пользователя, совершившего покупку, чтобы впоследствии вы могли убедиться, что это законная покупка этого пользователя. Для расходных элементов вы можете использовать произвольно сгенерированную строку, но для непотребимых элементов вы должны использовать строку, которая однозначно идентифицирует пользователя.
Реализация страницы покупки IAB имеет аналогичную рекомендацию с дополнительным предложением о том, что значение полезной нагрузки должно быть проверено на вашем собственном защищенном сервере:
Рекомендация по безопасности:. Когда вы отправляете запрос на покупку, создайте токен String, который однозначно идентифицирует этот запрос на покупку и включает этот токен в DeveloperPayload. Вы можете использовать произвольно сгенерированную строку в качестве токена. Когда вы получите ответ на покупку от Google Play, обязательно проверьте возвращенную подпись данных, orderId и строку разработчикаPayload. Для дополнительной безопасности вы должны выполнить проверку на своем собственном безопасном сервере. Убедитесь, что orderId является уникальным значением, которое вы ранее не обрабатывали, а строка разработчикаPayload соответствует маркеру, который вы отправили ранее с запросом на покупку.
Если посмотреть на исходный код приложения Trivial Drive, который Google использует для демонстрации API, я нахожу это предупреждение:
* WARNING: Locally generating a random string when starting a purchase and
* verifying it here might seem like a good approach, but this will fail in the
* case where the user purchases an item on one device and then uses your app on
* a different device, because on the other device you will not have access to the
* random string you originally generated.
*
* So a good developer payload has these characteristics:
*
* 1. If two different users purchase an item, the payload is different between them,
* so that one user purchase can't be replayed to another user.
*
* 2. The payload must be such that you can verify it even when the app wasn't the
* one who initiated the purchase flow (so that items purchased by the user on
* one device work on other devices owned by the user).
*
* Using your own server to store and verify developer payloads across app
* installations is recommended.
Итак, из всех этих сообщений звучит неплохо использовать случайное число/строку для полезной нагрузки. Кроме того, после прочтения последнего предупреждения звучит неплохо, чтобы передать идентификатор устройства в качестве полезной нагрузки, так как он будет отличаться для одного и того же пользователя на разных устройствах. Итак, что нужно использовать для полезной нагрузки разработчика?
Мое приложение предоставляет локальные функции, которые могут быть доступны пользователю без необходимости входа в службу. Таким образом, нет понятия "пользователь", а также нет компонента на стороне сервера. Запрос на покупку в приложении - это обновление, которое удаляет объявления из приложения. Имеет ли смысл приложение, подобное этому, использовать функцию полезной нагрузки, или мне лучше просто использовать пустую строку для нее и оставить ее склонной к повторным атакам?