Конечно, нельзя называть Apple Pay анонимным в принципе, хотя бы потому что к ней привязана наша банковская карта. Однако, в момент оплаты что о нас узнаёт продавец? Какие наши персональные данные получает продавец от Apple Pay?  Можно ли избежать передачи данных и, тем самым, сделать оплату анонимной в глазах продавца?  Когда мы полагаем, что оплачиваем через Apple Pay, то можем заблуждаться. В зависимости от того что мы приобретаем, используется один из двух механизмов Apple. При покупке любой материальной услуги действительно применяется Apple Pay. Однако, когда мы приобретаем цифровой контент в экосистеме Apple, применяется In-App Purchase. Заказываете Uber через Apple Pay? Верно, это Apple Pay. Оформляете подписку в Apple Music? Это уже In-App Purchase. Ниже мы рассказываем, какие данные утекают продавцу при оплате внутри приложений. Мы не стали разбирать ситуацию, когда товар оплачивается через POS-терминал, так как она требует отдельного внимания. Как уже было сказано выше, данный механизм оплаты используется только для цифрового контента. Электронные книги в Amazon Kindle, дополнительное пространство в Dropbox, скины в PUBG - это всё примеры цифрового контента. При анализе In-App Purchase выяснилось, что мы анонимны перед продавцом. Некоторая информация о нас все же передается продавцу, но в обезличенном виде. Если мы купим неприличную книгу в LitRes, то разработчики приложения не узнают, что именно мы её приобрели. При условии, что мы не поделились с приложением личной информацией иным путем.  Ниже представлена таблица, где мы видим какие данные In-App Purchase передает продавцу. In-App Purchase Как предотвратить передачу? Дата первой установки приложения Никак Список всех сделанных покупок Никак Биллинговая ошибка на стороне клиента (не хватает денег, карта неактивна) Никак Можно определить, когда мы первый раз скачали приложение, даже если удалим сейчас, но скачаем заново через пол года.  По сути, только дата покупки и что за продукт был приобретен. Если мы оформим автовозобновляемую подписку, а потом на карте закончатся деньги или карта будет неактивной, то разработчик узнает об этом. Приложение предлагает пользователю какой-то контент. Пользователь инициирует процесс покупки. Приложение показывает ему окно для совершения транзакции. После подтверждения приложение какое-то время думает. Контент предоставлен. В это время в приложении происходит целая череда событий. Большая часть из них скрыта внутри самой операционной системы, а именно системной библиотеки StoreKit. В результате покупки разработчик получит специальную строку receipt. Пример receipt receipt нужен для того, чтобы приложение смогло проверить, действительно ли пользователь совершил эту покупку. Обычно приложение передает эту строку на свой бекенд, а тот - в Apple, чтобы проверить покупку. Apple в ответ на запрос пришлет JSON. Он то нам и нужен: Оба примера взяты со StackOverflow. Чтобы определить дату первой установки, в JSON необходимо найти поле original_purchase_date. Это просто дата, когда приложение было скачано тем самым iTunes аккаунтом, через который совершается покупка. Поле in_app даст информацию о почти всех покупках, совершенных с этого iTunes аккаунта. Почти, потому что в нем не хранится информация о всех consumable покупках, только о текущей (как в примере выше). Consumable покупки - это покупки, которые можно совершать любое число раз, например, наборы монеток или кристаллов, за которые в приложении можно купить что-то. Все остальные покупки будут всегда храниться в этом поле. Причем, что интересно, если мы сделаем возврат покупки через Apple, то это действие также отобразится в этом массиве. То есть, когда мы в следующий раз придем покупать или восстанавливать покупку, разработчик может узнать не только как часто мы покупаем, но и как часто отменяем покупку. О нехватке баланса на карте можно будет узнать только в случае продления автовозобновляемой подписки. Эту информацию можно получить через App Store Server Notifications. Это система нотификаций от App Store, на которую подписывается бекенд и может обрабатывать разного рода сообщения. В конкретном случае нас интересует событие DID_FAIL_TO_RENEW Просто напомню, что Apple Pay предназначен для материальных товаров и услуг. Примерами могут быть: доставка еды в UberEATS, аренда дома в Airbnb, авиабилеты в Skyscanner. Исследование Apple Pay показало нам, что продавец однозначно понимает, кто у него покупает товар/услугу. Мы полностью открыты в глазах продавца. Можно ограничить доступ к некоторой информации о себе, но кардинально ситуацию не изменить. Ниже представлена таблица, где мы видим какие данные Apple Pay передает продавцу.  В момент, когда у нас выскакивает шторка с просьбой подтвердить оплату, продавец уже получает о нас информацию. Поле Значение Как предотвратить передачу? Тип карты Дебетовая/Кредитная Никак Примерный адрес доставки пользователя Страна, область, город, почтовый индекс Исказить или убрать в iOS. Настройки iOS → Wallet и Apple Pay → Параметры оплаты по умолчанию Примерный платежный адрес пользователя (если не запрошен адрес доставки) Страна, область, город, почтовый индекс Исказить или убрать в iOS. Приложение Wallet → Карта → Настройки → Адрес плательщика Информация о банке эмитенте карты (при наличии договоренности между разработчиком и банком) Название банка Никак Как только мы подтверждаем оплату с помощью Face ID, Touch ID или пароля, продавец получает новую порцию данных. Поле Значение Как предотвратить передачу? Платежная система Mastercard Никак Название карты с последними символами реальной карты MasterCard 2780 Никак Точный адрес доставки пользователя Страна, область, город, почтовый индекс, улица, дом, квартира До подтверждения оплаты исказить текст в самой шторке  Точный платежный адрес пользователя Страна, область, город, почтовый индекс, улица, дом, квартира Исказить или убрать в iOS. Приложение Wallet → Карта → Настройки → Адрес плательщика Имя Фамилия  Иван Иванов  Исказить или убрать в iOS. Находится там же, где и адрес доставки или платежный адрес. Номер телефона +77990001122 1. Либо до подтверждения оплаты исказить текст в самой шторке  2. Либо исказить/убрать в iOS. Настройки → Wallet и Apple Pay → Параметры оплаты по умолчанию Email Ivan@gmail.com После успешной оплаты продавец может запросить дополнительную информацию о нас. Информация запрашивается у того, кто непосредственно обрабатывает нашу оплату (эквайер). Поле Значение Как предотвратить передачу? IP покупателя 81.18.144.51 Никак Страна банка эмитента Россия Никак  Имя держателя карты IVAN IVANOV Никак  Срок истечения действия карты 202109 Никак  Маскированный номер карты, использованной для оплаты (указывается не реальный номер карты, а токен, который был привязан к устройству) 520424**0010 Никак  Шторка с подтверждением оплаты может выглядеть по-разному. Все зависит от того, какую информацию о нас запрашивает продавец. Любая запрошенная информация обязательна к заполнению. Обратимся к официальной документации и к тестовому приложению и попробуем сделать в нем платеж. Как только приложение показывает окно с суммой и просьбой подтвердить покупку, вызывается метод: Eсли при формировании let paymentRequest = PKPaymentRequest() еще запросить requiredShippingContactFields, то вызывается следующее: Целью этих методов является предоставление разработчикам возможности посчитать стоимость доставки, налогов или сделать скидку пользователям определенных карт. Они то и являются источником данных о типе карты, частичном адресе и информации о банке эмитенте. Если пользователь будет выбирать разные карты или адреса доставки, то эти методы будут вызываться при каждом изменении. По умолчанию адрес возвращаться не будет, но его можно запросить при показе окна с подтверждением. Сделать это можно, передав в соответствующие поля requiredShippingContactFields и requiredBillingContactFields те данные о пользователе, которые мы хотим получить. Стоит отметить, что если запрашивать requiredBillingContactFields вместе с  requiredShippingContactFields, то billingAddress не будет возвращаться до подтверждения покупки.  Если запросить только requiredBillingContactFields, то при выборе карты вызовется метод: Из объекта paymentMethod: PKPaymentMethod мы получим: А если запросим requiredShippingContactFields, то из метода didSelectShippingContact мы получим: Пользователь узнает требуются ли эти данные только после того, как окно платежа уже покажется, а данные - уйдут. Но если пользователь подтвердит покупку - мы получим еще больше: Кроме адреса можно запросить еще ФИО, email и номер телефона. Они будут получены после подтверждения оплаты: Но email и номер телефона можно получить только в случае запроса адреса доставки. При запросе адреса платежа такая информация не возвращается: Также после подтверждения платежа мы получим последние 4 цифры карты, ее платежную систему и название. Ниже пример такой информации для одной из тестовых карт Apple: Чтобы разобраться с тем, что можно получить от эквайера, обратимся к документации Сбербанка  Там много разной информации, но самыми интересными выглядят следующие параметры: ip - IP покупателя bankInfo - наименование страны банка-эмитента, если доступно cardAuthInfo - данные карты, привязанной к устройству expiration - срок истечения действия карты pan - маскированный номер карты номер, привязанный к мобильному устройству покупателя и выполняющий функции номера платёжной карты в системе Apple Pay cardholderName - имя держателя карты латиницей, если доступно Если адрес не выбран явно, то будет подтягиваться тот, что указан в адресе доставки. В этих настройках данные могут быть заданы напрямую, либо подтягиваться из карточки контакта из телефонной книги. Если данные были заданы здесь, то в телефонной книге их нельзя будет найти. Если же данные были введены в телефонной книге, то здесь они будут видны, но удалить их можно только через телефонную книгу. Это будет заметно по подписи под email или телефоном (домашний, рабочий и тд) и по тому, что не будет возможности удалить его. Компания