5.5. Виртуальный терминал

Введение

Виртуальный терминал (ВТ) — это технологическое решение, позволяющее обрабатывать транзакции из личного кабинета Торговца в Пользовательском интерфейсе. Эта функция не требует интеграции API торговца с Payneteasy. ВТ сразу предоставляет полнофункциональное рабочее место менеджера по платежам. ВТ используется для удаленной обработки транзакций без присутствия клиента, например, если клиент оформляет заказ или оплачивает услуги, находясь в другом городе или стране. Рабочий процесс ВТ полностью настраивается в соответствии с потребностями бизнеса. Гибкие шаблоны помогут минимизировать время заполнения всех данных клиента. Виртуальный терминал поддерживает регулярные платежи (по рекуррентному идентификатору). Если клиент ранее предоставил данные о держателе карты в процессинговую систему Payneteasy, и Торговец зарегистрировал такой платеж для получения рекуррентного идентификатора, будущие платежи можно совершать с рекуррентным идентификатором, вместо данных о держателе карты. ВТ также позволяет сгенерировать ссылку, по которой клиент может отправить данные держателя карты в защищенной среде и, при необходимости, пройти проверку 3-D Secure.

ВТ обеспечивает безопасный способ обработки транзакций MOTO с поддержкой асимметричной криптографии. Для этого, пожалуйста, Сгенерируйте пару публичного и приватного ключей, передайте публичный ключ в службу поддержки Payneteasy и загрузите приватный ключ в консоль браузера) или пользовательский интерфейс).
Доступные операции для ВТ:

• прием платежей от новых и от ранее зарегистрированных клиентов (Продажа);
• удержание средств новых и ранее зарегистрированных клиентов (Предавторизация);
• перевод средств с карты на карту для новых и для ранее зарегистрированных клиентов (Перевод между картами);
• выдача денежных средств на карты новых и ранее зарегистрированных клиентов (Перевод на карту (D2C));
• перевод средств с одного банковского счета на другой (Перевод на счёт).

Экран ВТ находится в меню “Инструменты” – “Виртуальный терминал (ВТ)”.

../_images/enter.png

Асимметричная криптография

Большим преимуществом нового виртуального терминала является использование системы асимметричной криптографии. Асимметричная криптография (криптография с публичным ключом) представляет собой криптографическую систему, использующую пары ключей: публичные ключи, которые могут быть свободно распространены, и приватные ключи, которые известны только владельцу. Генерация таких ключей основана на криптографических алгоритмах, использующих математические задачи по созданию односторонних функций. В результате, для безопасности требуется лишь сохранять конфиденциальность приватного ключа. Публичный ключ может распространяться открыто без ущерба для безопасности.

Виртуальный терминал персонализируется. Пользователь подписывает запрос на транзакцию своим приватным ключом, а система использует публичный ключ для проверки того, что запрос сделан владельцем соответствующего приватного ключа.

Генерация пары публичного и приватного ключей

Для авторизации запросов виртуальному терминалу требуется пара публичного и приватного ключей от пользователя. Для генерации ключей, перейдите на сайт https://www.openssl.org/ ( https://slproweb.com/products/Win32OpenSSL.html ), загрузите последнюю версию openssl и выполните следующие команды:

openssl genpkey -algorithm RSA -out private_key_pkcs_8.pem -pkeyopt rsa_keygen_bits:4096

openssl rsa -pubout -in private_key_pkcs_8.pem -out public_key.pem

Пожалуйста, не передавайте никому свой приватный ключ, это конфиденциальная информация, предназначенная только для личного использования. Публичный ключ, напротив, должен быть передан Payneteasy для настройки терминала. Во избежание компрометации используйте разные ключи для производственной и тестовой сред.

Незашифрованный приватный ключ PKCS #8 RSA в формате PEM начинается с текста —– BEGIN PRIVATE KEY —–. Этот ключ должен быть импортирован в консоль браузера или пользовательский интерфейс. Подробности см. ниже.

Импорт приватного ключа в консоль браузера

