NAV
примеры php python java

Обзор

Общая информация

Платежная платформа Paytransfer позволяет проводить оплату, выплату и возврат с использованием различных методов, а также выполнять другие действия, связанные с проведением платежей.

Выплата, возврат и оплата Host-to-Host проводятся с использованием Gate — программного интерфейса, который предназначен для приема запросов от вашей системы к платежной платформе Paytransfer. Gate отвечает принципам REST API, а также поддерживает обратную совместимость, благодаря которой выпуск каждой новой версии интерфейса не требует изменений программного кода на стороне вашей системы.

Организация взаимодействия

Платежная платформа связана с одной стороны с вашей системой, а с другой — с сервисами партнеров. Взаимодействие вашей системы с платформой основано на обмене HTTP-сообщениями по принципу «запрос-ответ»: ваша система направляет к платформе запросы и получает от платформы ответы и оповещения.

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

Все взаимодействия с платежной платформой выполняются с использованием протоколов HTTP версии не ниже 1.1 и TLS версии не ниже 1.2, а данные в запросах и оповещениях должны кодироваться и обрабатываться с использованием кодировки UTF-8. При работе со страницей оплаты в качестве пользовательского браузера вы можете использовать актуальные версии таких браузеров, как Chrome, Safari, Opera, Firefox, Microsoft Edge, Internet Explorer, Yandex Browser, QQ, MIUI, Samsung Internet, 360 и ряда других. Подробную информацию о работе страницы оплаты в разных средах можно получить у специалистов технической поддержки Paytransfer.

Внимание: Сбои связи с платежной платформой могут приводить к финансовым потерям, поэтому для обеспечения беспрепятственного обмена информацией с платежной платформой:
  • Отключите кеширование информации о разрешении DNS-имен и адресов платежной платформы.
  • Не применяйте списки управления доступом (Access Control List, ACL) к исходящим подключениям к платежной платформе.
  • По возможности не используйте систему защиты на основе SSL/TLS Fingerprinting в исходящих подключениях к платежной платформе.
  • Обновляйте корневые сертификаты не реже чем раз в полгода.

Порядок подключения

В общем случае для подключения к платежной платформе Paytransfer необходимо:

  1. Решить организационные вопросы, касающиеся взаимодействия с Paytransfer:

    1. Если у компании нет идентификатора проекта и секретного ключа для взаимодействия с Paytransfer — отправьте заявку на подключение.
    2. Согласуйте со специалистами технической поддержки Paytransfer порядок и сроки интеграции и запуска в работу.
  2. Выполнить подготовительные технические работы.

    Чтобы проводить оплату:

    1. Установите и подключите необходимые библиотеки.
    2. Реализуйте сбор параметров, необходимых для проведения оплаты, а также создания и отправки запросов на открытие страницы оплаты на стороне клиентской части вашей системы.
    3. Реализуйте подписывание данных и обработку оповещений на серверной стороне вашей системы.

    Чтобы проводить выплату:

    1. Обеспечьте возможности сбора параметров, необходимых для проведения выплаты, а также формирования и отправки запросов на ее инициирование.
    2. Обеспечьте подписывание данных и корректное реагирование на оповещения на стороне серверной части вашей системы.
  3. Совместно со специалистами технической поддержки Paytransfer протестировать выполнение целевых действий и запустить техническое решение в работу.

Для начала работы с платежной платформой Paytransfer обращайтесь к курирующему менеджеру Paytransfer, а для решения технических вопросов — к специалистам технической поддержки (support@paytransfer.kz).

Оплата Host-to-Host

Общая информация

Оплата — это тип платежа, в рамках которого на основании исходного запроса осуществляется перевод денежных средств от пользователя в вашу систему.

Оплата Host-to-Host осуществляется через интерфейс Gate, и все взаимодействия с пользователями выполняются в вашей системе.

Далее представлена информация о проведении оплаты Host-to-Host.

Схема проведения

Для проведения оплаты через Gate:

  1. Отправьте запрос на оплату.
  2. Примите от платежной платформы оповещение о результате оплаты.

Порядок проведения оплаты — без выполнения дополнительных процедур — представлен далее на схеме.

Рис. 1. Порядок взаимодействия

  1. Пользователь инициирует оплату в вашей системе.
  2. Ваша система передает запрос на проведение оплаты на заданный URL Paytransfer.
  3. Платежная платформа направляет в вашу систему ответ с информацией о получении запроса и его корректности.
  4. Платежная платформа обрабатывает этот запрос и отправляет в сервис провайдера.
  5. Сервис провайдера оповещает платежную платформу о результате оплаты.
  6. Платежная платформа отправляет в вашу систему оповещение (callback) с результатом оплаты.
  7. Ваша система направляет пользователю информацию о результате оплаты.

Запрос

Общая информация

Чтобы провести оплату, необходимо отправить к платежной платформе запрос — HTTP-сообщение заданной структуры — с использованием метода POST. В каждом запросе к платежной платформе должны передаваться следующие элементы в указанном порядке:

  • Стартовая строка с указанием метода передачи запроса (POST) и конечной точки, протокола и его версии (HTTP/1.1). Доступные конечные точки:
    • /v2/payment/card/sale — для платежей с использованием банковских карт;
    • /v2/payment/mobile/sale — для платежей с использованием мобильной коммерции.
  • Заголовок с полем Host, содержащим доменное имя для запросов к платформе.
  • Пустая строка, отделяющая служебную информацию от тела сообщения.
  • Тело сообщения, содержащее JSON-строку в кодировке UTF-8 с набором данных и подписью к ним.

В дополнение к обязательному полю Host в заголовке можно использовать любые другие поля из числа допустимых в HTTP версии 1.1.

Параметры запроса на оплату

При формировании JSON-строки необходимо использовать следующие объекты и параметры:

Объект Параметр Описание

general
object

project_id
integer

Идентификатор проекта, полученный от Paytransfer при интеграции.

Пример: 1234

payment_id
string

Идентификатор платежа, уникальный в рамках проекта.

Пример: payment_47

signature
string

Подпись запроса, составленная после определения всех параметров запроса. Подробнее о составлении подписи см. Подписывание и проверка подписи.

customer
object

id
string

Идентификатор пользователя, уникальный в рамках проекта.

Пример: customer_123

ip_address
string

IP-адрес устройства пользователя.

Пример: 198.51.100.47

first_name
string

Имя пользователя.

Пример: John

last_name
string

Фамилия пользователя.

Пример: Doe

email
string

Адрес электронной почты пользователя.

Пример: johndoe@example.com

payment
object

currency
string

Код валюты оплаты в формате ISO-4217 alpha-3.

Пример: USD

amount
integer

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

Пример: 100,00 USD передается как 10000

Рис. 2. Пример данных из запроса на проведение оплаты на сумму 300000,00 KZT
{
  "general": {
    "project_id": 2990,
    "payment_id": "X03935",
    "signature": "YWb6Z20ByxpQ30hfTI"
  },
  "customer": {
    "id": "customer_173",
    "ip_address": "198.51.100.47",
    "first_name": "John",
    "last_name": "Doe",
    "email": "johndoe@example.com"
    },
  "card": {
    "pan": "1122334455667788",
    "year": 2030,
    "month": 10,
    "card_holder": "JOHN DOE"
  },
  "payment": {
    "amount": 30000000,
    "currency": "KZT"
  }
}

Кроме базового набора объектов и параметров в запросе нужно передавать и другие параметры. Эти параметры указаны в таблице:

Платежный метод Список дополнительных параметров
Платежные карты
  • card.pan — номер карты;
  • card.year — год окончания срока действия карты;
  • card.month — месяц окончания срока действия карты;
  • card.card_holder — имя держателя карты (в соответствии с указанным на карте)
Мобильная коммерция
  • account.number — номер телефона пользователя. Указывается с кодом страны, без знаков пунктуации и специальных символов

Дополнительно в запросе рекомендуется указывать следующие дополнительные параметры:

Объект Параметр Описание

return_url
object

success
string

URL-адрес страницы для перенаправления пользователя в проект в случае проведенной оплаты.

Пример: http://example.com/success

decline
string

URL-адрес страницы для перенаправления пользователя в проект в случае отклонения оплаты.

Пример: http://example.com/decline

return
string

URL-адрес страницы для перенаправления пользователя в проект со страницы оплаты на стороне внешнего провайдера по нажатии на кнопку возврата на любом шаге проведения платежа.

Пример: http://example.com/return

customer
object

middle_name
string

Отчество или среднее имя пользователя.

Пример: John

Статусы платежа

В процессе оплаты платеж может иметь разные статусы, значение которых описано в следующей таблице:

error

Проведение платежа не инициировано из-за ошибки, возникшей при проверке принятого запроса.

Конечное состояние. Допускается повторное инициирование этого платежа

processing

Платеж проводится.

Промежуточное состояние

awaiting redirect result

Проведение платежа приостановлено до получения уведомления о его результате со стороны платежной системы. В зависимости от этого результата на стороне платежной системы платеж переводится в статус success или decline.

В рамках проведения одного платежа может использоваться awaiting redirect result либо awaiting customer action, но не оба этих статуса.

Промежуточное состояние

awaiting clarification

Проведение платежа приостановлено. Платежная платформа ожидает от вас запрос с недостающей информацией. Если такой запрос не поступит от вас в платежную платформу в течение 30 минут, платеж будет отклонен и переведен в статус decline.

Промежуточное состояние

awaiting customer action

Проведение платежа приостановлено до выполнения необходимых действий пользователем на стороне платежной системы (в соответствии со спецификой платежного метода). В зависимости от результата этих действий платеж переводится в статус success или статус decline.

В рамках проведения одного платежа может использоваться awaiting customer action либо awaiting redirect result, но не оба этих статуса.

Промежуточное состояние

decline

Платеж отклонен.

Конечное состояние

success

Платеж проведен.

Конечное состояние

Дополнительные возможности

Дополнение информации о платеже

Общая информация

Как правило, для проведения платежа достаточно тех данных, которые обязательны для запроса на инициирование этого платежа. Но в отдельных случаях — например, для дополнительной проверки — со стороны платежной системы или провайдера могут запрашиваться дополнительные данные. Для работы с такими ситуациями используется процедура дополнения информации: уведомление о том, что вам необходимо дополнить данные.

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

Схема работы

Информация о необходимости дополнить данные отправляется в оповещениях или ответах. Обычно эта информация отправляется в оповещениях — без предварительных запросов со стороны вашей системы, но в то же время ее можно получать в ответах на запросы о статусе платежа.

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

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

Как только в платежную платформу поступают все запрашиваемые данные, проведение платежа продолжается дальше.

Для дополнения информации ваша система должна:

  1. Получить список параметров в объекте clarification_fields в оповещении или ответе.
  2. Отправить POST-запрос, содержащий требуемый набор данных с объектом additional_data и подпись, к конечной точке /v2/payment/clarification.
  3. Получить и обработать ответ 200 OK о приеме запроса в обработку.

Ответ 200 OK отправляется, когда все запрашиваемые параметры указаны корректно и в полном объеме. При невыполнении хотя бы одного условия цикл повторяется, начиная с шага 1.

Оповещение (callback)

Рис. 3. Пример тела оповещения о необходимости предоставить индекс и адрес пользователя
POST /notify/success HTTP/1.1
Content-Length: 1237
User-Agent: GuzzleHttp/6.3.3 curl/7.47.0 PHP/7.0.32-0ubuntu0.16.04.1
Content-Type: application/json
Host: example.com

