Обзор
Общая информация
Платежная платформа 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 необходимо:
-
Решить организационные вопросы, касающиеся взаимодействия с Paytransfer:
- Если у компании нет идентификатора проекта и секретного ключа для взаимодействия с Paytransfer — отправьте заявку на подключение.
- Согласуйте со специалистами технической поддержки Paytransfer порядок и сроки интеграции и запуска в работу.
- Выполнить подготовительные технические работы.
Чтобы проводить оплату:
- Установите и подключите необходимые библиотеки.
- Реализуйте сбор параметров, необходимых для проведения оплаты, а также создания и отправки запросов на открытие страницы оплаты на стороне клиентской части вашей системы.
- Реализуйте подписывание данных и обработку оповещений на серверной стороне вашей системы.
Чтобы проводить выплату:
- Обеспечьте возможности сбора параметров, необходимых для проведения выплаты, а также формирования и отправки запросов на ее инициирование.
- Обеспечьте подписывание данных и корректное реагирование на оповещения на стороне серверной части вашей системы.
- Совместно со специалистами технической поддержки Paytransfer протестировать выполнение целевых действий и запустить техническое решение в работу.
Для начала работы с платежной платформой Paytransfer обращайтесь к курирующему менеджеру Paytransfer, а для решения технических вопросов — к специалистам технической поддержки (support@paytransfer.kz).
Оплата Host-to-Host
Общая информация
Оплата — это тип платежа, в рамках которого на основании исходного запроса осуществляется перевод денежных средств от пользователя в вашу систему.
Оплата Host-to-Host осуществляется через интерфейс Gate, и все взаимодействия с пользователями выполняются в вашей системе.
Далее представлена информация о проведении оплаты Host-to-Host.
Схема проведения
Для проведения оплаты через Gate:
- Отправьте запрос на оплату.
- Примите от платежной платформы оповещение о результате оплаты.
Порядок проведения оплаты — без выполнения дополнительных процедур — представлен далее на схеме.
- Пользователь инициирует оплату в вашей системе.
- Ваша система передает запрос на проведение оплаты на заданный URL Paytransfer.
- Платежная платформа направляет в вашу систему ответ с информацией о получении запроса и его корректности.
- Платежная платформа обрабатывает этот запрос и отправляет в сервис провайдера.
- Сервис провайдера оповещает платежную платформу о результате оплаты.
- Платежная платформа отправляет в вашу систему оповещение (callback) с результатом оплаты.
- Ваша система направляет пользователю информацию о результате оплаты.
Запрос
Общая информация
Чтобы провести оплату, необходимо отправить к платежной платформе запрос — HTTP-сообщение заданной структуры — с использованием метода POST. В каждом запросе к платежной платформе должны передаваться следующие элементы в указанном порядке:
- Стартовая строка с указанием метода передачи запроса (
POST) и конечной точки, протокола и его версии (HTTP/1.1). Доступные конечные точки:- /v2/payment/card/sale — для платежей с использованием банковских карт;
- /v2/payment/mobile/sale — для платежей с использованием мобильной коммерции.
- Заголовок с полем
Host, содержащим доменное имя для запросов к платформе. - Пустая строка, отделяющая служебную информацию от тела сообщения.
- Тело сообщения, содержащее JSON-строку в кодировке UTF-8 с набором данных и подписью к ним.
В дополнение к обязательному полю Host в заголовке можно использовать любые другие поля из числа допустимых в HTTP версии 1.1.
Параметры запроса на оплату
При формировании JSON-строки необходимо использовать следующие объекты и параметры:
| Объект | Параметр | Описание |
|---|---|---|
|
general |
project_id |
Идентификатор проекта, полученный от Paytransfer при интеграции. Пример: |
|
payment_id |
Идентификатор платежа, уникальный в рамках проекта. Пример: |
|
|
signature |
Подпись запроса, составленная после определения всех параметров запроса. Подробнее о составлении подписи см. Подписывание и проверка подписи. | |
|
customer |
id |
Идентификатор пользователя, уникальный в рамках проекта. Пример: |
|
ip_address |
IP-адрес устройства пользователя. Пример: |
|
|
first_name |
Имя пользователя. Пример: |
|
|
last_name |
Фамилия пользователя. Пример: |
|
|
email |
Адрес электронной почты пользователя. Пример: |
|
|
payment |
currency |
Код валюты оплаты в формате ISO-4217 alpha-3. Пример: |
|
amount |
Сумма оплаты в дробных единицах валюты без десятичной точки и пробелов за исключением случаев, когда у валюты нет дробной части. Если у валюты нет дробных единиц (то есть количество разрядов дробных единиц равно нулю), то в этом параметре нужно указывать сумму в основных единицах валюты. Подробнее о разрядах дробных единиц у валют см. Коды валют. Пример: 100,00 USD передается как |
Рис. 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"
}
}
Кроме базового набора объектов и параметров в запросе нужно передавать и другие параметры. Эти параметры указаны в таблице:
| Платежный метод | Список дополнительных параметров |
|---|---|
| Платежные карты |
|
| Мобильная коммерция |
|
Дополнительно в запросе рекомендуется указывать следующие дополнительные параметры:
| Объект | Параметр | Описание |
|---|---|---|
|
return_url |
success |
URL-адрес страницы для перенаправления пользователя в проект в случае проведенной оплаты. Пример: |
|
decline |
URL-адрес страницы для перенаправления пользователя в проект в случае отклонения оплаты. Пример: |
|
|
return |
URL-адрес страницы для перенаправления пользователя в проект со страницы оплаты на стороне внешнего провайдера по нажатии на кнопку возврата на любом шаге проведения платежа. Пример: |
|
|
customer |
middle_name |
Отчество или среднее имя пользователя. Пример: |
Статусы платежа
В процессе оплаты платеж может иметь разные статусы, значение которых описано в следующей таблице:
error |
Проведение платежа не инициировано из-за ошибки, возникшей при проверке принятого запроса. Конечное состояние. Допускается повторное инициирование этого платежа |
processing |
Платеж проводится. Промежуточное состояние |
awaiting redirect result |
Проведение платежа приостановлено до получения уведомления о его результате со стороны платежной системы. В зависимости от этого результата на стороне платежной системы платеж переводится в статус В рамках проведения одного платежа может использоваться Промежуточное состояние |
awaiting clarification |
Проведение платежа приостановлено. Платежная платформа ожидает от вас запрос с недостающей информацией. Если такой запрос не поступит от вас в платежную платформу в течение 30 минут, платеж будет отклонен и переведен в статус Промежуточное состояние |
awaiting customer action |
Проведение платежа приостановлено до выполнения необходимых действий пользователем на стороне платежной системы (в соответствии со спецификой платежного метода). В зависимости от результата этих действий платеж переводится в статус В рамках проведения одного платежа может использоваться Промежуточное состояние |
decline |
Платеж отклонен. Конечное состояние |
success |
Платеж проведен. Конечное состояние |
Дополнительные возможности
Дополнение информации о платеже
Общая информация
Как правило, для проведения платежа достаточно тех данных, которые обязательны для запроса на инициирование этого платежа. Но в отдельных случаях — например, для дополнительной проверки — со стороны платежной системы или провайдера могут запрашиваться дополнительные данные. Для работы с такими ситуациями используется процедура дополнения информации: уведомление о том, что вам необходимо дополнить данные.
Вы можете обеспечить передачу полной информации во всех запросах на инициирование платежей (и уйти от необходимости в дополнении информации) либо настроить реагирование на ситуации с необходимостью дополнения (и поддерживать проведение платежей в таких случаях).
Схема работы
Информация о необходимости дополнить данные отправляется в оповещениях или ответах. Обычно эта информация отправляется в оповещениях — без предварительных запросов со стороны вашей системы, но в то же время ее можно получать в ответах на запросы о статусе платежа.
После получения такого оповещения или ответа, ваша система должна составить и отправить в платформу корректный запрос с недостающей информацией. Если время ожидания истекло и запрос в платформе не принят — платеж автоматически отклоняется.
Состав запрошенных данных в теле запроса может варьироваться: данные можно указывать в полном объеме, частично или не указывать совсем, но в любом случае в теле запроса должен содержаться объект additional_data. При приеме запроса без этого объекта запрос признается некорректным и в вашу систему отправляется ответ с информацией об ошибке.
Как только в платежную платформу поступают все запрашиваемые данные, проведение платежа продолжается дальше.
Для дополнения информации ваша система должна:
- Получить список параметров в объекте
clarification_fieldsв оповещении или ответе. - Отправить POST-запрос, содержащий требуемый набор данных с объектом
additional_dataи подпись, к конечной точке /v2/payment/clarification. - Получить и обработать ответ
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 |
project_id |
Идентификатор проекта, полученный от Paytransfer при интеграции. Пример: |
|
payment_id |
Идентификатор платежа, уникальный в рамках проекта. Пример: |
|
|
signature |
Подпись запроса, составленная после определения всех параметров запроса. Подробнее о составлении подписи см. Подписывание и проверка подписи. | |
|
additional_data |
Объект с запрошенными данными. Пример: |
Справа представлен пример тела запроса с предоставлением индекса и адреса пользователя в качестве дополнительной информации.
Получение информации о состоянии платежа
Обзор
При работе с платежной платформой 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 |
project_id |
Идентификатор проекта, полученный от Paytransfer при интеграции. Пример: |
|
payment_id |
Идентификатор платежа, уникальный в рамках проекта. Пример: |
|
|
signature |
Подпись запроса, составленная после определения всех параметров запроса. Подробнее о составлении подписи см. Подписывание и проверка подписи. |
Примеры ответов
Рис. 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"
}
}
Чтобы инициировать возврат, отправьте запрос к одной из следующих конечных точек:
- /v2/payment/card/refund — для банковских карт;
- /v2/payment/mobile/refund — для мобильной коммерции.
В теле запроса на возврат полной суммы платежа должны использоваться следующие объекты и параметры:
| Объект | Параметр | Описание |
|---|---|---|
|
general |
project_id |
Идентификатор проекта, полученный от Paytransfer при интеграции. Пример: |
|
payment_id |
Идентификатор платежа, уникальный в рамках проекта. Пример: |
|
|
signature |
Подпись запроса, составленная после определения всех параметров запроса. Подробнее о составлении подписи см. Подписывание и проверка подписи. Пример: |
|
|
payment |
description |
Описание причины возврата. Относится только к операции возврата и не меняет описание оплаты, если оно было передано ранее. Пример: |
Чтобы возвратить часть суммы, в объекте payment дополнительно необходимо использовать следующие параметры:
| Объект | Параметр | Описание |
|---|---|---|
|
payment |
currency |
Код валюты платежа в формате ISO-4217 alpha-3. Пример: |
|
amount |
Сумма возврата, не превышающая актуальную сумму платежа, в дробных единицах валюты без десятичного разделителя (точки или запятой) и пробелов за исключением случаев, когда у валюты нет дробной части. Если у валюты нет дробных единиц (то есть количество разрядов дробных единиц равно нулю), то в этом параметре нужно указывать сумму в основных единицах валюты. Подробнее о разрядах дробных единиц у валют см. Коды валют. Пример: |
Статусы платежа
Статус платежа может принимать следующие значения:
success |
Платеж проведен, возврат для платежа не выполнен. Конечное состояние |
reversed |
До закрытия операционного дня для платежа выполнен возврат всей суммы. Конечное состояние |
refunded |
После закрытия операционного дня для платежа выполнен возврат всей суммы. Конечное состояние |
partially refunded |
Для платежа выполнен возврат части суммы. Конечное состояние |
Выплата
Общая информация
Выплата — это тип платежа, в рамках которого на основании исходного запроса осуществляется перевод денежных средств от вашей системы к пользователю.
В платежной платформе поддерживается один вариант для работы с выплатой через Gate — разовая единичная выплата, но дополнительно обеспечивается возможность проведения массовой выплаты через Dashboard (с автоматическим формированием требуемого количества платежей).
Схема проведения
Для проведения выплаты:
- Сформируйте и отправьте в платежную платформу запрос на выплату.
- Примите от платежной платформы оповещение (callback) о результате выплаты.
Схема проведения выплаты представлена далее.
- Пользователь инициирует выплату в вашей системе.
- Ваша система передает запрос на выплату в платежную платформу.
- Платежная платформа отправляет вам ответ с информацией о получении запроса и о результате проверки его корректности.
- Платежная платформа обрабатывает запрос и отправляет его в сервис провайдера.
- Сервис провайдера оповещает платежную платформу о результате выплаты.
- Платежная платформа отправляет вам оповещение с результатом выплаты.
- Ваша система направляет пользователю информацию о результате выплаты.
Как правило, ответ на полученный запрос в любом из описанных случаев отправляется в вашу систему в течение 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). Доступные конечные точки:- /v2/payment/card/payout — для выплаты с использованием банковских карт;
- /v2/payment/mobile/payout — для выплаты с использованием мобильной коммерции.
- Заголовок с полем
Host, содержащим доменное имя для запросов к платформе. - Пустая строка — разделитель, отделяющая служебную информацию от тела запроса.
- Тело запроса в формате JSON, которое должно содержать набор данных запроса и подпись. Допустимы только символы Unicode (UTF-8).
В дополнение к обязательному полю Host в заголовке можно использовать любые другие поля из числа допустимых в HTTP версии 1.1.
При формировании JSON-строки необходимо использовать базовый набор объектов и параметров:
| Объект | Параметр | Описание |
|---|---|---|
|
general |
project_id |
Идентификатор проекта, полученный от Paytransfer при интеграции. Пример: |
|
payment_id |
Идентификатор платежа, уникальный в рамках проекта. Пример: |
|
|
signature |
Подпись запроса, составленная после определения всех параметров запроса. Подробнее о составлении подписи см. Подписывание и проверка подписи. | |
|
customer |
id |
Идентификатор пользователя, уникальный в рамках проекта. Пример: |
|
ip_address |
IP-адрес устройства пользователя. Пример: |
|
|
email |
Адрес электронной почты пользователя. Пример: |
|
|
payment |
currency |
Код валюты выплаты в формате ISO-4217 alpha-3. Пример: |
|
amount |
Сумма выплаты в дробных единицах валюты без десятичной точки и пробелов за исключением случаев, когда у валюты нет дробной части. Если у валюты нет дробных единиц (то есть количество разрядов дробных единиц равно нулю), то в этом параметре нужно указывать сумму в основных единицах валюты. Подробнее о разрядах дробных единиц у валют см. Коды валют. Пример: 100,00 USD передается как |
Кроме базового набора объектов и параметров в запросе нужно передавать и другие параметры. Эти параметры указаны в таблице:
| Платежный метод | Список дополнительных параметров |
|---|---|
| Платежные карты |
|
| Мобильная коммерция |
|
Статусы платежа
При проведении выплаты могут использоваться следующие статусы.
error |
Проведение платежа не инициировано из-за ошибки, возникшей при проверке принятого запроса. Конечное состояние. Допускается повторная отправка запроса с тем же идентификатором платежа и повторная попытка проведения этого платежа |
processing |
Платеж проводится. Промежуточное состояние |
decline |
Платеж отклонен. Конечное состояние |
success |
Платеж проведен. Конечное состояние |
Платежные методы
Платежные карты
Платежные карты (Visa, Mastercard) — это популярный платежный метод, с помощью которого пользователи могут оплачивать в вашей системе различные услуги, а также получать денежные средства.
Точную минимальную и максимальную сумму оплаты и выплаты уточняйте у курирующего менеджера Paytransfer. Уточнить минимальную и максимальную сумму платежа, доступную в вашем проекте, вы также можете в Dashboard. Для этого в Dashboard перейдите в раздел Проекты и выберите вкладку Платежные методы.
Логотип платежного метода доступен для загрузки здесь.
Мобильная коммерция
«Мобильная коммерция» — это популярный платежный метод, с помощью которого пользователи могут оплачивать в вашей системе различные услуги, а также получать денежные средства.
Точную минимальную и максимальную сумму оплаты и выплаты уточняйте у курирующего менеджера Paytransfer. Уточнить минимальную и максимальную сумму платежа, доступную в вашем проекте, вы также можете в Dashboard. Для этого в Dashboard перейдите в раздел Проекты и выберите вкладку Платежные методы.
Логотип платежного метода доступен для загрузки здесь.
Особенности проведения платежей
Нужно помнить про некоторые особенности проведения платежей:
- Доступность возврата необходимо уточнять у курирующего менеджера в Paytransfer.
- При оплате пользователь получает от сервиса оператора связи сообщение с OTP-кодом для подтверждения оплаты.
Пользователь вводит OTP-код в вашей системе, а вы должны отправить этот код в платежную платформу в новом запросе. Более подробную информацию см. в разделе Дополнение информации о платеже. В запросе вы должны передать объект additional_data, представленный в следующей таблице.
| Объекты и параметры | Описание | ||
|---|---|---|---|
|
additional_data |
additional_data |
approval_code |
OTP-код, который пользователь получает в сообщении от оператора связи. Пример: |
Поддержка со стороны операторов связи
Идентификаторы сервисов операторов связи для проведения платежей:
- «Билайн» —
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 |
Запрос не удалось принять в обработку из-за некорректно указанного идентификатора проекта (параметр |
| 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-адрес для приема оповещений задан для вашего проекта.
Обработка оповещений
При обработке оповещений ваша система должна следовать следующим правилам:
- Принимать оповещения только с IP адреса, полученного от службы поддержки Paytransfer.
- На успешно принятые оповещения ответ вашей системы должен быть
HTTP 200 OK. - На оповещения, которые уже ранее были приняты вашей системой, ответ должен быть также
HTTP 200 OK. - На оповещения, принятые с ошибкой, ответ вашей системы должен быть
HTTP 400 Bad Request(например, если вам не удалось преобразовать строку параметров в массив) илиHTTP 500 Internal Server Error(например, если оповещение пришло на неправильный URL-адрес). - Повторные оповещения, которые ранее не были приняты или были приняты с ошибкой, ваша система должна попытаться принять еще раз.
- Ваша система не должна ограничивать время на доставку оповещений, доставка оповещений может происходить с задержкой.
Рис. 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), может отличаться в зависимости от типа операции и конфигурации оповещений. В этом разделе приведены описания параметров, используемых в типовых случаях.
| Параметр | Описание | tree |
|---|---|---|
|
customer |
Объект, содержащий информацию о пользователе, совершающем платеж | 70 |
|
id |
Уникальный идентификатор пользователя в проекте | 70-60 70 |
|
ip_address |
IP-адрес пользователя, переданный в начальном запросе | 70-70 70 |
|
phone |
Телефон пользователя. Целое значение: от 4 до 24 цифр | 70-100 70 |
|
email |
Электронная почта пользователя | 70-120 70 |
|
operation |
Объект, содержащий информацию об операции, по которой отправлено оповещение | 130 |
|
code |
Унифицированный код ответа Gate. Подробнее о кодах ответов см. Статусы операций и коды ответов | 130-10 130 |
|
date |
Дата и время последнего обновления статуса операции в Gate | 130-30 130 |
|
id |
Уникальный идентификатор операции в Gate | 130-50 130 |
|
message |
Унифицированное сообщение Gate. Подробнее см. в Статусы операций и коды ответов | 130-60 130 |
|
status |
Статус проведенной операции. Подробнее о возможных статусах операций см. Статусы операций и коды ответов. | 130-90 130 |
|
sum_converted |
Объект, содержащий валюту платежной системы и сумму операции, переведенной в эту валюту | 130-100 130 |
|
amount |
Сумма операции в дробных единицах валюты платежной системы | 130-100-10 130-100 |
|
currency |
Валюта платежной системы в формате ISO 4217 alpha-3 | 130-100-20 130-100 |
|
sum_initial |
Объект, содержащий сумму и валюту операции, переданные в запросе | 130-110 130 |
|
amount |
Сумма операции, переданная в начальном запросе, в дробных единицах валюты | 130-110-10 130-110 |
|
currency |
Валюта операции в формате ISO 4217 alpha-3, переданная в начальном запросе | 130-110-20 130-110 |
|
type |
Тип проведенной операции | 130-120 130 |
|
payment |
Объект, содержащий данные о платеже | 140 |
|
date |
Дата и время последнего обновления статуса платежа в Gate. Пример: |
140-20 140 |
|
description |
Описание платежа, переданное в начальном запросе | 140-30 140 |
|
id |
Уникальный идентификатор платежа в вашей системе | 140-40 140 |
|
status |
Статус платежа Пример: |
140-90 140 |
|
sum |
Объект, содержащий сумму платежа и валюту, переданную в начальном запросе | 140-100 140 |
|
amount |
Сумма платежа в дробных единицах валюты | 140-100-10 140-100 |
|
currency |
Валюта платежа в формате ISO 4217 alpha-3, переданная в начальном запросе Пример: |
140-100-20 140-100 |
|
type |
Тип проведенного платежа Пример: |
140-120 140 |
|
project_id |
Уникальный идентификатор проекта в Gate | 150 |
|
signature |
Подпись оповещения. Подробнее о проверке подписей оповещений см. | 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. Подробная информация и примеры синхронных ответов об ошибках представлены в разделе Ответ.
В зависимости от статуса и кода ошибки от вас могут потребоваться определенные действия. Возможные статусы операции и запроса и предусмотренные для них дальнейшие действия с вашей стороны приведены в таблице ниже.
| Статус | Примечание | Рекомендуемое действие |
|---|---|---|
success |
Операция выполнена. Дальнейших действий не предусмотрено | Действий не требуется |
|
Операция выполняется | Надо подождать |
decline |
Операция отклонена из-за отказа пользователя, превышения количества запросов, обрыва связи или нехватки денежных средств у пользователя в данный момент времени | Можно повторить запрос немедленно или позже |
| Операция отклонена по причине некорректных данных в запросе. Устранить ошибку можно самостоятельно, скорректировав запрос, или обратиться за помощью в службу технической поддержки | Скорректируйте запрос | |
| Операция отклонена по технической причине. Для устранения необходимо связаться со службой технической поддержки | Свяжитесь со службой технической поддержки | |
| Операция отклонена после ее проверки риск-системой или по иным причинам, которые невозможно устранить. Комментарии по отказу можно узнать у службы технической поддержки | Действий не требуется | |
error |
Выполнение операции не инициировано из-за ошибки, возникшей при проверке принятого запроса | Скорректируйте запрос |
Возможные коды ответов, соответствующие им сообщения, а также рекомендуемые вам дальнейшие действия, если они предусмотрены, приведены в таблицах далее.
| Код | Сообщение | Описание | Действие |
|---|---|---|---|
| 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 | Ожидается окончание обработки запроса | Необходимо подождать |
| Код | Сообщение | Описание | Действие |
|---|---|---|---|
| 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.
Для корректной работы перед отправкой в платформу любого запроса необходимо сформировать подпись и включить ее в состав этого запроса, а при получении от платформы оповещений и ответов, содержащих подпись, следует проверять целостность данных путем сличения расчетных подписей с полученными. Нарушения целостности данных могут быть вызваны разными причинами, но при обнаружении таких нарушений данные не могут и не должны считаться достоверными.
Далее описаны алгоритмы подписывания данных и проверки их целостности, а также представлены примеры выполнения этих алгоритмов.
Подписывание запроса
Описание алгоритма
В качестве входных данных для подписывания выступают:
- Данные запроса, которые требуется подписать.
Как правило, это все параметры тела запроса за исключением подписи или JavaScript-объект configObj с параметрами без включения параметра
signature. - Ключ, используемый для подписывания.
Для отладки и тестирования алгоритма подписывания могут использоваться произвольные ключи. Для рабочих запросов в платформу следует применять только актуальный секретный ключ, полученный от службы поддержки Paytransfer.
Далее в описании и примере представлен часто используемый и наиболее показательный вариант реализации алгоритма: с JavaScript-объектом configObj на входе (без параметра signature) и на выходе (с параметром signature).
- Убедитесь что входные данные удовлетворяют следующим требованиям:
- Структура данных для подписывания соответствует формату JavaScript-объектов.
- В составе данных для подписывания нет параметра
signature(даже с пустым значением). - Известен ключ для подписывания.
- Преобразуйте данные в строку в формате UTF-8 и отсортируйте параметры по алфавиту. В рамках этого шага:
- Логические (булевы) значения кодируются следующим образом:
falseзаменяется на0, аtrue— на1.Но это относится только к булевым значениям: в строковых параметрах, даже если они содержат значения
falseилиtrue, замены на0или1не используются! - Параметры с нулевыми, а также пустыми значениями остаются в строке, например запись
"payment_description":""представляется в видеpayment_description:. Замены пустых значений на пробелы илиnullне применяются. - Кодировка всех строк приводится к формату UTF-8.
- Полученные строки упорядочиваются в алфавитном порядке и объединяются в одну строку с использованием в качестве разделителя точки с запятой (;).
- Логические (булевы) значения кодируются следующим образом:
- Рассчитайте двоичный код HMAC с использованием ключа и функции SHA-512. На этом шаге для полученной строки с параметрами вычисляется HMAC (Hash-based Message Authentication Code; код аутентификации сообщений с использованием хеш-функции) с использованием функции хеширования SHA‑512 (Secure Hash Algorithm; безопасный алгоритм хеширования) и применяемого ключа. И этот HMAC представляется в виде необработанных двоичных данных.
- Закодируйте двоичный код HMAC с применением алгоритма Base64. На этом шаге полученный двоичный код HMAC кодируется с использованием алгоритма Base64. Получаемая при этом строка является подписью к исходным данным.
- Добавьте подпись в данные. На этом шаге к исходным данным для подписывания добавляется параметр
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;
Проверка подписи оповещений
Описание алгоритма
В качестве входных данных для проверки целостности выступают:
- Подписанные данные, которые требуется проверить. Как правило, это тело оповещения или ответа в формате JSON с параметром
signatureв его составе. - Ключ, используемый для проверки. Это должен быть ровно тот же ключ, который был использован для подписывания проверяемых данных.
В качестве выходных данных при проверке целостности в зависимости от реализации алгоритма могут выступать расчетная подпись и информация о ее совпадении с проверяемой подписью, то есть информация о целостности проверяемых данных.
Далее в описании и примере представлен часто используемый и наиболее показательный вариант реализации алгоритма: с телом проверяемого сообщения (оповещения или ответа) в формате JSON на входе и с заключением о целостности этого сообщения на выходе.
В состав алгоритма в этом случае включаются следующие шаги:
- Проверка входных данных на соблюдение заданных требований:
- Структура проверяемых данных должна соответствовать формату JSON.
- В составе проверяемых данных должен присутствовать параметр
signatureс подписью. - Должен быть задан проверочный ключ.
- Извлечение подписи из проверяемых данных На этом шаге из проверяемых данных исключается параметр
signature, а его значение фиксируется для последующего сличения с расчетной подписью. - Расчет подписи для проверяемых данных:
- Преобразование данных в строку UTF-8 с сортировкой параметров по алфавиту В рамках этого шага выполняются следующие действия:
- Логические (булевы) значения кодируются следующим образом:
falseзаменяется на0, аtrue— на1. Но это относится только к булевым значениям: в строковых параметрах, даже если они содержат значенияfalseилиtrue, замены на0или1не используются! - Каждый параметр преобразуется в строку, содержащую полный путь к параметру, название параметра и его значение:
<родительскийузел_1>:...:<родительскийузелN>:<названиепараметра>:<значение_параметра>, где родительские узлы — это названия объектов и (или) массивов, в состав которых включена пара «название параметра — значение параметра». Родительские узлы располагаются в порядке их вложения, начиная с самого верхнего уровня. В качестве разделителя при этом используется двоеточие (:), между парами «название параметра — значение параметра» удаляются запятые, а у строковых значений параметров удаляются обрамляющие кавычки. - Параметры с нулевыми, а также пустыми значениями остаются в строке, например запись
"payment_description":""представляется в видеpayment_description:. Замены пустых значений на пробелы илиnullне применяются. - Элементы массивов записываются отдельными строками, с указанием номера каждого элемента, начиная с нуля. Например, массив
["alpha", "beta", "gamma"]представляется в виде трех строк:0:alpha,1:betaи2:gamma. - Пустые массивы полностью игнорируются и не включаются в набор строк для создания подписи.
- Кодировка всех строк приводится к формату UTF-8.
- Полученные строки упорядочиваются в алфавитном порядке и объединяются в одну строку с использованием в качестве разделителя точки с запятой (;).
- Логические (булевы) значения кодируются следующим образом:
- Получение двоичного кода HMAC с использованием ключа и функции SHA‑512. На этом шаге для полученной строки с параметрами вычисляется HMAC (Hash-based Message Authentication Code; код аутентификации сообщений с использованием хеш-функции) с использованием функции хеширования SHA‑512 (Secure Hash Algorithm; безопасный алгоритм хеширования) и применяемого ключа. И этот HMAC представляется в виде необработанных двоичных данных.
- Кодирование двоичного кода HMAC с применением алгоритма Base64. На этом шаге полученный двоичный код HMAC кодируется с использованием алгоритма Base64. Получаемая при этом строка является подписью к исходным данным.
- Преобразование данных в строку UTF-8 с сортировкой параметров по алфавиту В рамках этого шага выполняются следующие действия:
- Сопоставление подписей. На этом шаге расчетная подпись сопоставляется с проверяемой. Если подписи совпадают, данные признаются целостными и достоверными. При несовпадении подписей данные не могут считаться достоверными и не должны использоваться в качестве рабочих.
Пример для оповещения
Допустим, что надо проверить подпись оповещения при следующих условиях:
Рис. 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==- Удалите из тела оповещения параметр
signatureвместе с его значением. - Преобразуйте оставшиеся параметры в строки UTF-8 согласно алгоритму.
- Упорядочите полученные строки по алфавиту.
- Объедините упорядоченные строки в одну строку с использованием в качестве разделителя точки с запятой.
- Вычислите HMAC полученной строки с использованием функции хеширования SHA-512 и ключа подписывания, после чего закодируйте двоичный HMAC-код с применением алгоритма Base64.
- Сравните полученную подпись с проверяемой.
В данном случае подписи не совпадают, а это значит, что такое оповещение недостоверно или ошибочно и должно быть отброшено.
// Пример проверки подписи. 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.
Не нашли ответ на интересующий вас вопрос? Обратитесь к нашим специалистам:
- к курирующему менеджеру — с деловыми и финансовыми вопросами (о стоимости услуг, расчете комиссий, работе с балансами и т. д.);
- к менеджеру по имплементации — с техническими вопросами (о работе с разными интерфейсами, составлении запросов, настройке оповещений и т. д). Коммуникация с менеджером по имплементации ведется в техническом чате. Если чат ранее не был создан, пожалуйста, обратитесь к своему курирующему менеджеру, чтобы его создать.
Часто задаваемые вопросы
Дробные единицы валюты — разменные единицы валюты, указываемые в суммах после основной единицы валюты и десятичного разделителя. Например, у суммы 155,00 USD часть 155 — основная, а 00 после запятой — дробная. Чаще всего дробные единицы валюты составляют 1/100 основной единицы валюты, но встречаются валюты, где дробные единицы составляют 1/1000 основной единицы валюты или же где у валюты совсем нет дробной части.
В запросах вы всегда должны передавать сумму платежа в дробных единицах валюты без десятичного разделителя и пробелов за исключением случаев, когда у валюты нет дробной части. Так, сумма платежа 10,00 USD в запросе должна передаваться как 1000.
Если у валюты нет дробных единиц (то есть количество разрядов дробных единиц после десятичной точки или запятой равно нулю), то в запросе нужно указывать сумму в основных единицах валюты. Например, у вьетнамских донгов не существует дробной части и, следовательно, сумма 10 VND в запросе должна передаваться как 10.
Чтобы проверить количество дробных единиц у валют, смотрите таблицу в разделе Коды валют.
- ваша система ожидает оповещения с URL-адреса, который вы получили от команды Paytransfer при интеграции;
- URL-адрес корректно настроен на прием HTTP-запросов от платежной платформы: IP-адреса Paytransfer добавлены в список разрешенных, а сообщения не блокируются брандмауэром или другими сетевыми устройствами;
- в запросе на проведение платежа не передавался параметр callback.force_disable со значением
1, которое запрещает платежной платформе отправлять оповещения по этому платежу.
Вы можете проверить статус платежа или операции в интерфейсе Dashboard. Для этого откройте раздел с платежами и найдите строку с интересующим вас платежом. Вы также можете посмотреть детальную информацию по платежу в его карточке, щелкнув строку с платежом. Проверяя информацию по платежам в Dashboard, учитывайте то, что данные в интерфейсе могут отображаться с задержкой в несколько минут.
Вы также можете проверить статус платежа или операции в оповещениях от платежной платформы Paytransfer. Статусы, которые вы можете увидеть в оповещении от платежной платформы, перечислены в разделе Статусы операций и коды ответов.
- В синхронном ответе на запрос, если была обнаружена ошибка при первичной обработке запроса. Подробная информация о таких ошибках представлена в разделе Ответ.
- В полученном промежуточном или итоговом оповещении (callback) — через код ответа и сообщение, которые могут быть представлены:
- в массиве
errors, если операция была отклонена на стороне платежной платформы, например, если операция не прошла проверку на соответствие установленным бизнес-правилам; - в параметрах
operation.codeиoperation.message, если операция была отклонена на стороне провайдера или платежной системы.
- в массиве
- В карточке платежа в интерфейсе 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.
Подробнее о переводе сумм в дробные единицы валюты см. Использование дробных единиц валюты.
| Код | Количество дробных единиц | Валюта | Страны |
|---|---|---|---|
| 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:
Dashboard
Пользовательский интерфейс, с помощью которого вы можете просматривать и анализировать информацию по проведенным платежам, инициировать оплату, возврат и выплату, контролировать и предотвращать попытки мошенничества и выполнять иные действия.
Gate
Компонент платежной платформы Paytransfer, обеспечивающий безопасное и эффективное взаимодействие между вашей системой и платежной платформой. В Paytransfer вы можете использовать Gate для проведения выплаты пользователям вашей системы. Взаимодействие с компонентом Gate осуществляется посредством Gate API.
Ваша система
Сайт, мобильное приложение или другой сервис, где вы предоставляете товары или услуги пользователям.
Оповещение (callback)
Техническое сообщение, которое платежная платформа отправляет на заданный URL-адрес вашей системы, чтобы сообщить определенную информацию, например о результате выполнения операции. Оповещение представляет собой HTTP-POST-запрос определенной структуры, но вы можете настроить структуру, параметры адресации и случаи, в которых отправляются оповещения, в соответствии с вашими потребностями.
Основная валюта
Валюта, заданная в качестве основной для платежного метода, настроенного в вашем проекте. В этой валюте будет обработана операция, если в запросе на проведение платежа вы передадите валюту, отличную от валюты, допустимой для платежного метода.
Платеж
Комплекс действий по выполнению запроса от вашей системы на перевод денежных средств между вашей системой и пользователем. В настоящий момент в Paytransfer поддерживаются следующие типы платежей:
- оплата (purchase) — перевод средств от пользователя в вашу систему;
- выплата (payout) — перевод средств от вашей системы к пользователю.
На стороне вашей системы каждому платежу присваивается свой идентификатор платежа. Убедитесь, что этот идентификатор не повторяется в рамках одного вашего проекта в Paytransfer.
Платежный метод
Способ, который выбирает пользователь для совершения платежа. Платежные методы могут относиться к разным типам и регионам, поддерживать определенные валюты и типы платежей, а также иметь различные пользовательские сценарии, особенности и ограничения.
Подпись
Строка данных, полученная заданным способом из набора подписываемых данных и секретного ключа. Подпись используется для обеспечения подлинности и целостности данных, передаваемых в технических запросах и оповещениях между вашей системой и Paytransfer. Подробнее о формировании подписи, см. раздел Подписывание и проверка подписи.
Пользователь
Лицо, которое оплачивает товары или услуги в вашей системе.
Проект
Сущность, созданная внутри платежной платформы и закрепленная за вашей системой. В Paytransfer у каждого проекта есть свой набор параметров, влияющих на проведение платежей и порядок взаимодействия платежной платформы с вашей системой (в частности, при работе с оповещениями).
Для каждого проекта вам выдается отдельный идентификатор проекта, который вы должны использовать при взаимодействии с платежной платформой.
Секретный ключ
Ключ симметричного шифрования данных. Секретный ключ уникален для каждого проекта и используется для формирования и проверки корректности цифровой подписи.
Тип платежного метода
Категория, которая включает в себя один или несколько платежных методов, одинаковых по способу проведения платежей.