Приватный ключ выгружается в IndexedDB браузера с помощью скрипта, связанного с текущей открытой страницей. Этот скрипт использует только простые API браузера (API WebCrypt, API IndexedDB) и не использует никаких внешних скриптов, чтобы избежать компрометации приватного ключа.
Последовательность импорта:
1. Откройте страницу https://gate.payneteasy.com/paynet-ui/login-step1 в браузере (не входите в систему).
2. Откройте консоль браузера. В Chrome это делается с помощью Ctrl+Shift+J. В Safari, это делается с помощью Ctrl+Shift+I, Ctrl+Alt+C. Для Mac - Cmd, вместо Ctrl.
3. Замените демо ключ реальным приватным ключом в формате PEM (он должен иметь префикс —–BEGIN PRIVATE KEY—– в начале).
var privateKeyPem = `-----BEGIN PRIVATE KEY-----\
     MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDJzUVnqQhDWF2H
     pxAMcyo7f+ucIEJS3AQHG0ET/dxJ0qssGymIjdzelJ3XI+oTq2y9TTimQjtujoeh
     6zl44WrXCbJLCUDWsNjlh7hmBorpU6tJVhw1466CAxkktPJHkMqJYF0efegIfOwU
     otTzwY4tGlN6iWK0aMJ5ZWhWpZDbgap72vrRXKfCN6/JeTUdsOI7PAeZw0me04jZ
     8Lova9FVIbVzOJaFGwSUroMvXevIB8rOD57c3VCLTxE3aGNMz+9DLl6GCm8WZ1US
     HmiHybqgvGLyQswBPFcVzFgd7BpgZs+JAzYDh8ZGANvjA5F9u0b6Ynb3Mpm3+9Rl
     CtvSxKwpAgMBAAECggEAZ6+hro5KIZggjleHRm5Rz7p9S33DtiE3rJMTT/tKmV+1
     9XaLU49YYcDIjMb2OV8GAwnPRpWXRcnT5J0grXxc0do4kpdRij3ZY63lT/6ilxoX
     Uxn8aq/udPy0iYizR5QcjJNHpSgZ9WqCPmQfuJLFw2TYaYh3f6yn54n0Hzj4gd9l
     tsol4xeTKQ47c/vUF7kHfD8IYzL8jv3a3++IqzCwJ3jIpTENsBYAgrkbYN9f9GHD
     BvX3sz6tgFaYU2R8YbDvA0Yq9tVPwYrPvbhwoht6PsjE/R0UK6yqnKPEADdzWvP8
     frXmmtJ35rAymqUWfpqx9RdZ0NMR7J8ut8C5365PJQKBgQD+UidVWut7d9qvhZKq
     +T5qtasH5qkD34idFl4Ay8xsSntqTrXr7q1Ff+FQY6R+f/8IzB4ZqgnV58+8AEMc
     gJzNmkf9L119SCQDxRV/TgW2eHrUrI9XS2AI5tmyzaGY1xL4fCQQMvqNAGERT6sS
     XJRt8WjuGmE4zeqxNB0XY7u1OwKBgQDLIlnksOrPw00lWUbXHSHwdfBzjYU97KVu
     GnOl5fsCmlKanqHUfd/4StnRXpl3l56hig8mYsHV5EcfUEX98PaSbTAy8Lk5y5E9
     ye2ENOgl/IyMgHPtT6spFKm7jRmpulqG4FVCGxQl3n6/nSmztA3S1zLZzi0guI0E
     oxXCbG796wKBgC8NSgOrr5eHRClnIAyL0nVxqPPsQ+bYi3Dsu3WQPwDmAtFXQKcm
     4F3UW/5AgSV6Ttf007jR0cIGglN5BPGYBeqwGZOJGNXd6/PambCU4c+xmKASUO7I
     njrnYu2Gx9f8KqFYbl+k3uAJauwF/lOGV1vD5zLuJICa8Enap2s1Y3wTAoGBAKrx
     QnLISyIB+XbXtVyrYHdJ2Mp1Ks6cye5pBi9y5RQgqCkEG62FLCh3XOvrTvysNEs+
     slccPoBv9UYtuGjmEanRhwEnQMiZPaWgu2dJWp8081X9dxEavS/5+oghSpphf3MH
     b9gMj5z6qvE3IfPfLs7iWCGgdquVgt6HG3Wc6J53AoGAc+ZYE8kMj2p9rtu1uJgX
     +VMbbdLEUqz3BPC9Tzq+eglUlYmwUK1xynKZfkEMcu5PncaBaNLU+GmYKKgw6wZS
     soEF1KvbBB4o6nZdlGo0BirOQ0ijHDWUvtuiaaWAQoQAhQwgqqV2IOC4UfkZ6ORf
     A/UW43A9wZq9kaEgb0YWOes=\
     -----END PRIVATE KEY-----`;

