Аутентификация 3‑D Secure
Общая информация
Обзор
Аутентификация пользователей с использованием протокола 3‑D Secure (Three-Domain Secure) предназначена для защиты от мошенничества при проведении онлайн-платежей с использованием платёжных карт. Она может выполняться с применением различных способов проверки подлинности пользователей: например, через указание пользователем одноразового проверочного кода (One Time PIN, OTP), через распознавание лица пользователя, с помощью проверки отпечатка пальца пользователя на его мобильном устройстве или даже без каких-либо действий со стороны пользователя, на основе имеющейся информации о нём, его устройстве и инициированном платеже. При этом в разных случаях со стороны эмитентов могут поддерживаться различные способы проверки.
В аутентификации 3‑D Secure задействуются три домена:
- Домен эквайера. В рамках работы с платёжной платформой ecommpay к нему относятся веб-сервисы мерчантов, платёжная платформа и связанный с ней 3DS-сервер.
- Домен совместимости. К нему относятся серверы каталогов (Directory Servers, DS) международных платёжных систем.
- Домен эмитента. К нему относятся серверы управления доступом (Access Control Servers, ACS) эмитентов, а также страницы аутентификации (ACS-страницы), открываемые при обращениях к этим серверам.
Между этими доменами осуществляется обмен сообщениями, необходимыми для аутентификации пользователей. К таким сообщениям могут относиться запросы на аутентификацию (Authentication Request Message, AReq) и ответы на них (Authentication Response Message, ARes), а также запросы на подтверждение личности пользователя (Challenge Request, CReq) и ответы с информацией о результатах такого подтверждения (Challenge Response, CRes).
При работе с аутентификацией 3‑D Secure следует учитывать, что информация о возможности аутентификации держателей карт хранится на серверах управления доступом, и эту информацию в случае с каждой картой можно получить только после отправки запроса на проведение платежа. Также со стороны веб-сервиса и платёжной платформы невозможно отслеживать действия пользователей на страницах аутентификации — доступно лишь получение информации о результатах аутентификации.
Варианты аутентификации
При работе с протоколом 3‑D Secure могут применяться два варианта аутентификации:
- Аутентификация с подтверждением пользователем своей личности (challenge flow). В этом случае подтверждение личности пользователя выполняется, например, с использованием одноразового кода или биометрических данных, если такая возможность поддерживается эмитентом.
- Аутентификация без участия пользователя (frictionless flow). В этом случае личность пользователя подтверждается исходя из информации, которой располагает эмитент.
Со стороны мерчанта выбирать варианты аутентификации нельзя — можно лишь указывать предпочтения по такому выбору для конкретных платежей, но итоговое решение каждый раз принимается на стороне эмитента. Также, помимо указания предпочтений, в запросах на проведение платежей можно передавать ряд других необязательных параметров, применение которых может повышать вероятность выбора варианта аутентификации frictionless flow и, как следствие, способствовать повышению проходимости и улучшению пользовательского опыта. Информация о таких параметрах представлена далее.
Особенности
Область применения
Выполнение аутентификации 3‑D Secure, как правило, обязательно для платежей с прямым использованием платёжных карт. Это связано с требованиями второй директивы о платёжных услугах (Payment Services Directive 2, PSD2), включающими в себя необходимость выполнения строгой аутентификации пользователя (Strong Customer Authentication, SCA) при проведении таких платежей.
К платежам, на которые не распространяются требования PSD2 к строгой аутентификации, относятся:
- Оплаты с использованием платёжных карт, выпущенных за пределами Европейской экономической зоны.
- Оплаты с использованием анонимных предоплаченных платёжных карт, например с использованием подарочной карты или виртуальной карты с предоплаченной стоимостью.
- Оплаты категории Mail Order/Telephone Order (MO/TO).
- Оплаты, инициируемые мерчантом (Merchant-initiated transactions, MIT), к которым в платёжной платформе ecommpay относятся регулярные оплаты и автооплаты (с типом платежа
recurring), а также операции по изменению суммы предварительной блокировки (с типом операцииincremental). - Оплаты с использованием большинства альтернативных платёжных методов.
В платёжной платформе ecommpay поддерживается определение таких платежей, и аутентификация для них не выполняется.
Допустимые исключения
Среди тех платежей, на которые распространяются базовые требования к строгой аутентификации, директива PSD2 допускает наличие исключений (SCA Exemptions), при которых аутентификация может не выполняться по решениям эмитентов. Такими исключениями могут выступать платежи следующих категорий:
- Платежи на незначительные суммы (Low value) — оплаты на суммы до 25 фунтов стерлингов (в пределах Великобритании) или 30 евро (в пределах Европейской экономической зоны), в случаях, когда с момента последней успешной аутентификации было проведено не более пяти платежей и общая сумма этих платежей не превышает 85 фунтов стерлингов или 100 евро соответственно.
- Платежи с низким уровнем риска (Transaction Risk Analysis) — оплаты, проводимые эквайером, уровень мошенничества в платёжном трафике которого соответствует порогам PSD2.
- Платежи доверенным мерчантам (Trusted beneficiaries) — оплаты в пользу тех мерчантов, которые по инициативе или с согласия держателя карты занесены в список доверенных.
- Безопасные корпоративные платежи (Corporate payments) — оплаты, инициируемые юридическими лицами с использованием процессов и протоколов, обеспечивающих высокий уровень защиты от мошенничества (таких как Electronic Banking Internet Communication Standard, EBICS).
В платёжной платформе ecommpay поддерживается работа с исключениями для классических карточных платежей с использованием карт платёжных систем Mastercard и Visa в рамках первых двух категорий (на незначительные суммы и с низким уровнем риска).
Работа с допустимыми исключениями
Применение исключений может уменьшать количество действий со стороны пользователей и положительно влиять на проходимость платежей. При этом ответственность за возможные мошеннические действия для таких платежей возлагается на мерчанта.
Если эта возможность подключена, то применение соответствующих исключений инициируется автоматически, кроме тех случаев, когда со стороны мерчанта указано предпочтительное выполнение аутентификации. При этом следует учитывать, что в случае проведения платежа, который относится к исключениям, итоговое решение о необходимости аутентификации так же остаётся за эмитентом. С его стороны может быть направлен „мягкий отказ“ (soft decline), означающий необходимость выполнения аутентификации. В случае получения такого отказа аутентификация для искомого платежа выполняется стандартно, без применения исключений, и, как правило, в варианте challenge flow. Кроме того, исключения не могут применяться при регистрации повторяемых оплат — в таких случаях выполнение аутентификации 3‑D Secure обязательно.
Информация о применённых исключениях передаётся в оповещениях о результатах платежей и отображается в карточках платежей в интерфейсе Dashboard. По вопросам, касающимся подключения возможности применения исключений, можно обращаться к курирующему менеджеру ecommpay.
Пользовательские сценарии
С учётом допустимости разных вариантов аутентификации 3‑D Secure, а также с учётом других факторов (в частности, способов оформления страниц ожидания и используемого платёжного интерфейса), процесс аутентификации может выглядеть для пользователей по-разному.
В случае с вариантом challenge flow и с перенаправлением пользователя к ACS-странице на стороне эмитента для ввода одноразового кода сценарий может соответствовать следующим иллюстрациям.
В случае с вариантом frictionless flow из такого сценария исключаются шаги с перенаправлением пользователя к ACS-странице и последующим возвращением к веб-сервису.
Схемы работы
Общая информация
Как и пользовательские сценарии, схемы работы веб-сервиса и других сторон при выполнении аутентификации 3‑D Secure могут различаться. При этом существенными факторами для веб-сервиса выступают внешние решения относительно необходимости сбора дополнительных сведений об устройстве пользователя и относительно варианта аутентификации — каждое из этих решений может вызывать необходимость выполнения соответствующей процедуры дополнительно к базовым действиям по проведению искомого платежа.
| Варианты работы | без сбора сведений | со сбором сведений |
|---|---|---|
| frictionless flow |
|
|
| challenge flow |
|
|
Самостоятельно выбирать какие-либо из этих сценариев со стороны мерчантов нельзя. Но можно влиять на решения других сторон — через передачу рекомендуемых параметров и указание предпочтений по варианту аутентификации (frictionless flow или challenge flow) для конкретных платежей.
Общая схема работы
Общую схему проведения оплаты с аутентификацией 3‑D Secure можно представить следующим образом.
- В платёжной платформе выполняется обработка исходного запроса на проведение платежа и выявляется необходимость аутентификации 3‑D Secure (согласно действующим требованиям к проведению платежей).
- От платёжной платформы к 3DS‑серверу, связанному с платёжной платформой, передаётся запрос на проверку возможности аутентификации для указанной карты и необходимости сбора сведений об устройстве пользователя.
- На стороне 3DS‑сервера проверяются возможность аутентификации и необходимость сбора сведений.
- От 3DS‑сервера к платёжной платформе направляется ответ с информацией о возможности аутентификации и о необходимости сбора дополнительных сведений об устройстве пользователя.
- В платёжной платформе обрабатывается полученная информация. При этом в случае, если сбор дополнительных сведений не требуется, инициируется выполнение следующего шага (шага 6), а в случае необходимости сбора дополнительных сведений выполняются следующие шаги:
- От платёжной платформы к веб-сервису направляется оповещение с данными для сбора дополнительных сведений об устройстве пользователя.
- От веб-сервиса к платёжной платформе направляется синхронный ответ о приёме данных.
- На стороне веб-сервиса выполняется код для сбора дополнительных сведений об устройстве пользователя, с открытием служебного объекта iframe.
- На устройстве пользователя автоматически выполняются сбор необходимых сведений и их отправка к серверу управления доступом (Access Control Server) эмитента.
- От эмитента к веб-сервису передаётся уведомление о приёме данных.
- От веб-сервиса на заданный URL ecommpay передаётся запрос на аутентификацию пользователя.
- Запрос поступает в платёжную платформу.
- В платёжной платформе выполняется приём запроса с проверкой его корректности.
- От платёжной платформы к веб-сервису направляется ответ с информацией о получении запроса и его корректности.
- От платёжной платформы к 3DS-серверу передаётся запрос на аутентификацию пользователя.
- Запрос передаётся от 3DS‑сервера к серверу каталогов международной платёжной системы (Directory Server).
- Запрос передаётся от сервера каталогов к серверу управления доступом.
- На стороне эмитента выполняется аутентификация пользователя. При этом в случае выбора эмитентом варианта аутентификации frictionless flow от сервера управления доступом к платёжной платформе (через сервер каталогов и 3DS-сервер) передаётся информация о результате аутентификации, а в случае выбора варианта аутентификации challenge flow выполняются следующие шаги:
- От сервера управления доступом к серверу каталогов и далее к 3DS-серверу и платёжной платформе передаются данные для перенаправления пользователя на страницу аутентификации (ACS URL).
- От платёжной платформы к веб-сервису направляется оповещение с данными для перенаправления.
- Со стороны веб-сервиса выполняется перенаправление пользователя на страницу аутентификации.
- Пользователю отображается страница аутентификации, после чего он осуществляет требуемые действия.
- На стороне эмитента выполняется аутентификация пользователя.
- От сервера управления доступом к серверу каталогов и далее к 3DS-серверу передаётся информация о результате проверки.
- От 3DS‑сервера к серверу каталогов и далее к серверу управления доступом передаётся ответ о приёме этой информации.
- Со стороны сервера управления доступом выполняется перенаправление пользователя к веб-сервису с передачей данных о результате аутентификации.
- Пользователю отображается страница ожидания веб-сервиса.
- От веб-сервиса на заданный URL ecommpay передаётся запрос на продолжение проведения платежа с учётом результата аутентификации.
- Запрос поступает в платёжную платформу.
- В платёжной платформе выполняется приём запроса с проверкой его корректности.
- От платёжной платформы к веб-сервису направляется синхронный ответ с информацией о получении запроса и его корректности, после чего обрабатывается информация о результате аутентификации и осуществляется переход к оставшимся действиям для проведения искомого платежа.
Информация о форматах оповещений и запросов, используемых в рамках этой схемы, приведена далее в этой статье; общая информация о работе с Gate API — в статье Организация взаимодействия. Также стоит учитывать, что в различных случаях эта схема может дополняться другими процедурами и действиями, не касающимися непосредственно аутентификации и описанными в соответствующих статьях настоящей документации.
Сбор сведений об устройстве пользователя
В случаях, когда для эмитента актуален сбор дополнительных сведений об устройстве пользователя, к веб-сервису от платформы отправляется соответствующее оповещение. При получении такого оповещения необходимо:
- Проверить целостность данных путём сличения расчётной подписи с представленной в оповещении.
- Подтвердить приём оповещения, отправив положительный синхронный ответ (200 OK) к платформе.
- Открыть в клиентской части веб-сервиса элемент iframe для сбора сведений об устройстве пользователя с использованием данных из оповещения (подробнее).
- Принять уведомление о приёме сведений от сервера управления доступом (ACS) эмитента.
- Отправить запрос на аутентификацию в платёжную платформу.
Перенаправление пользователя к странице аутентификации
В случаях, когда для эмитента актуален вариант аутентификации challenge flow с перенаправлением пользователя к ACS-странице, к веб-сервису от платформы отправляется соответствующее оповещение. При получении такого оповещения необходимо:
- Проверить целостность данных путём сличения расчётной подписи с представленной в оповещении.
- Подтвердить приём оповещения, отправив положительный синхронный ответ (200 OK) к платформе.
- Перенаправить пользователя на страницу аутентификации с использованием данных из оповещения (подробнее) и с соблюдением ограничения в 30 секунд с момента приёма оповещения о необходимости перенаправления.
- Принять уведомление о результате аутентификации от эмитента.
- Отправить запрос на продолжение проведения платежа с учётом результата аутентификации с соблюдением ограничения в 30 минут с момента приёма оповещения о необходимости перенаправления.
- Если используется возможность каскадного проведения платежей (подробнее) и повторно получено оповещение о необходимости перенаправления пользователя (со значением
trueдля параметраcascading_with_redirect):- Повторить шаги 1–2 этой процедуры, с проверкой и подтверждением приёма оповещения.
- Отобразить пользователю сообщение об ошибке при предыдущей попытке аутентификации.
- Получить согласие пользователя на повторную аутентификацию.
- Повторить шаги 3–5 этой процедуры.
Работа со сведениями об устройстве пользователя
Чтобы улучшать пользовательский опыт и проходимость платежей, уместно минимизировать число действий в рамках аутентификации пользователей. Для этого в запросах на проведение платежей, для которых применима аутентификация 3‑D Secure, полезно передавать ряд таких параметров, которые помогают уменьшать вероятность применения процедур со сбором дополнительных сведений об устройствах пользователей и с перенаправлениями пользователей к страницам аутентификации. В число таких параметров, полный перечень которых представлен далее, наряду со сведениями о пользователе и платеже входят следующие сведения об устройстве и браузере пользователя:
- Сведения об устройстве, определяемые на клиентской стороне веб-сервиса:
accept_header— значение HTTP-заголовка Accept;accept_language_header— значение параметра Accept-Language, которое указывает предпочтения в языке локализации;browser— значение HTTP-заголовка User-Agent;ip_address— IP-адрес пользователя, актуальный для инициируемого платежа.
- Сведения об устройстве, получаемые из запроса от используемого браузера к веб-сервису:
color_depth— глубина цвета используемого устройства, в битах на пиксель;java_enabled— индикатор поддержки сценариев Java в используемом браузере;js_enabled— индикатор поддержки сценариев JavaScript в используемом браузере;language— код языка, выбранного для работы в используемом браузере;screen_res— разрешение экрана используемого устройства, в пикселях и с символомxв качестве разделителя (например,1920x1080);timezone_name— название часового пояса, который актуален для используемого браузера (например,Australia/Adelaide);timezone_offset— разница между временем для используемого браузера и UTC, в минутах (например,570).
"customer": { "ip_address": "188.113.253.90", "browser": "Mozilla/5.0 (Linux; Android 14; SM-A155F Build/UP1A.231005.007; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/138.0.7204.67 Mobile Safari/537.36", "screen_res": "1920x1080", "language": "en_US", "accept_header": "*/*", "accept_language_header": "en-GB,en;q=0.8,fr;q=0.3", "color_depth": 24, "java_enabled": false, "js_enabled": true, "timezone_offset": "570" }
Со стороны веб-сервиса сбор и использование таких сведений об устройстве и браузере пользователя можно организовать следующим образом.
- Определить сведения об устройстве пользователя в клиентской части веб-сервиса.
Рис. 8. Пример кода на JavaScript для сбора сведений об устройстве пользователя function collectClientData() { return { // разрешение экрана устройства screen_res: `${screen.width}x${screen.height}`, // код языка, выбранного в браузере language: navigator.language, // глубина цвета браузера color_depth: screen.colorDepth, // индикатор поддержки сценариев Java в браузере java_enabled: navigator.javaEnabled(), // индикатор поддержки сценариев JavaScript в браузере js_enabled: true, // разница между временем для браузера и UTC timezone_offset: new Date().getTimezoneOffset().toString(), }; } - Отправить собранные сведения из клиентской части веб-сервиса в серверную.
Рис. 9. Пример кода на JavaScript для отправки собранных сведений в серверную часть веб-сервиса async function sendClientDataToServer(endpoint = '/api/collect-client-data') { try { const clientData = collectClientData(); const response = await fetch(endpoint, { method: 'POST', headers: { 'Content-Type': 'application/json', 'Accept': '*/*' }, body: JSON.stringify(clientData) }); const result = await response.json(); return result; } catch (error) { console.error('Ошибка отправки данных:', error); throw error; } }
- Дополнить эти сведения полученными из запроса от браузера пользователя к веб-сервису и использовать их наряду с другими актуальными параметрами для формирования и отправки запроса на проведение искомого платежа.
Рис. 10. Пример кода на PHP для формирования запроса на оплату (с базовым набором параметров и сведениями об устройстве пользователя) interface CustomerData { public function getIpAddress(): ?string; public function getAcceptHeader(): ?string; public function getAcceptLanguageHeader(): ?string; public function getScreenRes(): ?string; public function getBrowser(): ?string; public function getLanguage(): ?string; public function getColorDepth(): ?int; public function getJavaEnabled(): ?bool; public function getJsEnabled(): ?bool; public function getTimezoneOffset(): ?string; } interface CardData { public function getPan(); public function getYear(); public function getMonth(); public function getCardHolder(); public function getCvv(); } interface PaymentData { public function getPaymentId(): string; public function getAmount(): int; public function getCurrency(): string; public function getCardData(): CardData; public function getCustomerData(): CustomerData; } interface HttpClient { public function sendRequest(array $request): bool; } interface Signer { public function sign(array $params): string; } final class PaymentController { public function __construct( private Signer $signer, private HttpClient $httpClient, private int $projectId, ) {} public function processPayment(PaymentData $paymentData): void { $paymentRequest = [ 'general' => [ 'project_id' => $this->projectId, 'payment_id' => $paymentData->getPaymentId(), ], 'customer' => $this->prepareCustomerData($paymentData->getCustomerData()), 'payment' => [ 'amount' => $paymentData->getAmount(), 'currency' => $paymentData->getCurrency(), ], 'card' => [ 'pan' => $paymentData->getCardData()->getPan(), 'year' => $paymentData->getCardData()->getYear(), 'month' => $paymentData->getCardData()->getMonth(), 'card_holder' => $paymentData->getCardData()->getCardHolder(), 'cvv' => $paymentData->getCardData()->getCvv(), ], ]; $paymentRequest['general']['signature'] = $this->signer->sign($paymentRequest); $this->httpClient->sendRequest($paymentRequest); } private function prepareCustomerData(CustomerData $customerData): array { return array_filter([ 'ip_address' => $customerData->getIpAddress(), 'browser' => $customerData->getBrowser(), 'screen_res' => $customerData->getScreenRes(), 'language' => $customerData->getLanguage(), 'accept_header' => $customerData->getAcceptHeader(), 'accept_language_header' => $customerData->getAcceptLanguageHeader(), 'color_depth' => $customerData->getColorDepth(), 'java_enabled' => $customerData->getJavaEnabled(), 'js_enabled' => $customerData->getJsEnabled(), 'timezone_offset' => $customerData->getTimezoneOffset(), ]); } }Рис. 11. Пример кода на Go для формирования запроса на оплату (с базовым набором параметров и сведениями об устройстве пользователя) package main import "encoding/json" // CustomerData interface type CustomerData interface { GetIpAddress() *string GetAcceptHeader() *string GetAcceptLanguageHeader() *string GetScreenRes() *string GetBrowser() *string GetLanguage() *string GetColorDepth() *int GetJavaEnabled() *bool GetJsEnabled() *bool GetTimezoneOffset() *string } // CardData interface type CardData interface { GetPan() interface{} GetYear() interface{} GetMonth() interface{} GetCardHolder() interface{} GetCvv() interface{} } // PaymentData interface type PaymentData interface { GetPaymentId() string GetAmount() int GetCurrency() string GetCardData() CardData GetCustomerData() CustomerData } // HttpClient interface type HttpClient interface { SendRequest(request map[string]interface{}) bool } // Signer interface type Signer interface { Sign(params map[string]interface{}) string } // PaymentController struct type PaymentController struct { signer Signer httpClient HttpClient projectId int } // NewPaymentController constructor func NewPaymentController(signer Signer, httpClient HttpClient, projectId int) *PaymentController { return &PaymentController{ signer: signer, httpClient: httpClient, projectId: projectId, } } // ProcessPayment processes the payment func (pc *PaymentController) ProcessPayment(paymentData PaymentData) { cardData := paymentData.GetCardData() paymentRequest := map[string]interface{}{ "general": map[string]interface{}{ "project_id": pc.projectId, "payment_id": paymentData.GetPaymentId(), }, "customer": pc.prepareCustomerData(paymentData.GetCustomerData()), "payment": map[string]interface{}{ "amount": paymentData.GetAmount(), "currency": paymentData.GetCurrency(), }, "card": map[string]interface{}{ "pan": cardData.GetPan(), "year": cardData.GetYear(), "month": cardData.GetMonth(), "card_holder": cardData.GetCardHolder(), "cvv": cardData.GetCvv(), }, } // Add signature general := paymentRequest["general"].(map[string]interface{}) general["signature"] = pc.signer.Sign(paymentRequest) // Send request pc.httpClient.SendRequest(paymentRequest) } // prepareCustomerData filters and prepares customer data func (pc *PaymentController) prepareCustomerData(customerData CustomerData) map[string]interface{} { result := make(map[string]interface{}) if v := customerData.GetIpAddress(); v != nil { result["ip_address"] = *v } if v := customerData.GetBrowser(); v != nil { result["browser"] = *v } if v := customerData.GetScreenRes(); v != nil { result["screen_res"] = *v } if v := customerData.GetLanguage(); v != nil { result["language"] = *v } if v := customerData.GetAcceptHeader(); v != nil { result["accept_header"] = *v } if v := customerData.GetAcceptLanguageHeader(); v != nil { result["accept_language_header"] = *v } if v := customerData.GetColorDepth(); v != nil { result["color_depth"] = *v } if v := customerData.GetJavaEnabled(); v != nil { result["java_enabled"] = *v } if v := customerData.GetJsEnabled(); v != nil { result["js_enabled"] = *v } if v := customerData.GetTimezoneOffset(); v != nil { result["timezone_offset"] = *v } return result }
Формат запросов на проведение платежей
Общая информация
Общий формат запросов на проведение платежей с возможностью выполнения аутентификации 3‑D Secure должен соответствовать описанному в статье Организация взаимодействия. При этом для каждого запроса может быть актуальным свой набор параметров:
- в любом случае должны использоваться параметры, обязательные для соответствующего типа платежа (подробнее — в статьях о типах платежей), и параметры, перечисленные далее как обязательные для выполнения аутентификации 3‑D Secure;
- в случаях, когда предпочтительны сценарии без сбора дополнительных сведений об устройстве пользователя и без перенаправления пользователя к странице аутентификации (с вариантом frictionless flow), желательно передавать максимальное число параметров, которые перечислены далее как рекомендуемые для выполнения аутентификации 3‑D Secure;
- дополнительно могут использоваться любые другие параметры из числа допустимых для конкретного типа платежа.
Обязательные параметры
В запросах на проведение платежей, для которых применима аутентификация 3‑D Secure, вместе с обязательными для соответствующего типа платежа параметрами необходимо передавать следующие объекты и параметры.
| Параметр | Описание | |
|---|---|---|
|
|
Объект с адресами веб-сервиса, используемыми для аутентификации | 1 |
|
|
Адрес веб-сервиса для перенаправления пользователя после аутентификации | 1-11 |
|
|
Адрес веб-сервиса для получения уведомления о том, что данные приняты сервером управления доступом | 1-21 |
|
|
Объект со сведениями о пользователе | 2 |
|
|
IP-адрес пользователя, актуальный для инициируемого платежа | 2-12 |
|
|
Разрешение экрана используемого устройства, в пикселях и с символом x в качестве разделителя (например, 1920x1080) |
2-22 |
|
|
Адрес электронной почты пользователя | 2-32 |
|
|
Номер телефона пользователя, в виде последовательности от четырёх до двадцати четырёх цифр без использования разделителей | 2-42 |
|
|
Объект со сведениями о платёжной карте пользователя | 3 |
|
|
Имя держателя карты, в соответствии с указанным на карте | 3-13 |
{
"general": {
"project_id": 42,
"payment_id": "456789",
"signature": "v7KNMpfogAxwRIL9tVftZ1ZZ5D/aZAeb0VMdeR+CqGrNxYyilUwSm...=="
},
"customer": { // сведения о пользователе
"ip_address": "248.121.176.220", // IP-адрес пользователя
"id": "customer_12",
"screen_res": "1920x1080", // разрешение экрана используемого устройства
"phone": "44991234567", // номер телефона пользователя
"email": "john_smith@email.com" // адрес электронной почты пользователя
},
"payment": {
"amount": 400000,
"currency": "USD"
},
"return_url": {
"success": "https://example.com/success",
"decline": "https://example.com/decline"
},
"card": {
"pan": "4314220000000056",
"year": 2025,
"month": 8,
"card_holder": "JOHN SMITH", // имя держателя карты
"cvv": "123"
},
"acs_return_url": { // сведения об адресах веб-сервиса
"return_url": "https://3DS_result_url", // адрес для перенаправления пользователя после аутентификации
"3ds_notification_url": "https://3DS_result_url" // адрес для получения уведомления о принятии данных
}
Рекомендуемые параметры
В запросах на проведение платежей, для которых применима аутентификация 3‑D Secure, рекомендуется передавать ряд необязательных параметров, указание которых может повышать вероятность выбора эмитентами варианта аутентификации frictionless flow, без участия пользователя, а также отказ от сбора дополнительных сведений об устройстве пользователя. Со стороны веб-сервиса можно передавать как полный, так и неполный набор таких параметров, с учётом наличия соответствующей информации. К базовому минимуму параметров, влияющих на решения эмитентов о варианте аутентификации и сборе сведений, при этом можно отнести платёжный адрес пользователя и сведения о его устройстве и браузере.
| Параметр | Описание | |
|---|---|---|
|
|
Объект со сведениями о пользователе | 2 |
|
|
Значение HTTP-заголовка Accept в соответствии с полученным со стороны используемого браузера | 2-12 |
|
|
Значение параметра Accept-Language в соответствии с полученным со стороны используемого браузера. Представляет собой строку с перечислением кодов и уровней приоритетности (q-values) использования языков (например, en-GB,en;q=0.8,fr;q=0.3) |
2-192 |
|
|
Значение HTTP-заголовка User-Agent в соответствии с полученным со стороны используемого браузера | 2-22 |
|
|
Глубина цвета используемого устройства, в битах на пиксель | 2-32 |
|
|
Индикатор поддержки сценариев Java в используемом браузере | 2-42 |
|
|
Индикатор поддержки сценариев JavaScript в используемом браузере | 2-52 |
|
|
Код языка, выбранного для работы в используемом браузере | 2-62 |
|
|
Название часового пояса, который актуален для используемого браузера (например, Australia/Adelaide) |
2-82 |
|
|
Разница между временем для используемого браузера и UTC, в минутах (например, 570) |
2-92 |
|
|
Указатель совпадения расчётного адреса пользователя с адресом доставки, указанным в объекте
|
2-102 |
|
|
Номер домашнего телефона пользователя, в виде последовательности от четырёх до двадцати четырёх цифр без использования разделителей (например, 44991234567) |
2-112 |
|
|
Номер рабочего телефона пользователя, в виде последовательности от четырёх до двадцати четырёх цифр без использования разделителей (например, 44997654321) |
2-122 |
|
|
Объект со сведениями об учётной записи пользователя на стороне веб-сервиса мерчанта | 2-132 |
|
|
Дополнительная информация об учётной записи пользователя, например её идентификатор, в произвольном формате с использованием до 64 символов | 2-13-12-13 |
|
|
Количество попыток проведения оплаты за последние 24 часа, в виде числа от 0 до 999 (999) |
2-13-22-13 |
|
|
Количество попыток проведения оплаты за последние 365 дней, в виде числа от 0 до 999 (999) |
2-13-32-13 |
|
|
Индикатор давности учётной записи, который может принимать одно из следующих значений:
|
2-13-42-13 |
|
|
Дополнительная информация об аутентификации на стороне веб-сервиса, в произвольном формате с использованием не более 255 символов | 2-13-52-13 |
|
|
Указатель способа последней аутентификации пользователя на стороне веб-сервиса, который может принимать одно из следующих значений:
|
2-13-62-13 |
|
|
Дата и время последней аутентификации пользователя на стороне веб-сервиса в формате ДД-ММ-ГГГГчч:мм |
2-13-72-13 |
|
|
Дата создания учётной записи в формате ДД-ММ-ГГГГ |
2-13-82-13 |
|
|
Дата последних изменений в учётной записи, за исключением изменения или сброса пароля, в формате ДД-ММ-ГГГГ |
2-13-92-13 |
|
|
Индикатор давности изменений в учётной записи, за исключением изменения или сброса пароля, который может принимать одно из следующих значений:
|
2-13-102-13 |
|
|
Дата последнего изменения или сброса пароля в формате ДД-ММ-ГГГГ |
2-13-112-13 |
|
|
Индикатор давности последнего изменения или сброса пароля, который может принимать одно из следующих значений:
|
2-13-122-13 |
|
|
Дата добавления реквизитов платёжного инструмента в формате ДД-ММ-ГГГГ |
2-13-132-13 |
|
|
Индикатор давности сохранения данных платёжного инструмента, используемых для проведения платежа, который может принимать одно из следующих значений:
|
2-13-142-13 |
|
|
Количество попыток сохранения реквизитов для новых платёжных инструментов за последние 24 часа, от 0 до 999 (999) |
2-13-152-13 |
|
|
Количество покупок, совершённых через учётную запись за последние 6 месяцев, от 0 до 9999 (9999) |
2-13-162-13 |
|
|
Индикатор подозрительной активности, который может принимать одно из следующих значений:
|
2-13-172-13 |
|
|
Объект со сведениями о расчётном адресе пользователя | 2-162 |
|
|
Название улицы в расчётном адресе пользователя | 2-16-12-16 |
|
|
Название города в расчётном адресе пользователя | 2-16-22-16 |
|
|
Код страны в расчётном адресе пользователя в формате ISO 3166-1 alpha-2 | 2-16-32-16 |
|
|
Почтовый индекс в расчётном адресе пользователя | 2-16-42-16 |
|
|
Внутренний код региона (штата, провинции или иной территориальной области) в расчётном адресе пользователя. Представляет собой вторую часть международного кода территории (в формате ISO 3166-2), без двухбуквенного кода страны и разделительного дефиса. При указании значения этого параметра также необходимо указать значение параметра |
2-16-52-16 |
|
|
Объект со сведениями о доставке | 2-172 |
|
|
Название улицы и номер дома в адресе доставки (с обозначением корпуса или строения, где это актуально), в виде строки длиной не более 150 символов | 2-17-12-17 |
|
|
Дата первого использования указанного адреса, в формате ДД-ММ-ГГГГ |
2-17-22-17 |
|
|
Индикатор давности первого использования указанного адреса доставки, который может принимать одно из следующих значений:
|
2-17-32-17 |
|
|
Название города (или иного населённого пункта) в адресе доставки, в виде строки длиной не более 50 символов | 2-17-42-17 |
|
|
Код страны в адресе доставки в формате ISO 3166-1 alpha-2 (например, GB) | 2-17-52-17 |
|
|
Адрес электронной почты в случае доставки на этот адрес, который может содержать не более 255 символов | 2-17-62-17 |
|
|
Индикатор срока доставки, который может принимать одно из следующих значений:
|
2-17-72-17 |
|
|
Индикатор совпадения имени пользователя с именем получателя доставки, который может принимать одно из следующих значений:
|
2-17-82-17 |
|
|
Почтовый индекс в адресе доставки, представляет собой строку длиной не более 16 символов | 2-17-92-17 |
|
|
Внутренний код региона в адресе доставки, представляет собой вторую часть международного кода территории (в формате ISO 3166-2), без двухбуквенного кода страны и разделительного дефиса, например При указании значения этого параметра также необходимо указать значение параметра |
2-17-102-17 |
|
|
Указатель варианта доставки, который может принимать одно из следующих значений:
|
2-17-112-17 |
|
|
Объект со сведениями о предыдущей аутентификации пользователя | 2-182 |
|
|
Идентификатор предыдущей операции пользователя на стороне эмитента, не более тридцати шести символов. В качестве этого идентификатора необходимо использовать значение, полученное в параметре acs_operation_id оповещения о результате проведения предыдущего платежа |
2-18-12-18 |
|
|
Указатель варианта предыдущего прохождения аутентификации пользователем, полученный в параметре
|
2-18-22-18 |
|
|
Дата и время предыдущей успешной аутентификации пользователя. В качестве значения необходимо использовать данные, полученные в параметре mpi_timestamp оповещения о результате проведения предыдущего платежа |
2-18-32-18 |
|
|
Объект со сведениями о платеже | 3 |
|
|
Индикатор предпочтения по использованию варианта аутентификации challenge flow, который может принимать одно из следующих значений:
|
3-13 |
|
|
Индикатор размера окна для открытия страницы аутентификации, который может принимать одно из следующих значений:
|
3-23 |
|
|
Планируемая дата поступления товара или услуги в формате ДД-ММ-ГГГГ |
3-33 |
|
|
Индикатор предварительного заказа, который может принимать одно из следующих значений:
|
3-43 |
|
|
Индикатор первичной или повторной покупки данного товара или услуги пользователем, который может принимать одно из следующих значений:
|
3-53 |
|
|
Объект со сведениями о покупке предоплаченных или подарочных карт | 3-63 |
|
|
Сумма покупки, в дробных единицах валюты, указанной в параметре currency этого же объекта |
3-6-13-6 |
|
|
Код валюты для суммы покупки в формате ISO 4217 alpha-3 (например, GBP) | 3-6-23-6 |
|
|
Количество приобретаемых предоплаченных или подарочных карт | 3-6-33-6 |
Форматы промежуточных сообщений
Формат оповещения о необходимости сбора дополнительных сведений
Для сбора эмитентом дополнительных сведений об устройстве пользователя при выполнении аутентификации необходимо принять промежуточное оповещение от платёжной платформы и использовать информацию из него, включённую в объект iframe объекта threeds2 — чтобы сформировать служебный элемент iframe на странице веб-сервиса. Формат таких оповещений является типовым (подробнее), при этом в состав объекта iframe включаются сведения, которые необходимо использовать следующим образом: адрес из параметра url — в атрибуте action используемой формы в клиентской части веб-сервиса, а данные из других параметров — в тегах input этой же формы.
{
"threeds2":{
"iframe":{
"url":"https://example.com",
"params":{
"3DSMethodData":"eyAidGhyZWVNrkthelJSUFQwaWZYMCUzQ",
"threeDSMethodData":"eyAidGhjNjMGQ4YWU4LTA2u0wyWmtObGRdwR"
}
}
}
}
<iframe id="tdsMmethodTgtFrame" name="tdsMmethodTgtFrame" style="width: 1px; height: 1px; display: none;" src="javascript:false;" xmlns="http://example.com/xhtml"> <!--.--> </iframe> <form id="tdsMmethodForm" name="tdsMmethodForm" action="https://example.com" method="post" target="tdsMmethodTgtFrame" xmlns="http://example.com/xhtml"> <input type="hidden" name="3DSMethodData" value="eyAidGhyZWVNrkthelJSUFQwaWZYMCUzQ" /> <input type="hidden" name="threeDSMethodData" value="eyAidGhjNjMGQ4YWU4LTA2u0wyWmtObGRdwR" /> </form> <script type="text/javascript" xmlns="http://example.com/xhtml"> document.getElementById("tdsMmethodForm").submit(); </script>
Формат уведомления о приёме дополнительных сведений
Для уведомлений о приёме дополнительных сведений об устройствах пользователей используются форматы эмитентов. Такие уведомления передаются от серверов управления доступом (ACS) эмитентов на адреса веб-сервисов, указанные в запросах на проведение платежей (в параметре 3ds_notification_url). С вопросами о работе с такими уведомлениями можно обращаться к специалистам технической поддержки ecommpay.
threeDSMethodData:eyJ0aHJlZURTU2VydmVyVHJhbnNJRCI6ImRiNmFjM2UwLWI5ZWQtNWQ3NS04MDAwLTAwMDAwMDAwMTA0MiJ9 threeDSServerTransID=3abd37b3-afa6-53cf-8000-000000006455
Формат запроса на инициирование аутентификации
Для инициирования аутентификации, когда это актуально после сбора дополнительных сведений об устройстве пользователя, каждый раз должен использоваться POST-запрос к конечной точке /v2/payment/card/3ds_check_iframe. В каждом таком запросе должны использоваться следующие объекты и параметры:
general— объект, содержащий основные идентификационные сведения запроса:project_id— идентификатор используемого проекта;payment_id— идентификатор проводимого платежа;signature— подпись к данным запроса, составленная после указания целевых параметров (подробнее — в статье Работа с подписью к данным).
threeds_completion_indicator— индикатор своевременного получения уведомления о приёме сведений — со значениемtrue, если такое уведомление получено в течение 10 секунд с момента открытия элемента iframe для сбора дополнительных сведений об устройстве пользователя, илиfalse, если уведомление получено позже.
Таким образом, корректный запрос на инициирование аутентификации 3‑D Secure после сбора дополнительных сведений об устройстве пользователя должен содержать идентификаторы проекта и платежа, индикатор получения уведомления о сборе сведений в допустимый период и подпись.
{
"general":{
"project_id":42,
"payment_id":"456789",
"signature":"v7KNMpfogAxwRIL9tVftZ1ZZ5D/aZAeb0VMdeR+CqGrNxYyilUwSm...=="
},
"threeds_completion_indicator":true
}
Формат оповещения о необходимости перенаправления
Для перенаправления пользователей от веб-сервиса мерчанта к страницам аутентификации (ACS URL) эмитентов необходимо принимать промежуточные оповещения от платёжной платформы и использовать информацию из них, включённую в объект redirect объекта threeds2. Формат таких оповещений является типовым (подробнее), при этом в состав объекта redirect включаются сведения, которые необходимо использовать следующим образом: адрес из параметра url — в атрибуте action используемой формы в клиентской части веб-сервиса, а данные из других параметров — в тегах input этой же формы.
{
"threeds2":{
"redirect":{
"url":"https://example.com/ACS",
"params":{
"creq":"ewogICAiYWNzVHJhbnNJCIDAtMDAwMDAwMDAwN2Q5Ip9",
"threeDSSessionData":"240000549"
}
}
}
}
<!DOCTYPE html SYSTEM "about:legacy-compat"> <html class="no-js" lang="en" xmlns="http://example.com/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta charset="utf-8" /> <title>3D Secure Processing</title> <link href="https://example.com/mpi.css" rel="stylesheet" type="text/css" /> </head> <body> <div id="main"> <div id="content"> <div id="order"> <h2>3D Secure Processing</h2> <img src="https://example.com/preloader.gif" alt="Please wait.." /> <img src="https:// example.com/verifiedbyvisa.png" alt="Verified by VISA" /> <div id="formdiv"> <script type="text/javascript"> function hideAndSubmitTimed(formid) { timer=setTimeout("hideAndSubmit('"+formid+"');", 100);} function hideAndSubmit(formid) { var formx=document.getElementById(formid); tif (formx!=null) { formx.style.visibility="hidden"; formx.submit(); } } </script> <div> <form id="webform0" name="red2ACSv2" method="POST" action="https:// example.com/ACS" accept_charset="UTF-8"> <input type="hidden" name="_charset_" value="UTF-8" /> <input type="hidden" name="creq" value="ewogICAiYWNzVHJhbnNJCIDAtMDAwMDAwMDAwN2Q5Ip9" /> <input type="hidden" name="threeDSSessionData" value="240000476" /> <input type="submit" name="submitBtn" value="Please click here to continue" /> </form> </div> </div> <script type="text/javascript"> thideAndSubmitTimed('webform0'); </script> <noscript> <div align="center"> <b>Javascript is turned off or not supported!</b> <br/> </div> </noscript> </div> </div> </div> </body> </html>
Формат уведомления о результате аутентификации
Для уведомлений со сведениями о результатах аутентификации используются форматы эмитентов, при этом в состав таких уведомлений должен включаться параметр cres, который должен передаваться далее в платформу со стороны веб-сервиса в запросах на продолжение платежа.
cres=ewogICJhY3NUcmFuc0lEIiA6ICJkYTIyNjY0Mi1hYzJhLTQ0N2ItYWFiYS1lNWI2Nzc2MjdmZmMiLAogICJtZXNzYWdlVHlwZSIgOiAiQ1JlcyIsCiAgIm1lc3NhZ2VWZXJzaW9uIiA6ICIyLjEuMCIsCiAgInRocmVlRFNTZXJ2ZXJUcmFuc0lEIiA6ICI5ZjE3OWM0My02NjA2LTU3YWUtODAwMC0wMDAwMDAwMDA3ZGQiLAogICJ0cmFuc1N0YXR1cyIgOiAiWSIKfQ&threeDSSessionData=240000554
cres=ewogICAiYWNzUmVmZXJlbmNlTnVtYmVyIiA6ICJBQ1NFbXUyIiwKICAgImFjc1RyYW5zSUQiIDog%0D%0AIjAwMDAwMDAwLTAwMDUtNWE1YS04MDAwLTAxNmQzZTI2ZWU2YyIsCiAgICJtZXNzYWdlVHlwZSIg%0D%0AOiAiQ1JlcyIsCiAgICJtZXNzYWdlVmVyc2lvbiIgOiAiMi4xLjAiLAogICAidGhyZWVEU1NlcnZl%0D%0AclRyYW5zSUQiIDogIjhiMjM0Y2ZmLTkzNjAtNTc5Yy04MDAwLTAwMDAwMDAwMDlhNiIsCiAgICJ0%0D%0AcmFuc1N0YXR1cyIgOiAiTiIKfQ==&threeDSSessionData=240000622
Формат запроса на продолжение платежа
Для продолжения проведения платежа, когда это актуально после аутентификации с вариантом challenge flow, каждый раз должен использоваться POST-запрос к конечной точке /v2/payment/card/3ds_result. В каждом таком запросе должны использоваться следующие объекты и параметры:
general— объект, содержащий основные идентификационные сведения запроса:project_id— идентификатор используемого проекта;payment_id— идентификатор проводимого платежа;signature— подпись к данным запроса, составленная после указания целевых параметров (подробнее — в статье Работа с подписью к данным).
cres— сведения о результате аутентификации 3‑D Secure, полученные в соответствующем уведомлении.
Таким образом, корректный запрос на продолжение проведения платежа с учётом результата аутентификации 3‑D Secure должен содержать идентификаторы проекта и платежа, сведения о результате аутентификации от эмитента и подпись.
{
"general": {
"project_id": 42,
"payment_id": "456789",
"signature": "v7KNMpfogAxwRIL9tVftZ1ZZ5D/aZAeb0VMdeR+CqGrNxYyilUwSm...=="
},
"cres": "ewogICJhY3NUcmFuc0lEIiA6ICJkYTIyNjY0Mi1hYzJhLTQ0N2ItYWFiYS1lNWI2Nzc2MjdmZmMi
LAogICJtZXNzYWdlVHlwZSIgOiAiQ1JlcyIsCiAgIm1lc3NhZ2VWZXJzaW9uIiA6ICIyLjEuMCIsCiAgInRocmVlR
FNTZXJ2ZXJUcmFuc0lEIiA6ICI5ZjE3OWM0My02NjA2LTU3YWUtODAwMC0wMDAwMDAwMDA3ZGQiLAogICJ0cmFuc1
N0YXR1cyIgOiAiWSIKfQ"
// Сведения о результате аутентификации
}
Формат оповещений о результатах платежей
Информация о результатах платежей, при проведении которых выполнялась аутентификация 3‑D Secure, передаётся от платёжной платформы к веб-сервису в оповещениях типового формата, описание которого представлено в статье Работа с оповещениями. При этом в объекте mpi_result таких оповещений дополнительно могут передаваться следующие параметры:
mpi_operation_id— идентификатор операции на стороне 3DS‑сервера;ds_operation_id— идентификатор операции на стороне cервера каталогов международной платёжной системы;acs_operation_id— идентификатор операции на стороне сервера управления доступом эмитента;mpi_timestamp— дата и время аутентификации;cardholder_info— информация об аутентификации, которую рекомендуется отобразить пользователю при уведомлении о результате проведения платежа;authentication_flow— указатель использованного варианта аутентификации:01— frictionless flow,02— challenge flow.
В случаях, когда аутентификация не выполнялась в связи с применением одного из допустимых исключений, в объекте operation таких оповещений дополнительно может передаваться параметр non_3ds_reason со значением tra, lve (для платежей с низким уровнем риска (Transaction Risk Analysis) или на незначительные суммы (Low value)).
По умолчанию такие дополнительные параметры не включаются в состав итоговых оповещений. Однако их можно включить в используемую структуру через обращение к специалистам технической поддержки ecommpay.
{
"account":{
"number":"431422******0056",
"token":"f365bb1729f9b72fd9c09703a751c979f3becc679f29c3e35c91d18070d15654",
"type":"visa",
"card_holder":"JOHN SMITH",
"id":45678,
"expiry_month":"08",
"expiry_year":"2025"
},
"customer":{
"id":"customer_12",
"phone":"44991234567"
},
"payment":{
"date":"2019-01-11T13:02:42+0000",
"id":"456789",
"method":"card",
"status":"success",
"sum":{
"amount":400000,
"currency":"USD"
},
"type":"purchase",
"description":""
},
"project_id":42,
"operation":{
"id":969000002636,
"type":"sale",
"status":"success",
"date":"2019-01-11T13:02:42+0000",
"created_date":"2019-01-11T13:01:45+0000",
"request_id":"c6eed1eb14c629b4ef20b3b8086d...d04132c34b0088cbc0be4667c",
"sum_initial":{
"amount":400000,
"currency":"USD"
},
"sum_converted":{
"amount":400000,
"currency":"USD"
},
"provider":{
"id":408,
"payment_id":"330157196",
"date":"2019-01-11T13:02:32+0000",
"auth_code":"",
"endpoint_id":"612266625"
},
"mpi_result":{
"mpi_operation_id":"",
// Идентификатор операции на стороне 3DS‑сервера
"ds_operation_id":"",
// Идентификатор операции на стороне сервера каталогов международной платёжной системы
"acs_operation_id":"",
// Идентификатор операции на стороне сервера управления доступом эмитента
"mpi_timestamp":"YYYYMMDDHHMM",
// Дата и время выполнения аутентификации
"cardholder_info":"Additional authentication is needed for this transaction",
// Информация об аутентификации, которую рекомендуется отобразить пользователю
"authentication_flow":"02"
// Информация о варианте аутентификации
},
"code":"0",
"message":"Success",
"eci":"07"
},
"signature":"v7KNMpfogAxwRIL9tVftZ1ZZ5D/aZAeb0VMdeR+CqGrNxYyilUwSm...=="
}