Документ содержит техническое описание процесса передачи данных банковской карты для проведения авторизации платежа платежным шлюзом «МПС». Документ предназначен для технических специалистов Заказчика, которые отвечают за разработку сервиса оплаты банковскими картами в интернет-магазине Заказчика с использованием процессинговой системы MyPayments.
Основные требования для работы по данному протоколу:
Для организации приема банковской карты на своей стороне предприятие должно зарегистрировать заказ в системе, создать скрытый элемент iframe c адресом, который был получен при регистрации заказа. Дальнейшее взаимодействие между фреймами строится на базе функции HTML5 postMessage.
регистрация заказа в системе ПШ - используется стандартный протокол (например, метод register сервиса orderv2); взаимодействие происходит между сервисами ПШ и бэкэндом (server side) сайта/приложения Интернет точки продажи. Далее взаимодействие происходит между сервисами ПШ и фронтэндом (client side) сайта/приложения Интернет точки продажи;
создание скрытого элемента iframe с адресом, полученным в ответ на запрос из п.1; между итерфейсом ввода данных карты на сайте и iframe элементом включен механизм обмена сообщениями через postMessage.
взаимодействие с ПШ при помощи сообщений postMessage:
сообщение | инициатор: ПШ / сайт | процесс | ожидаемые действия от фронтэнда сайта |
---|---|---|---|
EgoIframeReady | ПШ | скрытый iframe успешно загрузился | отобразить форму для ввода карточных данных |
Authorize | сайт | ввод карточных данных, передача их в ПШ | отправка полученных карточных данных |
EgoIframeProcess | ПШ | обработка данных карты | |
EgoIframe3ds | ПШ | процедура верификации держателя карты (3ds) | отобразить iframe для выполнения процедуры аутентификации по технологии 3D secure |
EgoIframeProcess | ПШ | обработка данных карты | |
EgoIframeResult | ПШ | возвращение статуса оплаты | |
EgoIframeClose | ПШ | информирование клиента о статусе оплаты | получить результат, отобразить его клиенту; или отобразить содержимое iframe |
EgoIframeError | ПШ | ошибка при процессировании |
Более подробное описание сообщений дано ниже.
Сообщение EgoIframeReady направляется в том случае, если iframe элемент успешно загрузился. После получения данного сообщения, сайт предприятия должен отобразить клиенту форму для ввода данных банковской карты при использовании режима ввода данных карты на стороне самого сайта, либо отобразить загруженный iframe.
Данное сообщение не содержит дополнительной информации.
После успешного ввода данных карты, сайт магазина отправляет сообщение Authorize со следующими параметрами в формате JSON:
Дополнительно могут быть переданы:
Важно: количество обязательных/опциональных полей зависит от выбранной схемы работы.
Пример авторизационной части запроса:
= {
data 'pan': '5100000000000008',
'cvv': '222',
'exp': '201912',
'holder': 'Vasya Pupkin',
'phone': '89119111213',
'email': 'pupkin@vasya.ru'
; }
Сообщение EgoIframeProcess направляется после успешного старта обработки переданных данных.
Данное сообщение не содержит дополнительной информации.
Если предъявленная карта клиента участвует в программе 3D secure — необходимо выполнить процедуру аутентификации по технологии 3D secure. Для этого сайт заказчика должен отобразить iframe элемент, сразу после получения сообщения EgoIframe3ds из iframe. В “видимом” iframe элементе откроется страница банка-эмитента карты, на которой клиенту сайта необходимо ввести полученный одноразовый пароль.
Данное сообщение не содержит дополнительной информации.
После завершения оплаты результаты отправляются сообщении EgoIframeResult в формате JSON следующего содержания:
- tdate – дата транзакции
- number – id платежа
- amount – сумма платежа
- currency – валюта платежа
Результат оплаты - “success”, если платежу присвоен один из следующих финальных статусов в системе ПШ:
статус (status) | комментарий (comment) |
---|---|
acknowledged | authorized successfully |
not_acknowledged | authorized successfully |
refunded | authorized successfully |
authorized | authorized successfully |
failed | authorization canceled |
Результат оплаты не “success”, если платежу присвоен один из следующих промежуточных статусов в системе ПШ:
статус (status) | комментарий (comment) |
---|---|
registered | Please, wait |
in_progress | Please, wait |
authorized | Acknowledge in progress |
not_authorized | - |
canceled | - |
Важно: более подробное описание статусов заказов содержится в основной документации, описывающей взаимодействие с платежным шлюзом.
Важно: если в процессе обработки возникла ошибка из iframe вернется сообщение EgoIframeError.
По завершению оплаты из iframe отправляется сообщение EgoIframeClose, а URL в Iframe в соответствии с результатом оплаты меняется на success или fault адрес, указанные при регистрации заказа.
Данное сообщение не содержит дополнительной информации.
В случае возникновения ошибки, препятствующей проведению авторизации платежа, отправляется сообщение EgoIframeError в формате JSON следующего содержания:
<!DOCTYPE html>
<html>
<head>
<title></title>
<script src="http://code.jquery.com/jquery-1.8.3.js"></script>
<script type="text/javascript" src="postmessage.js"></script>
<body>
<iframe id="iframe" src="https://sandbox.egopay.ru/payments/request?session=12321324341" frameborder="0" style="height:0;width:0;"></iframe>
<script type="text/javascript">
$(document).ready(function(){
if (window.pm) {
window.pm.bind('EgoIframeReady', function() {
console.log('EgoIframeReady');
= {
data 'pan':'5100000000000008',
'cvv':'222',
'exp': '201912',
'amt': 2850,
'cy': 'RUB',
'holder': 'Vasya Pupkin'
;
}.pm({
$target: document.getElementById('iframe').contentWindow,
origin: "https://sandbox.egopay.ru",
url: "https://sandbox.egopay.ru",
type: 'Authorize',
data: data,
success: function() {
console.log('ok');
,
}error: function() {
console.log('error');
}, "https://sandbox.egopay.ru");
}console.log('sent autorize');
;
})
window.pm.bind('EgoIframeProcess', function() {
console.log('payment process');
;
})window.pm.bind('EgoIframe3ds', function() {
console.log('EgoIframe3ds');
$('#iframe').css({width: 500, height: 500})
;
})window.pm.bind('EgoIframeResult', function() {
console.log('EgoIframeResult', arguments);
;
})window.pm.bind('EgoIframeClose', function() {
console.log('EgoIframeClose', arguments);
;
})window.pm.bind('EgoIframeError', function() {
console.log('EgoIframeError', arguments);
;
})
};
})</script>
</body>
</html>
Список обязательных тестовых сценариев приведен в таблице ниже
Тестовый сценарий | Событие EgoIframeReady | Событие EgoIframeError | Событие EgoIframeProcess | Событие EgoIframe3ds | Повторный EgoIframeError | Повторный EgoIframeProcess | Событие EgoIframeResult | Результат авторизации | Событие EgoIframeClose |
---|---|---|---|---|---|---|---|---|---|
Успешная авторизация с 3ds | да | нет | да | да | нет | да | да | успех | да |
Отказ в авторизации без 3ds | да | нет | да | нет | нет | да | да | отказ | да |
Успешная авторизация без 3ds | да | нет | да | нет | нет | да | да | успех | да |
Отказ в авторизации (c 3ds) | да | нет | да | да | нет | да | да | отказ | да |
Таймаут оплаты | да | - | - | - | - | - | - | - | да, таймаут |
Сбой 3DS аутентификации | да | нет | да | да | нет | - | - | - | да |
Сбой загрузки frame | нет | - | - | - | - | - | - | - | - |
Сбой связи при отправке данных | да | да | да | - | да | - | - | - | да,таймаут |
Ошибка в номере карты | да | да | да | - | да | - | - | - | да |
Сбой связи при отправке данных 3ds | да | нет | да | да | да | да | - | - | да,таймаут |
Общение между окнами: https://learn.javascript.ru/iframes http://javascript.ru/ajax/cross-origin-2
Метод Window.postMessage: https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage
Метод Window.postMessage для устаревших браузеров - библиотека jQuery postMessage: https://github.com/daepark/postmessage
этап | textStatus | errorThrown | описание |
---|---|---|---|
отправка карточных данных, получение результата | timeout | system/error | таймаут обработки запроса системой - обратитесь в службу тех. поддержки |
отправка карточных данных, получение результата | error | system/session | указана неверная сессия при попытке открыть элемент iframe. Перепроверьте соответствие указанного адреса и адреса, полученного в ответ на регистрацию заказа. На других этапах - убедитесь, что на стороне сайта нет попытки подмены значения src в скрытом iframe элементе |
отправка карточных данных, получение результата | error | system/error | ошибка при обработке запроса - обратитесь в службу тех. поддержки |
отправка карточных данных, получение результата | user/network | Keepalive period expired | потеряно соединение с браузером клиента. Необходимо перепроверить статус заказа и если он не оплачен - начать процесс оплаты заново |
отправка карточных данных | error | user/invalid_input | переданы некорректные данные карты |
3ds | timeout | system/timeout | потеряно соединение с браузером клиента. Необходимо перепроверить статус заказа и если он не оплачен - начать процесс оплаты заново |
3ds | error | system/session | убедитесь, что на стороне сайта нет попытки подмены значения src в скрытом iframe элементе |
3ds | error | system/error | ошибка при получении ACS страницы. Необходимо начать процесс оплаты заново |