// Algorithm Object
var algorithmKeyGen = {
  name: "RSASSA-PKCS1-v1_5",
  // RsaHashedKeyGenParams
  modulusLength: 2048,
  publicExponent: new Uint8Array([0x01, 0x00, 0x01]),  // Equivalent to 65537
  hash: {
    name: "SHA-256"
  }
};

function parsePem(pemString, type) {
    const expectedPrefix = "-----BEGIN " + type + "-----";
    const expectedPosftix = "-----END " + type + "-----";

    pemString = pemString.trim();
    if (!pemString.startsWith(expectedPrefix)) {
        throw "Expected PEM to start with " + expectedPrefix;
    }
    if (!pemString.endsWith(expectedPosftix)) {
        throw "Expected PEM to end with " + expectedPosftix;
    }
    const base64 = pemString.substring(expectedPrefix.length, pemString.length - expectedPosftix.length).trim();
    return Uint8Array.from(atob(base64), c => c.charCodeAt(0))
}

function parsePrivateKeyPem(pem) {
    return parsePem(pem, 'PRIVATE KEY')
}

function storePrivateKey(privateKey) {
    var request = indexedDB.open("keys");

    request.onupgradeneeded = function() {
      // The database did not previously exist, so create object stores and indexes.
      var db = request.result;
      var store = db.createObjectStore("privateKeys", {keyPath: "name"});

      // Populate with initial data.
      store.put({name: "first", key: privateKey});
    };

    request.onsuccess = function() {
      db = request.result;
    };
}

var privateKeyArray = parsePrivateKeyPem(privateKeyPem);
var NON_EXTRACTABLE = false;
window.crypto.subtle.importKey("pkcs8", privateKeyArray, algorithmKeyGen, NON_EXTRACTABLE, ['sign'])
.then(function(privateKey) {
        storePrivateKey(privateKey);
        privateKeyPem = null;
        privateKeyArray = null;
    }
);
4. Скопируйте содержимое этого скрипта и вставьте его в консоль браузера.
5. Ключ был загружен в браузер неизвлекаемым способом.

Warning

Если приватный ключ интегрирован в браузер, но совершить транзакцию не удается, очистите кэш браузера и попробуйте еще раз интегрировать приватный ключ.


Note

Если предложенный код вам не подходит или требуется дополнительная информация о Web Crypto API, посетите официальный сайт https://developer.mozilla.org/en-US/docs/Web/API/Web_Crypto_API.

Импорт приватного ключа в пользовательский интерфейс

Виртуальный терминал имеет функцию использования приватного ключа через пользовательский интерфейс.

../_images/add_private_key_1.png

Для более быстрого проведения большого количества тестовых транзакций установите флажок “Сохранить ключ в браузере”, и приватный ключ будет автоматически сохранен в браузере.

../_images/add_private_key_2.png

Подробности интерфейса ВТ

ВТ имеет кнопки управления, которые более подробно описаны ниже.

icon - Adding a private key icon - Copy link
icon - Hide sealed fields icon - Show sealed fields
icon - Save template icon - Default template
icon - Unseal the field icon - Seal the field
icon - Clean all unsealed fields icon - Required fields

Управление шаблонами

1) Для упрощения работы оператора Виртуального терминала, поля данных можно сохранить в виде шаблона. Использование шаблонов позволяет работать только с индивидуальными атрибутами клиента.

../_images/create_template_step_1.png

2) После ввода данных в правой части страницы можно сохранить эти данные как шаблон, нажав ‘Сохранить как шаблон’ и указав имя нового шаблона.

../_images/create_template_step_2.png

3) Для редактирования, клонирования, удаления шаблонов или их распространения, нажмите на три точки возле имени шаблона и выберите нужный параметр. Шаблоном можно делиться с пользователями, обладающими доступом более низкого уровня. Таким образом, Торговец может поделиться шаблоном со своими сотрудниками.

../_images/create_template_step_3.png

Для всех выбранных пользователей созданный шаблон станет шаблоном по умолчанию при загрузке виртуального терминала.
Изменения по-прежнему можно вносить до проведения транзакции, но только создатель шаблона имеет право изменять шаблон. Пользователи, которым был предоставлен доступ к шаблону, могут только копировать его.
Количество созданных шаблонов, доступных для совместного использования, не ограничено. Все они будут отображаться пользователям в алфавитном порядке.

