.. meta:: :description: Виртуальный терминал в UI менеджера Payneteasy: ручная обработка транзакций без API-интеграции с поддержкой рекуррентных платежей и ссылок на клиентов. .. _vt_man: Виртуальный терминал ################ .. role:: ex .. role:: code Введение ======== | Виртуальный терминал (VT) — технологическое решение, позволяющее обрабатывать транзакции из личного кабинета Торговца в пользовательском интерфейсе. Эта функция не требует API-интеграции Торговца с Payneteasy. VT сразу предоставляет полнофункциональное рабочее место менеджера платежей. VT используется для удалённой обработки транзакций без присутствия клиента, например если клиент оформляет заказ или оплачивает услуги, находясь в другом городе или стране. Рабочий процесс VT полностью настраивается под потребности бизнеса. Гибкие шаблоны помогают сократить время заполнения данных клиента. Виртуальный терминал поддерживает рекуррентные платежи (по рекуррентному ID). Если клиент ранее предоставил данные держателя карты системе обработки gate.payneteasy.ru, а Торговец зарегистрировал такой платёж для получения рекуррентного ID, последующие платежи можно выполнять по рекуррентному ID вместо данных держателя карты. VT также позволяет сгенерировать ссылку для передачи клиентом данных держателя карты в защищённой среде и, при необходимости, прохождения проверки 3-D Secure. | | VT обеспечивает безопасный способ обработки MOTO-транзакций с поддержкой асимметричной криптографии. Для этого выполните :ref:`man_public_private_keys_vt`, затем передайте открытый ключ службе поддержки Payneteasy и загрузите закрытый ключ в Browser Console (:ref:`man_import_private_keys_to_bc_vt`) или User Interface (:ref:`man_private_key_to_ui_vt`). | Доступные операции для ВТ: | | • принимать платежи как от новых, так и от ранее зарегистрированных клиентов (:ref:`man_sale_vt`); | • удерживать средства как у новых, так и у ранее зарегистрированных клиентов (:ref:`man_preauth_vt`); | • перевод средств с карты на карту как для новых, так и для ранее зарегистрированных клиентов (:ref:`man_transfer_vt`); | • выдача средств на карты как новых, так и ранее зарегистрированных клиентов (:ref:`man_d2c_vt`); | • перевод средств с одного банковского счёта на другой (:ref:`man_payout_vt`). | | Экран ВТ находится в меню "Инструменты" – "Виртуальный терминал (ВТ)". | .. image:: ../_static/images/vt/enternew.png :align: center :width: 600px Асимметричная криптография ======================= | Большим преимуществом нового виртуального терминала является использование системы асимметричной криптографии. Асимметричная криптография (криптография с публичным ключом) представляет собой криптографическую систему, использующую пары ключей: публичные ключи, которые могут быть свободно распространены, и приватные ключи, которые известны только владельцу. Генерация таких ключей основана на криптографических алгоритмах, использующих математические задачи по созданию односторонних функций. В результате, для безопасности требуется лишь сохранять конфиденциальность приватного ключа. Публичный ключ может распространяться открыто без ущерба для безопасности. | | Виртуальный терминал персонализируется. Пользователь подписывает запрос на транзакцию своим приватным ключом, а система использует публичный ключ для проверки того, что запрос сделан владельцем соответствующего приватного ключа. .. _man_public_private_keys_vt: Генерация пары публичного и приватного ключей ------------------------------------------ | Для авторизации запросов виртуальному терминалу требуется пара публичного и приватного ключей от пользователя. Для генерации ключей, перейдите на сайт https://www.openssl.org/ ( https://slproweb.com/products/Win32OpenSSL.html ), загрузите последнюю версию openssl и выполните следующие команды: | | :ex:`openssl genpkey -algorithm RSA -out private_key_pkcs_8.pem -pkeyopt rsa_keygen_bits:4096` | | :ex:`openssl rsa -pubout -in private_key_pkcs_8.pem -out public_key.pem` | | Пожалуйста, не передавайте никому свой приватный ключ, это конфиденциальная информация, предназначенная только для личного использования. Публичный ключ, напротив, должен быть передан Payneteasy для настройки терминала. Во избежание компрометации используйте разные ключи для производственной и тестовой сред. | | Незашифрованный закрытый ключ PKCS #8 RSA в формате PEM начинается с текста —– BEGIN PRIVATE KEY —–. Этот ключ необходимо импортировать в консоль браузера или пользовательский интерфейс. Подробнее см. ниже. .. _man_import_private_keys_to_bc_vt: Импорт приватного ключа в консоль браузера ------------------------------------- | Приватный ключ выгружается в IndexedDB браузера с помощью скрипта, связанного с текущей открытой страницей. Этот скрипт использует только простые API браузера (API WebCrypt, API IndexedDB) и не использует никаких внешних скриптов, чтобы избежать компрометации приватного ключа. | Последовательность импорта: | 1. Откройте страницу https://gate.payneteasy.ru/paynet-ui/login-step1 в браузере (не входите в систему). | 2. Откройте консоль браузера. В Chrome это делается с помощью :code:`Ctrl+Shift+J`. В Safari, это делается с помощью :code:`Ctrl+Shift+I`, :code:`Ctrl+Alt+C`. Для Mac - :code:`Cmd`, вместо :code:`Ctrl`. | 3. Замените демо ключ реальным приватным ключом в формате PEM (он должен иметь префикс **-----BEGIN PRIVATE KEY-----** в начале). .. code-block:: none 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. .. _man_private_key_to_ui_vt: Импорт приватного ключа в пользовательский интерфейс ------------------------------------ | Виртуальный терминал имеет функцию использования приватного ключа через пользовательский интерфейс. | .. image:: ../_static/images/vt/add_private_key_1.png :align: center :width: 600px | | Для более быстрого проведения большого количества тестовых транзакций установите флажок "Сохранить ключ в браузере", и приватный ключ будет автоматически сохранен в браузере. | .. image:: ../_static/images/vt/add_private_key_2.png :align: center :width: 600px Подробности интерфейса ВТ ==================== | ВТ имеет кнопки управления, которые более подробно описаны ниже. | .. raw:: html
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) Для упрощения работы оператора Виртуального терминала, поля данных можно сохранить в виде шаблона. Использование шаблонов позволяет работать только с индивидуальными атрибутами клиента. | .. image:: ../_static/images/vt/create_template_step_1.png :align: center :width: 400px | | 2) После ввода данных в правой части страницы можно сохранить эти данные как шаблон, нажав 'Сохранить как шаблон' и указав имя нового шаблона. | .. image:: ../_static/images/vt/create_template_step_2.png :align: center :width: 400px | | 3) Для редактирования, клонирования, удаления шаблонов или их распространения, нажмите на три точки возле имени шаблона и выберите нужный параметр. Шаблоном можно делиться с пользователями, обладающими доступом более низкого уровня. Таким образом, Торговец может поделиться шаблоном со своими сотрудниками. | .. image:: ../_static/images/vt/create_template_step_3.png :align: center :width: 400px | | Для всех выбранных пользователей созданный шаблон станет шаблоном по умолчанию при загрузке виртуального терминала. | Изменения по-прежнему можно вносить до проведения транзакции, но только создатель шаблона имеет право изменять шаблон. Пользователи, которым был предоставлен доступ к шаблону, могут только копировать его. | Количество созданных шаблонов, доступных для совместного использования, не ограничено. Все они будут отображаться пользователям в алфавитном порядке. | .. image:: ../_static/images/vt/create_template_step_3.1.png :align: center :width: 400px Спецификация транзакциий ========================= .. _man_deposit_vt: Списания ------- | В разделе депозита можно совершить транзакцию продажи и предавторизации (холдирования), которые описаны ниже. .. _man_sale_vt: Продажа ~~~~ | Продажа — это тип транзакции, при которой покупатель получает товары или услуги от Торговца в обмен на деньги или другие активы. | Чтобы инициировать транзакцию, отправьте следующие 3 типа информации: | 1) Данные транзакции — терминал, сумма, валюта, описание, номер заказа должны быть заполнены непосредственно в ВТ. | 2) Информация о карте — владелец карты, номер карты, срок действия: | - можно заполнить непосредственно в ВТ; | - может быть заполнено автоматически вместе с Личной информацией, если указан Идентификатор рекуррента. Если указан идентификатор рекуррентного платежа, а поле CVV пустое, используйте "Cкопировать ссылку", чтобы отправить форму клиенту для дополнительного подтверждения. В случае, если CVV будет заполнен непосредственно в форме ВТ, транзакция будет обработана напрямую; | - может быть заполнено клиентом на форме. | 3) Личная информация - имя, фамилия, город, адрес, почтовый индекс, телефон, адрес электронной почты, IP-адрес клиента, страна и т. д.: | - можно заполнить непосредственно в ВТ; | - может быть заполнено автоматически вместе с данными Карты, если указан идентификатор рекуррента; | - может быть заполнено автоматически, если указан идентификатор клиента. | | Обработка транзакции: | - Используйте кнопку "Копировать ссылку" для генерации ссылки для оплаты и отправки ее клиенту. Данный сценарий актуален для транзакций, требующих предоставления клиентом дополнительной информации в форме (данные держателя карты, проверка 3DS и т. д.). | - Используйте кнопку "Провести" в случае, если транзакция не требует предоставления клиентом дополнительной информации (например, безакцептные списания noCVV и non3D). | На изображении показаны возможные варианты заполнения. | .. image:: ../_static/images/vt/sale.png :align: center :width: 600px .. _man_preauth_vt: Предавторизация ~~~~~~~ | Предавторизация — тип транзакции, при которой банк по запросу торговца блокирует указанную сумму на карточном счете клиента и не позволяет держателю карты использовать эту заблокированную сумму. | Важно знать, что блокировка сохраняется в течение определенного периода времени в зависимости от вида карты (обычно, максимальный срок блокировки составляет 7 дней для дебетовых карт и 28 дней для кредитных карт). | Чтобы инициировать транзакцию, отправьте следующие 3 типа информации: | 1) Данные транзакции — терминал, сумма, валюта, описание, номер заказа должны быть заполнены непосредственно в ВТ. | 2) Информация о карте — владелец карты, номер карты, срок действия: | - можно заполнить непосредственно в ВТ; | - может быть заполнено автоматически вместе с Личной информацией, если указан Идентификатор рекуррента. Если указан идентификатор рекуррентного платежа, а поле CVV пустое, используйте "Cкопировать ссылку", чтобы отправить форму клиенту для дополнительного подтверждения. В случае, если CVV будет заполнен непосредственно в форме ВТ, транзакция будет обработана напрямую; | - может быть заполнено клиентом на форме. | 3) Личная информация - имя, фамилия, город, адрес, почтовый индекс, телефон, адрес электронной почты, IP-адрес клиента, страна и т. д.: | - можно заполнить непосредственно в ВТ; | - может быть заполнено автоматически вместе с данными Карты, если указан идентификатор рекуррента; | - может быть заполнено автоматически, если указан идентификатор клиента. | | Обработка транзакции: | - Используйте кнопку "Копировать ссылку" для генерации ссылки для оплаты и отправки ее клиенту. Данный сценарий актуален для транзакций, требующих предоставления клиентом дополнительной информации в форме (данные держателя карты, проверка 3DS и т. д.). | - Используйте кнопку "Провести" в случае, если транзакция не требует предоставления клиентом дополнительной информации (например, безакцептные списания noCVV и non3D). | | На изображении показаны возможные варианты заполнения. | .. image:: ../_static/images/vt/preauth.png :align: center :width: 600px .. _man_transfer_vt: Перевод между картами --------------------------- | Перевод между картами — это транзакция перевода средств с карты на карту (C2C). | Возможны несколько сценариев: | 1) Перевод денег с неизвестной карты на зарегистрированную карту. | Данные Получателя извлекаются из рекуррентного идентификатора назначения. Информация о карте получателя (владелец карты, номер карты, срок действия) и личная информация (имя, фамилия, город, адрес, почтовый индекс, мобильный номер, электронная почта, страна и другие необязательные данные клиента) будут заполнены автоматически. Для ускорения заполнения полей получателя используйте раздел "Последние использованные" рядом с полем "Рекуррентный идентификатор назначения", в котором содержатся ранее использованные рекуррентные идентификаторы. Торговец создает специальную ссылку для отправителя при помощи кнопки "Копировать ссылку". Отправитель получает ссылку на форму, в которой он указывает номер своей карты, дату окончания срока действия, имя держателя карты и CVV, а затем проходит проверку 3DS при необходимости. | 2) Перевод денег с зарегистрированной карты на неизвестную карту. | Данные отправителя извлекаются из рекуррентного идентификатора. Разделы "Информация о карте отправителя" (владелец карты, номер карты, срок действия) и "личная информация" (имя, фамилия, город, адрес, почтовый индекс, мобильный номер, адрес электронной почты, IP-адрес клиента, страна и другие необязательные данные клиента) будут заполнены автоматически. CVV не сохраняется и должен быть запрошен у Отправителя. Для ускорения заполнения полей Отправителя используйте раздел "Последние использованные" в поле "рекуррентный идентификатор", в котором содержатся ранее использованные рекуррентные идентификаторы. Торговец создает специальную ссылку для Отправителя с помощью кнопки "Копировать ссылку". Отправитель получает ссылку на форму, в которой он указывает номер карты получателя, а затем проходит проверку 3DS при необходимости. | 3) Перевод денег между известными или зарегистрированными картами. | Торговец заполняет данные держателя карты или использует рекуррентные идентификаторы как для Отправителя, так и для Получателя средств непосредственно в ВТ и инициирует обработку перевода кнопкой "Провести". В этом случае транзакция должна быть обработана через non3D канал, что нетипично для переводов C2C. | .. Note:: При заполнении поля "Идентификатор клиента" разделы личной информации (Имя, Фамилия, Город, Адрес, Почтовый индекс, Мобильный номер, Электронная почта, Страна) будут заполнены автоматически. | | На изображении показаны возможные варианты заполнения. | .. image:: ../_static/images/vt/c2c.png :align: center :width: 600px Выплаты ---------- | В разделе вывода средств возможно осуществить перевод на карту (D2C - deposit to card) и перевод на счёт, которые описаны ниже. .. _man_d2c_vt: Перевод на карту (D2C) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | Операция перевода на карту представляет собой перевод средств с банковского счета Торговца на банковскую карту Получателя. | Возможны несколько сценариев: | 1) Перевод денег на известную карту. | Торговец заполняет данные держателя карты для получателя средств и совершает выплату непосредственно в ВТ с помощью кнопки "Провести". | 2) Перевод денег на зарегистрированную карту. | Данные Получателя извлекаются с использованием рекуррентного идентификатора назначения. Разделы "Информация о карте Получателя" (владелец карты, номер карты, срок действия) и "Личная информация" (имя, фамилия, город, адрес, почтовый индекс, мобильный номер, электронная почта, страна и другие необязательные данные клиента) будут заполнены автоматически. Для ускорения заполнения полей Получателя используйте раздел "Последние использованные" рядом с полем рекуррентного идентификатора назначения, в котором содержатся ранее использованные рекуррентные идентификаторы. | 3) Перевод денег на неизвестную карту. | Торговец создает специальную ссылку для получателя средств при помощи кнопки "Копировать ссылку". Получателю отправляется ссылка на форму, в которой он должен указать номер карты получателя. | .. Note:: При заполнении ячейки "Идентификатор клиента" разделы "Личной информации" (Имя, Фамилия, Город, Адрес, Почтовый индекс, Мобильный номер, Электронная почта, Страна) будут заполнены автоматически. | | На изображении показаны возможные варианты заполнения. | .. image:: ../_static/images/vt/d2c.png :align: center :width: 600px .. _man_payout_vt: Перевод на счёт ~~~~~~ | Транзакция перевода на счёт — это перечисление средств на номер счета Получателя, цифровой кошелек или другой тип счета. Торговец заполняет платежные данные для Получателя средств непосредственно в ВТ и инициирует выплату кнопкой "Провести". | .. Note:: При заполнении поля "Идентификатор клиента" разделы личной информации (Имя, Фамилия, Город, Адрес, Почтовый индекс, Мобильный номер, Электронная почта, Страна) будут заполнены автоматически. | | На изображении показаны возможные варианты заполнения. | .. image:: ../_static/images/vt/payout.png :align: center :width: 600px