Beeline Mobile ID
Описание
Beeline Mobile ID - новый способ оплаты, который позволяет клиенту авторизовываться в личном кабинете с помощью технологии Mobile ID и проводить оплату с баланса телефона, а так же сохраненными картами.
На текущий момент доступны следующие способы оплаты:
- оплата по банковской карте.
- оплата с баланса телефона.
Пошаговое руководство по интеграции beeline-mobile-id.js
Шаг 1. Укажите блок для размещения кнопки на странице
В HTML-коде странице, где должна будет отображаться кнопка Mobile ID нужно указать блок, в который в итоге добавится кнопка. Блок должен размещаться строго внутри тега
<div class="mobile-pay__container"></div>Шаг 2. Подключение beeline-mobile-id.js к странице
В <head> страницы нужно подключить скрипт beeline-mobile-id.js
Для UAT (Тестовая среда) используется:
<script src="https://mpay.rbsuat.com/sdk/v1/beeline-mobile-id.js"></script>Для PROD (Продуктив) используется:
<script src="https://mpay.rbsgate.com/sdk/v1/beeline-mobile-id.js"></script>Шаг 3. Инициализация кнопки
Подключение кнопки в странице должно происходить только после полной загрузки HTML-документа.
<script>
document.addEventListener('DOMContentLoaded', function () {
// << Инициализация скрипта
});
</script>3.1 Рендер кнопки
Для отрисовки кнопки требуется вызвать функцию BeelineMobileId.createButtonElement() и затем смонтировать элемент в DOM-дерево.
<script>
document.addEventListener('DOMContentLoaded', () => {
const BeelineMobileId = window.BeelineMobileId;
const payButtonElement = BeelineMobileId.createButtonElement();
document.querySelector('#root').append(payButtonElement);
});
</script>
3.2 Передача параметров платежа
Для передачи параметров платежа, требуется создать сессию с помощью метода BeelineMobileId.createSession() которая может принимать параметры платежа
document.addEventListener('DOMContentLoaded', () => {
const BeelineMobileId = window.BeelineMobileId;
const payButtonElement = BeelineMobileId.createButtonElement();
document.querySelector('#root').append(payButtonElement);
const mobileIdSession = BeelineMobileId.createSession({
buttonElement: payButtonElement,
merchant: {
login: 'mobilepay',
},
order: {
description: 'Автомобиль DeLorean DMC-12',
orderNumber: new Date().getTime().toString(),
amount: 55000,
},
successUrl: 'https://example.com/success',
failUrl: 'https://example.com/fail',
});
});Пример инициализации сессии. Кнопка становится кликабельной.
Параметры BeelineMobileId.createSession({})
BeelineMobileId.createButtonElement()
Содержит в себе параметр
login
Например:
https://example.com/successПо итогу к ссылке добавятся параметры
mdOrder (идентификатор заказа в платежном шлюзе)
Например:
https://example.com/failПо итогу к ссылке добавятся параметры
mdOrder (идентификатор заказа в платежном шлюзе)
Содержит в себе следующие параметры:
10 цифр. Указывается в формате
9000000000.
Пример Beeline Mobile ID c корзиной
document.addEventListener('DOMContentLoaded', function () {
const payButtonElement = BeelineMobileId.createButtonElement();
document.querySelector('#root').append(payButtonElement);
const mobileIdSession = BeelineMobileId.createSession({
buttonElement: payButtonElement,
merchant: {
login: 'mobilepay',
},
successUrl: 'https://example.com/success',
failUrl: 'https://example.com/fail',
order: {
description: 'Спортивные товары в SportSensey',
orderNumber: new Date().getTime().toString(),
amount: 810000,
email: 'user@example.com',
phone: '9000000000',
orderBundle: {
cartItems: [
{
positionId: 'i1',
name: 'Кроссовки Bosko Sport 42',
quantity: {
measure: 'шт',
value: '1',
},
itemAmount: 800000,
itemCode: 'c1',
},
{
positionId: 'i2',
name: 'Злаковый батончик PumBar',
quantity: {
measure: 'шт',
value: '2',
},
itemAmount: 10000,
itemPrice: 5000,
itemCode: 'c2',
},
],
},
},
});
});
Cобытия Beeline Mobile ID
Beeline Mobile ID имеет внутренние события для более гибкой настройки платежа. События позволяют сайту магазина (который использует Beeline Mobile ID) гибко реагировать на поведение пользователя внутри Beeline Mobile ID.
Событие нужно передавать как параметр в функцию mobileIdSession.on().
Пользователь нажал кнопку оплаты Beeline Mobile ID.
Событие BeelineMobileId.Event.openDialog
Пример:
mobileIdSession.on(BeelineMobileId.Event.openDialog, () => {
console.info('Пользователь нажал кнопку оплаты');
});Пользователь закрыл окно оплаты.
Событие BeelineMobileId.Event.CloseDialog
Пример:
mobileIdSession.on(BeelineMobileId.Event.CloseDialog, () => {
// Ваш код, который выполнится после того как пользователь закрыл окно оплаты Beeline Pay.
console.info('Пользователь закрыл окно оплаты');
});Пользователь закрыл окно в момент опроса статуса оплаты.
Событие BeelineMobileId.Event.UnfinishedOperation
Т.е. оплата могла пройти успешно, однако пользователь недождался экрана с подтверждением этой информации.
Пример:
mobileIdSession.on(BeelineMobileId.Event.UnfinishedOperation, () => {
// Ваш код, который выполнится после того как пользователь закрыл окно оплаты Mobile ID в момент опроса статуса оплаты
console.info('Пользователь закрыл окно в момент опроса статуса оплаты');
});Изменение статуса оплаты.
Событие BeelineMobileId.Event.ChangePaymentStatus
Принимает параметры status и orderId Для корректного определения статуса рекомендуется использовать метод BeelineMobileId.PendingStatuses.includes(status) и BeelineMobileId.SuccessfulStatuses.includes(status)
orderId - id заказа внутри платежного шлюза.
Пример:
mobileIdSession.on(
BeelineMobileId.Event.ChangePaymentStatus,
({ status, orderId }) => {
if (BeelineMobileId.PendingStatuses.includes(status)) {
console.log('🕒️ Завершение операции.');
} else if (BeelineMobileId.SuccessfulStatuses.includes(status)) {
console.log('✔️ Оплата выполнена УСПЕШНО.');
} else {
console.log('❌ Оплата выполнена НЕУСПЕШНО.');
}
console.log(`Статус заказа: ${status}. Номер заказа ${orderId}`);
},
);Пример:
const bgColors = [
'linear-gradient(to right, #00b09b, #96c93d)',
'linear-gradient(to right, #ff5f6d, #ffc371)',
'linear-gradient(to right, #9a9a9a, #bdbdbd)',
];
function showToast(text, colorIndex) {
Toastify({
text: text,
close: true,
duration: -1,
style: {
background: bgColors[colorIndex],
},
}).showToast();
}
document.addEventListener('DOMContentLoaded', () => {
// Создание кнопки Beeline Mobile ID
const BeelineMobileId = window.BeelineMobileId;
const payButtonElement = BeelineMobileId.createButtonElement();
document.querySelector('#example5').append(payButtonElement);
// Описание платежной сессии заказа
const mobileIdSession = BeelineMobileId.createSession({
buttonElement: payButtonElement,
merchant: {
login: 'mobilepay',
},
successUrl: 'https://example.com/success',
failUrl: 'https://example.com/fail',
order: {
description: 'Набор T-72AB (Turms-T)',
orderNumber: new Date().getTime().toString(),
amount: 650,
email: 'user@example.com',
phone: '9001234567',
currency: '810',
},
});
// Слушаем события Mobile ID
mobileIdSession.on(
BeelineMobileId.Event.ChangePaymentStatus,
({ status, orderId }) => {
if (BeelineMobileId.PendingStatuses.includes(status)) {
showToast('🕒️ Завершение операции.', 2);
} else if (BeelineMobileId.SuccessfulStatuses.includes(status)) {
showToast('✔️ Оплата выполнена УСПЕШНО', 0);
} else {
showToast('❌ Оплата выполнена НЕУСПЕШНО.', 1);
}
showToast(`Статус заказа: ${status}. Номер заказа ${orderId}`, 2);
},
);
mobileIdSession.on('openDialog', () => {
showToast('Пользователь нажал кнопку оплаты', 2);
});
mobileIdSession.on('closeDialog', () => {
showToast('Пользователь закрыл окно оплаты', 2);
});
mobileIdSession.on(BeelineMobileId.Event.UnfinishedOperation, () => {
showToast('Пользователь закрыл окно в момент опроса статуса оплаты', 2);
});
});
mobileIdSession.updateOrder() - обновление информации в сессии
Иногда требуется без перезагрузки страницы обновить информацию о цене, составе корзины, описания прямо в реальном времени. Для этого можно использовать метод .updateOrder()
Пример:
<div id="controls" style="margin-bottom: 20px">
Сумма (в копейках):
<input type="number" name="amount" value="9900" />
<button type="button" id="apply">Изменить сумму</button>
</div>
<div id="example6"></div>
<script id="main-script">
document.addEventListener('DOMContentLoaded', () => {
const BeelineMobileId = window.BeelineMobileId;
const payButtonElement = BeelineMobileId.createButtonElement();
document.querySelector('#example6').append(payButtonElement);
const mobileIdSession = BeelineMobileId.createSession({
buttonElement: payButtonElement,
merchant: {
login: 'mobilepay',
},
successUrl: 'https://example.com/success',
failUrl: 'https://example.com/fail',
order: {
description: 'Автомобиль DeLorean DMC-12',
orderNumber: new Date().getTime().toString(),
amount: 9900,
},
});
document.querySelector('#apply').addEventListener('click', () => {
mobileIdSession.updateOrder({
...mobileIdSession.options.order,
amount: Number(document.querySelector('[name="amount"]').value),
});
});
});
</script>
mobileIdSession.destroy() - демонтаж кнопки
Метод mobileIdSession.destroy() используется для корректного удаления кнопки из DOM-дерева.
mobileIdSession.destroy()- удаляет обработчик клика на кнопку.mobileIdSession.destroy({ removeButton: true })- удаляет кнопку из DOM-дерева.
Пример:
<div id="controls" style="margin-bottom: 20px">
<button type="button" id="destroy">mobileIdSession.destroy()</button>
<button type="button" id="destroyRemoveButton">
mobileIdSession.destroy({removeButton: true})
</button>
</div>
<div id="example7"></div>
<script>
document.addEventListener('DOMContentLoaded', () => {
const BeelineMobileId = window.BeelineMobileId;
const payButtonElement = BeelineMobileId.createButtonElement();
document.querySelector('#example7').append(payButtonElement);
const mobileIdSession = BeelineMobileId.createSession({
buttonElement: payButtonElement,
merchant: {
login: 'mobilepay',
},
order: {
description: 'Автомобиль DeLorean DMC-12',
orderNumber: new Date().getTime().toString(),
amount: 55000,
},
successUrl: 'https://example.com/success',
failUrl: 'https://example.com/fail',
});
document.querySelector('#destroy').addEventListener('click', () => {
mobileIdSession.destroy();
});
document
.querySelector('#destroyRemoveButton')
.addEventListener('click', () => {
mobileIdSession.destroy({ removeButton: true });
});
});
</script>
Определения статуса платежа
Для корректного и честного определения, что оплата по Mobile ID прошла, рекомендуется делать реализацию через бек-офиc (backend).
Запрос payment/getOrderStatusExtended.do
Для запроса состояния зарегистрированного заказа используется запрос getOrderStatusExtended.do. Например, после того, как вы получили событие BeelineMobileId.Event.ChangePaymentStatus, для того, чтобы убедиться что оплата выполнена успешно, магазин должен через backend сделать POST запрос с заголовком Content-Type: application/json и телом запроса со следующими параметрами:
В запросе должен присутствовать либо orderId, либо orderNumber. Если в запросе присутствуют оба параметра, то приоритетным считается orderId.
orderId - id заказа в платежном шлюзе. Его можно получить, либо через BeelineMobileId.Event.ChangePaymentStatus, либо взять из QUERY-параметра orderId для successUrl / failUrl. Запрос делается на следующий адрес:
Для тестовой среды
https://mpay.rbsuat.com/mobilepay/payment/getOrderStatusExtended.doДля продуктовой среды
https://mpay.rbsgate.com/mobilepay/payment/getOrderStatusExtended.doПоля ответа
Существует несколько наборов параметров ответа. Какие именно наборы параметров будут возвращены, завит от версии getOrderStatusExtended, указанной в настройках продавца.
Примеры запроса и ответа
Пример запроса:
curl --request POST \
--url https://mpay.rbsuat.com/mobilepay/payment/getOrderStatusExtended.do \
--header 'Content-Type: application/json' \
--data '{
"userName": "test_user",
"password": "test_user_password",
"orderId": "04888d6f-7920-7531-8332-8de901efddd0",
"language": "ru",
"orderNumber"="0784sse49d0s134567890"
}'Пример ответа:
{
"errorCode": "0",
"errorMessage": "Успешно",
"orderNumber": "0784sse49d0s134567890",
"orderStatus": 6,
"actionCode": 2007,
"actionCodeDescription": "Время сессии истекло",
"amount": 33000,
"currency": "810",
"date": 1383819429914,
"orderDescription": " ",
"merchantOrderParams": [
{
"name":"email",
"value":"yap"
}
],
"attributes": [
{
"name": "mdOrder",
"value": "b9054496-c65a-4975-9418-1051d101f1b9"
}
],
"cardAuthInfo": {
"expiration": "201912",
"cardholderName": "Ivan",
"secureAuthInfo": {
"eci": 6,
"threeDSInfo": {
"xid": "MDAwMDAwMDEzODM4MTk0MzAzMjM="
}
},
"pan": "411111**1111"
},
"terminalId": "333333"
}Тестовые данные для проверки
Проверить работу кнопки можно в тестовом режиме, используя следующие параметры:
Номер телефона для проверки 9000000000
Будет некоторое время "грузить", затем перейдете ко второму шагу, выбору способа оплаты.
Тестовая карта
card: 4111 1111 1111 1111
expiry: 12/24 cvc: 123
Код СМС, для подтверждения оплаты по карте
12345678