../_images/create_template_step_3.1.png

Спецификация транзакциий

Списания

В разделе депозита можно совершить транзакцию продажи и предавторизации (холдирования), которые описаны ниже.

Продажа

Продажа — это тип транзакции, при которой покупатель получает товары или услуги от Торговца в обмен на деньги или другие активы.
Чтобы инициировать транзакцию, отправьте следующие 3 типа информации:
1) Данные транзакции — терминал, сумма, валюта, описание, номер заказа должны быть заполнены непосредственно в ВТ.
2) Информация о карте — владелец карты, номер карты, срок действия:
- можно заполнить непосредственно в ВТ;
- может быть заполнено автоматически вместе с Личной информацией, если указан Идентификатор рекуррента. Если указан идентификатор рекуррентного платежа, а поле CVV пустое, используйте “Cкопировать ссылку”, чтобы отправить форму клиенту для дополнительного подтверждения. В случае, если CVV будет заполнен непосредственно в форме ВТ, транзакция будет обработана напрямую;
- может быть заполнено клиентом на форме.
3) Личная информация - имя, фамилия, город, адрес, почтовый индекс, телефон, адрес электронной почты, IP-адрес клиента, страна и т. д.:
- можно заполнить непосредственно в ВТ;
- может быть заполнено автоматически вместе с данными Карты, если указан идентификатор рекуррента;
- может быть заполнено автоматически, если указан идентификатор клиента.

Обработка транзакции:
- Используйте кнопку “Копировать ссылку” для генерации ссылки для оплаты и отправки ее клиенту. Данный сценарий актуален для транзакций, требующих предоставления клиентом дополнительной информации в форме (данные держателя карты, проверка 3DS и т. д.).
- Используйте кнопку “Провести” в случае, если транзакция не требует предоставления клиентом дополнительной информации (например, безакцептные списания noCVV и non3D).

На изображении показаны возможные варианты заполнения.

../_images/sale.png

Предавторизация

Предавторизация — тип транзакции, при которой банк по запросу торговца блокирует указанную сумму на карточном счете клиента и не позволяет держателю карты использовать эту заблокированную сумму.
Важно знать, что блокировка сохраняется в течение определенного периода времени в зависимости от вида карты (обычно, максимальный срок блокировки составляет 7 дней для дебетовых карт и 28 дней для кредитных карт).
Чтобы инициировать транзакцию, отправьте следующие 3 типа информации:
1) Данные транзакции — терминал, сумма, валюта, описание, номер заказа должны быть заполнены непосредственно в ВТ.
2) Информация о карте — владелец карты, номер карты, срок действия:
- можно заполнить непосредственно в ВТ;
- может быть заполнено автоматически вместе с Личной информацией, если указан Идентификатор рекуррента. Если указан идентификатор рекуррентного платежа, а поле CVV пустое, используйте “Cкопировать ссылку”, чтобы отправить форму клиенту для дополнительного подтверждения. В случае, если CVV будет заполнен непосредственно в форме ВТ, транзакция будет обработана напрямую;
- может быть заполнено клиентом на форме.
3) Личная информация - имя, фамилия, город, адрес, почтовый индекс, телефон, адрес электронной почты, IP-адрес клиента, страна и т. д.:
- можно заполнить непосредственно в ВТ;
- может быть заполнено автоматически вместе с данными Карты, если указан идентификатор рекуррента;
- может быть заполнено автоматически, если указан идентификатор клиента.

Обработка транзакции:
- Используйте кнопку “Копировать ссылку” для генерации ссылки для оплаты и отправки ее клиенту. Данный сценарий актуален для транзакций, требующих предоставления клиентом дополнительной информации в форме (данные держателя карты, проверка 3DS и т. д.).
- Используйте кнопку “Провести” в случае, если транзакция не требует предоставления клиентом дополнительной информации (например, безакцептные списания noCVV и non3D).

На изображении показаны возможные варианты заполнения.
../_images/preauth.png

Перевод между картами

