.. meta:: :description: Процесс mobile device transfer в Payneteasy: инициация переводов с карты на карту из мобильного приложения с использованием MoneySend или Visa Direct. .. _mobile_device_transfer: Mobile Device Transfer ====================== .. role:: ex .. role:: code Введение ------------ | Перевод с мобильного устройства может выполняться с данными держателя карты отправителя и получателя средств или со ссылкой на карту, ранее созданной в процессе :ref:`проверки карты` либо в предыдущих транзакциях Transfer/Sale. | | Значение терминов см. в :ref:`Глоссарии`. Сценарий Переводов ------------- .. uml:: :align: center @startuml autonumber title Мобильное приложение - \nПеревод стредств с карты 3-DS skinparam ParticipantPadding 70 participant "Клиент" as client participant "Мобильное приложение" as mobile participant "Сервер \nПрисоединяющейся Стороны" as party participant "Payneteasy" as company client <-> mobile: Аутентификация mobile -> party: Запрос \nтокена доступа mobile <-- party: Ответ с \nтокеном доступа note right accessToken end note mobile -> party: Запрос инициации \nперевода средств mobile <-- party: Ответ инициации \nперевода средств mobile -> company: Обработка запроса \nперевода средств mobile <-- company: Обработка ответа \nперевода средств note right session token end note party <- company : Проверка запроса \nперевода средств party --> company : Проверка ответа \nперевода средств company -> company: Начало обработки mobile -> company: Запрос статуса \nперевода средств note left session token end note mobile <-- company: Ответ статуса \nперевода средств note right state = REDIRECT_REQUEST end note mobile -> mobile: Открытие браузера и \nпредоставлние redirectUrl \nдля перенаправления \nна страницу 3DS activate mobile client <-- mobile: Предоставление redirectUrl client -> mobile: Предоставлние \nдержателем карты \nданных аутентификации mobile -> company: Обновление статуса \nперевода средств company --> mobile: Запрос на закрытие браузера destroy mobile company -> company: Обработка перевода средств party <- company: Запрос уведомления \nперевода средств \nсравнения карты note right server card id end note party --> company: Ответ уведомления \nперевода средств \nсравнения карты mobile -> company: Запрос статуса перевода средств note left session token end note mobile <-- company: Ответ статуса перевода средств note right bankorder id state = APPROVED|DECLINED end note party <- company: Запрос обратного вызова \nс финальным статусом party --> company: Ответ обратного вызова \nс финальным статусом @enduml | (1,2,3) Для выполнения аутентификации Потребителя в приложении Присоединяющейся стороны Присоединяющаяся сторона может использовать любой метод, наиболее соответствующий её потребностям. В результате сервер Присоединяющейся стороны генерирует :ex:`{accessToken}` и предоставляет его приложению Присоединяющейся стороны. Этот параметр будет использоваться для начала и продолжения сеанса. | (4,5) Чтобы инициировать перевод средств, приложение Присоединяющейся стороны отправляет :ex:`{accessToken}` с суммой транзакции и другими параметрами устройства на сервер Присоединяющейся стороны; они используются для начала сессии с уникальными случайными :ex:`{nonce}` и зашифрованной :ex:`{signature}`. Для инициирования запроса Transfer см. :ref:`Initiate Transfer`. | (6,7) На этом этапе приложение Присоединяющейся стороны отправляет данные держателя карты, устройства, сеанса и другие параметры напрямую в Payneteasy для перевода средств с карты на карту. См. :ref:`Perform Transfer`. | (8,9) Check transfer используется в целях безопасности и позволяет Payneteasy сравнить данные приложения Присоединяющейся стороны с данными на сервере Присоединяющейся стороны. О реализации запроса см. :ref:`Check Transfer`. | (11,12,21,22) Приложение Присоединяющейся стороны отправляет запрос статуса перевода в Payneteasy для получения статуса транзакции Transfer. Для реализации запроса см. :ref:`статус Transfer`. | (19,20) Payneteasy отправляет на сервер/прокси Присоединяющейся стороны уведомление сопоставления карты Transfer с созданной на её стороне ссылкой на карту — :ex:`{serverCardId}`. Для реализации запроса уведомления сопоставления карты Transfer см. :ref:`Уведомление сопоставления карты Transfer`. | (23,24) Присоединяющаяся сторона указала URL обратного вызова; Платёжный Шлюз отправляет сообщение на URL обратного вызова каждый раз, когда транзакция достигает финального статуса, независимо от того, является ли результат :ex:`approved`, :ex:`declined` или имеет другой :ref:`финальный статус`. Подробнее см. в :ref:`Callbacks`. .. _transfer-repeat: Repeat Сценарий Переводов -------------------- | После успешной процедуры Card mapping новые переводы с теми же данными держателя карты можно выполнять проще для Покупателя. | Приложение Присоединяющейся стороны создаёт новые запросы Transfer, используя :ex:`{clientCardId}` вместо данных держателя исходной и/или целевой карты. Payneteasy отправляет эти :ex:`{clientCardId}` на сервер Присоединяющейся стороны в «Check transfer request» и получает сопоставленные с ними :ex:`{serverCardId}` в «Check transfer response». Эти :ex:`{serverCardId}` используются для продолжения обработки транзакции Transfer. | Поток транзакции остаётся тем же: :ref:`Инициация перевода` -> :ref:`Выполнение перевода` -> :ref:`Проверка перевода`. | Если нет необходимости изменять данные Потребителя (например, адрес, телефон и т. д.), «Perform transfer request» для Repeat transfer можно отправить без необязательных параметров и со ссылками на карты отправителя и получателя вместо данных держателя карты. Если данные Потребителя требуется изменить, необходимо создать новую ссылку на исходную карту. | Если источник и/или назначение :ex:`{clientCardId}` используются в «запросе выполнения перевода», источник и/или назначение :ex:`{serverCardId}` должны быть включены в «ответ проверки Transfer» и подпись. | Если исходный :ex:`{clientCardId}` был сопоставлен с :ex:`{serverCardId}` в транзакции со значением :ex:`{consumer.email}`, новый «запрос на выполнение перевода» и «ответ проверки подписи» с этим :ex:`{clientCardId}` также должны содержать то же значение :ex:`{consumer.email}`. | | Для процесса Repeat Transfer используйте следующие параметры источника средств в запросе Perform Transfer: | #. :ex:`{sourceOfFunds.reference.clientCardId}` #. :ex:`{sourceOfFunds.reference.securityCode}` | Instead of: | #. :ex:`{sourceOfFunds.card.expiry.month}` #. :ex:`{sourceOfFunds.card.expiry.year}` #. :ex:`{sourceOfFunds.card.holder}` #. :ex:`{sourceOfFunds.card.holder.firstName}` #. :ex:`{sourceOfFunds.card.holder.lastName}` #. :ex:`{sourceOfFunds.card.number}` #. :ex:`{sourceOfFunds.card.securityCode}` | Для получателя средств используйте :ex:`{destinationOfFunds.reference.clientCardId}` вместо :ex:`{destinationOfFunds.card.number}`. .. uml:: :align: center @startuml autonumber title Мобильное Устройство - \nСсылка на карту для повторного перевода средств participant "Мобильное приложение" as mobile participant "Сервер \nПрисоединяющейся Стороны" as party participant "Payneteasy" as company skinparam ParticipantPadding 80 == Последняя стадия верификации карты \nили перевода средств == party <- company: Запрос на уведомление \nсравнения карты note right serverCardId end note party --> company: Ответ уведомления \nсравнения карты party --> party: Создание clientCardId для serverCardId party -> mobile: Хранение ссылки в приложении \nили отправка по запросу note right clientCardId end note == Новый перевод средств == mobile -> party: Запрос на инициацию \nперевода средств mobile <-- party: Ответ на инициацию \nперевода средств mobile -> company: Обработка перевода средств note left clientCardId end note mobile <-- company: Ответ обработки \nперевода средств party <- company: Проверка запроса \nна перевод средств note right clientCardId end note party --> company: Проверка ответа \nперевода средств note left serverCardId end note company -> company: Обработка перевода средств @enduml | (1,2) Payneteasy отправляет на сервер/прокси Присоединяющейся стороны уведомление сопоставления карты Transfer с созданной на её стороне ссылкой на карту — :ex:`{serverCardId}`. Для реализации запроса уведомления сопоставления карты Transfer см. :ref:`Уведомление сопоставления карты Transfer`. | (5,6) Чтобы инициировать перевод средств, приложение Присоединяющейся стороны отправляет :ex:`{accessToken}` с суммой транзакции и другими параметрами устройства на сервер Присоединяющейся стороны; они используются для начала сессии с уникальными случайными :ex:`{nonce}` и зашифрованной :ex:`{signature}`. Для инициирования запроса Transfer см. :ref:`Initiate Transfer`. | (7,8) На этом этапе приложение Присоединяющейся стороны отправляет данные держателя карты, устройства, сеанса и другие параметры напрямую в Payneteasy для перевода средств с карты на карту. См. :ref:`Perform Transfer`. | (9,10) Check transfer используется в целях безопасности и позволяет Payneteasy сравнить данные приложения Присоединяющейся стороны с данными на сервере Присоединяющейся стороны. О реализации запроса см. :ref:`Check Transfer`. | Consumer Defined Transfer Rates Flow ------------------------------------ | Тарифы Transfer, заданные потребителем, — необязательная функция, позволяющая отправителю выбрать наиболее подходящую сумму комиссии для транзакции Transfer из нескольких доступных шлюзов поставщиков платежей. | Возможность такой функции зависит от интеграции. Пожалуйста, уточните детали у менеджера поддержки. | При включении этой функции поток Transfer расширяется: #. Если Check transfer выполнен успешно, Payneteasy приостанавливает обработку, включает список возможных комиссий в следующий ответ статуса Transfer и ожидает подтверждения от потребителя. #. Клиент выбирает наиболее подходящую комиссию из списка в приложении Присоединяющейся стороны. #. Приложение Присоединяющейся стороны отправляет выбранный шлюз (используя его алиас-имя :code:`assignedId`) в запросе Complete transfer к Payneteasy. #. Payneteasy продолжает обрабатывать транзакцию на выбранном шлюзе. .. uml:: :align: center @startuml autonumber title Тарифы на перевод средств, утверждённые Клиентом participant "Клиент" as client participant "Мобильное приложение" as mobile participant "Payneteasy" as company == Перевод средств успешно проверен == company -> company : Остановка транзакции loop пока окончательный перевод средств не отправлен mobile -> company: Запрос статуса \nперевода средств note left session token end note mobile <-- company: Ответ статуса \nперевода средств note right state=TRANSFER_FEE_REQUEST transferFeeList end note end mobile -> client: Запрос на выбор комиссии mobile <-- client: Комиссия выбрана mobile -> company: Запрос на завершение \nперевода средств note left assignedId end note mobile <-- company: Ответ на завершение \nперевода средств company -> company: Продолжение обработки @enduml | (2,3) Запрос статуса перевода выполняется приложением Присоединяющейся стороны к Payneteasy для получения статуса транзакции Transfer. Чтобы реализовать запрос статуса перевода, см. :ref:`Статус Transfer`. Ответ статуса Transfer включает параметр :code:`state` со значением :ex:`TRANSFER_FEE_REQUEST` и объект :code:`transferFeeList` со списком комиссий для возможных шлюзов обработки. Каждый шлюз обработки представлен собственным псевдонимом в параметре :code:`assignedId`. Значение :ex:`TRANSFER_FEE_REQUEST` в параметре :code:`state` существует только в потоке «Тарифы Transfer, заданные потребителем». Указанные параметры могут отсутствовать в первом ответе статуса Transfer, поэтому приложение Присоединяющейся стороны должно продолжать опрос статуса транзакции. Когда транзакция достигнет состояния :ex:`TRANSFER_FEE_REQUEST`, обработка останется приостановленной до отправки запроса завершения перевода. | (6,7) Для реализации запроса Complete transfer см. :ref:`Complete transfer`. .. ifconfig:: "doc.payneteasy.com" in site_link ---- .. admonition:: See also :class: related-cross-link `Multichannel integration including mPOS and SDK → `_ .. ifconfig:: "doc.payneteasy.ru" in site_link ---- .. admonition:: См. также :class: related-cross-link `mPOS & POS SDK — приём платежей через терминалы → `_