Ответ 1
Уязвимый подход Apple,
Сервер может аутентифицировать покупку выполнив следующие действия:
-
Приложение iPhone получает
transactionReceipt
после покупки. Иметь iPhone base64 закодировать его (вы можете использовать этот open-source дополнение к NSData) и отправить его на ваш сервер. (Вы даже можете отправить его как есть, и сервер base64 кодирует его перед проверкой.) -
Попросите вашего сервера отправить запрос JSON с помощью одного ключа
receipt-data
с закодированным base64transactionReceipt
доhttps://buy.itunes.apple.com/verifyReceipt
используя HTTP POST. (Инструкции о том, как это сделать на разных серверных языках см. Этот сайт) -
Сервер ответит с помощью объекта JSON двумя ключами:
status
, который является целым числом иreceipt
, который является повторением квитанции.
Если статус равен нулю, квитанция должна быть принята, ненулевое значение означает, что квитанция недействительна.
Безопасные дополнения к Apple Approach
Однако есть несколько последствий для безопасности. Пользователь может использовать другую пользовательскую квитанцию, поскольку устройства не привязаны к квитанциям, или пользователь может использовать другую квитанцию продукта, так как сервер не проверяет идентификатор продукта квитанции. Чтобы этого не произошло, вы также должны сделать следующее:
-
Когда вы впервые получите квитанцию в приложении, немедленно отправьте ее на свой сервер вместе с UUID устройства через безопасный канал таких как HTTPS или SSL-сокет. Не храните его в любом месте, оставьте его в памяти.
-
На вашем сервере сохраните пар UUID и квитанцию в базе данных.
-
Когда устройство отправляет пару UUID и получение, проверьте в своей базе данных, что квитанция еще не была использована, и убедитесь, что квитанция действительно для вашего продукта, проверив идентификатор продукта получения. Квитанция - это просто объект JSON, поэтому ваш сервер может прочитать содержимое, расшифровав квитанцию из base64.
-
Верните ответ на устройство по защищенному каналу, сообщив ему, есть ли покупка:
- Аутентифицирован как новый (не был в БД и был действителен)
- Аутентификация в прошлом (одинаковые UUID и квитанция уже были в БД)
- Отказ от неправильного идентификатора продукта
- Отказано из-за того, что он уже использовал квитанцию с другим UUID.
Поскольку квитанция ведется только на памяти устройства, а ваше приложение использует UUID устройства ( может быть подделано jailbroken устройствами, см. комментарии), и все покупки вашего продукта регистрируются с UUID устройства на вашем сервере безопасным образом; пользователь не мог использовать другую квитанцию пользователя для проверки покупки и не мог использовать квитанцию от другого продукта, поскольку вы проверяете это.
Вы также можете проверить другие поля из квитанции, если хотите проверить другие данные транзакции. Например, если ваш продукт является подпиской, вам также захочется посмотреть дату транзакции.
Кроме того, пользователи не могут претендовать на роль своего сервера, имея устройство в частной сети с узлом с тем же именем, что и ваш, поскольку у них не будет вашего SSL-сертификата.
Отказоустойчивость
Поскольку сбой может произойти между тем, когда пользовательское устройство получит квитанцию и проверит ее с вашим сервером (например, если пользователь теряет связь или ваш сервер не работает для обслуживания), вы также должны позволить пользователю "повторно авторизировать", Повторная авторизация должна получить квитанцию из магазина (с помощью Restored Transaction) и отправить его на сервер так же, как если бы это было новое покупка. Это редко нужно использовать, но должно быть доступно, чтобы сохранить пользователя, который должен повторно купить продукт в случае сбоя сети.
Рассмотрение нескольких устройств
Это означает, что если пользователь хочет использовать приложение на нескольких устройствах, им придется приобретать продукт несколько раз. Это может быть желательным эффектом, но вы, вероятно, должны сообщать своим пользователям, прежде чем они купят, поскольку они могут ожидать, что смогут использовать контент на устройствах, связанных с их учетной записью.
Если квитанция также содержит информацию об учетной записи iTunes, аутентификация может использовать это, чтобы пользователи могли обмениваться контентом между всеми своими устройствами (но не их друзьями).