Перевод между картами — это транзакция перевода средств с карты на карту (C2C).
Возможны несколько сценариев:
1) Перевод денег с неизвестной карты на зарегистрированную карту.
Данные Получателя извлекаются из рекуррентного идентификатора назначения. Информация о карте получателя (владелец карты, номер карты, срок действия) и личная информация (имя, фамилия, город, адрес, почтовый индекс, мобильный номер, электронная почта, страна и другие необязательные данные клиента) будут заполнены автоматически. Для ускорения заполнения полей получателя используйте раздел “Последние использованные” рядом с полем “Рекуррентный идентификатор назначения”, в котором содержатся ранее использованные рекуррентные идентификаторы. Торговец создает специальную ссылку для отправителя при помощи кнопки “Копировать ссылку”. Отправитель получает ссылку на форму, в которой он указывает номер своей карты, дату окончания срока действия, имя держателя карты и CVV, а затем проходит проверку 3DS при необходимости.
2) Перевод денег с зарегистрированной карты на неизвестную карту.
Данные отправителя извлекаются из рекуррентного идентификатора. Разделы “Информация о карте отправителя” (владелец карты, номер карты, срок действия) и “личная информация” (имя, фамилия, город, адрес, почтовый индекс, мобильный номер, адрес электронной почты, IP-адрес клиента, страна и другие необязательные данные клиента) будут заполнены автоматически. CVV не сохраняется и должен быть запрошен у Отправителя. Для ускорения заполнения полей Отправителя используйте раздел “Последние использованные” в поле “рекуррентный идентификатор”, в котором содержатся ранее использованные рекуррентные идентификаторы. Торговец создает специальную ссылку для Отправителя с помощью кнопки “Копировать ссылку”. Отправитель получает ссылку на форму, в которой он указывает номер карты получателя, а затем проходит проверку 3DS при необходимости.
3) Перевод денег между известными или зарегистрированными картами.
Торговец заполняет данные держателя карты или использует рекуррентные идентификаторы как для Отправителя, так и для Получателя средств непосредственно в ВТ и инициирует обработку перевода кнопкой “Провести”. В этом случае транзакция должна быть обработана через non3D канал, что нетипично для переводов C2C.

Note

При заполнении поля “Идентификатор клиента” разделы личной информации (Имя, Фамилия, Город, Адрес, Почтовый индекс, Мобильный номер, Электронная почта, Страна) будут заполнены автоматически.


На изображении показаны возможные варианты заполнения.

../_images/c2c.png

Выплаты

В разделе вывода средств возможно осуществить перевод на карту (D2C - deposit to card) и перевод на счёт, которые описаны ниже.

Перевод на карту (D2C)

Операция перевода на карту представляет собой перевод средств с банковского счета Торговца на банковскую карту Получателя.
Возможны несколько сценариев:
1) Перевод денег на известную карту.
Торговец заполняет данные держателя карты для получателя средств и совершает выплату непосредственно в ВТ с помощью кнопки “Провести”.
2) Перевод денег на зарегистрированную карту.
Данные Получателя извлекаются с использованием рекуррентного идентификатора назначения. Разделы “Информация о карте Получателя” (владелец карты, номер карты, срок действия) и “Личная информация” (имя, фамилия, город, адрес, почтовый индекс, мобильный номер, электронная почта, страна и другие необязательные данные клиента) будут заполнены автоматически. Для ускорения заполнения полей Получателя используйте раздел “Последние использованные” рядом с полем рекуррентного идентификатора назначения, в котором содержатся ранее использованные рекуррентные идентификаторы.
3) Перевод денег на неизвестную карту.
Торговец создает специальную ссылку для получателя средств при помощи кнопки “Копировать ссылку”. Получателю отправляется ссылка на форму, в которой он должен указать номер карты получателя.

Note

При заполнении ячейки “Идентификатор клиента” разделы “Личной информации” (Имя, Фамилия, Город, Адрес, Почтовый индекс, Мобильный номер, Электронная почта, Страна) будут заполнены автоматически.


На изображении показаны возможные варианты заполнения.

../_images/d2c.png

Перевод на счёт

Транзакция перевода на счёт — это перечисление средств на номер счета Получателя, цифровой кошелек или другой тип счета. Торговец заполняет платежные данные для Получателя средств непосредственно в ВТ и инициирует выплату кнопкой “Провести”.

Note

При заполнении поля “Идентификатор клиента” разделы личной информации (Имя, Фамилия, Город, Адрес, Почтовый индекс, Мобильный номер, Электронная почта, Страна) будут заполнены автоматически.


На изображении показаны возможные варианты заполнения.

../_images/payout.png