Расходуется в приложении для проверки покупок

Недавно мы запустили приложение, которое покупает только внутри приложения. Мы заметили много поддельных покупок - покупки с недействительными квитанциями, а также с "действительными" квитанциями, но массив "in_app" в ответе о проверке от apple - пустой массив. Мне нужно знать, как пользователи формируют такие "действительные" квитанции? Это квитанция о загрузке приложения, а не о покупке в приложении или как? Сейчас я ставлю следующую проверку для проверки. Извлеките поле "in_app" в ответе json от Apple и, если оно не пустое, проверьте соответствие product_id или нет. Мне нужно знать, достаточно ли этого чека, или его лучше проверить.

1 ответ

Решение

Все приложения имеют квитанцию. Те приложения, которые приобрели IAP, имеют в квитанции поле in_app. Ваши пользователи вставляют ложный вызов в свой метод updatedTransaction, а вы забираете их квитанцию ​​(без IAP, потому что они не совершили покупку) и отправляете ее на свой сервер. Другие пользователи могут обменять некоторую квитанцию ​​откуда-то (например, один из 30 воров совершает покупку, извлекает эту действительную квитанцию ​​и отправляет ее своим 29 ворам). Если они вставят эту квитанцию ​​в свое устройство, а затем отправят вызов на updatedTransactions, то ваш сервер получит свою квитанцию, которая теперь действительна, но дублируется. Ваш сервер должен проверить *** дату получения и обнаружить, что она старше, чем недавняя, или, что еще лучше, старше, чем paymentRequest, который вам необходимо будет отправить на ваш сервер. (лучше декодировать на устройстве - гораздо безопаснее)

*** раньше вы могли проверять транзакции_id на наличие дубликата транзакции_идентификатора. К сожалению, вы больше не можете этого делать, так как restoreCompletedTransaction возвращает тот же номер транзакции, что и исходная покупка. Я сказал Apple об этом, и они проигнорировали меня.

Refer to this In-App Purchase FAQ My app validates its receipt with the App Store via paymentQueue:updatedTransactions: after a successful purchase. However, the returned receipt contains an empty in_app array rather than the expected products.

An empty in_app array indicates that the App Store has not recorded any transactions for the user yet. It may be that the application receipt has not yet been updated. When this happens, your app can inform the user that the receipt does not appear current and ask whether to refresh it.

Information about consumable products is added to the receipt when they are paid for and remains in the receipt until you finish the transaction. After you finish the transaction, this information is removed the next time the receipt is updated. Thus resulting into an empty in_app array if your app only sells consumable products.

Другие вопросы по тегам