{ "sum_request": { "amount": 45000, "currency": "KZT" }, "request_id": "80bdc0831c3f8e1", "payment": { "id": "payment_568485", "method": "card", "date": "2019-07-29T11:19:33+0000", "result_code": "9999", "result_message": "Awaiting processing", "is_new_attempts_available": false, "attempts_timeout": 0, "provider_id": 3 }, "sum_real": { "amount": 45000, "currency": "KZT" }, "status": "awaiting clarification", // Статус платежа "customer": { "id": "423432432432534222" }, "clarification_fields": { // Запрашиваемая информация "avs_data": [ "avs_post_code", "avs_street_address" ] }, "project_id": 11, "description": "", "operations": [ { "id": 7282148104130, "type": "sale", "status": "awaiting clarification", "date": "2019-07-29T11:19:33+0000", "processing_time": null, "sum": { "amount": 45000, "currency": "KZT" }, "code": "9999", "message": "Awaiting processing" } ], "signature": "99q4lpCEuNpxp3ugvxF1qPbinWUIwNSLaxcVbF0A==" }

Оповещение о необходимости дополнить данные соответствует стандартной структуре оповещения, описанной в разделе Оповещение (callback), но содержит объект clarification_fields со списком запрашиваемых параметров.

Справа представлен пример тела оповещения о необходимости предоставить индекс и адрес пользователя.

Ответ

Рис. 4. Пример тела ответа о необходимости указать электронную почту, имя и фамилию, платежный адрес и дату рождения пользователя
HTTP/1.1 200 OK
Server: api.com Date: Wed, 29 July 2019 09:27:45 GMT Content-Type: application/json; charset=UTF-8 Content-Length: 875 Connection: keep-alive Keep-Alive: timeout=60 Cache-Control: no-cache Access-Control-Allow-Methods: GET, POST, OPTIONS Access-Control-Allow-Origin: * X-Powered-By: PHP/7.0.32 Access-Control-Allow-Headers: DNT,X-CustomHeader,Keep-Alive,User-Agent, X-Requested-With,If-Modified-Since,Cache-Control,Content-Type

{ "sum_request": { "amount": 500, "currency": "KZT" }, "request_id": "563c42d4846d105e77", "payment": { "method": "card", "date": "2019-07-29T09:27:45+0000", "result_code": "9999", "result_message": "Awaiting processing", "status": "awaiting clarification", // Статус платежа "is_new_attempts_available": false, "attempts_timeout": 0, "id": "E2E_01_0868", "cascading_with_redirect": false, "provider_id": 1145 }, "sum_real": { "amount": 500, "currency": "KZT" }, "customer": { "id": "7826" }, "clarification_fields": { "customer": [ "email", // Запрашиваемая информация "first_name", "last_name", "billing.address", "billing.city", "billing.country", "billing.postal", "day_of_birth" ] }, "project_id": 245, "description": "", "operations": [ { "id": 1315207090506, "type": "sale", "status": "awaiting clarification", "date": "2019-07-29T09:27:45+0000", "processing_time": null, "request_id": "563c42d4846d105e77", "sum": { "amount": 500, "currency": "KZT" }, "code": "9999", "message": "Awaiting processing" } ], "signature": "MYiga7aoW0UBFBfeTdIiF0QFOokEfyuSA==" }

Для ответа о необходимости дополнить информацию используется такая же структура, как и для оповещений.

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

Структура запроса

Рис. 5. Пример тела запроса с предоставлением индекса и адреса пользователя в качестве дополнительной информации
{
  "general": {
    "project_id": 11,
    "payment_id": "EPr-bf14",
    "signature": "v7KNMpfogAthg1ZZ5D/aZAeb0VMdeR+CqghwSm...=="
  },
  "additional_data": {
    "avs_data":{
        "avs_post_code": "230532",
        "avs_street_address": "01 Main Street, MB"
    }
  }
}

Запрос с предоставлением недостающей информации отправляется методом POST к конечной точке /v2/payment/clarification и должен содержать следующие объекты и параметры:

Объект Параметр Описание

general
object

project_id
integer

Идентификатор проекта, полученный от Paytransfer при интеграции.

Пример: 1234

payment_id
string

Идентификатор платежа, уникальный в рамках проекта.

Пример: payment_47

signature
string

Подпись запроса, составленная после определения всех параметров запроса. Подробнее о составлении подписи см. Подписывание и проверка подписи.

additional_data
object

Объект с запрошенными данными.

Пример: "avs_post_code": "230532"

Справа представлен пример тела запроса с предоставлением индекса и адреса пользователя в качестве дополнительной информации.

Получение информации о состоянии платежа

Обзор

При работе с платежной платформой Paytransfer актуальную информацию о состоянии платежей можно получить через интерфейс Dashboard, а также в оповещениях (подробнее — в разделе Оповещение (callback)) или ответах на запросы о состоянии платежа. Такие запросы можно отправлять при любой необходимости — например, для проверки статуса оплаты, когда проведение платежа может занимать не один день, — но не ранее, чем через 10 секунд после отправки запроса на проведение платежа. При этом следует учитывать, что информацию о платеже можно получить только после того, как в платежной платформе был принят запрос на проведение этого платежа и платеж был зарегистрирован.

Запрос о состоянии платежа выполняется на стороне платежной платформы в течение одного HTTP-сеанса, а в ответе на корректно составленный запрос содержится HTTP-код ответа (200) и запрошенная информация без указания статуса запроса. Информация об HTTP-кодах ответов представлена в разделе Ответ.

Структура запроса

Рис. 6. Пример тела запроса на получение информации о состоянии платежа
{
    "general":{
       "project_id": 50,
       "payment_id": "ORDER_ID_302bis",
       "signature": "qflDO7yiPKCFTyqCAaT+2/f9Gi20aV5yuSjq1GH7BYgmil8APKojXw=="
    }
}

Чтобы получить информацию о состоянии платежа, необходимо отправить запрос к конечной точке /v2/payment/status, при этом в теле запроса должен содержаться объект general с основными идентификационными сведениями:

Объект Параметр Описание

general
object

project_id
integer

Идентификатор проекта, полученный от Paytransfer при интеграции.

Пример: 1234

payment_id
string

Идентификатор платежа, уникальный в рамках проекта.

Пример: payment_47

signature
string

Подпись запроса, составленная после определения всех параметров запроса. Подробнее о составлении подписи см. Подписывание и проверка подписи.

Примеры ответов

Рис. 7. Пример тела ответа о платеже с итоговым статусом
HTTP/1.1 200 OK                                           //стартовая строка ответа
...                                                       //поля заголовка 
{ 
  "project_id":50,
  "payment":{ 
    "id":"ORDER_ID_302bis",
    "type":"purchase",                                     //тип платежа
    "status":"success",                                    //статус платежа 
    "date":"2019-12-12T15:46:51+0000",
    "method":"card",                                       //код платежного метода
    "sum_real":{ 
      "amount":3300,
      "currency":"KZT"
    },
    "description":"Purchase"
  },
  "customer":{ 
    "id":"6361696170"
  },
  "operations":[ 
    { 
      "id":9435219675496,
      "type":"sale",                                          //тип операции
      "status":"success",                                     //статус операции
      "date":"2019-12-11T15:46:37+0000",
      "created_date":"2019-12-11T15:46:35+0000",
      "request_id":"bcRFZRJkmfcf-178c3d843c99-00009436",
      "sum":{ 
        "amount":3300,
        "currency":"KZT"
      },
      "code":"0",                           //код, уточняющий статус операции sale
      "message":"Success",                  //пояснение к коду
      "eci":"07",
      "provider":{ 
        "id":1309,
        "payment_id":"2015611",
        "auth_code":"",
        "date":"2019-12-11T15:46:36+0000"
     }
    }
  ],
  "signature":"yb9JpzzbyEbkxitA9c3+c+0nX7PQwO8TPoYLGcPnZprQNnHgPlanEYqj1SAg=="
}

Справа представлен пример данных о проведенной оплате. В этом примере указаны:

  • код ответа о том, что запрос был успешно принят (200);
  • статус платежа (success);
  • код используемого платежного метода (card);
  • сведения об операции sale в массиве operations.
Рис. 8. Пример тела ответа о платеже с промежуточным статусом
HTTP/1.1 200 OK                                             //стартовая строка ответа
...                                                         //поля заголовка
{ 
  "project_id":72,
  "payment":{ 
    "id":"ORDER_ID_tetan_M_2007_2012",
    "type":"purchase",                                       //тип платежа
    "status":"awaiting redirect result",                     //статус платежа
    "date":"2019-12-11T15:59:10+0000",
    "method":"card",                              //код платежного метода
    "sum":{ 
      "amount":25000,
      "currency":"KZT"
    },
    "description":"Book premium"
  },
  "customer":{ 
    "id":"Scott"
  },
  "operations":[ 
    { 
      "id":65747461,
      "type":"sale",                                           //тип операции
      "status":"awaiting redirect result",                     //статус операции
      "date":"2019-12-11T15:59:10+0000",
      "created_date":"2019-12-11T15:59:06+0000",
      "request_id":"97c7dd03080b4293603f28e64-0c415bc3e876c911f2d87-00006979",
      "sum_initial":{ 
        "amount":25000,
        "currency":"KZT"
      },
      "sum_converted":{ 
        "amount":25000,
        "currency":"KZT"
      },
      "code":"9999",                       //код, уточняющий статус операции sale
      "message":"Awaiting processing",     //пояснение к коду
      "provider":{ 
        "id":2080,
        "payment_id":"",
        "auth_code":""
      }
    }
  ],
  "signature":"i12QRhdMbrh6iFF2zKQ7X78u+M7KdwhRLpc2gHiF+lL74Wfp7Ylr85NA=="
}

В представленном далее примере данных о незавершенной оплате содержится следующая информация:

  • код ответа о том, что запрос был успешно принят (200);
  • статус платежа (awaiting redirect result);
  • код используемого платежного метода (card);
  • сведения об операции sale в массиве operations.
Рис. 9. Пример тела ответа об ошибке в запросе
HTTP/1.1 400 Bad Request                         //стартовая строка ответа
...                                              //поля заголовка
{
   "status":"error",                             //статус обработки запроса
   "code":"2004",                                //код, уточняющий статус
   "message":"Required field not provided"       //пояснение к коду
}

Далее представлен пример ответа на некорректно составленный запрос. Если в запросе обнаружена ошибка, то в ответе указывается следующее:

  • код ответа с описанием причины ошибки в стартовой строке (400 Bad Request);
  • статус обработки запроса (error);
  • уточняющая информация об ошибке: код ошибки (2004) и поясняющее описание к нему (Required field not provided).

Возврат

Общая информация

Возвратом в рамках платежной платформы Paytransfer считается перевод пользователю средств, ранее списанных при проведении оплаты.

Чтобы инициировать возврат при работе через Gate, отправьте запрос к конечной точке /v2/payment/{название метода}/refund. Для выполнения возврата формируется одна из следующих операций:

  • reversal, если возврат инициируется до закрытия операционного дня и на всю сумму оплаты;
  • refund, если возврат инициируется до закрытия операционного дня и на часть суммы оплаты или после закрытия операционного дня вне зависимости от суммы.

После выполнения возврата вы получите оповещение, в котором содержится информация о результате выполнения возврата и о статусе платежа после возврата.

Особенности

Срок выполнения возврата, как правило, зависит от банка-эмитента или платежного провайдера, выполняющего операцию, и может занять длительное время.

При выполнении возврата изменяются данные о сумме платежа. В оповещении о результате возврата указывается актуальная сумма платежа, доступная для дальнейших возвратов. Актуальная сумма платежа рассчитывается как разница между исходной суммой платежа и суммой, возвращенной пользователю. Допустим, исходная сумма равна 1500,00 KZT. Тогда при возврате на сумму 1000,00 KZT актуальная сумма платежа принимает значение 500,00 KZT, а при еще одном возврате на сумму 500,00 KZT — 0,00 KZT.

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

Ограничения

Выполнение возврата возможно с учетом следующих ограничений:

  • В рамках оплаты, для которой выполняется возврат, должно быть выполнено хотя бы одно списание средств пользователя, при этом самой оплате должен соответствовать один из следующих статусов: success, partially paid или partially refunded.

    Если в рамках оплаты не выполнено ни одного успешного списания или статус оплаты не соответствует ни одному из перечисленных, то запрос на возврат отклоняется и в вашу систему направляется оповещение с кодом ошибки, например 3081.

  • Валюта возврата должна соответствовать валюте оплаты, для которой выполняется возврат.

    Если в запросе передана валюта, не соответствующая валюте оплаты, то запрос на возврат отклоняется и в вашу систему направляется оповещение с кодом ошибки 3284 (подробнее о таких кодах — в разделе Статусы операций и коды ответов).

  • Должна соблюдаться допустимая частота отправки запросов.

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

  • Остаток средств на вашем счете должен быть достаточным для выполнения возврата.

    Информацию об остатке средств можно получить в интерфейсе Dashboard, а также при обращении к курирующему менеджеру Paytransfer.

  • Должны соблюдаться актуальные для этого возврата специфические региональные требования, а также требования провайдеров и платежных систем. Информацию о специфике выполнения возврата в зависимости от используемого платежного метода можно получить у курирующего менеджера Paytransfer.

Помимо перечисленных ограничений для частичного возврата действуют следующие:

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

Формат запросов

Рис. 10. Пример данных из запроса на возврат средств
{
  "general": {
    "project_id": 239,
    "payment_id": "payment2",
    "signature": "of8k9xeKJ7KLTZYO56lCv+f1M0Sf/7eg=="
  },
  "payment": {
    "description": "refund",
// При частичном возврате:
    "amount": 1000,
    "currency": "KZT"
  }
}

Чтобы инициировать возврат, отправьте запрос к одной из следующих конечных точек:

В теле запроса на возврат полной суммы платежа должны использоваться следующие объекты и параметры:

Объект Параметр Описание

general
object

project_id
integer

Идентификатор проекта, полученный от Paytransfer при интеграции.

Пример: 1234

payment_id
string

Идентификатор платежа, уникальный в рамках проекта.

Пример: payment_47

signature
string

Подпись запроса, составленная после определения всех параметров запроса. Подробнее о составлении подписи см. Подписывание и проверка подписи.

Пример: IipTv+AWoXW/9MTO8yJA==

payment
object

description
string

Описание причины возврата. Относится только к операции возврата и не меняет описание оплаты, если оно было передано ранее.

Пример: refund

Чтобы возвратить часть суммы, в объекте payment дополнительно необходимо использовать следующие параметры:

Объект Параметр Описание

payment
object

currency
string

Код валюты платежа в формате ISO-4217 alpha-3.

Пример: USD

amount
integer

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

Если у валюты нет дробных единиц (то есть количество разрядов дробных единиц равно нулю), то в этом параметре нужно указывать сумму в основных единицах валюты. Подробнее о разрядах дробных единиц у валют см. Коды валют.

Пример: 10000

Статусы платежа

Статус платежа может принимать следующие значения:

success

Платеж проведен, возврат для платежа не выполнен.

Конечное состояние

reversed

До закрытия операционного дня для платежа выполнен возврат всей суммы.

Конечное состояние

refunded

После закрытия операционного дня для платежа выполнен возврат всей суммы.

Конечное состояние

partially refunded

Для платежа выполнен возврат части суммы.

Конечное состояние

Выплата

Общая информация

Выплата — это тип платежа, в рамках которого на основании исходного запроса осуществляется перевод денежных средств от вашей системы к пользователю.

В платежной платформе поддерживается один вариант для работы с выплатой через Gate — разовая единичная выплата, но дополнительно обеспечивается возможность проведения массовой выплаты через Dashboard (с автоматическим формированием требуемого количества платежей).

Схема проведения

Для проведения выплаты:

  1. Сформируйте и отправьте в платежную платформу запрос на выплату.
  2. Примите от платежной платформы оповещение (callback) о результате выплаты.

Схема проведения выплаты представлена далее.

Рис. 11. Проведение выплаты. Описание шагов
  1. Пользователь инициирует выплату в вашей системе.
  2. Ваша система передает запрос на выплату в платежную платформу.
  3. Платежная платформа отправляет вам ответ с информацией о получении запроса и о результате проверки его корректности.
  4. Платежная платформа обрабатывает запрос и отправляет его в сервис провайдера.
  5. Сервис провайдера оповещает платежную платформу о результате выплаты.
  6. Платежная платформа отправляет вам оповещение с результатом выплаты.
  7. Ваша система направляет пользователю информацию о результате выплаты.

Как правило, ответ на полученный запрос в любом из описанных случаев отправляется в вашу систему в течение 100 мс. Если ответ не получен, можно повторить отправку запроса с тем же идентификатором платежа. Если в ответе указаны сведения об ошибке, допущенной на стороне вашей системы, устраните эту ошибку и повторите отправку запроса с учетом правок.

Формат запросов

// Пример запроса на выплату. PHP
require_once 'Signer.php';

$payoutUrl = 'http://gate.test/v2/payment/card/payout';
$projectId = 200;
$secretKey = '123';

$requestParams = [
    'general' => [
        'project_id' => $projectId,
        'payment_id' => microtime(),
    ],
    'payment' => [
        'amount'   => 100,
        'currency' => 'KZT',
    ],
    'customer' => [
        'id' => 'test_customer_id',
        'ip_address'=> '14.192.204.152',
        'email'=> 'janedoe@example.com',
    ],
    'account' => [
        'bank_id' => 14,
        'customer_name' => 'Jane Doe',
        'number' => '314159265358979',
    ],
];

$requestParams['general']['signature'] = Signer::sign($requestParams, $secretKey);

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, $payoutUrl);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($requestParams));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$response = curl_exec($ch);

if (!$response) {
    print_r(curl_error($ch));
} else {
    print_r($response);
}

curl_close($ch);
# Пример запроса на выплату. Python
from datetime import datetime
from Signer import Signer
import requests
import json

payoutUrl = 'http://gate.test/v2/payment/card/payout'
secretKey = '123'
projectId = 200

params = {
    'general': {
        'project_id': 200,
        'payment_id': 'X03936'
    },
    'payment': {
        'amount': 122990,
        'currency': 'KZT'
    },
    'customer': {
        'id': 'customer_173',
        'ip_address': '1.2.3.4',
        'email': 'janedoe@example.com'
    },
    'account': {
        'bank_id': 114,
        'customer_name': 'Jane Doe',
        'number': '314159265358979'
    }
}

print(json.dumps(params))

signer = Signer()
params['general']['signature'] = signer.getSign(params, secretKey)

r = requests.post(
    payoutUrl,
    json=params
)

print(r.status_code, r.reason)
print(r.text[:300])
// Пример запроса на выплату. Java
const signer  = require('./Signer');
const request = require('request'); // npm install request

const secretKey = '123';
const params = {
    'general': {
        'project_id': 200,
        'payment_id': 'X03936'
    },
    'payment': {
        'amount': 122990,
        'currency': 'KZT'
    },
    'customer': {
        'id': 'customer_173',
        'ip_address': '1.2.3.4',
        'email': 'janedoe@example.com'
    },
    'account': {
        'bank_id': 114,
        'customer_name': 'Jane Doe',
        'number': '314159265358979'
    }
};

params['general']['signature'] = (new signer()).getSign(params, secretKey);

const opts = {
    uri: 'http://gate.test/v2/payment/card/payout',
    method: 'POST',
    json: params
};

request(opts, function (error, response, body) {
    if (error || response.statusCode !== 200) {
        console.log('request got an error:');
        console.log(body);
        return
    }

    console.log('request got OK');
    console.log(body);
});
Рис. 12. Пример данных из запроса на проведение выплаты на платежную карту
{
    "general": {
        "project_id": 1234,
        "payment_id": "payment_47",
        "signature": "PJkV8ej\/UG0Di8hTng6JvC7vQsaC6tajQVVfBaNIipTv+AWoXW\/9MTO8yJA=="
    },
    "customer": {
        "id": "customer_123",
        "ip_address": "198.51.100.47",
        "first_name": "John",
        "last_name": "Doe",
        "middle_name": "Paul",
        "email": "johndoe@example.com"
    },
    "payment": {
        "amount": 1000,
        "currency": "KZT"
    },
    "card": {
        "pan": "1122334455667788",
        "card_holder": "JOHN DOE"
    }
}

Чтобы провести выплату, составьте и отправьте в платежную платформу запрос — HTTP-сообщение заданной структуры — с использованием метода POST. В каждом запросе к платежной платформе должны передаваться следующие элементы в указанном порядке:

  • Стартовая строка с указанием метода передачи запроса (POST) и конечной точки в интерфейсе Gate, протокола и его версии (HTTP/1.1). Доступные конечные точки:
  • Заголовок с полем Host, содержащим доменное имя для запросов к платформе.
  • Пустая строка — разделитель, отделяющая служебную информацию от тела запроса.
  • Тело запроса в формате JSON, которое должно содержать набор данных запроса и подпись. Допустимы только символы Unicode (UTF-8).

В дополнение к обязательному полю Host в заголовке можно использовать любые другие поля из числа допустимых в HTTP версии 1.1.

При формировании JSON-строки необходимо использовать базовый набор объектов и параметров:

Объект Параметр Описание

general
object

project_id
integer

Идентификатор проекта, полученный от Paytransfer при интеграции.

Пример: 1234

payment_id
string

Идентификатор платежа, уникальный в рамках проекта.

Пример: payment_47

signature
string

Подпись запроса, составленная после определения всех параметров запроса. Подробнее о составлении подписи см. Подписывание и проверка подписи.

customer
object

id
string

Идентификатор пользователя, уникальный в рамках проекта.

Пример: customer_123

ip_address
string

IP-адрес устройства пользователя.

Пример: 198.51.100.47

email
string

Адрес электронной почты пользователя.

Пример: johndoe@example.com

payment
object

currency
string

Код валюты выплаты в формате ISO-4217 alpha-3.

Пример: USD

amount
integer

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

Пример: 100,00 USD передается как 10000

Кроме базового набора объектов и параметров в запросе нужно передавать и другие параметры. Эти параметры указаны в таблице:

Платежный метод Список дополнительных параметров
Платежные карты
  • customer.first_name — имя пользователя;
  • customer.last_name — фамилия пользователя;
  • customer.middle_name — отчество или среднее имя пользователя;
  • card.pan — номер карты;
  • card.card_holder — имя держателя карты (в соответствии с указанным на карте)
Мобильная коммерция
  • account.number — номер телефона пользователя, на счет мобильной связи которого совершается выплата. Указывается с кодом страны, без знаков пунктуации и специальных символов

Статусы платежа

При проведении выплаты могут использоваться следующие статусы.

error

Проведение платежа не инициировано из-за ошибки, возникшей при проверке принятого запроса.

Конечное состояние. Допускается повторная отправка запроса с тем же идентификатором платежа и повторная попытка проведения этого платежа

processing

Платеж проводится.

Промежуточное состояние

decline

Платеж отклонен.

Конечное состояние

success

Платеж проведен.

Конечное состояние

Платежные методы

Платежные карты

Платежные карты (Visa, Mastercard) — это популярный платежный метод, с помощью которого пользователи могут оплачивать в вашей системе различные услуги, а также получать денежные средства.

Точную минимальную и максимальную сумму оплаты и выплаты уточняйте у курирующего менеджера Paytransfer. Уточнить минимальную и максимальную сумму платежа, доступную в вашем проекте, вы также можете в Dashboard. Для этого в Dashboard перейдите в раздел Проекты и выберите вкладку Платежные методы.

Логотип платежного метода доступен для загрузки здесь.

Мобильная коммерция

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

Точную минимальную и максимальную сумму оплаты и выплаты уточняйте у курирующего менеджера Paytransfer. Уточнить минимальную и максимальную сумму платежа, доступную в вашем проекте, вы также можете в Dashboard. Для этого в Dashboard перейдите в раздел Проекты и выберите вкладку Платежные методы.

Логотип платежного метода доступен для загрузки здесь.

Особенности проведения платежей

Нужно помнить про некоторые особенности проведения платежей:

  • Доступность возврата необходимо уточнять у курирующего менеджера в Paytransfer.
  • При оплате пользователь получает от сервиса оператора связи сообщение с OTP-кодом для подтверждения оплаты.

    Пользователь вводит OTP-код в вашей системе, а вы должны отправить этот код в платежную платформу в новом запросе. Более подробную информацию см. в разделе Дополнение информации о платеже. В запросе вы должны передать объект additional_data, представленный в следующей таблице.

Объекты и параметры Описание

additional_data
object

additional_data
object

approval_code
string

OTP-код, который пользователь получает в сообщении от оператора связи.

Пример: 123456

Поддержка со стороны операторов связи

Идентификаторы сервисов операторов связи для проведения платежей:

Рис. 13. Список сервисов операторов связи
  • «Билайн» — BEELINE
  • Activ — ACTIV
  • Altel — ALTEL
  • Kcell — KCELL
  • Tele2 — TELE2

Получение информации

Общая информация

При работе с платежной платформой Paytransfer для получения актуальной информации о выполнении запросов на программном уровне служат следующие сущности:

  • Ответ (response) Ответы отправляются синхронно, то есть в течение одного HTTP-сеанса, и содержат информацию о приеме запроса в платформе или об ошибке, если запрос не был принят.
  • Оповещение (callback) Оповещения отправляются асинхронно и содержат информацию о промежуточном и итоговом результате выполнения запроса.

Также получать актуальную информацию о выполнении запросов можно через интерфейс Dashboard.

Ответ

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

  • сведения об успешном приеме запроса в обработку;
  • расширенное описание ошибки, если запрос невозможно принять в обработку.

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

Структура ответа

В каждом ответе от платформы содержатся следующие элементы в порядке перечисления:

  • стартовая строка с указанием протокола и его версии (HTTP/1.1), кода ответа и поясняющей фразы к коду (например, 200 OK);
  • поля заголовка;
  • пустая строка — разделитель, отделяющая служебную информацию от тела ответа;
  • тело ответа в формате JSON, содержащее данные ответа и подпись. В теле ответа используются только символы Unicode (UTF-8).

HTTP-коды ответов

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

Код ответа с пояснением Описание
200 OK

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

400 Bad Request Запрос не удалось принять в обработку из-за отсутствия в JSON-данных как минимум одного обязательного параметра, например идентификатора проекта (project_id)
403 Forbidden Запрос не удалось принять в обработку из-за отказа в доступе к указанной конечной точке, например из-за того, что запрос отправлен с IP-адреса, не включенного в список разрешенных адресов
404 Not Found

Запрос не удалось принять в обработку из-за некорректно указанного идентификатора проекта (параметр project_id)

422 Unprocessable Entity Запрос не удалось принять в обработку из-за синтаксической ошибки, обнаруженной при попытке разбора JSON-данных, например из-за пропущенной запятой
500 Internal Error Запрос не удалось обработать из-за сбоя в платежной платформе.

Такой ответ свидетельствует только о неполадках с обработкой запроса в платежной платформе и ничего не говорит об обработке запроса и ее результатах.

К примеру, ответ с кодом 500 Internal Error, полученный в процессе обработки платежа, не свидетельствует об отказе в проведении платежа. Также, на основе кода 500 Internal Error, полученного в ответ на запрос статуса платежа, нельзя делать вывод о неуспехе платежа.

Статус приема запроса

Статус приема запроса указывается в параметре status в теле синхронного ответа и информирует о том, приняла ли платежная платформа ваш запрос в обработку. Никакого другого смысла статус приема запроса не несет, поэтому никаких выводов о платеже, указанном в исходном запросе, делать нельзя!

Существуют всего два статуса приема запроса:

  • success — запрос принят в обработку. Этот статус используется только в ответах с HTTP-кодом 200.
  • error — платежная платформа не может принять запрос в обработку. Этот статус используется в ответах с кодами ошибок 400, 403, 404, 422 и 500.

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

Ответы о приеме или отказе в обработке асинхронно обрабатываемого запроса

Если запрос принят в обработку, то в первой строке ответа указывается код ответа 200, а в теле — статус success.

Если в запросе обнаружена ошибка, то в стартовой строке ответа указывается код ответа с причиной ошибки (в примере — 400), а в теле — статус error и расширенная информация об ошибке: код ошибки в платежной платформе (в примере —2004) и описание к нему (в примере — Required field not provided). Запросы с ошибкой отбрасываются и не принимаются в обработку!

Оповещение (callback)

Общая информация

Рис. 14. Пример оповещения
 {
        "project_id": 200,
        "payment": {
            "payment_id": "cosmo_set_4589",
            "type": "purchase",
            "status": "success",
            "date": "2020-07-20T07:12:04+0000",
            "method": "card",
            "sum": {
                "amount": 131970,
                "currency": "KZT"
            },
            "description": "Sports equipment"
        },
        "customer": {
            "id": "customer_173",
            "ip_address": "198.51.100.47",
            "phone": "+60-3-xxxx-xxxx",
            "email": "jane.doe@example.com"
        },
        "operation":{
            "id": 003,
            "type": "sale",
            "status": "success",
            "date": "2020-07-20T07:12:04+0000",
            "sum_initial": {
                "amount": 131970,
                "currency": "KZT"
            },
            "code": "0",
            "message": "Success"
        },
        "signature": "qV2FRs/wxoOaywQS0GYQDi+6spZFbiRXxt8zG10zy9TNiJLT0P/+EOrpMkoW80mynkaQfSAUJpfQ=="
    }

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

В каждом оповещении от платформы содержатся следующие элементы в порядке перечисления:

  • стартовая строка с указанием метода передачи запроса (POST), URL вашей системы для отправки оповещений о результатах (в примере — /notify/success), протокола и его версии (HTTP/1.1);
  • поля заголовка, в том числе поле Host с указанием доменного имени вашей системы (в примере — webservice.com);
  • пустая строка — разделитель, отделяющая служебную информацию от тела оповещения;
  • тело оповещения в формате JSON, содержащее набор данных оповещения и подпись. В теле оповещения используются только символы Unicode (UTF-8).

Дополнительные сведения о подписи данных см. в Подписывание и проверка подписи.

Справа представлен пример оповещения с информацией о результате проведения платежа. Содержимое JSON-строки в этом примере разбито на несколько строк для удобства чтения.

Доставка оповещений

Оповещения отправляются сразу же после проведения операции.

Факт доставки оповещения в вашу систему фиксируется на стороне платежной платформы в ответе от вашей системы. Ответ должен содержать HTTP заголовок с кодом ответа 200 ОК.

В случае если необходимо отложить отправку оповещения, в запросе на проведение платежа следует передать параметр delay в объекте callback с необходимым значением в секундах. Максимальное значение задержки отправки составляет 600 секунд.

Если оповещение не было доставлено, со стороны платежной платформы выполняются повторные попытки отправки оповещения по следующему расписанию:

  • 6 попыток с интервалом в 10 сек.;
  • далее 62 попытки в течение четырех часов с увеличивающимся интервалом (интервал увеличивается в соответствии с формулой 70 + 10·1,12n-4, где n — порядковый номер попытки отправки);
  • потом каждые 4 часа до достижения максимального количества попыток.

Максимально платежная платформа выполняет 120 попыток доставки оповещения в течение 11 суток. Расписание отправки может незначительно изменяться в зависимости от загруженности системы.

Адреса для приема оповещений

Рис. 15. Пример данных из запроса на открытие страницы оплаты, содержащий URL-адрес, на который будут отправляться оповещения по этому платежу
{
        project_id: 1234,
        payment_id: 'payment_47',
        customer_id: 'customer_123',
        customer_first_name: 'John',
        customer_last_name: 'Doe',
        customer_email: 'johndoe@example.com',
        merchant_callback_url: 'http://example.com/callback',
        payment_currency: 'KZT',
        payment_amount: 10000,
        signature: 'kUi2x9dKHAVNU0FYldJrxh4yo+52Kt8KU+Y19vySO\/RLUkDJrOcZzUCwX6R\/ekpZhkIQg=='
    }
Рис. 16. Пример данных из запроса на выплату, содержащий URL-адрес, на который будут отправляться оповещения по этому платежу
{
    "general": {
        "project_id": 1234,
        "payment_id": "payment_47",
        "merchant_callback_url": "http://example.com/callback",
        "signature": "PJkV8ej\/UG0Di8hTng6JvC7vQsaC6tajQVVfBaNIipTv+AWoXW\/9MTO8yJA=="
    },
    "customer": {
        "id": "customer_123",
        "ip_address": "198.51.100.47",
        "first_name": "John",
        "last_name": "Doe",
        "email": "johndoe@example.com"
    },
    "account": {
        "number": "123456789"
    },
    "payment": {
        "amount": 10000,
        "currency": "KZT"
    }
}

Платежная платформа Paytransfer отправляет оповещения на URL-адрес, который вы предоставляете сотрудникам Paytransfer в процессе интеграции. Если у вас есть несколько проектов, вы можете предоставить для каждого проекта отдельный URL-адрес, на который платежная платформа будет отправлять оповещения.

Вы можете предоставить сотрудникам Paytransfer отдельные URL-адреса, чтобы получать оповещения с определенной информацией по платежу. Например, чтобы оповещения об успешном завершении платежа платежная платформа отправляла на один адрес, а об отклонении — на другой. Вы также можете предоставить отдельный URL-адрес для получения оповещений по платежам определенного типа.

Вы можете самостоятельно указать дополнительные адреса для приема оповещений в Dashboard. Для этого в Dashboard перейдите в раздел Проекты и выберите вкладку Оповещения. Инструменты в Dashboard позволят вам определить, в каких случаях и на какие адреса Paytransfer будет отправлять вашей системе оповещения.

Обратите внимание, что ваша система должна принимать оповещения только с IP-адреса, полученного от команды интеграции Paytransfer. Чтобы уточнить IP-адрес, с которого Paytransfer отправляет оповещения, обратитесь в службу поддержки Paytransfer.

Адреса для приема оповещений по конкретному платежу

Вы можете указать отдельный URL-адрес для приема оповещений по конкретному платежу. Для этого:

  • в запрос на открытие страницы оплаты добавьте параметр merchant_callback_url и задайте в качестве его значения URL-адрес, на который Paytransfer будет отправлять оповещения;
  • в запрос на выплату добавьте в объект general параметр merchant_callback_url и задайте в качестве его значения URL-адрес, на который Paytransfer будет отправлять оповещения.

После этого все оповещения по этому платежу (и только по нему) будут отправляться на указанный в этом параметре URL-адрес независимо от того, какой URL-адрес для приема оповещений задан для вашего проекта.

Обработка оповещений

При обработке оповещений ваша система должна следовать следующим правилам:

  1. Принимать оповещения только с IP адреса, полученного от службы поддержки Paytransfer.
  2. На успешно принятые оповещения ответ вашей системы должен быть HTTP 200 OK.
  3. На оповещения, которые уже ранее были приняты вашей системой, ответ должен быть также HTTP 200 OK.
  4. На оповещения, принятые с ошибкой, ответ вашей системы должен быть HTTP 400 Bad Request (например, если вам не удалось преобразовать строку параметров в массив) или HTTP 500 Internal Server Error (например, если оповещение пришло на неправильный URL-адрес).
  5. Повторные оповещения, которые ранее не были приняты или были приняты с ошибкой, ваша система должна попытаться принять еще раз.
  6. Ваша система не должна ограничивать время на доставку оповещений, доставка оповещений может происходить с задержкой.
Рис. 17. Ответ на оповещение
HTTP/1.1 200 OK
Date: Fri, 07 Jun 2019 11:38:32 GMT
Content-Type: text/plain;charset=UTF-8
Content-Length: 2
Connection: keep-alive
                    
OK

Параметры оповещения

Набор параметров, передаваемых в оповещении (callback), может отличаться в зависимости от типа операции и конфигурации оповещений. В этом разделе приведены описания параметров, используемых в типовых случаях.

Внимание: Подпись должна рассчитываться на основе всех параметров оповещения.

Табл. 1. Объекты и параметры оповещений
Параметр Описание tree

customer
object

Объект, содержащий информацию о пользователе, совершающем платеж 70

id
string

Уникальный идентификатор пользователя в проекте 70-60 70

ip_address
string

IP-адрес пользователя, переданный в начальном запросе 70-70 70

phone
string

Телефон пользователя. Целое значение: от 4 до 24 цифр 70-100 70

email
string

Электронная почта пользователя 70-120 70

operation
object

Объект, содержащий информацию об операции, по которой отправлено оповещение 130

code
string

Унифицированный код ответа Gate. Подробнее о кодах ответов см. Статусы операций и коды ответов 130-10 130

date
string

Дата и время последнего обновления статуса операции в Gate 130-30 130

id
integer

Уникальный идентификатор операции в Gate 130-50 130

message
string

Унифицированное сообщение Gate. Подробнее см. в Статусы операций и коды ответов 130-60 130

status
string

Статус проведенной операции. Подробнее о возможных статусах операций см. Статусы операций и коды ответов. 130-90 130

sum_converted
object

Объект, содержащий валюту платежной системы и сумму операции, переведенной в эту валюту 130-100 130

amount
integer

Сумма операции в дробных единицах валюты платежной системы 130-100-10 130-100

currency
string

Валюта платежной системы в формате ISO 4217 alpha-3 130-100-20 130-100

sum_initial
object

Объект, содержащий сумму и валюту операции, переданные в запросе 130-110 130

amount
integer

Сумма операции, переданная в начальном запросе, в дробных единицах валюты 130-110-10 130-110

currency

string

Валюта операции в формате ISO 4217 alpha-3, переданная в начальном запросе 130-110-20 130-110

type
string

Тип проведенной операции 130-120 130

payment
object

Объект, содержащий данные о платеже 140

date
string

Дата и время последнего обновления статуса платежа в Gate.

Пример: 2017-07-27T15:19:13+0000

140-20 140

description
string

Описание платежа, переданное в начальном запросе 140-30 140

id
string

Уникальный идентификатор платежа в вашей системе 140-40 140

status
string

Статус платежа

Пример: success

140-90 140

sum
object

Объект, содержащий сумму платежа и валюту, переданную в начальном запросе 140-100 140

amount
integer

Сумма платежа в дробных единицах валюты 140-100-10 140-100

currency
string

Валюта платежа в формате ISO 4217 alpha-3, переданная в начальном запросе

Пример: USD

140-100-20 140-100

type  
string

Тип проведенного платежа

Пример: purchase

140-120 140

project_id
integer

Уникальный идентификатор проекта в Gate 150

signature
string

Подпись оповещения. Подробнее о проверке подписей оповещений см.

Подписывание и проверка подписи

190

Статусы операций и коды ответов

О состоянии каждой операции, созданной в платежной платформе Paytransfer в рамках платежа, информирует ее статус. Этот статус передается в промежуточных и итоговых оповещениях о платежах в параметре operation.status, а также отображается в интерфейсе Dashboard.

Помимо статусов, в платежной платформе используются служебные коды и сообщения, которые уточняют информацию о выполнении или возможных причинах отклонения операции, в том числе со стороны внешних платежных систем. Для удобства представления информации все используемые коды ответов и ошибок, а также соответствующие им сообщения унифицированы и передаются в вашу систему в параметрах operation.code и operation.message. Также эти коды и сообщения можно увидеть в интерфейсе Dashboard в карточке платежа.

Рис. 18. Фрагмент оповещения с информацией о выполнении операции
"operation":{
            "id": 003,
            "type": "sale",
            "status": "success",
            "date": "2020-07-20T07:12:04+0000",
            "sum_initial": {
                "amount": 131970,
                "currency": "KZT"
            },
            "code": "0",
            "message": "Success"
        }

Если при обработке запроса на проведение платежа возникает ошибка, то в синхронном ответе от платежной платформы указывается статус запроса error. Так как операция в данном случае не создается, то информация об ошибке передается в параметрах code и message. Подробная информация и примеры синхронных ответов об ошибках представлены в разделе Ответ.

В зависимости от статуса и кода ошибки от вас могут потребоваться определенные действия. Возможные статусы операции и запроса и предусмотренные для них дальнейшие действия с вашей стороны приведены в таблице ниже.

Табл. 2. Статусы и рекомендуемые действия
Статус Примечание Рекомендуемое действие
success Операция выполнена. Дальнейших действий не предусмотрено Действий не требуется
  • awaiting redirect result
  • awaiting clarification
  • awaiting customer action
  • processing
Операция выполняется Надо подождать
decline Операция отклонена из-за отказа пользователя, превышения количества запросов, обрыва связи или нехватки денежных средств у пользователя в данный момент времени Можно повторить запрос немедленно или позже
Операция отклонена по причине некорректных данных в запросе. Устранить ошибку можно самостоятельно, скорректировав запрос, или обратиться за помощью в службу технической поддержки Скорректируйте запрос
Операция отклонена по технической причине. Для устранения необходимо связаться со службой технической поддержки Свяжитесь со службой технической поддержки
Операция отклонена после ее проверки риск-системой или по иным причинам, которые невозможно устранить. Комментарии по отказу можно узнать у службы технической поддержки Действий не требуется
error Выполнение операции не инициировано из-за ошибки, возникшей при проверке принятого запроса Скорректируйте запрос

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

Табл. 3. Общие коды ответов
Код Сообщение Описание Действие
0 Success Операция успешно завершена Действий не требуется
100 General decline Выполнение операции отклонено из-за получения общей ошибки от Gate Свяжитесь со службой технической поддержки
301 Cancelled Выполнение операции отменено участником Попробуйте повторить запрос
303 Access denied Невозможно выполнить запрос, так как недостаточно прав, например из-за того, что запрос отправлен с IP-адреса, не включенного в список разрешенных адресов. Свяжитесь со службой технической поддержки и не завершайте платеж, пока не получите инструкции, как действовать в такой ситуации.
309 The amount received during conversion exceeds the limit Выполнение операции отклонено, так как сумма платежа превышает лимит, установленный платежным провайдером Скорректируйте запрос
310 This operation is not allowed by project settings Выполнение операции отклонено. Данный тип операции недоступен для проекта Свяжитесь со службой технической поддержки
314 Provider is not available now to perform the operation Выполнение операции отклонено, так как платежный провайдер недоступен в данный момент Попробуйте повторить запрос позже
315 Provider account is not available now to perform the operation Выполнение операции отклонено, так как учетная запись платежного провайдера в данный момент недоступна Попробуйте повторить запрос позже
402 Declined by Risk System Выполнение операции отклонено из-за подозрения на мошенничество Действий не требуется
501 Internal error Возникла внутренняя ошибка Свяжитесь со службой технической поддержки
502 Validation error Предоставленные данные не проходят валидацию Свяжитесь со службой технической поддержки
504 Insufficient funds on the balance Недостаточно средств на счете Свяжитесь со службой технической поддержки
601 Try again Возникла ошибка Попробуйте повторить запрос
602 Network error Возникла ошибка соединения с одним из сторонних сервисов Попробуйте повторить запрос
603 Auto decline Выполнение операции было автоматически отклонено Попробуйте повторить запрос
702 Malformed request Запрос был отклонен по причине некорректного формата Скорректируйте запрос
2003 Invalid JSON string В запросе передан некорректный JSON Скорректируйте запрос
2004 Required field not provided В запросе не передан обязательный параметр Скорректируйте запрос
2008 Access denied Невозможно выполнить запрос, так как недостаточно прав, например из-за того, что запрос отправлен с IP-адреса, не включенного в список разрешенных адресов. Свяжитесь со службой технической поддержки и не завершайте платеж, пока не получите инструкции, как действовать в такой ситуации.
2124 Invalid Customer ID В запросе передано некорректное значение customer_id Скорректируйте запрос
2154 Customer ID is required for project В запросе не передан обязательный для проекта параметр customer_id Скорректируйте запрос
2426 Invalid Email В запросе передано некорректное значение email Скорректируйте запрос
2442 Project ID not found В запросе не передан параметр project_id Скорректируйте запрос
2541 Unknown Payment Method В запросе передан неизвестный payment_method Скорректируйте запрос
2609 Invalid day of birth В запросе передано некорректное значение day_of_birth Скорректируйте запрос
2610 Invalid Country В запросе передано некорректное значение country Скорректируйте запрос
2611 Invalid City В запросе передано некорректное значение city Скорректируйте запрос
2641 Invalid Bank Code or Currency В запросе передано некорректное значение bank_code или currency Скорректируйте запрос
2642 Operation amount is greater than limit Сумма операции больше установленного лимита Скорректируйте запрос
2701 Rules Failed Code Выполнение операции отклонено по бизнес-правилам Свяжитесь со службой технической поддержки
2801 Bank ID not found В запросе не передан параметр bank_id Скорректируйте запрос
2881 Country not found В запросе не передан параметр country Скорректируйте запрос
3023 Provided currency disabled for Project ID В запросе передано значение валюты недопустимое для данного project_id Свяжитесь со службой технической поддержки
3024 Invalid Payment ID В запросе передано некорректное значение payment_id Скорректируйте запрос
3026 Internal Decline Выполнение операции через данную платежную систему недоступно Свяжитесь со службой технической поддержки
3028 Insufficient funds on merchant balance Недостаточно средств на счете для выплаты Следует связаться с курирующим менеджером Paytransfer
3041 Payment ID already exists Значение payment_id уже существует в системе Скорректируйте и повторно отправьте запрос
3060 Current payment or operation status does not allow this action Текущий статус платежа или операции не позволяет совершить желаемое действие Свяжитесь со службой технической поддержки
3081 State Machine Flow Break При обработке платежа возникла ошибка Свяжитесь со службой технической поддержки
3104 Payment Constraint Invalid Payout Amount Превышен максимальный лимит по выплате Скорректируйте и повторно отправьте запрос
3119 Request currency does not match channel currency Валюта, указанная в запросе, не совпадает со значением валюты, в которой настроен платежный канал мерчанта Скорректируйте и повторно отправьте запрос
3121 Invalid currency В запросе передано некорректное значение currency Скорректируйте и повторно отправьте запрос
3124 Invalid certificate При обработке запроса возникла ошибка Свяжитесь со службой технической поддержки
3191 Need clarification Запрос нуждается в уточнении параметров Скорректируйте и повторно отправьте запрос
3201 Expected error Выполнение операции отклонено из-за ошибки при маршрутизации платежа Свяжитесь со службой технической поддержки
3242 Account must be defined Должен быть передан объект account Скорректируйте и повторно отправьте запрос
3243 Account must not be defined Объект account не должен быть передан Скорректируйте и повторно отправьте запрос
3244 Bank id must be defined Должен быть передан параметр bank_id Скорректируйте и повторно отправьте запрос
3261 Invalid signature В запросе передано некорректное значение signature Скорректируйте и повторно отправьте запрос
3262 Empty signature Значение параметра signature в запросе пустое Скорректируйте и повторно отправьте запрос
3281 Converted amount is less than one minor unit Сконвертированная сумма меньше дробной единицы валюты Свяжитесь со службой технической поддержки
3283 Refund amount more than init amount Значение суммы в запросе на возврат больше суммы в первоначальной оплате Скорректируйте и повторно отправьте запрос
3284 Refund currency mismatched or empty Значение валюты в запросе на возврат не совпадает с валютой в первоначальной оплате или пустое Скорректируйте и повторно отправьте запрос
3285 Cannot make refund because of timeout block for repeat refund Выполнение операции отклонено из-за ограничений по частоте запросов на refund Попробуйте повторить запрос позже
3286 The property amount is required Отсутствует параметр amount в запросе. При передаче параметра currency необходимо передавать параметр amount Скорректируйте и повторно отправьте запрос
3287 The property currency is required Отсутствует параметр currency в запросе. При передаче параметра amount необходимо передавать параметр currency Скорректируйте и повторно отправьте запрос
3289 The operation amount is less than fix fee of tariff Выполнение операции отклонено, так как сумма меньше суммы комиссии по тарифу Скорректируйте и повторно отправьте запрос
3293 Payout method not filled in merchant account Для мерчант-аккаунта не заполнен платежный метод Свяжитесь со службой технической поддержки
3297 The provider's daily limit for the merchant account for the total amount of transactions has been exceeded Исчерпан суточный лимит на сумму операций, установленный провайдером для мерчант-аккаунта Попробуйте повторить запрос позже
3298 The provider's daily limit on the total amount of transactions has been exceeded Исчерпан суточный лимит на сумму операций, установленный провайдером Попробуйте повторить запрос позже
3358 Operation amount is less than limit Сумма операции меньше установленного лимита Скорректируйте и повторно отправьте запрос
9999 Awaiting processing Ожидается окончание обработки запроса Необходимо подождать

Табл. 4. Коды ответов от внешних платежных систем
Код Сообщение Описание Действие
20000 General decline Выполнение операции отклонено по неизвестной причине Попробуйте повторить запрос
20100 Declined by external provider Выполнение операции отклонено платежной системой без объяснения причины Попробуйте повторить запрос
20101 Decline due to amount or frequency limit Выполнение операции отклонено из-за превышения ограничений суммы или частоты платежа Следует скорректировать запрос или Можно попробовать еще раз
201011 Decline due to amount limit Выполнение операции отклонено из-за превышения ограничений суммы Скорректируйте и повторно отправьте запрос
201012 Decline due to amount limit per period for the customer Выполнение операции отклонено из-за превышения ограничений суммы для одного пользователя за установленный период Попробуйте повторить запрос позже
201013 Decline due to frequency limit Выполнение операции отклонено из-за превышения попыток проведения платежа Попробуйте повторить запрос позже
201014 Too much declined operations per period for the customer Выполнение операции отклонено из-за превышения отклоненных попыток проведения для одного пользователя за установленный период Попробуйте повторить запрос позже
20102 Incorrect account data entered Выполнение операции отклонено по причине ввода пользователем некорректных данных аккаунта Скорректируйте и повторно отправьте запрос
20103 Incorrect login or password Выполнение операции отклонено по причине ввода пользователем некорректных данных для входа в аккаунт Скорректируйте и повторно отправьте запрос
20104 Password attempts entry exceeded Выполнение операции отклонено по причине многократного ввода пользователем некорректного пароля для входа в аккаунт Попробуйте повторить запрос
20105 Insufficient funds on customer account Выполнение операции отклонено из-за недостатка средств на счете аккаунта пользователя Попробуйте повторить запрос
20106 Customer account is no longer available Выполнение операции отклонено по причине того, что аккаунт пользователя истек или недоступен Скорректируйте и повторно отправьте запрос
20107 Customer account does not support requested currency Выполнение операции отклонено по причине того, что аккаунт пользователя не поддерживает указанную валюту Попробуйте изменить запрос перед повторной отправкой
20201 Restrictions for the customer account Выполнение операции отклонено по причине наложенных ограничений на аккаунт пользователя. Пожалуйста, свяжитесь с платежной системой Скорректируйте и повторно отправьте запрос
20202 PSP system is unavailable Выполнение операции отклонено по причине недоступности платежной системы. Пожалуйста, попробуйте отправить запрос позднее Попробуйте повторить запрос
20203 Compromised customer account Выполнение операции отклонено из-за получения особого ответа от банка о том, что аккаунт пользователя скомпрометирован Действий не требуется
20204 Crediting this customer account is blocked Выполнение операции отклонено. Выплата на аккаунт пользователя невозможна. Пожалуйста, свяжитесь с внешней платежной системой Скорректируйте и повторно отправьте запрос
20205 Payment method is not available for customer country Платежный метод недоступен для страны пользователя Действий не требуется
20206 Difficulties on the mobile operator side Выполнение операции отклонено из-за технических проблем на стороне мобильного оператора Попробуйте повторить запрос
20301 Account owner cancelled operation Выполнение операции отклонено владельцем аккаунта Попробуйте повторить запрос
20302 Unacceptable password Пароль не отвечает требуемым параметрам. Пожалуйста, попробуйте другой Скорректируйте и повторно отправьте запрос
20303 Customer is not permitted to perform the action Невозможно выполнить запрос, так как недостаточно прав Скорректируйте и повторно отправьте запрос
20304 Incorrect amount paid Выполнение операции отклонено из-за неверной суммы, оплаченной пользователем Попробуйте отправить запрос повторно
20401 Declined by PSP risk system Выполнение операции отклонено риск-департаментом платежной системы. Не показывайте данное сообщение пользователю Скорректируйте и повторно отправьте запрос
20402 Suspicious operation Выполнение операции отклонено антимошеннической системой платежной системы Отказ со стороны риск-системы
20501 Refer to acquirer Выполнение операции отклонено из-за некорректного взаимодействия с платежной системой Свяжитесь со службой технической поддержки
20502 Error during operation validation Выполнение операции отклонено во время проведения процесса валидации данных Скорректируйте и повторно отправьте запрос
20503 Incorrect acquirer settings Выполнение операции отклонено из-за некорректных настроек. Пожалуйста, свяжитесь с эквайером Свяжитесь со службой технической поддержки
20504 Insufficient funds on acquirer balance Выполнение операции отклонено из-за недостатка средств на счете эквайера Свяжитесь со службой технической поддержки
20601 Try again Выполнение операции отклонено. Пожалуйста, попробуйте отправить запрос повторно Попробуйте повторить запрос
20602 Time-out Выполнение операции отклонено из-за истечения времени ожидания. Пожалуйста, попробуйте отправить запрос повторно Попробуйте повторить запрос
20603 Operation could not be authorized. Try again later Операция не может быть проведена в данный момент. Пожалуйста, попробуйте отправить запрос позднее Попробуйте повторить запрос
20604 Notification is not delivered Выполнение операции отклонено. Невозможно доставить оповещение Свяжитесь со службой технической поддержки
20701 Wrong requests sequence Выполнение операции отклонено по причине некорректной последовательности отправки запросов Скорректируйте и повторно отправьте запрос
20702 Invalid request. Try again Выполнение операции отклонено по причине некорректного формата запроса Свяжитесь со службой технической поддержки
20705 Merchant account is blocked Аккаунт мерчанта заблокирован Свяжитесь со службой технической поддержки
20706 Operation not supported by provider Выполнение данной операции не поддерживается провайдером Свяжитесь со службой технической поддержки
20801 Payment provider approved but did not process the operation Платежная система подтвердила, но не провела операцию Свяжитесь со службой технической поддержки
20802 The payment provider did not confirm neither successful nor negative status of the payment transaction Платежная система не может подтвердить статус платежа Необходимо подождать, действий не требуется
29999 Awaiting processing Ожидается окончание обработки запроса на стороне платежной системы. Пожалуйста, подождите Необходимо подождать, действий не требуется

Анализ результатов платежей

Всю необходимую информацию можно получать и анализировать средствами Dashboard, в том числе с помощью аналитических панелей в разделе Аналитика.

Также Dashboard позволяет выгружать данные в формате CSV с помощью инструментов в разделе Отчеты. При этом можно выполнять разовые и периодические выгрузки информации на локальный компьютер.

С любыми вопросами о возможностях анализа можно обращаться в службу технической поддержки Paytransfer.

Подписывание и проверка подписи

Общая информация

Для обеспечения защищенного обмена данными при работе с платежной платформой Paytransfer используется криптографический протокол TLS (Transport Layer Security; протокол защиты транспортного уровня) версии не ниже 1.2, а для подтверждения авторства и целостности передаваемых данных дополнительно применяется цифровая подпись. Она формируется и проверяется по заданным алгоритмам с использованием одинакового секретного ключа, доступного на двух сторонах: вашей системы и Paytransfer.

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

Далее описаны алгоритмы подписывания данных и проверки их целостности, а также представлены примеры выполнения этих алгоритмов.

Подписывание запроса

Описание алгоритма

В качестве входных данных для подписывания выступают:

  1. Данные запроса, которые требуется подписать.

    Как правило, это все параметры тела запроса за исключением подписи или JavaScript-объект configObj с параметрами без включения параметра signature.

  2. Ключ, используемый для подписывания.

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

Далее в описании и примере представлен часто используемый и наиболее показательный вариант реализации алгоритма: с JavaScript-объектом configObj на входе (без параметра signature) и на выходе (с параметром signature).

Рис. 19. Как рассчитать подпись

  1. Убедитесь что входные данные удовлетворяют следующим требованиям:
    1. Структура данных для подписывания соответствует формату JavaScript-объектов.
    2. В составе данных для подписывания нет параметра signature (даже с пустым значением).
    3. Известен ключ для подписывания.
  2. Преобразуйте данные в строку в формате UTF-8 и отсортируйте параметры по алфавиту. В рамках этого шага:
    1. Логические (булевы) значения кодируются следующим образом: false заменяется на 0, а true — на 1.

      Но это относится только к булевым значениям: в строковых параметрах, даже если они содержат значения false или true, замены на 0 или 1 не используются!

    2. Параметры с нулевыми, а также пустыми значениями остаются в строке, например запись "payment_description":"" представляется в виде payment_description:. Замены пустых значений на пробелы или null не применяются.
    3. Кодировка всех строк приводится к формату UTF-8.
    4. Полученные строки упорядочиваются в алфавитном порядке и объединяются в одну строку с использованием в качестве разделителя точки с запятой (;).
  3. Рассчитайте двоичный код HMAC с использованием ключа и функции SHA-512. На этом шаге для полученной строки с параметрами вычисляется HMAC (Hash-based Message Authentication Code; код аутентификации сообщений с использованием хеш-функции) с использованием функции хеширования SHA‑512 (Secure Hash Algorithm; безопасный алгоритм хеширования) и применяемого ключа. И этот HMAC представляется в виде необработанных двоичных данных.
  4. Закодируйте двоичный код HMAC с применением алгоритма Base64. На этом шаге полученный двоичный код HMAC кодируется с использованием алгоритма Base64. Получаемая при этом строка является подписью к исходным данным.
  5. Добавьте подпись в данные. На этом шаге к исходным данным для подписывания добавляется параметр signature с полученной подписью в качестве его значения.

// Пример формирования подписи. PHP
class Signer
{
    const ALGORITHM = 'sha512';
    const ITEMS_DELIMITER = ';';
    const MAXIMUM_RECURSION_DEPTH = 3;

/** * Generate signature * * @param array $params * @param string $secretKey * @param array $ignoreParamKeys * @param bool $doNotHash * @param bool $useUnlimitedRecursionDepth * * @return string */ public static function sign(array $params, string $secretKey, array $ignoreParamKeys = [], bool $doNotHash = false, bool $useUnlimitedRecursionDepth = false): string { $paramsPrepared = self::getParamsToSign($params, $ignoreParamKeys, 1, '', $useUnlimitedRecursionDepth); $stringToSign = implode(self::ITEMS_DELIMITER, $paramsPrepared);

return $doNotHash ? $stringToSign : base64_encode(hash_hmac(self::ALGORITHM, $stringToSign, $secretKey, true)) ; }

/** * Get parameters to sign * * @param array $params * @param array $ignoreParamKeys * @param int $currentLevel * @param string $prefix * @param bool $useUnlimitedRecursionDepth * * @return array */ private static function getParamsToSign( array $params, array $ignoreParamKeys = [], int $currentLevel = 1, string $prefix = '', bool $useUnlimitedRecursionDepth = false ): array { $paramsToSign = [];

foreach ($params as $key => $value) { if (in_array($key, $ignoreParamKeys, true)) { continue; }

$paramKey = ($prefix ? $prefix . ':' : '') . $key;

if (is_object($value)) { $value = get_object_vars($value); }

if (is_array($value)) { if (!$useUnlimitedRecursionDepth && ($currentLevel >= self::MAXIMUM_RECURSION_DEPTH)) { $paramsToSign[$paramKey] = (string)$paramKey.':'; } else { $subArray = self::getParamsToSign($value, $ignoreParamKeys, $currentLevel + 1, $paramKey, $useUnlimitedRecursionDepth); $paramsToSign = array_merge($paramsToSign, $subArray); } } else { if (is_bool($value)) { $value = $value ? '1' : '0'; } else { $value = (string)$value; }

$paramsToSign[$paramKey] = (string)$paramKey.':'.$value; } }

if ($currentLevel == 1) { ksort($paramsToSign, SORT_NATURAL); }

return $paramsToSign; } }

# Пример формирования подписи. Python
import hmac
import base64
import hashlib

class Signer: def getSign(self, params, key): byteKey = key.encode() paramsPrepared = self.getParamsToSign(params) toSignString = ';'.join(paramsPrepared.values()) hmacObj = hmac.new(byteKey, toSignString.encode(), hashlib.sha512)

return base64.b64encode(hmacObj.digest())

def getParamsToSign(self, params, currentLevel = 1, prefix = '', useUnlimitedRecursionDepth = False): paramsToSign = dict()

for paramKey in params.keys():

newParamKey = (prefix + ':' if prefix else '') + paramKey

if isinstance(params[paramKey], (dict)): if useUnlimitedRecursionDepth is False and (currentLevel >= 3): paramsToSign[newParamKey] = newParamKey + ':' else: subDict = self.getParamsToSign(params[paramKey], currentLevel + 1, newParamKey, useUnlimitedRecursionDepth) paramsToSign.update(subDict) else: if isinstance(params[paramKey], (bool)): value = '1' if params[paramKey] == True else '0' else: value = str(params[paramKey])

paramsToSign[newParamKey] = str(newParamKey + ':' + value)

sortedParams = dict()

for key in sorted(paramsToSign.keys()): sortedParams[key] = paramsToSign[key]

return sortedParams

// Пример формирования подписи. Java
const CryptoJS = require('crypto-js'); // npm install crypto-js

class Signer { getSign(params, key) { const paramsPrepared = this.getParamsToSign(params, 1);

const joinedString = Object.values(paramsPrepared).join(';');

const hash = CryptoJS.HmacSHA512(joinedString, key);

return hash.toString(CryptoJS.enc.Base64); }

getParamsToSign(params, currentLevel = 1, prefix = '', useUnlimitedRecursionDepth = false) { let paramsToSign = {}; let value = '';

let keys = Object.keys(params); let key = ''; for (let i = 0; i < keys.length; i++) { key = keys[i];

let paramKey = (prefix ? prefix + ':' : '') + key;

if (typeof params[key] === 'object') { if (!useUnlimitedRecursionDepth && (currentLevel >= 3)) { paramsToSign[paramKey] = paramKey + ':'; } else { let subParams = this.getParamsToSign(params[key], currentLevel + 1, paramKey, useUnlimitedRecursionDepth);

Object.assign(paramsToSign, subParams); } } else { if (typeof params[key] === "boolean") { value = params[key] === true ? '1' : '0'; } else { value = params[key].toString(); }

paramsToSign[paramKey] = paramKey + ':' + value; } }

let orderedKeys = Object.keys(paramsToSign).sort();

let ordered = {};

for (let k = 0; k < orderedKeys.length; k++) { ordered[orderedKeys[k]] = paramsToSign[orderedKeys[k]]; }

return ordered; } }

module.exports = Signer;

Проверка подписи оповещений

Описание алгоритма

В качестве входных данных для проверки целостности выступают:

  1. Подписанные данные, которые требуется проверить. Как правило, это тело оповещения или ответа в формате JSON с параметром signature в его составе.
  2. Ключ, используемый для проверки. Это должен быть ровно тот же ключ, который был использован для подписывания проверяемых данных.

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

Далее в описании и примере представлен часто используемый и наиболее показательный вариант реализации алгоритма: с телом проверяемого сообщения (оповещения или ответа) в формате JSON на входе и с заключением о целостности этого сообщения на выходе.

В состав алгоритма в этом случае включаются следующие шаги:

Рис. 20. Шаги алгоритма проверки данных

  1. Проверка входных данных на соблюдение заданных требований:
    1. Структура проверяемых данных должна соответствовать формату JSON.
    2. В составе проверяемых данных должен присутствовать параметр signature с подписью.
    3. Должен быть задан проверочный ключ.
  2. Извлечение подписи из проверяемых данных На этом шаге из проверяемых данных исключается параметр signature, а его значение фиксируется для последующего сличения с расчетной подписью.
  3. Расчет подписи для проверяемых данных:
    1. Преобразование данных в строку UTF-8 с сортировкой параметров по алфавиту В рамках этого шага выполняются следующие действия:
      1. Логические (булевы) значения кодируются следующим образом: false заменяется на 0, а true — на 1. Но это относится только к булевым значениям: в строковых параметрах, даже если они содержат значения false или true, замены на 0 или 1 не используются!
      2. Каждый параметр преобразуется в строку, содержащую полный путь к параметру, название параметра и его значение: <родительскийузел_1>:...:<родительскийузелN>:<названиепараметра>:<значение_параметра>, где родительские узлы — это названия объектов и (или) массивов, в состав которых включена пара «название параметра — значение параметра». Родительские узлы располагаются в порядке их вложения, начиная с самого верхнего уровня. В качестве разделителя при этом используется двоеточие (:), между парами «название параметра — значение параметра» удаляются запятые, а у строковых значений параметров удаляются обрамляющие кавычки.
      3. Параметры с нулевыми, а также пустыми значениями остаются в строке, например запись "payment_description":"" представляется в виде payment_description:. Замены пустых значений на пробелы или null не применяются.
      4. Элементы массивов записываются отдельными строками, с указанием номера каждого элемента, начиная с нуля. Например, массив ["alpha", "beta", "gamma"] представляется в виде трех строк: 0:alpha, 1:beta и 2:gamma.
      5. Пустые массивы полностью игнорируются и не включаются в набор строк для создания подписи.
      6. Кодировка всех строк приводится к формату UTF-8.
      7. Полученные строки упорядочиваются в алфавитном порядке и объединяются в одну строку с использованием в качестве разделителя точки с запятой (;).
    2. Получение двоичного кода HMAC с использованием ключа и функции SHA‑512. На этом шаге для полученной строки с параметрами вычисляется HMAC (Hash-based Message Authentication Code; код аутентификации сообщений с использованием хеш-функции) с использованием функции хеширования SHA‑512 (Secure Hash Algorithm; безопасный алгоритм хеширования) и применяемого ключа. И этот HMAC представляется в виде необработанных двоичных данных.
    3. Кодирование двоичного кода HMAC с применением алгоритма Base64. На этом шаге полученный двоичный код HMAC кодируется с использованием алгоритма Base64. Получаемая при этом строка является подписью к исходным данным.
  4. Сопоставление подписей. На этом шаге расчетная подпись сопоставляется с проверяемой. Если подписи совпадают, данные признаются целостными и достоверными. При несовпадении подписей данные не могут считаться достоверными и не должны использоваться в качестве рабочих.

Пример для оповещения

Допустим, что надо проверить подпись оповещения при следующих условиях:

Рис. 21. Тело оповещения
{
  "project_id": 200,
  "payment": {
    "id": "sports_eq_4589",
    "type": "purchase",
    "status": "success",
    "date": "2020-07-20T07:12:04+0000",
    "method": "World banks",
    "sum": {
      "amount": 131970,
      "currency": "USD"
    },
    "description": "Sports equipment"
  },
  "customer": {
    "id": "customer_173",
    "ip_address": "198.51.100.47",
    "phone": "+60-3-xxxx-xxxx",
    "email": "jane.doe@example.com"
  },
  "operation": {
    "id": 103,
    "type": "sale",
    "status": "success",
    "date": "2020-07-20T07:12:04+0000",
    "sum_initial": {
      "amount": 131970,
      "currency": "USD"
    },
    "code": "0",
    "message": "Success"
  },
  "signature": "qV2FRs/wxoOaywQS0GYQDi+6spZFbiRXxt8zG10zy9TNiJLT0P/+EOrpMkoW80mynkaQfSAUJpfQ=="
}
  • Ключ подписывания — secret
  • Тело полученного оповещения выглядит, как показано в примере.

Чтобы проверить подпись:

Рис. 22. Вид набора параметров после выполнения шага 1
{
  "project_id": 200,
  "payment": {
    "id": "sports_eq_4589",
    "type": "purchase",
    "status": "success",
    "date": "2020-07-20T07:12:04+0000",
    "method": "World banks",
    "sum": {
      "amount": 131970,
      "currency": "USD"
    },
    "description": "Sports equipment"
  },
  "customer": {
    "id": "customer_173",
    "ip_address": "198.51.100.47",
    "phone": "+60-3-xxxx-xxxx",
    "email": "jane.doe@example.com"
  },
  "operation": {
    "id": 103,
    "type": "sale",
    "status": "success",
    "date": "2020-07-20T07:12:04+0000",
    "sum_initial": {
      "amount": 131970,
      "currency": "USD"
    },
    "code": "0",
    "message": "Success"
  },
  "signature": "qV2FRs/wxoOaywQS0GYQDi+6spZFbiRXxt8zG10zy9TNiJLT0P/+EOrpMkoW80mynkaQfSAUJpfQ=="
}
Рис. 23. Вид набора параметров после выполнения шага 2
project_id:200
payment:id:sports_eq_4589
payment:type:purchase
payment:status:success
payment:date:2020-07-20T07:12:04+0000
payment:method:World banks
payment:sum:amount:131970
payment:sum:currency:USD
payment:description:Sports equipment
customer:id:customer_173
customer:ip_address:198.51.100.47
customer:phone:+60-3-xxxx-xxxx
customer:email:jane.doe@example.com
operation:id:103
operation:type:sale
operation:status:success
operation:date:2020-07-20T07:12:04+0000
operation:sum_initial:amount:131970
operation:sum_initial:currency:USD
operation:code:0
operation:message:Success
Рис. 24. Вид набора параметров после выполнения шага 3
customer:email:jane.doe@example.com
customer:id:customer_173
customer:ip_address:198.51.100.47
customer:phone:+60-3-xxxx-xxxx
operation:code:0
operation:date:2020-07-20T07:12:04+0000
operation:id:103
operation:message:Success
operation:status:success
operation:sum_initial:amount:131970
operation:sum_initial:currency:USD
operation:type:sale
payment:date:2020-07-20T07:12:04+0000
payment:description:Sports equipment
payment:id:sports_eq_4589
payment:method:World banks
payment:status:success
payment:sum:amount:131970
payment:sum:currency:USD
payment:type:purchase
project_id:200
Рис. 25. Вид набора параметров после выполнения шага 4
customer:email:jane.doe@example.com;customer:id:customer_173;customer:ip_address:198.51.100.47;customer:phone:+60-3-xxxx-xxxx;operation:code:0;operation:date:2020-07-20T07:12:04+0000;operation:id:103;operation:message:Success;operation:status:success;operation:sum_initial:amount:131970;operation:sum_initial:currency:USD;operation:type:sale;payment:date:2020-07-20T07:12:04+0000;payment:description:Sports equipment;payment:id:sports_eq_4589;payment:method:World banks;payment:status:success;payment:sum:amount:131970;payment:sum:currency:USD;payment:type:purchase;project_id:200
Рис. 26. Подпись, полученная после выполнения шага 5
k1P1qtiRjtFpwvU1JSVIVTIM/aEo7YxBBcOsPa6DyTmrfvdi/ti8dGlVzSrC6/T+C8JtIQfWeD7L2N15FnSEXw==
  1. Удалите из тела оповещения параметр signature вместе с его значением.
  2. Преобразуйте оставшиеся параметры в строки UTF-8 согласно алгоритму.
  3. Упорядочите полученные строки по алфавиту.
  4. Объедините упорядоченные строки в одну строку с использованием в качестве разделителя точки с запятой.
  5. Вычислите HMAC полученной строки с использованием функции хеширования SHA-512 и ключа подписывания, после чего закодируйте двоичный HMAC-код с применением алгоритма Base64.
  6. Сравните полученную подпись с проверяемой.

    В данном случае подписи не совпадают, а это значит, что такое оповещение недостоверно или ошибочно и должно быть отброшено.

// Пример проверки подписи. PHP
require_once 'Signer.php';

$secretKey = '123';

$requestBody = '{ "project_id": 200, "payment": { "id": "sports_eq_4589", "type": "purchase", "status": "success", "date": "2020-07-20T07:12:04+0000", "method": "World banks", "sum": { "amount": 131970, "currency": "USD" }, "description": "Sports equipment" }, "customer": { "id": "customer_173", "ip_address": "198.51.100.47", "phone": "+60-3-xxxx-xxxx", "email": "jane.doe@example.com" }, "operation": { "id": 103, "type": "sale", "status": "success", "date": "2020-07-20T07:12:04+0000", "sum_initial": { "amount": 131970, "currency": "USD" }, "code": "0", "message": "Success" }, "signature": "qV2FRs/wxoOaywQS0GYQDi+6spZFbiRXxt8zG10zy9TNiJLT0P/+EOrpMkoW80mynkaQfSAUJpfQ==" }';

$requestBodyArray = json_decode($requestBody, true);

$actualSignature = $requestBodyArray['signature']; unset($requestBodyArray['signature']); $expectedSignature = Signer::sign($requestBodyArray, $secretKey);

print_r('Actual signature: ' . $actualSignature . PHP_EOL); print_r('Expected signature: ' . $expectedSignature . PHP_EOL);

if ($expectedSignature === $actualSignature) { print_r('Signatures are equal'); } else { print_r('Signatures are not equal'); }

print_r(PHP_EOL);

# Пример проверки подписи. Python
from Signer import Signer
import base64

secretKey = '123' params = { "project_id": 200, "payment": { "id": "sports_eq_4589", "type": "purchase", "status": "success", "date": "2020-07-20T07:12:04+0000", "method": "World banks", "sum": { "amount": 131970, "currency": "USD" }, "description": "Sports equipment" }, "customer": { "id": "customer_173", "ip_address": "198.51.100.47", "phone": "+60-3-xxxx-xxxx", "email": "jane.doe@example.com" }, "operation": { "id": 103, "type": "sale", "status": "success", "date": "2020-07-20T07:12:04+0000", "sum_initial": { "amount": 131970, "currency": "USD" }, "code": "0", "message": "Success" }, "signature": "qV2FRs/wxoOaywQS0GYQDi+6spZFbiRXxt8zG10zy9TNiJLT0P/+EOrpMkoW80mynkaQfSAUJpfQ==" }

signer = Signer() actualSign = params['signature'] del params['signature'] expectedSign = signer.getSign(params, secretKey).decode()

print('Actual signature:' + actualSign) print('Expected signature:' + expectedSign)

if (expectedSign == actualSign): print('Signature is correct') else: print('Signature is incorrect')

// Пример проверки подписи. Java
const signer = require('./Signer');

const secretKey = '123';

const params = { "project_id": 200, "payment": { "id": "sports_eq_4589", "type": "purchase", "status": "success", "date": "2020-07-20T07:12:04+0000", "method": "World banks", "sum": { "amount": 131970, "currency": "USD" }, "description": "Sports equipment" }, "customer": { "id": "customer_173", "ip_address": "198.51.100.47", "phone": "+60-3-xxxx-xxxx", "email": "jane.doe@example.com" }, "operation": { "id": 103, "type": "sale", "status": "success", "date": "2020-07-20T07:12:04+0000", "sum_initial": { "amount": 131970, "currency": "USDUSD" }, "code": "0", "message": "Success" }, "signature": "qV2FRs/wxoOaywQS0GYQDi+6spZFbiRXxt8zG10zy9TNiJLT0P/+EOrpMkoW80mynkaQfSAUJpfQ==" };

const actualSignature = params['signature']; delete params.signature; const expectedSignature = (new signer()).getSign(params, secretKey);

console.log('Actual: ' + actualSignature); console.log('Expected: '+expectedSignature);

if (actualSignature == expectedSignature) { console.log('Signatures is correct'); } else { console.log('Signature is incorrect'); }

FAQ

Общая информация

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

Не нашли ответ на интересующий вас вопрос? Обратитесь к нашим специалистам:

  • к курирующему менеджеру — с деловыми и финансовыми вопросами (о стоимости услуг, расчете комиссий, работе с балансами и т. д.);
  • к менеджеру по имплементации — с техническими вопросами (о работе с разными интерфейсами, составлении запросов, настройке оповещений и т. д). Коммуникация с менеджером по имплементации ведется в техническом чате. Если чат ранее не был создан, пожалуйста, обратитесь к своему курирующему менеджеру, чтобы его создать.

Часто задаваемые вопросы

Рис. 27. Что такое дробные единицы валюты и как с ними работать?

Дробные единицы валюты — разменные единицы валюты, указываемые в суммах после основной единицы валюты и десятичного разделителя. Например, у суммы 155,00 USD часть 155 — основная, а 00 после запятой — дробная. Чаще всего дробные единицы валюты составляют 1/100 основной единицы валюты, но встречаются валюты, где дробные единицы составляют 1/1000 основной единицы валюты или же где у валюты совсем нет дробной части.

В запросах вы всегда должны передавать сумму платежа в дробных единицах валюты без десятичного разделителя и пробелов за исключением случаев, когда у валюты нет дробной части. Так, сумма платежа 10,00 USD в запросе должна передаваться как 1000.

Если у валюты нет дробных единиц (то есть количество разрядов дробных единиц после десятичной точки или запятой равно нулю), то в запросе нужно указывать сумму в основных единицах валюты. Например, у вьетнамских донгов не существует дробной части и, следовательно, сумма 10 VND в запросе должна передаваться как 10.

Чтобы проверить количество дробных единиц у валют, смотрите таблицу в разделе Коды валют.

Рис. 28. Почему мне не приходят оповещения?

Если вам не приходят оповещения от платежной платформы Paytransfer, убедитесь, что:
  • ваша система ожидает оповещения с URL-адреса, который вы получили от команды Paytransfer при интеграции;
  • URL-адрес корректно настроен на прием HTTP-запросов от платежной платформы: IP-адреса Paytransfer добавлены в список разрешенных, а сообщения не блокируются брандмауэром или другими сетевыми устройствами;
  • в запросе на проведение платежа не передавался параметр callback.force_disable со значением 1, которое запрещает платежной платформе отправлять оповещения по этому платежу.
Если все эти условия выполнены, но оповещения по-прежнему не приходят, свяжитесь со службой технической поддержки Paytransfer по адресу support@paytransfer.kz. В своем обращении не забудьте указать идентификатор проекта и URL-адрес, на который не приходят оповещения.
Рис. 29. Как узнать текущий статус платежа или операции?

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

Вы также можете проверить статус платежа или операции в оповещениях от платежной платформы Paytransfer. Статусы, которые вы можете увидеть в оповещении от платежной платформы, перечислены в разделе Статусы операций и коды ответов.

Рис. 30. Как узнать причину отклонения операции?

Если во время обработки запроса или выполнения операции возникли ошибки или поводы для отказа, причины их возникновения можно узнать следующими способами:
  • В синхронном ответе на запрос, если была обнаружена ошибка при первичной обработке запроса. Подробная информация о таких ошибках представлена в разделе Ответ.
  • В полученном промежуточном или итоговом оповещении (callback) — через код ответа и сообщение, которые могут быть представлены:
    • в массиве errors, если операция была отклонена на стороне платежной платформы, например, если операция не прошла проверку на соответствие установленным бизнес-правилам;
    • в параметрах operation.code и operation.message, если операция была отклонена на стороне провайдера или платежной системы.
    Подробная информация о работе с оповещениями представлена в разделе Оповещение (callback).
  • В карточке платежа в интерфейсе Dashboard.
Подробная информация о возможных ошибках при выполнении операций и о кодах, которые используются в оповещениях и интерфейсе Dashboard, представлена в разделе Статусы операций и коды ответов.

Использование дробных единиц валюты

Обычно с запросах сумма платежа указывается в дробных единицах валюты без десятичной точки и пробелов.

Дробной единицей валюты называется денежная единица, которая оценивается в долю (обычно в одну сотую) от основной денежной единицы. Такие единицы используются в денежном обращении для мелких расчётов. Значения в столбце Количество разрядов дробных единиц таблицы Коды валют показывают количество десятичных разрядов для валют, используемых в Paytransfer.

Например, если рассмотреть рубли, то:

  • Основная едииница: основной единицей является рубль.
  • Дробная единица: для мелких расчетов используются копейки.

Значение в столбце Количество разрядов дробных единиц для рублей — 2.

Таким образом, если требуется передать сумму 100,00 RUB, то сумма представляется как 100×102=10000 (то есть 10000 копеек).

Но если у валюты нет дробных единиц — то есть значение в столбце Количество разрядов дробных единиц равно нулю, то в запросах сумму следует указывать в основных единицах валюты. Например, сумма 100 JPY представляется как 100×100=100.

Примеры соотношения номинальных и дробных единиц валют приведены в таблице ниже.

Сумма в номинальных единицах валюты Сумма в дробных единицах валюты
450,66 GBP 45066
39,95 USD 3995
200 JPY 200
150,15 KWD 15015

Справочники

Коды валют

В следующей таблице приведена информация о валютах. Для каждой валюты приведены: код валюты в соответствии со стандартом ISO 4217 alpha-3, количество разрядов дробных единиц, название валюты и страна (или страны), где она используется.

Обычно с запросах сумма платежа указывается в дробных единицах валюты без десятичной точки и пробелов. Например, сумма 100,00 USD представляется как 10000 (то есть 10000 центов).

Но если у валюты нет дробных единиц — то есть значение в столбце Количество разрядов дробных единиц равно нулю, то в запросах сумму следует указывать в основных единицах валюты. Например, сумма 100 JPY представляется как 100.

Подробнее о переводе сумм в дробные единицы валюты см. Использование дробных единиц валюты.

Табл. 5. Коды валют
Код Количество дробных единиц Валюта Страны
AED 2 Дирхам Объединенные Арабские Эмираты
AFN 2 Афгани Афганистан
ALL 2 Лек Албания
AMD 2 Армянский драм Армения
ANG 2 Нидерландский антильский гульден Кюрасао, Синт-Мартен
AOA 2 Кванза Ангола
ARS 2 Аргентинское песо Аргентина
AUD 2 Австралийский доллар Австралия, Остров Рождества, Кокосовые острова, Остров Херд и острова Макдональд, Кирибати, Науру, Остров Норфолк, Тувалу
AWG 2 Арубанский флорин Аруба
AZN 2 Азербайджанский манат Азербайджан
BAM 2 Конвертируемая марка Босния и Герцеговина
BBD 2 Барбадосский доллар Барбадос
BDT 2 Така Бангладеш
BGN 2 Болгарский лев Болгария
BHD 3 Бахрейнский динар Бахрейн
BIF 0 Бурундийский франк Бурунди
BMD 2 Бермудский доллар Бермуды
BND 2 Брунейский доллар Бруней
BOB 2 Боливиано Боливия
BOV 2 Мвдол Боливия
BRL 2 Бразильский реал Бразилия
BSD 2 Багамский доллар Багамские острова
BTN 2 Нгултрум Бутан
BWP 2 Пула Ботсвана
BYN 2 Белорусский рубль (BYR) Беларусь
BZD 2 Белизский доллар Белиз
CAD 2 Канадский доллар Канада
CDF 2 Конголезский франк Конго
CHE 2 WIR-евро Швейцария
CHF 2 Швейцарский франк Лихтенштейн, Швейцария
CHW 2 WIR-франк Швейцария
CLF 4 Единица развития Чили
CLP 0 Чилийское песо Чили
CNY 2 Юань Китай
COP 2 Колумбийское песо Колумбия
COU 2 Единица реальной стоимости Колумбия
CRC 2 Коста-риканский колон Коста-Рика
CUC 2 Конвертируемое песо Куба
CUP 2 Кубинское песо Куба
CVE 0 Эскудо Кабо-Верде Кабо-Верде
CZK 2 Чешская крона Чехия
DJF 0 Франк Джибути Джибути
DKK 2 Датская крона Дания, Фарерские острова, Гренландия
DOP 2 Доминиканское песо Доминиканская Республика
DZD 2 Алжирский динар Алжир
EGP 2 Египетский фунт Египет
ERN 2 Накфа Эритрея
ETB 2 Эфиопский быр Эфиопия
EUR 2 Евро Андорра, Майотта, Монако, Сан-Марино, Сен-Пьер и Микелон, страны Европейского союза, кроме Болгарии, Хорватии, Чехии, Дании, Венгрии, Польши, Румынии и Швеции
FJD 2 Доллар Фиджи Фиджи
FKP 2 Фунт Фолклендских островов Фолклендские острова
GBP 2 Фунт стерлингов Гернси, Остров Мен, Джерси, Великобритания
GEL 2 Лари Грузия
GHS 2 Ганский седи Гана
GIP 2 Гибралтарский фунт Гибралтар
GMD 2 Даласи Габмия
GNF 0 Гвинейский франк Гвинея
GTQ 2 Кетсаль Гватемала
GYD 2 Гайанский доллар Гайана
HKD 2 Гонконгский доллар Гонконг
HNL 2 Лемпира Гондурас
HRK 2 Хорватская куна Хорватия
HTG 2 Гурд Гаити
HUF 2 Форинт Венгрия
IDR 2 Индонезийская рупия Индонезия
ILS 2 Новый израильский шекель Израиль
INR 2 Индийская рупия Бутан, Индия
IQD 3 Иракский динар Ирак
IRR 2 Иранский риал Иран
ISK 0 Исландская крона Исландия
JMD 2 Ямайский доллар Ямайка
JOD 3 Иорданский динар Иордания
JPY 0 Иена Япония
KES 2 Кенийский шиллинг Кения
KGS 2 Сом Кыргызстан
KHR 2 Риель Камбоджа
KMF 0 Франк Комор Коморские острова
KPW 2 Северокорейская вона Корея
KRW 0 Вона Южная Корея
KWD 3 Кувейтский динар Кувейт
KYD 2 Доллар Островов Кайман Каймановы острова
KZT 2 Тенге Казахстан
LAK 2 Кип Лаос
LBP 2 Ливанский фунт Ливан
LKR 2 Шри-Ланкийская рупия Шри-Ланка
LRD 2 Либерийский доллар Либерия
LSL 2 Лоти Лесото
LYD 3 Ливийский динар Ливия
MAD 2 Марокканский дирхам Марокко, Западная Сахара
MDL 2 Молдавский лей Молдова
MGA 2 Малагасийский ариари Мадагаскар
MKD 2 Денар Македония
MMK 2 Кьят Мьянма
MNT 2 Тугрик Монголия
MOP 2 Патака Макао
MRU 1 Угия Мавритания
MUR 2 Маврикийская рупия Маврикий
MVR 2 Руфия Мальдивы
MWK 2 Квача Малави
MXN 2 Мексиканское песо Мексика
MXV 2 Мексиканская инверсионная единица Мексика
MYR 2 Малайзийский ринггит Малайзия
MZN 2 Мозамбикский метикал Мозамбик
NAD 2 Доллар Намибии Намибия
NGN 2 Найра Нигерия
NIO 2 Золотая кордоба Никарагуа
NOK 2 Норвежская крона Остров Буве, Норвегия, Шпицберген и Ян-Майен
NPR 2 Непальская рупия Непал
NZD 2 Новозеландский доллар Острова Кука, Новая Зеландия, Ниуэ, Острова Питкэрн, Токелау
OMR 3 Оманский риал Оман
PAB 2 Бальбоа Панама
PEN 2 Новый соль Перу
PGK 2 Кина Папуа Новая Гвинея
PHP 2 Филиппинское песо Филиппины
PKR 2 Пакистанская рупия Пакистан
PLN 2 Злотый Польша
PYG 0 Гуарани Парагвай
QAR 2 Катарский риал Катар
RON 2 Новый румынский лей Румыния
RSD 2 Сербский динар Сербия
RUB 2 Российский рубль Российская Федерация
RWF 0 Франк Руанды Руанда
SAR 2 Саудовский риял Саудовская Аравия
SBD 2 Доллар Соломоновых Островов Соломоновы острова
SCR 2 Сейшельская рупия Сейшельские Острова
SDG 2 Суданский фунт Судан
SEK 2 Шведская крона Швеция
SGD 2 Сингапурский доллар Сингапур
SHP 2 Фунт Святой Елены Остров Святой Елены
SLL 2 Леоне Сьерра-Леоне
SOS 2 Сомалийский шиллинг Сомали
SRD 2 Суринамский доллар Суринам
SSP 2 Южносуданский фунт Южный Судан
STN 2 Добра Сан-Томе и Принсипе
SVC 2 Сальвадорский колон Сальвадор
SYP 2 Сирийский фунт Арабская Сирийская Республика
SZL 2 Лилангени Свазиленд
THB 2 Бат Таиланд
TJS 2 Сомони Таджикистан
TMT 2 Новый туркменский манат Туркменистан
TND 3 Тунисский динар Тунис
TOP 2 Паанга Тонга
TRY 2 Турецкая лира Турция
TTD 2 Доллар Тринидада и Тобаго Тринидад и Тобаго
TWD 2 Новый тайваньский доллар Тайвань
TZS 2 Танзанийский шиллинг Танзания
UAH 2 Гривна Украина
UGX 0 Угандийский шиллинг Уганда
USD 2 Доллар США Американское Самоа, Бонэйр, Британские территории в Индийском Океане, Эквадор, Сальвадор, Гуам, Маршалловы острова, Микронезия, Северные Марианские острова, Палау, Панама, Пуэрто-Рико, Западный Тимор, Теркс и Кайкос, Внешние малые острова США, Соединенные Штаты Америки, Британские Виргинские Острова, Американские Виргинские Острова
UYI 0 Уругвайское песо в индексированных единицах Уругвай
UYU 2 Уругвайское песо Уругвай
UYW 4 Пенсионная единица (Уругвай) Уругвай
UZS 2 Узбекский сум Узбекистан
VEF 2 Боливар (VES) Венесуэла
VND 0 Донг Вьетнам
VUV 0 Вату Вануату
WST 2 Тала Самоа
XAF 0 Франк КФА BEAC Камерун, Центральноафриканская Руспублика, Чад, Конго, Экваториальная Гвинея, Габон
XCD 2 Восточно-карибский доллар Ангилья, Антигуа и Барбуда, Доминика, Гренада, Монтсеррат, Сент-Китс и Невис, Санта-Люсия, Сент-Винсент и Гренадины
XDR - СДР (специальные права заимствования) Международный монетарный фонд
XOF 0 Франк КФА BCEAO Бенин, Буркина-Фасо, Кот-д'Ивуар, Гвинея-Биссау, Мали, Нигер, Сенегал, Того
XPF 0 Франк КФП Французская Полинезия, Новая Каледония, Уоллис и Футуна
XSU 2 Сукре Единая система региональных взаиморасчетов, общая денежная единица организации АЛБА (Боливарианский альянс для народов нашей Америки)
YER 2 Йеменский риал Йемен
ZAR 2 Рэнд Лесото, Намибия, Южно-Африканская Республика
ZMW 2 Замбийская квача Замбия
ZWL 2 Доллар Зимбабве Зимбабве

Глоссарий

API (Application Programming Interface)

Набор правил, согласно которым программные системы взаимодействуют друг с другом и обмениваются данными. Для проведения платежей с использованием платежной платформы Paytransfer вам доступны следующие API:

  • Gate API — программный интерфейс, с помощью которого вы можете проводить выплату пользователям. В Paytransfer выплата может быть инициирована с использованием Gate и Dashboard.

Dashboard

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

Gate

Компонент платежной платформы Paytransfer, обеспечивающий безопасное и эффективное взаимодействие между вашей системой и платежной платформой. В Paytransfer вы можете использовать Gate для проведения выплаты пользователям вашей системы. Взаимодействие с компонентом Gate осуществляется посредством Gate API.

Ваша система

Сайт, мобильное приложение или другой сервис, где вы предоставляете товары или услуги пользователям.

Оповещение (callback)

Техническое сообщение, которое платежная платформа отправляет на заданный URL-адрес вашей системы, чтобы сообщить определенную информацию, например о результате выполнения операции. Оповещение представляет собой HTTP-POST-запрос определенной структуры, но вы можете настроить структуру, параметры адресации и случаи, в которых отправляются оповещения, в соответствии с вашими потребностями.

Основная валюта

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

Платеж

Комплекс действий по выполнению запроса от вашей системы на перевод денежных средств между вашей системой и пользователем. В настоящий момент в Paytransfer поддерживаются следующие типы платежей:

  • оплата (purchase) — перевод средств от пользователя в вашу систему;
  • выплата (payout) — перевод средств от вашей системы к пользователю.

На стороне вашей системы каждому платежу присваивается свой идентификатор платежа. Убедитесь, что этот идентификатор не повторяется в рамках одного вашего проекта в Paytransfer.

Платежный метод

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

Подпись

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

Пользователь

Лицо, которое оплачивает товары или услуги в вашей системе.

Проект

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

Для каждого проекта вам выдается отдельный идентификатор проекта, который вы должны использовать при взаимодействии с платежной платформой.

Секретный ключ

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

Тип платежного метода

Категория, которая включает в себя один или несколько платежных методов, одинаковых по способу проведения платежей.