API для эквайринга
Общие принципы
Настройки у клиента
У клиента в настройках CRM для API-эквайринга указываются следующие параметры:
- Идентификатор продавца (MerchantID), являющегося клиентом и эквайера, и CRM
- URL для регистрации счёта (на стороне эквайера)
- Секретный ключ
- Булев признак использования онлайн-кассы
- Параметры чека для ОФД
Идентификатор продавца - строка с макс. длиной 36 символов. Выдаётся эквайером.
Секретный ключ - строка с длиной 8-64 символа. Допустимы только символы ASCII, исключая пробел. Формируется пользователем и сохраняется на обеих сторонах, либо формируется эквайером.
Схема взаимодействия CRM и эквайера
Платёж производится одностадийным способом:
- Клиент инициирует оплату счёта в CRM (нажимает кнопку "Оплатить")
- CRM отправляет запрос к эквайеру на URL для регистрации счёта,
предоставляя параметры счёта, а также CallbackUrl и ReturnUrl - Эквайер возвращает URL для оплаты и OrderId (идентификатор транзакции эквайера)
- CRM перенаправляет браузер клиента на URL для оплаты
- По мере выполнения оплаты эквайер уведомляет CRM о статусах платежа посредством вызовов CallbackUrl
(как минимум один раз: при успешном или неуспешном завершении процесса оплаты) - Эквайер перенаправляет браузер клиента на ReturnUrl
Формат запросов
При вызове URL для регистрации счёта CRM использует HTTP-метод POST в формате JSON и Content-Type равным application/json; charset="utf-8".
При получении входящих запросов от эквайера на CallbackUrl CRM так же ожидает метод POST. Допустимые форматы: JSON или application/x-www-form-urlencoded.
Аутентификация
Выполняется на основе уникального в рамках эквайера MerchantID.
Безопасность
При вызове URL для регистрации счёта CRM добавляет в запрос электронную подпись. При получении запросов на CallbackUrl CRM так же ожидает от эквайера аналогичную подпись.
Подпись представляет собой HTTP-заголовок "Content-Signature", равный Base64(HMAC-SHA256(Body, ASCII(Key))),
т.е. формируется следующим образом:
- Берётся полное содержимое тела POST-запроса
- Вычисляется подпись HMAC-SHA256, где в качестве ключа выступают ASCII-коды символов строки секретного ключа
- Полученная бинарная подпись преобразуется в Base64-строку
- В запрос добавляется HTTP-заголовок "Content-Signature" с полученной строкой в качестве значения
При несовпадении подписи при вызове CallbackUrl вернёт соответствующую ошибку.
Секретный ключ по сети не передаётся.
Также для избежания повторной обработки запроса на регистрацию счёта CRM формирует и передаёт в качестве параметра ключ идемпотентности.
Функции
Регистрация счёта (CRM->эквайер)
Вызывается при нажатии пользователем кнопки "Оплатить" в CRM.
Список параметров:
| Наименование | Формат | Обяз-ый | Описание |
| idempotenceKey | Строка <= 32 симв. |
+ | Ключ идемпотентности. |
| merchantId | Строка <= 36 симв. |
+ | Идентификатор продавца. |
| amount | Число | + | Общая сумма. |
| currency | Число | + | Код валюты по ISO 4217 (рос. рубль = 643). |
| language | Строка 2 симв. |
+ | Желательный язык интерфейса при оплате, исходя из текущего языка клиента в CRM. Возможные значения: "ru", "en". |
| invoiceNumber | Строка < 40 симв. |
+ | Идентификатор платежа в CRM. |
| clientName | Строка | + | Имя клиента (Фамилия И.О.) |
| clientEmail | Строка | -/+ | E-mail клиента. Обязательный только в случае использования онлайн-кассы, в противном случае может отсутствовать. |
| clientPhone | Строка | - | Номер мобильного телефона клиента |
| description | Строка | + | Общее описание платежа |
| receipt | Объект | -/+ | Параметры чека для ОФД. Обязательный только в случае использования онлайн-кассы, в противном случае отсутствует. |
| callbackUrl | Строка | + | URL для обратного вызова от эквайера к CRM для информирования CRM о статусах платежа в процессе оплаты. |
| returnUrl | Строка | + | URL для возврата на сайт продавца (т.е. в CRM). |
Объект Receipt
| Наименование | Формат | Обяз-ый | Описание |
| taxCode | Строка | + | Идентификатор системы налогообложения. |
| Строка | + | E-mail клиента для отправки чека. | |
| items | Массив объектов | + | Товарные позиции в чеке (на данный момент всегда одна). |
Объект массива items (позиция в чеке)
| Наименование | Формат | Обяз-ый | Описание |
| name | Строка | + | Наименовании позиции. |
| amount | Число | + | Сумма. |
| quantity | Число | + | Количество (на данный момент всегда 1). |
| vatCode | Число | + | Идентификатор ставки НДС. |
| paymentSubject | Строка | - | Признак предмета расчёта (может отсутствовать для эквайринга вне РФ). |
| paymentMode | Строка | - | Признак способа расчета (может отсутствовать для эквайринга вне РФ). |
Идентификаторы системы налогообложения (taxCode)
| Osn | Общая система налогообложения |
| UsnIncome | Упрощенная (УСН, доходы) |
| UsnIncomeOutcome | Упрощенная (УСН, доходы минус расходы) |
| Envd | Единый налог на вмененный доход (ЕНВД) |
| Esn | Единый сельскохозяйственный налог (ЕСН) |
| Patent | Патентная система налогообложения |
Идентификаторы ставки НДС (vatCode)
Сюда включены возможные ставки не только РФ, но и Республики Казахстан.
| -1 | Без НДС |
| 0 | НДС по ставке 0% |
| 5 | НДС по ставке 5% |
| 7 | НДС по ставке 7% |
| 10 | НДС по ставке 10% |
| 12 | НДС по ставке 12% |
| 18 | НДС по ставке 18% |
| 20 | НДС по ставке 20% |
| 22 | НДС по ставке 22% |
| 105 | НДС по расчетной ставке 5/105 |
| 107 | НДС по расчетной ставке 7/107 |
| 110 | НДС по расчетной ставке 10/110 |
| 112 | НДС по расчетной ставке 12/112 |
| 118 | НДС по расчетной ставке 18/118 |
| 120 | НДС по расчетной ставке 20/120 |
| 122 | НДС по расчетной ставке 22/122 |
Признаки предмета расчёта (paymentSubject)
| Service | Услуга |
| Commodity | Товар |
| Job | Работа |
| IntellectualActivity | Результаты интеллектуальной деятельности |
| Payment | Платеж |
| AgentCommission | Агентское вознаграждение |
| Composite | Составной предмет расчета |
| Another | Другое |
Признаки способа расчета (paymentMode)
| FullPrepayment | Полная предоплата |
| PartialPrepayment | Частичная предоплата |
| Advance | Аванс |
| FullPayment | Полный расчет |
| PartialPayment | Частичный расчет и кредит |
Пример запроса
{
"idempotenceKey": "e0a51c144a1e43e2b43555938f36c56b", // Ключ идемпотентности
"merchantId": "123", // Идентификатор продавца
"amount": 123.45, // Общая сумма
"currency": 643, // Код валюты по ISO 4217
"language": "ru", // Желательный язык интерфейса при оплате
"invoiceNumber": "3628", // Идентификатор платежа в CRM
"clientName": "Иванов И.И.", // Имя клиента
"clientEmail": "some@mail.com", // E-mail клиента
"clientPhone": "79251234567", // Номер мобильного телефона клиента
"description": "Оплата за курс английского языка", // Общее описание платежа
"receipt": { // Параметры чека для ОФД
"taxCode": "UsnIncome", // Идентификатор системы налогообложения
"email": "some@mail.com", // E-mail клиента для отправки чека
"items": [{ // Товарные позиции в чеке
"name": "Оплата за курс английского языка", // Наименовании позиции
"amount": 123.45, // Сумма
"quantity": 1, // Количество
"vatCode": 22, // Идентификатор ставки НДС
"paymentSubject": "Service", // Признак предмета расчёта
"paymentMode": "FullPrepayment" // Признак способа расчета
}]
},
"callbackUrl": "https://demo.t8s.ru/Acquire/ApiCallback", // URL для обратных вызовов
"returnUrl": "https://demo.t8s.ru/Acquire/ApiComplete" // URL для возврата на сайт продавца
}
Возвращаемые данные должны быть представлены в виде JSON.
В случае успеха функция должна возвращать объект с двумя обязательными полями:
- OrderId: идентификатор транзакции эквайера
- PayUrl: URL страницы оплаты
В случае ошибки функция должна возвращать текст ошибки в поле «Error». Этот текст может быть отображён для пользователя CRM.
Если возвращаемый код состояния HTTP свидетельствует об ошибке, так же будет отображён соответствующий ему текст ошибки, но текст в поле «Error» имеет больший приоритет.
Обратный вызов (CallbackUrl, эквайер->CRM)
Вызывается эквайером при изменении статуса платежа при оплате.
Обязательным является только вызов при статусе "succeeded" или ошибке/отказе.
Статусы "pending ,"authorized" и "confirmation", являющиеся переходными в процессе оплаты, на данный момент игнорируются, но сохраняются в логах CRM.
Список параметров:
| Наименование | Формат | Обяз-ый | Описание |
| orderId | Строка | + | Идентификатор транзакции эквайера. |
| status | Строка | + | Текущий статус платежа. |
| issuer | Строка | - | Название банка-эмитента. |
| method | Строка | - | Способ оплаты (например, "BankCard"). |
| instrument | Строка | - | Платёжный инструмент (например, номер карты: "410000XXXXXX0000"). |
Статусы платежа (status)
| Pending | В обработке |
| Authorized | Авторизован |
| Confirmation | На подтверждении |
| Succeeded | Успешно завершён |
| ... | Любой другой статус (например "Rejected" или "Отклонён") является статусом ошибки и будет отображён пользователю |
В случае ошибки функция возвращает поле: "Error" с кодом состояния HTTP 500.