На волне всеобщего увлечения бесконтактной оплатой хочу поделиться подкапотным опытом Яндекс.Денег по запуску Apple Pay и Samsung Pay. Нашей команде пришлось координировать усилия с MasterCard и производителями смартфонов. Подружить эту компанию и не сойти с ума – задача сама по себе нетривиальная. Вдобавок мы были в первой волне тех, кто пришел на "праздник", и многие решения пришлось обкатывать на ходу.
Под катом подробности о подключении бесконтактных платежей в Яндекс.Деньгах, тестировании и особенностях работы систем безопасности с новым типом платежей.
В этом посте речь пойдет о платежных системах Apple Pay и Samsung Pay, которые основаны на схожих принципах и отличаются в деталях. Для простоты я буду называть их просто *Pay везде, где детали не принципиальны.
Зачем все это
Оплатить товар с телефона можно давно – достаточно установить мобильное приложение вашего банка, в котором должна быть опция бесконтактной оплаты (приложение Яндекс.Денег тоже подойдет, кстати). Данные о карте хранятся в защищенном виде на устройстве пользователя и доступны по технологии HCE – это программный аналог чипа банковской карты.
Есть и отдельные программы вроде Кошелька, которые предлагают возможности беспроводной оплаты для банков-партнеров и, в качестве бонуса, хранение скидочных карт.
Вот почему раньше для бесконтактной оплаты требовались дополнительные "прослойки":
Владельцы iPhone не могли платить бесконтактно, потому что интерфейс NFC в смартфонах Apple нельзя напрямую использовать для оплаты в сторонних приложениях. К тому же NFC появился только в iPhone 6 и SE.
- На многих современных смартфонах появилось отдельное устройство Secure Element (SE), которое выполняет функции EMV-чипа банковской карты и не привязано к конкретному банку или карте. Такое унифицированное решение удобнее пользователю и проще в реализации банку, у которого до этого не было оплаты со смартфона.
Apple Pay и Samsung Pay нужны в первую очередь для того, чтобы оплата со смартфона через NFC стала стандартизированной и безопасной.
Изначально платежные карты выпускались только с магнитной полосой, на которой был записан номер карты. Естественно, номер легко копировался, поэтому за дело взялась организация EMVCo, разработавшая более защищенный чип EMV. Эта мера позволила существенно сократить число мошеннических операций, но целиком проблему не решила. Кроме того, процесс оплаты был несовершенен и поэтому продолжались работы над дальнейшими улучшениями.
Далее появились бесконтактные платежи на пластике (MasterCard PayPass, VISA PayWave), а потом платежные функции карты стали частично переходить на мобильные устройства.
Путь был тернист, и среди прочих платежные системы пробовали следующие варианты:
SIM-карта со встроенным чипом Secure Element, выпускаемая совместно сотовым оператором и банком-эмитентом;
наклейка на телефон со встроенным беспроводным модулем и Secure Element;
- использование встроенного в телефон NFC-адаптера и программной эмуляции Secure Element (HCE).
В конечном счете MasterCard "перетасовал карты" и закрепил за производителями мобильных устройств функции хранения карточных данных и проведения оплаты. Так появился MasterCard Digital Enablement Service (MDES) от MasterCard, а затем и *Pay.
Но HCE все равно полностью не исчезла, так как позволяет банкам использовать собственные мобильные приложения для бесконтактной оплаты. То есть банк может самостоятельно добавить в свое приложение функцию оплаты с карты. Плюс к тому, в приложении можно реализовать какие-нибудь фирменные удобства вроде оплаты ЖКХ.
Кстати, в мобильных Яндекс.Деньгах тоже осталась опция бесконтактной оплаты через HCE — для всех тех, кто по разным причинам не может воспользоваться *Pay.
Подружить всех со всеми
Надеюсь, теперь все причинно-следственные связи восстановлены, поэтому вернемся к проекту бесконтактной оплаты Яндекс.Денег.
Если все равно что-то осталось туманным – обязательно спрашивайте в комментариях.
Все дальнейшие сценарии буду иллюстрировать на примере карт Яндекс.Денег, по которым набралось больше всего информации.
Чтобы пользователь мог непринужденно оплатить товар с телефона, нужно тесное сотрудничество четырех сторон:
сервиса бесконтактных платежей от производителя смартфона (Apple Pay и Samsung Pay);
платежной системы (MasterCard);
эмитента карточки (Яндекс.Деньги);
- банка-эквайера продавца.
Таким образом, команде Яндекс.Денег нужно было договориться с Apple, Samsung, Mastercard и реализовать поддержку обновленных платежных протоколов на своей стороне. Еще потребовалось добавить прием платежей через Apple Pay и Samsung Pay в Яндекс.Кассу – платёжное решение для бизнеса. Но это уже другая история.
На иллюстрации не хватает банка-эквайера – убрал его для простоты.
Когда пользователь добавляет карту в кошелек, Apple Wallet формирует криптограмму с зашифрованными данными карты и цифровой подписью, а затем отправляет ее в MasterCard. Там криптограмма расшифровывается и происходит токенизация. Токенизация – это формирование номера DPAN, который представляет собой синоним оригинальной карты, уникальный для каждого физического устройства.
Digital Primary Account Number (DPAN) – это специальный номер-токен, который платежная система выдает конкретному устройству для использования одной из карт пользователя. Такой номер уникален для каждого устройства и поэтому генерируется каждый раз при добавлении одной и той же карты в кошелек очередного устройства.
Токен нужен для того, чтобы не хранить на мобильном устройстве реальных платежных данных.
Но DPAN не будет сгенерирован, пока MasterCard не проверит поддержку *Pay на стороне эмитента, то есть Яндекс.Денег. Для этого необходимо:
Дождаться проверки Apple или Samsung возможности использовать устройство в качестве оплаты (не украден ли телефон, есть ли права Root и т.д.).
Подключиться к MasterCard Digital Enablement Service (MDES). Подробности о подобных приложениях едва ли не полностью подпадают под NDA, поэтому желающим придется запрашивать документацию напрямую у MasterCard.
Реализовать поддержку специфических запросов *Pay.
- Протестировать систему с Apple, Samsung и MasterCard. Тестирование частично выездное, поэтому тут все не так просто, как может показаться.
Но пользователь может захотеть добавить карту не вручную, а из приложения Яндекс.Денег. Такая возможность есть, но используется немного другой механизм.
Красный, желтый, зеленый
Когда пользователь добавляет карточку в кошелек телефона, запускается один из трех сценариев дальнейшего развития событий, в зависимости от степени риска:
Зеленый. Используется когда запрос на добавление карты приходит от мобильного приложения эмитента (Яндекс.Деньги) и в нем есть специальный ключ, подтверждающий аутентификацию пользователя в банковском приложении. Дополнительных проверок не требуется.
Желтый. Обычно используется при добавлении карты вручную или с помощью камеры телефона (OCR). Кошелек спросит CVV-код карты и запросит дополнительную аутентификацию.
- Оранжевый. Фактически означает отказ в добавлении карты.
Если у вас еще нет пластиковой карты Яндекс.Денег, то для пробы пера можно выпустить виртуальную прямо в приложении.
Но мы живем не в идеальном сферическом мире, поэтому часто будет использоваться именно желтый путь. Чтобы он тоже проходил гладко и на этапе распознавания реквизитов карты камерой не было проблем, мы отправили в Apple более 200 фото тестовых карточек. Без этого обучения алгоритм распознавания периодически ошибался и пытался добавить в кошелек карту с неверными данными.
Предполетная подготовка
Когда необходимый софт на бэкенде был готов, а бета-версия Яндекс.Денег обучена премудростям Apple Pay (для Samsung Pay опция токенизации через наше мобильное приложение пока недоступна), настала утомительная пора тестирования.
Кстати, для подключения к "банкету" недостаточно все реализовать и сообщить в MasterCard о готовности – платежная система и производители телефонов обязательно проверят вас лично. Например, по поводу Apple Pay к нам приехал товарищ из компании UL с набором всевозможных гаджетов Apple. Одних только iPhone у него было 6 штук — 3 поколения в 2 версиях (простая и Plus). С их помощью аудитор проверил множество сценариев оплаты, включая возврат средств.
Обновленный процессинг Яндекс.Денег работал в изолированном тестовом сегменте, поэтому для проверки использовался "белый список" карт – для них MasterCard просто включил платежи *Pay. Но вот с тестовой средой от Apple были некоторые сложности.
Например, отдельной платежной инфраструктуры для обкатки не было, поэтому тестировщикам Яндекс.Денег пришлось перевести свои смартфоны и Apple ID на регион "США" и подбирать ответы на некоторые запросы самостоятельно.
Но дьявол кроется в деталях, а ошибки – на последней миле. Оказалось, что далеко не все банки следят за обновлением прошивок своих терминалов, а кассирам в большинстве своем чужды современные технологии.
Карту давайте…
Моделей платежных терминалов и прошивок к ним довольно много, и у самых древних из них мозги сходили с ума от *Pay. Пришлось понимать и прощать, попутно сообщая в поддержку соответствующих банков о “небольших сложностях с POS-терминалом”.
Когда все уже вроде бы работало, по некоторым транзакциям в мобильный кошелёк стали приходить суммы с прочерком. Это явно означало проблемы вне систем Яндекс.Денег. Конечно, на саму оплату такие отчеты не влияли, но когнитивный диссонанс присутствовал.
(Не)лазейка для мошенников
Токенизация карт со стороны Яндекс.Денег, как и других банков, сопровождается проверкой таких запросов на мошеннические паттерны. Для этого в Яндекс.Деньгах существует отдельный механизм со своей сложной логикой и полномочиями блокировать крайне подозрительные операции – система антифрода.
Так как система работает на основе определенных правил, обнаружилась потенциальная проблема с безопасностью при токенизации чужой карты на устройство. Для этого нужны номер карты, срок действия и CVC2. Да, эмитент наверняка запросит дополнительную валидацию, но даже в случае с SMS-паролем фишинг и социальная инженерия работают. При сумме оплаты до 1000 рублей терминал даже пин-код не спросит, а SMS-оповещения включены до сих пор не у всех владельцев карт.
С такими угрозами можно бороться на уровне процессинга. Каждое действие пользователя со своим счетом или картой рассматривается в режиме онлайн фрод-машиной: если сработает хотя бы одно блокирующее правило, то транзакция будет отклонена.
Для каждого пользователя Яндекс.Денег формируется индивидуальный поведенческий профиль: что он любит и не любит, как и когда обычно платит, типичные периоды активности и множество других признаков. На основе этой информации и с помощью машинного обучения строится прогноз будущих значений, то есть наиболее вероятных действий человека. Если антифрод замечает отклонения фактических показателей от их прогноза, то может запросить дополнительную аутентификацию или отклонить транзакцию.
Про машинное обучение в системах безопасности можно много интересного рассказать в связи с его давним внедрением в Яндекс.Деньгах, но это уже тема отдельной статьи.
Если вы по работе сталкивались с другими нюансами подключения к *Pay – поделитесь в комментариях, многим будет любопытно.