<_0_full_md>
**Тема:** Регистрация сертификата на [тестовом/промышленном] стенде СБП C2B
>
> **Тело:**
> Просим зарегистрировать сертификат для работы с СБП C2B.
> * **Тип регистрации:** Впервые / Повторно (взамен истёкшего alias...)
> * **Организация:** [Название]
> * **ИНН:** [Номер]
> * **Вложение:** client.crt (в архиве без пароля)
### 2.3. Что вы получите от банка
После регистрации банк предоставит:
1. **Alias** — имя вашего сертификата (передается в заголовке `key-name`).
2. **Клиентский сертификат RSA/TLS** — для поднятия MTLS-соединения.
3. **Корневые сертификаты банка** — для проверки серверного сертификата.
4. **TermNo** — тестовый номер терминала.
5. **Эндпойнт** — для промышленной среды.
---
## 3. Техническая реализация запроса
### 3.1. Формирование заголовков (Headers)
При каждом запросе необходимо передавать следующие заголовки:
| Заголовок | Значение |
| :--- | :--- |
| `Content-Type` | `application/x-www-form-urlencoded` |
| `Authorization` | Base64-строка зашифрованного хеша (см. ниже) |
| `key-name` | Ваш **Alias**, полученный от банка |
### 3.2. Подпись сообщения (Security)
Процесс формирования заголовка `Authorization`:
1. **Подготовка данных:** Сформируйте JSON-тело запроса. Исключите все пробелы, табуляции и переносы строк между ключами и значениями.
2. **Вычисление хеша и подпись:**
```bash
# Расчет SHA256 и подпись приватным ключом
openssl dgst -sha256 -sign client.key -out signature.txt block.txt
```
3. **Кодирование в Base64:**
```bash
# Получение строки для заголовка Authorization
base64 signature.txt > signature64.txt
```
---
## 4. Тестирование
### 4.1. Эндпойнт тестовой среды
`https://217.12.103.132:2443/fsCryptoProxy`
### 4.2. Пример запроса (GetQRCd)
**Body:**
```json
{
"command":"GetQRCd",
"TermNo":"90080567",
"qrcType":"01",
"amount":"100",
"currency":"RUB",
"paymentPurpose":"Назначение платежа"
}
```
> **Важно по полю `paymentPurpose`:**
> * Макс. длина: 140 символов.
> * Допустимы: Латиница, Кириллица (кроме Ё/ё), цифры и спецсимволы.
> * Перенос строки передается как `\\n` (двойной слэш для JSON).
### 4.3. Как провести тестовую оплату
1. Сгенерируйте QR-код через API.
2. Откройте на смартфоне: [testpay.alfabank.ru/sbp-page](https://testpay.alfabank.ru/sbp-page).
3. Нажмите **"Сканировать QR"** и наведите камеру на код.
4. Нажмите **"Произвести оплату"**. Выбор банка не требуется.
---
## 5. Статусы и уведомления
### Получение статуса платежа
Существует два способа:
1. **Запрос `GetQRCstatus`:** Опрос шлюза клиентом.
2. **Callback-уведомления:** ПШ банка отправляет POST-запрос на ваш сервер.
### Настройка Callback
* Сервер ТСП должен быть публичным (HTTPS, порт 443).
* IP-адреса банка для белого списка: `217.12.97.124`, `217.12.101.32`.
* Для включения отправьте URL обработчика на [acquiring@alfabank.ru](mailto:acquiring@alfabank.ru).
### Лимиты на тестовой среде (`GetQRCstatus`)
* **Лимит ТСП:** не более 4 запросов в минуту.
* **Общий лимит НСПК:** 60 запросов в минуту на весь банк.
* При превышении возвращается ошибка `429 Too Many Requests`.
---
## 6. Переход в промышленную среду (Production)
Для выхода в "бой" необходимо:
1. Заключить договор по СБП с Альфа-Банком.
2. Сгенерировать новую ключевую пару для промышленной среды.
3. Направить письмо на регистрацию (аналогично тестовой, но с пометкой "промышленный стенд").
4. Срок предоставления доступов — **до 3 рабочих дней**.
## Общие положения
### Техническая документация СБП: Общие положения
Данный документ описывает принципы взаимодействия, идентификации и основные бизнес-сценарии при работе с Системой Быстрых Платежей (СБП) через хост Альфа-Банка.
---
## 1. Каналы взаимодействия и безопасность
Взаимодействие осуществляется по протоколу **HTTP(S)** с обязательной двусторонней аутентификацией.
### Требования к сертификатам
* **Тип:** Клиентские сертификаты RSA/TLS.
* **Управление:** Порядок выпуска и установки определяется Удостоверяющим Центром Заказчика.
* **Именование (Alias):** На прокси-сервере Заказчика должны соблюдаться строгие правила именования:
| Параметр | Требование к имени (алиасу) |
| :--- | :--- |
| **Обычный запрос** | Должно соответствовать коду терминала и реквизиту заголовка `key-name`. |
| **Проверка соединения** | Должно быть равно параметру `TermNo` в теле запроса и заголовку `key-name`. |
---
## 2. Идентификация Виртуального терминала
Для работы в системе каждому терминалу присваивается уникальный идентификатор — **TermNo**.
* **Назначение:** Определение конкретного виртуального терминала, кассы или системы.
* **Привязка:** TermNo определяет принадлежность к Юридическому лицу (ЮЛ), конкретной точке продаж (ТСП) и расчетному счету, на который будут поступать средства.
* **Лимиты:** Минимум 1 терминал на адрес ТСП, максимум — по запросу.
* **Применение:**
* Сохраняется в настройках терминала.
* Используется на прикладном уровне протокола совместно с сертификатом.
* **Обязателен** для генерации динамических QR-кодов и проверки статуса оплаты.
---
## 3. Общий порядок работы
### 3.1. Оплата покупки (C2B)
Процесс проведения оплаты через динамический QR-код:
1. **Инициация:** Кассир вводит сумму (валюта и назначение платежа обычно подставляются автоматически).
2. **Запрос QR:** ТСП запрашивает динамический QR-код у Банка.
3. **Отображение:** ТСП выводит QR на экран или печатает пре-чек.
4. **Действия клиента:**
* Сканирует QR через банковское приложение.
* Подтверждает оплату.
5. **Проверка:** ТСП запрашивает подтверждение статуса платежа.
6. **Фискализация:** При получении статуса «Оплачено» ТСП печатает чек.
**Обязательные реквизиты в чеке оплаты:**
* `qrcId` (Идентификатор QR-кода)
* Код транзакции СБП
* Дата и время операции
---
### 3.2. Возврат покупки
Возврат средств имеет ряд технологических особенностей.
> [!IMPORTANT]
> **Ограничения возврата:**
> * Возможен только при наличии чека и кода транзакции СБП.
> * Осуществляется только по номеру телефона плательщика.
> * Средства возвращаются только в тот же Банк-участник СБП, с которого была оплата.
**Параметры для инициации возврата:**
* Сумма (полная или частичная) и валюта.
* Данные из чека: `qrcId`, Код транзакции, Дата оплаты.
**Процесс подтверждения:**
1. Хост Банка проверяет наличие исходной операции.
2. Кассир проходит аутентификацию (ввод одноразового кода SMS/Push или иная проверка полномочий).
3. ТСП отправляет финальный запрос на возврат.
**Реквизиты в чеке возврата:**
* Код транзакции `payrrn`
* Сумма возврата
---
## 4. Работа с кассовыми ссылками
Кассовая ссылка — это многоразовый QR-код, который активируется под конкретную покупку.
### Жизненный цикл ссылки
1. **Регистрация:** ТСП через Агента регистрирует ссылку в ОПКЦ СБП. QR-код размещается в кассовой зоне.
2. **Активация:** В момент покупки ТСП отправляет запрос на активацию ссылки, передавая `сумму`, `валюту` и `назначение платежа`.
* *Совет:* Для получения уведомлений передавайте адрес `callback-url`.
3. **Оплата:** Клиент считывает статическую ссылку, которая после активации ведет на оплату конкретного счета.
4. **Деактивация:** Если оплата не состоялась, ТСП отправляет запрос на деактивацию.
5. **Изменение счета:** ТСП может изменить расчетный счет, привязанный к ссылке, через запрос к Агенту ТСП (автоматические уведомления об изменении не поддерживаются).
---
## 5. Привязка счета и рекуррентные платежи
Сценарии для реализации оплат «в один клик» или подписок.
### Сценарии регистрации привязки
| Тип сценария | Описание |
| :--- | :--- |
| **Чистая привязка** | Регистрация QR-кода типа `03`. Клиент сканирует код только для привязки счета без оплаты. |
| **Оплата + Привязка** | При регистрации обычного QR на оплату передается параметр `subscriptionPurpose`. После оплаты банк предлагает клиенту привязать счет. |
### Оплата по инициативе ТСП (Списание без участия клиента)
1. ТСП регистрирует QR для оплаты с привязанного счета.
2. ТСП направляет запрос на оплату в НСПК.
3. НСПК запрашивает подтверждение у Банка Плательщика.
4. При положительном ответе инициируется C2B операция, и Агент ТСП получает уведомление о финальном статусе.
---
## Справочник параметров (Сниппеты данных)
При формировании запросов используйте следующие ключевые поля:
```json
// Пример ключевых полей для активации кассовой ссылки / оплаты
{
"TermNo": "12345678", // Номер терминала
"amount": 10000, // Сумма в копейках/единицах
"currency": "RUB", // Валюта
"qrcId": "AD100000...", // ID QR-кода
"payrrn": "3021...", // Код транзакции (для возвратов)
"callbackUrl": "https://..." // Адрес для уведомлений
}
```
# Статический QR-код (СБП)
Статический QR-код — это инструмент безналичной оплаты через Систему быстрых платежей (СБП), являющийся альтернативой эквайрингу. Изображение QR-кода остается неизменным, его можно распечатать и разместить в кассовой зоне.
### Особенности
* **Варианты реализации:**
* С открытой суммой (вводит покупатель).
* С фиксированной суммой (задает продавец при генерации).
* **Способы оплаты:** Сканирование камерой смартфона или использование NFC-метки.
* **Скорость:** Средства поступают на счет продавца мгновенно.
* **Оборудование:** Терминал не требуется.
---
## 1. Регистрация статического QR-кода
Метод `GetQRCd` используется для формирования платежной ссылки и получения изображения QR-кода.
### Параметры запроса
| Параметр | Тип данных | Обяз. | Назначение |
| :--- | :--- | :---: | :--- |
| `command` | String | Y | Константа `GetQRCd`. |
| `TermNo` | String(20) | Y | Уникальный идентификатор терминала. |
| `qrcType` | String(2) | Y | Тип QR-кода. Для статического — `01`. |
| `amount` | Number | O | Сумма в копейках. Если не указана — сумма открытая. |
| `currency` | String(3) | O | Код валюты (например, `RUB`). |
| `paymentPurpose` | String(140) | O | Назначение платежа. |
| `width` / `height` | String | O | Размеры изображения QR-кода в пикселях. |
| `redirectUrl` | String(1024)| O | Ссылка для возврата клиента в приложение/на сайт ТСП. |
| `messageID` | String(1024)| O | Уникальный ID сообщения (GUID). Только латиница. |
| `queryData.notificationUrl` | String(512) | O | URL для получения уведомления о статусе оплаты. |
### Пример запроса
```json
{
"command": "GetQRCd",
"TermNo": "90080567",
"qrcType": "01",
"width": "600",
"height": "600",
"amount": 10000,
"currency": "RUB",
"paymentPurpose": "Оплата заказа №123",
"messageID": "550e8400-e29b-41d4-a716-446655440000",
"queryData": {
"notificationUrl": "https://yourserver.com/sbp/notify"
},
"redirectUrl": "https://yourshop.ru/success"
}
```
### Параметры ответа
| Параметр | Тип данных | Назначение |
| :--- | :--- | :--- |
| `ErrorCode` | String | Код ответа (0 — успех). |
| `image` | String | Изображение QR-кода в формате BASE64. |
| `payload` | String | Платежная ссылка (содержимое QR-кода). |
| `qrcId` | String | Уникальный идентификатор QR-кода. |
| `status` | String | Статус регистрации ссылки (например, `CREATED`). |
---
## 2. Нотификация о статусе оплаты
После успешной оплаты Банк отправляет POST-запрос на `notificationUrl`, указанный при регистрации.
### Параметры уведомления
| Параметр | Тип данных | Назначение |
| :--- | :--- | :--- |
| `qrcId` | String | Идентификатор QR-кода. |
| `trxId` | String | Уникальный ID платежа в НСПК. |
| `status` | String | `ACWP` — успех, `RJCT` — отклонено. |
| `amount` | Number | Сумма платежа в копейках. |
| `timestamp` | String | Время операции по Гринвичу (GMT). |
| `payerId` | String | Маскированный номер телефона плательщика. |
### Пример уведомления
```json
{
"command": "qrc/notification",
"qrcId": "AS10000NJTDV88TN82CRT8CG1AU690OF",
"trxId": "A31040920067662400000550448AD7B3",
"status": "ACWP",
"amount": 10000,
"timestamp": "2023-04-14T09:20:06.000Z",
"payrrn": "000051992395",
"TermNo": "90080567"
}
```
*ТСП должно ответить HTTP-кодом `200 OK`.*
---
## 3. Проведение возврата
Возврат средств выполняется в два этапа.
### 3.1. Проверка возможности возврата (`GetQRCreversalData`)
Используется для получения данных о плательщике и проверки доступности операции.
**Запрос:**
| Параметр | Обяз. | Описание |
| :--- | :---: | :--- |
| `qrcId` | Y | ID QR-кода из оригинального платежа. |
| `trxId` | Y | ID транзакции НСПК. |
| `amount` | O | Сумма возврата. Если пусто — полный возврат. |
**Пример ответа:**
```json
{
"ErrorCode": 0,
"payerBnkName": "Альфа-Банк",
"payerId": "*1779",
"trxDT": "20230414062006",
"message": "OK"
}
```
### 3.2. Выполнение возврата (`QRCreversal`)
Непосредственная инициация перевода средств клиенту.
**Запрос:**
| Параметр | Обяз. | Описание |
| :--- | :---: | :--- |
| `messageID` | Y | GUID, полученный в ответе `GetQRCreversalData`. |
| `queryData.notificationUrl` | O | URL для уведомления о статусе возврата. |
---
## 4. Запрос статуса возврата
Метод `GetQRCreversalStatus` используется для уточнения финального статуса операции возврата (B2C).
### Параметры запроса
Для поиска операции необходимо передать одну из пар:
1. `payrrn` ИЛИ `originalTrxId` (для поиска исходного платежа).
2. `trxId` ИЛИ `messageID` (для идентификации самого возврата).
### Статусы возврата в ответе
* `ACWP` — Возврат успешно завершен.
* `RJCT` — Операция отклонена.
* `NTST` — Статус неизвестен (в обработке).
### Пример ответа
```json
{
"ErrorCode": 0,
"amount": 10000,
"status": "ACWP",
"originalTrxId": "A31040920067662400000550448AD7B3",
"trxId": "B31071502287201D00001650448AD7B3"
}
```
---
*Примечание: Все текстовые данные в запросах должны передаваться в кодировке UTF-8, формат передачи данных — JSON.*
# Интеграция динамических QR-кодов (СБП)
Оплата по динамическому QR-коду — это способ безналичной оплаты через Систему Быстрых Платежей (СБП). QR-код создается отдельно под каждую покупку, содержит сумму и реквизиты. Средства мгновенно поступают на счёт продавца.
## 1. Регистрация динамического QR-кода
**Метод:** `GetQRCd`
Используется для генерации QR-кода под конкретный заказ.
### Параметры запроса
| Код ключа | Тип данных | Обяз. | Назначение |
| :--- | :--- | :---: | :--- |
| `command` | String | Y | Константа `GetQRCd` |
| `TermNo` | String(20) | Y | Уникальный идентификатор терминала |
| `qrcType` | String(2) | Y | Тип QR-кода. Для динамического — `02` |
| `amount` | Number | Y | Сумма в минорных единицах (копейках) |
| `currency` | String(3) | Y | Код валюты (для рублей — `RUB`) |
| `OrderNumber` | String(1000)| O | Номер заказа (только латиница и цифры) |
| `paymentPurpose`| String(140) | O | Назначение платежа |
| `qrTtl` | String(6) | O | Срок жизни ссылки в минутах (мин. 1, рек. от 5) |
| `queryData.notificationUrl` | String(512) | O | URL для уведомления о статусе оплаты |
| `redirectUrl` | String(1024)| O | Ссылка для возврата клиента в приложение/сайт |
| `extJsonParams` | Object | O | Блок дополнительных параметров (JsonParam1-10) |
**Для подписок (рекуррентных платежей):**
* `subscriptionServiceId`: Идентификатор привязки.
* `subscriptionServiceName`: Наименование привязки.
### Пример запроса
```json
{
"command": "GetQRCd",
"TermNo": "90080567",
"amount": "10000",
"currency": "RUB",
"qrcType": "02",
"qrTtl": "5",
"OrderNumber": "FYI123456",
"queryData": {
"notificationUrl": "https://sbp-payments.your-site.com/callback"
}
}
```
### Параметры ответа
| Код ключа | Тип данных | Обяз. | Назначение |
| :--- | :--- | :---: | :--- |
| `ErrorCode` | String | Y | Код ответа (0 — успех) |
| `image` | String | Y | Изображение QR-кода в формате Base64 |
| `payload` | String | Y | Платежная ссылка СБП |
| `qrcId` | String | Y | Уникальный идентификатор QR-кода |
| `status` | String | Y | Статус регистрации (например, `CREATED`) |
---
## 2. Запрос статуса оплаты
**Метод:** `GetQRCstatus`
Направляется кассой/терминалом для проверки факта оплаты.
> **Важно:** Запрос следует направлять не ранее, чем через 10 секунд после формирования QR, и не чаще чем раз в 3 секунды.
### Параметры запроса
| Код ключа | Тип данных | Обяз. | Назначение |
| :--- | :--- | :---: | :--- |
| `command` | String | Y | Константа `GetQRCstatus` |
| `TermNo` | String | Y | Идентификатор терминала |
| `qrcId` | String | Y/O | ID QR-кода (обязательно, если нет payrrn) |
| `payrrn` | String | Y/O | Референс запроса в системе Банка |
### Возможные статусы (`status`)
1. `ACWP` (ACCEPTED) — Операция завершена успешно.
2. `RJCT` (REJECTED) — Операция отклонена.
3. `NTST` (NOT_STARTED) — Операция не найдена (нужен повтор запроса).
4. `RCVD` (RECEIVED) — Операция в обработке.
### Пример ответа (Успех)
```json
{
"ErrorCode": 0,
"status": "ACWP",
"qrcId": "AD100026KQ0ESJBV8OFPCG0U9K1H52UM",
"trxId": "A3013090427361010000057B3DA2D4A7",
"amount": 10000,
"payerId": "*********1234"
}
```
---
## 3. Нотификация о финальном статусе
**Метод:** `qrc/notification`
Запрос отправляется со стороны Банка на `notificationUrl` ТСП.
### Формат уведомления
```json
{
"command": "qrc/notification",
"qrcId": "AD100026KQ0ESJBV8OFPCG0U9K1H52UM",
"status": "ACWP",
"amount": "10000",
"trxId": "A3013090427361010000057B3DA2D4A7",
"timestamp": "2022-10-27T14:33:49.000Z"
}
```
*ТСП должно ответить HTTP-кодом `200`.*
---
## 4. Проведение возврата
Возврат может быть выполнен в два этапа (проверка + выполнение) или в один этап (при передаче `messageID`).
### 4.1 Проверка возможности возврата (`GetQRCreversalData`)
Используется для получения данных о плательщике и проверки доступного остатка.
### 4.2 Выполнение возврата (`QRCreversal`)
**Параметры запроса:**
| Код ключа | Тип данных | Обяз. | Назначение |
| :--- | :--- | :---: | :--- |
| `command` | String | Y | Константа `QRCreversal` |
| `amount` | Number | O | Сумма возврата (если не указана — полный возврат) |
| `qrcId`/`trxId` | String | Y | Идентификаторы оригинальной операции |
| `ReturnRestAmount`| Boolean| O | Вернуть остаток доступных средств в ответе |
### Пример ответа на возврат
```json
{
"ErrorCode": 0,
"message": "Возврат проведен",
"amount": 10000,
"trxId": "A3024113609260070000086B8426B817",
"restAmount": "99.87"
}
```
---
## 5. История и статусы возвратов
### Запрос истории (`GetQRCreversalHistory`)
Позволяет получить список всех попыток возврата по одной транзакции оплаты.
**Пример структуры массива `refunds` в ответе:**
```json
"refunds": [
{
"status": "ACWP",
"amount": 10000,
"trxId": "B51390823097450W0000180011510503",
"trxDT": "20250519082345"
},
{
"status": "RJCT",
"amount": 10000,
"trxId": "A4327120041167130000020011381101"
}
]
```
---
## 6. Нотификация о возврате
**Метод:** `b2c-refund/notification`
Банк уведомляет систему ТСП о финальном статусе операции возврата.
### Пример уведомления
```json
{
"command": "b2c-refund/notification",
"status": "ACWP",
"amount": "10000",
"originalTrxId": "X1A2S3D5F6G7H8J9K0C4S5C6D7V5D1K2",
"trxId": "A3024113609260070000086B8426B817"
}
```
---
## Примечания
* **Формат данных:** Все текстовые данные в ответах передаются в формате `urlencoded`.
* **Суммы:** Все суммы в запросах передаются как целые числа в копейках.
* **Ошибки:** Список кодов ошибок приведен в Приложении №2 (согласно основной документации Банка).
* **Успешная оплата:** Считается подтвержденной только при получении статуса `ACWP` и наличии `trxId`.
# Кассовая платёжная ссылка СБП: Техническая документация
**Кассовая платёжная ссылка** — это гибридное решение, объединяющее преимущества статического и динамического QR-кодов. QR-код остается неизменным (его можно распечатать один раз), но сумма оплаты передается с кассы в момент покупки, что исключает ошибки ручного ввода со стороны клиента.
## Общие положения
* Для каждой кассы/терминала создается уникальная ссылка.
* Сумма передается в **минорных единицах** (копейках).
* Текстовые данные в ответах передаются в формате `urlencoded`.
---
## 1. Регистрация кассовой платёжной ссылки
Метод `RegCashQRc` используется для генерации постоянного QR-кода для терминала.
### Параметры запроса
| Параметр | Тип | Обяз. | Назначение |
| :--- | :--- | :---: | :--- |
| `command` | String | Y | Константа `RegCashQRc` |
| `TermNo` | String | Y | Уникальный ID терминала (до 20 симв.) |
| `mediaType` | String | N | Тип картинки (напр., `image/png`) |
| `width` | String | N | Ширина изображения |
| `height` | String | N | Высота изображения |
| `redirectUrl` | String | N | Ссылка для возврата клиента в приложение ТСП |
| `qrcId` | String | N | ID для привязки предвыпущенных NFC-табличек |
**Пример запроса:**
```json
{
"command": "RegCashQRc",
"TermNo": "90080567",
"mediaType": "image/png",
"width": "600",
"height": "600",
"redirectUrl": "https://exampletsp.io/callback"
}
```
---
## 2. Активация ссылки (Передача суммы)
Метод `ActivateCashQRc` вызывается кассой в момент совершения покупки для установки суммы и параметров платежа.
### Параметры запроса
| Параметр | Тип | Обяз. | Назначение |
| :--- | :--- | :---: | :--- |
| `command` | String | Y | Константа `ActivateCashQRc` |
| `TermNo` | String | Y | ID терминала |
| `qrcId` | String | Y | ID QR-кода |
| `amount` | Number | Y | Сумма в копейках |
| `currency` | String | N | Валюта (по умолчанию `RUB`) |
| `qrTtl` | String | N | Срок жизни активации (5–20 мин) |
| `queryData.notificationUrl` | String | N | URL для уведомления об оплате |
**Пример запроса:**
```json
{
"command": "ActivateCashQRc",
"TermNo": "90080567",
"qrcId": "BS1R001P1UIGJCFJ9RDQ8974M1I4CJO9",
"amount": 10000,
"currency": "RUB",
"qrTtl": "5",
"queryData": {
"notificationUrl": "https://sbp-payments.your-site.ru"
}
}
```
---
## 3. Проверка статуса оплаты
Метод `GetQRCstatus` используется для получения финального статуса транзакции. Рекомендуется запрашивать не ранее 10 сек. после активации и не чаще раза в 3 сек.
### Статусы оплаты (поле `status`)
* **ACWP** (ACCEPTED) — Оплата успешно завершена.
* **RJCT** (REJECTED) — Операция отклонена.
* **NTST** (NOT_STARTED) — Оплата еще не инициирована.
* **RCVD** (RECEIVED) — В обработке.
**Пример ответа (Успех):**
```json
{
"ErrorCode": 0,
"status": "ACWP",
"trxId": "A30180803159571F0000097B3DA2D4A7",
"amount": 10000,
"payerId": "*********1234",
"payrrn": "000056251465"
}
```
---
## 4. Деактивация ссылки
Метод `DelCashQRc` используется для досрочной отмены ожидания оплаты (например, если клиент отказался от покупки).
**Пример запроса:**
```json
{
"command": "DelCashQRc",
"TermNo": "90080567",
"qrcId": "BS1R001P1UIGJCFJ9RDQ8974M1I4CJO9"
}
```
---
## 5. Возврат платежа
Возврат по СБП выполняется в два этапа (или в один при наличии `messageID`).
### Этап 1: Проверка возможности возврата (`GetQRCreversalData`)
Позволяет узнать доступный остаток и получить данные для проведения возврата.
### Этап 2: Проведение возврата (`QRCreversal`)
**Пример запроса на возврат:**
```json
{
"command": "QRCreversal",
"TermNo": "90080567",
"payrrn": "000056251465",
"amount": 10000,
"messageID": "f9aa54ff-a615-44b8-aa6c-acab655c89f8"
}
```
---
## 6. Нотификации (Webhooks)
Банк отправляет POST-запросы на ваш `notificationUrl` при изменении статуса оплаты или возврата.
### Уведомление об оплате (`qrc/notification`)
```json
{
"command": "qrc/notification",
"qrcId": "BS1R001P1UIGJCFJ9RDQ8974M1I4CJO9",
"status": "ACWP",
"amount": 10000,
"trxId": "A30180803159571F0000097B3DA2D4A7"
}
```
---
## 7. Изменение параметров ссылки
Метод `ChangeAccForCashQRc` позволяет перепривязать QR-код к другому счету, терминалу или изменить `redirectUrl`.
| Параметр | Назначение |
| :--- | :--- |
| `NewTermNo` | Перенос на новый ID терминала |
| `NewMerchantId` | Перенос на другую торговую точку |
| `account` | Смена расчетного счета |
---
## Приложение: Коды ошибок (ErrorCode)
| Код | Описание |
| :--- | :--- |
| `0` | Успешно |
| `3` | Не передан обязательный параметр |
| `16` | Некорректный TermNo |
| `41` | Некорректный qrcId |
| `301` | Превышен временной диапазон поиска |
| `RQ05019` | Не передан параметр amount при активации |
> **Примечание:** При получении статуса `NTST` необходимо продолжать опрос статуса до получения финального результата (`ACWP` или `RJCT`).
# Привязка счёта и подписки СБП: Техническая документация
Данный функционал позволяет ТСП (Торгово-сервисным предприятиям) выполнять привязку банковского счёта клиента для проведения последующих платежей без участия плательщика (рекуррентные платежи, оплата в один клик).
---
## 1. Привязка счёта без оплаты
Используется для регистрации QR-кода, целью которого является только установление связки между счётом клиента и ТСП.
### 1.1. Метод `RegQRcSub`
**Параметры запроса:**
| Параметр | Тип | Обяз. | Описание |
| :--- | :--- | :---: | :--- |
| `command` | String | Да | Тип запроса. Константа: `RegQRcSub`. |
| `TermNo` | String | Да | Уникальный идентификатор терминала. |
| `qrcType` | String | Да | Тип QR-кода. Константа: `03`. |
| `subscriptionPurpose` | String | Да | Цель привязки. Отображается клиенту в приложении банка. |
| `queryData.notificationUrl` | String | Да | URL для получения уведомления о результате привязки. |
| `qrTtl` | String | Нет | Срок жизни ссылки в минутах (1 — 129 600). По умолчанию: 4320 (3 суток). |
| `redirectUrl` | String | Нет | Ссылка для возврата клиента в приложение/на сайт ТСП. |
| `subscriptionServiceId` | String(32) | Нет | Идентификатор сервиса подписки (используется с `subscriptionServiceName`). |
| `subscriptionServiceName`| String(70) | Нет | Наименование сервиса подписки. |
**Пример запроса:**
```json
{
"command": "RegQRcSub",
"TermNo": "90080567",
"qrTtl": "10",
"qrcType": "03",
"subscriptionPurpose": "Подписка на оплату услуг Интернет 500р./мес.",
"queryData": {
"notificationUrl": "https://sbp-subscription.example.com"
},
"redirectUrl": "https://exampletsp.io/callback"
}
```
**Параметры ответа:**
| Параметр | Описание |
| :--- | :--- |
| `ErrorCode` | Код ответа (0 или RQ00000 — успех). |
| `qrcId` | Идентификатор QR-кода. |
| `payload` | Платежная ссылка для формирования QR или перехода. |
| `payrrn` | Референс запроса в системе Банка. |
---
### 1.2. Нотификация о результате привязки (`subscription/notification`)
Банк отправляет POST-запрос на `notificationUrl` ТСП.
**Параметры нотификации:**
* `status`: `ACWP` (оформлено) или `RJCT` (отказ).
* `subscriptionToken`: Уникальный токен привязки (необходим для будущих оплат).
* `memberId`: Идентификатор банка плательщика.
> **Важно:** Значения `subscriptionToken` и `memberId` необходимо сохранить. Без них проведение платежей по инициативе ТСП невозможно.
---
## 2. Оплата с последующей привязкой счёта
Позволяет клиенту совершить первую покупку и одновременно разрешить ТСП списывать средства в будущем.
### 2.1. Метод `GetQRCd` (Тип 02)
Для этого сценария используется стандартный метод генерации QR, но с обязательным заполнением поля `subscriptionPurpose`.
**Ключевые параметры:**
* `qrcType`: `02` (динамический QR).
* `amount`: Сумма первого платежа в копейках.
* `subscriptionPurpose`: Описание подписки (наличие этого поля активирует сценарий привязки).
* `queryData.notificationUrl_sub`: (Опционально) Отдельный URL для уведомления именно о привязке.
**Логика уведомлений:**
1. При успешной операции ТСП получает **два** callback-уведомления:
- О статусе платежа (`qrc/notification`).
- О статусе привязки (`subscription/notification`).
2. Если платеж прошел, но клиент отказался от привязки — придет уведомление об успехе оплаты и уведомление об отказе в подписке.
---
## 3. Оплата с привязанного счёта (по инициативе ТСП)
Сценарий "бесшовной" оплаты без участия клиента. Проводится в два этапа.
### Этап 1: Генерация ссылки через `GetQRCd`
Создается технический QR-код (тип `02`), к которому будет "привязан" платеж.
* `paymentPurpose`: Обязательно для заполнения.
* `amount`: Сумма списания.
### Этап 2: Запрос на списание `QRCSubPayPetition`
ТСП отправляет команду банку на исполнение платежа, используя полученный ранее токен.
**Параметры запроса:**
| Параметр | Обяз. | Описание |
| :--- | :---: | :--- |
| `command` | Да | `QRCSubPayPetition` |
| `subscriptionToken` | Да | Токен, полученный при регистрации привязки. |
| `SenderMemberId` | Да | Идентификатор банка плательщика (`memberId`). |
| `qrcId` | Да | ID QR-кода, созданного на Этапе 1. |
**Пример запроса:**
```json
{
"command": "QRCSubPayPetition",
"TermNo": "90080567",
"subscriptionToken": "70LSS7DN18SJQRS10006DNPKLJL24B05",
"SenderMemberId": "100000000008",
"qrcId": "AD10000BBJKO23GB98LA1FGBRIHH3K89"
}
```
### 3.1. Статусы решения банка (`resolution/notification`)
После запроса на списание банк присылает уведомление с результатом:
| Код | Описание |
| :--- | :--- |
| `RQ00030` | **Успех.** Согласие на проведение платежа. |
| `RQ05031` | Отказ: Привязка не найдена (клиент мог её удалить). |
| `RQ05060` | Отказ: Недостаточно средств. |
| `RQ05061` | Отказ: Превышен лимит СБП. |
| `RQ05063` | Отказ: Подозрение на мошенничество. |
---
## 4. Запрос статуса привязки
Если ТСП не получило callback, можно запросить статус привязки вручную.
### Метод `GetQRCSubStatus`
**Запрос:**
```json
{
"command": "GetQRCSubStatus",
"TermNo": "90080567",
"qrcId": "BB1S002PRSK6SR3E9R7P0H077UKN1QVF"
}
```
**Ответ (успешная привязка):**
```json
{
"ErrorCode": 0,
"status": "ACWP",
"subscriptionToken": "70LSS7DN18SJQRS10006DNPKLJLAGT77",
"memberId": "600000000015",
"message": "OK"
}
```
---
## Важные примечания для разработчиков
1. **Лимиты:** Оплата с привязанного счета возможна на сумму до **1 000 000 руб.** за одну операцию.
2. **Кодировка:** Текстовые данные в ответах могут передаваться в формате `urlencoded` (например, `%u0423%u0441%u043F%u0435%u0445` для слова "Успех").
3. **Безопасность:** Система ТСП должна игнорировать неизвестные дополнительные параметры в уведомлениях от НСПК/Банка, не считая их ошибкой.
4. **Хранение данных:** Потеря `subscriptionToken` делает невозможным рекуррентное списание. В этом случае потребуется повторная привязка через QR-код.
# Цифровой рубль: Техническая документация по интеграции
Цифровой рубль (ЦР) — это третья форма национальной валюты, дополняющая наличные и безналичные средства. Счета цифрового рубля открываются на платформе Центрального банка, а доступ к ним осуществляется через мобильные приложения и интернет-банки коммерческих банков.
Прием платежей в ЦР осуществляется в рамках **Универсального платёжного кода (УПК)**.
---
## 1. Динамический QR-код (Одноразовый УПК)
Динамический код формируется под конкретную операцию с фиксированной суммой.
### 1.1. Регистрация динамического УПК
Для генерации кода можно использовать существующий метод `GetQRCd` или специализированный метод `ReqUniQr`.
#### Метод `ReqUniQr`
Запрос направляется ТСП в Банк для регистрации универсальной платёжной ссылки в API СБП.
**Параметры запроса:**
| Код ключа | Тип данных | Обяз. | Назначение |
| :--- | :--- | :---: | :--- |
| `command` | String | Y | Константа `ReqUniQr` |
| `TermNo` | String | Y | Уникальный идентификатор терминала |
| `amount` | Number | O* | Сумма в копейках (обязательна для `uniQrType = 02`) |
| `uniQrType` | String | Y | Тип ссылки: `01` — многоразовая, `02` — одноразовая |
| `mediaType` | String | O | Расширение QR-кода (напр., `image/png`) |
| `width` / `height` | String | O | Размеры изображения в пикселях |
| `paymentPurpose` | String | O | Назначение платежа |
| `redirectUrl` | String | O | URL для возврата в приложение ТСП (ASCII/RFC3986) |
| `messageID` | String | O | Уникальный GUID сообщения |
| `qrTtl` | String | O | Срок жизни ссылки в минутах |
| `queryData.notificationUrl` | String | O | URL для уведомления о статусе оплаты |
**Пример запроса:**
```json
{
"command": "ReqUniQr",
"TermNo": "90080567",
"amount": "10000",
"uniQrType": "02",
"redirectUrl": "https://alfabank.ru/sme/payservice/sbp/",
"mediaType": "image/png",
"width": "600",
"height": "600",
"messageID": "f9aa54ff-a615-44b8-aa6c-acab655c89f8",
"queryData": {
"notificationUrl": "https://sbp-payments",
"SenderFIO": "Иванов Иван Иванович"
}
}
```
**Параметры ответа:**
- `ErrorCode`: `0` — успех.
- `payload`: Платёжная ссылка.
- `image`: Изображение QR-кода в Base64.
- `uniQrId`: Идентификатор ссылки.
- `status`: Статус (обычно `CREATED`).
---
### 1.2. Проверка статуса оплаты динамического УПК
Используется метод `GetUniQrStatus`.
**Специфические статусы для Цифрового рубля:**
* `ENDD`: Платёж в ЦР обработан, но финальный результат (успех/отказ) пока неизвестен.
* `ACDR`: Платёж в ЦР успешно выполнен (аналог `ACWP` для СБП).
**Структура блока `data` (массив Record) в ответе:**
| Ключ | Описание |
| :--- | :--- |
| `paymentServiceId` | `PS0000000001` (СБП) или `PS0000000002` (ЦР) |
| `status` | `NTST` (не начат), `RCVD` (в процессе), `ACWP` (успех СБП), `RJCT` (отказ), `ENDD` (ЦР в обработке), `ACDR` (успех ЦР) |
---
## 2. Кассовая платёжная ссылка (Многоразовый УПК)
Многоразовый код, который обычно размещается в кассовой зоне.
### 2.1. Регистрация кассового УПК
Метод: `RegCashUniQr`.
**Особенности:**
* Позволяет привязать конкретный `qrcId`.
* В настройках ТСП на стороне Банка должен быть обязательно указан счет ЦР (`accountDR`).
**Пример ответа:**
```json
{
"ErrorCode": "0",
"message": "OK",
"TermNo": "90080567",
"payload": "https://qr.nspk.ru/BS2R003FS8EFGAVM852PQS13N894HDLU?type=01...",
"image": "iVBORw0KGgoAAAANSUhEUgAAAlg...",
"qrcId": "BS2R003FS8EFGAVM852PQS13N894HDLU",
"status": "CREATED"
}
```
---
### 2.2. Изменение параметров кассового УПК
Метод `ChangeAccForCashUniQr` позволяет обновить привязанные счета или параметры терминала без смены самого QR-кода.
**Ключевые параметры для изменения:**
* `account`: Новый счет для СБП.
* `accountDR`: Новый счет для Цифрового рубля (строго 55 символов).
* `NewTermNo`: Смена ID терминала.
* `NewMerchantId`: Смена ID мерчанта в НСПК.
---
### 2.3. Проверка статуса кассового УПК
Метод: `GetCashUniQrStatus`.
**Важные поля ответа:**
* `paymentServiceId`: Определяет, как заплатил клиент (`PS0000000002` — Цифровой рубль).
* `cashRegisterQrcStatus`: Статус самой ссылки (`WAITING_PAYMENT`, `IN_PROGRESS`, `DEACTIVATED`).
---
## 3. Нотификация об исполнении перевода (C2B)
Сообщение отправляется со стороны Банка на сервер ТСП при получении финального статуса платежа.
**Метод:** `paymentDR/notification` (POST запрос)
**Параметры запроса:**
| Код ключа | Тип данных | Назначение |
| :--- | :--- | :--- |
| `command` | String | `paymentDR/notification` |
| `uniQrId` | String | Идентификатор платежа |
| `operationId` | String | ID операции на платформе ЦР |
| `status` | String | Статус (напр. `ACWP` или `RCVD`) |
| `amount` | String | Сумма в рублях (с разделителем-точкой) |
| `timestamp` | ISO8601 | Дата и время операции |
| `payrrn` | String | Референс платежа |
**Пример нотификации:**
```json
{
"command": "paymentDR/notification",
"uniQrId": "AD2000670LSS7DN18SJQDNP4B05KLJL1",
"operationId": "546464AX45546",
"status": "ACWP",
"amount": "10241.21",
"timestamp": "2024-08-01T10:15:00.000Z",
"payrrn": "102345678912",
"TermNo": "90080567",
"merchantName": "Рога и Копыта",
"purpose": "Кофе и булочка"
}
```
**Ожидаемый ответ от ТСП:**
* `HTTP 200 OK` — уведомление успешно принято.
* `HTTP 500` — внутренняя ошибка (будет произведена повторная попытка).
---
## Приложение: Справочник статусов (status)
| Код | Описание | Применимость |
| :--- | :--- | :--- |
| **NTST** | Платёж не начат | СБП / ЦР |
| **RCVD** | Платёж инициирован / в обработке | СБП / ЦР |
| **ACWP** | Платёж успешно выполнен | СБП |
| **RJCT** | Платёж отклонён | СБП |
| **ENDD** | Платёж обработан (результат уточняется) | **ЦР** |
| **ACDR** | Платёж успешно выполнен | **ЦР** |
# Дополнительные методы API СБП (Альфа-Банк)
Данный документ содержит описание дополнительных методов API для работы с Системой Быстрых Платежей (СБП) через платежный шлюз (ПШ) Альфа-Банка.
> **Примечание:** Таблицы кодов ответов (`ErrorCode`) и их расшифровок приведены в Приложении №2 к основной документации.
---
## 1. Запрос списка банков-участников СБП (`GetBankList`)
Метод используется ТСП для получения актуального списка банков, поддерживающих оплату через СБП.
### 1.1. Параметры запроса
| Код ключа | Тип данных | Обяз. | Назначение |
| :--- | :--- | :---: | :--- |
| `command` | String (an-1..50) | **Y** | Тип запроса. Константа: `GetBankList` |
| `messageID` | String (ans-1..1024) | N | Уникальный идентификатор сообщения (GUID) |
| `BankMemberIdFilter` | String (n-11) | N | Фильтр по ID участника СБП (если нужен только один банк) |
**Пример запроса:**
```json
{
"command": "GetBankList"
}
```
### 1.2. Параметры ответа
| Код ключа | Тип данных | Обяз. | Назначение |
| :--- | :--- | :---: | :--- |
| `ErrorCode` | String (an-20) | **Y** | Код ответа |
| `message` | String (ans-1024) | **Y** | Расшифровка кода ответа |
| `BankList` | Array | N | Коллекция банков-участников |
| `BankList.BankName` | String (an-50) | N | Наименование банка |
| `BankList.BankID` | String (an-12) | N | Идентификатор участника СБП в НСПК |
| `BankList.BankBIK` | String (n-9) | N | БИК банка (если передан из НСПК) |
**Пример успешного ответа:**
```json
{
"ErrorCode": 0,
"message": "Запрос обработан успешно",
"BankList": [
{
"BankName": "Наименование банка 1",
"BankID": "10000001100",
"BankBIK": "044525823"
},
{
"BankName": "Наименование банка N",
"BankID": "10000001145",
"BankBIK": "044525829"
}
]
}
```
---
## 2. Блокирование QR-кода (`BlockQRcId`)
Запрос направляется для блокировки ранее сгенерированного QR-кода любого типа.
### 2.1. Параметры запроса
| Код ключа | Тип данных | Обяз. | Назначение |
| :--- | :--- | :---: | :--- |
| `command` | String (an-1..50) | **Y** | Тип запроса. Константа: `BlockQRcId` |
| `TermNo` | String (an-20) | **Y** | Уникальный идентификатор терминала |
| `qrcId` | String (an-32) | **Y** | Идентификатор QR-кода |
| `reason` | String (ans-1024) | N | Причина блокировки |
**Пример запроса:**
```json
{
"command": "BlockQRcId",
"TermNo": "90080567",
"qrcId": "BS1R003FN6RS6HL48QMBFVO5C4K9GQRV",
"reason": "Заказ 12345 направлен в стоп-лист"
}
```
### 2.2. Параметры ответа
| Код ключа | Тип данных | Обяз. | Назначение |
| :--- | :--- | :---: | :--- |
| `ErrorCode` | String (an-20) | **Y** | Код ответа |
| `TermNo` | String (an-20) | **Y** | Уникальный идентификатор терминала |
| `message` | String (ans-1024) | **Y** | Расшифровка кода ответа |
**Пример успешного ответа (200 OK):**
```json
{
"ErrorCode": 0,
"TermNo": "90080567",
"message": "OK"
}
```
---
## 3. Разблокирование QR-кода (`UnblockQRcId`)
Запрос используется для восстановления активности ранее заблокированного QR-кода.
### 3.1. Параметры запроса
| Код ключа | Тип данных | Обяз. | Назначение |
| :--- | :--- | :---: | :--- |
| `command` | String (an-1..50) | **Y** | Тип запроса. Константа: `UnblockQRcId` |
| `TermNo` | String (an-20) | **Y** | Уникальный идентификатор терминала |
| `qrcId` | String (an-32) | **Y** | Идентификатор QR-кода |
**Пример запроса:**
```json
{
"command": "UnblockQRcId",
"TermNo": "90080567",
"qrcId": "BS1R003FN6RS6HL48QMBFVO5C4K9GQRV"
}
```
### 3.2. Параметры ответа
| Код ключа | Тип данных | Обяз. | Назначение |
| :--- | :--- | :---: | :--- |
| `ErrorCode` | String (an-20) | **Y** | Код ответа |
| `TermNo` | String (an-20) | **Y** | Уникальный идентификатор терминала |
| `message` | String (ans-1024) | **Y** | Расшифровка кода ответа |
**Пример успешного ответа:**
```json
{
"ErrorCode": 0,
"TermNo": "90080567",
"message": "OK"
}
```
---
## 4. Список заблокированных QR-кодов (`GetBlockedQRcIdList`)
Запрос позволяет получить перечень всех заблокированных QR-кодов по конкретному терминалу или кассе.
### 4.1. Параметры запроса
| Код ключа | Тип данных | Обяз. | Назначение |
| :--- | :--- | :---: | :--- |
| `command` | String (an-1..50) | **Y** | Тип запроса. Константа: `GetBlockedQRcIdList` |
| `TermNo` | String (an-20) | **Y** | Уникальный идентификатор терминала |
**Пример запроса:**
```json
{
"command": "GetBlockedQRcIdList",
"TermNo": "90080567"
}
```
### 4.2. Параметры ответа
| Код ключа | Тип данных | Обяз. | Назначение |
| :--- | :--- | :---: | :--- |
| `ErrorCode` | String (an-20) | **Y** | Код ответа |
| `message` | String (ans-1024) | **Y** | Расшифровка кода ответа |
| `TermNo` | String (an-20) | **Y** | Уникальный идентификатор терминала |
| `QRcIdList` | Collection | N | Список заблокированных QR-кодов |
| `QRcIdList.qrcId` | String (an-32) | **Y** | Идентификатор QR-кода |
| `QRcIdList.reason` | String (ans-1024) | N | Причина блокировки |
| `QRcIdList.date` | String (an-20) | **Y** | Дата и время блокировки |
**Пример успешного ответа:**
```json
{
"ErrorCode": 0,
"TermNo": "90080567",
"message": "OK",
"QRcIdList": [
{
"date": "2024-04-18 17:17:45",
"qrcId": "BD100000K5II0G369JHR3KBA6SM3FD3V",
"reason": "Заказ 12345 направлен в стоп-лист"
},
{
"date": "2024-05-01 19:07:15",
"qrcId": "BD100002JN871TSC9SJB7HPVRFD3HQ8T",
"reason": "Заказ 96780 направлен в стоп-лист"
}
]
}
```
---
## Обработка ошибок (Общий формат)
В случае ошибки (например, `400 Bad Request`), шлюз возвращает JSON следующего вида:
```json
{
"ErrorCode": "Код ошибки",
"message": "Расшифровка причины ошибки"
}
```
# Приложения к технической спецификации СБП
## Приложение 1. Формат Payload
В Системе быстрых платежей (СБП) используется формат двухмерного кода **QR Code (ISO/IEC 18004-2015)**. Payload (полезная нагрузка) может быть представлен в двух вариантах.
### Варианты Payload
* **Короткий вариант:** `https://{HOST}/{QR_ID}`
* **Длинный вариант:** `https://{HOST}/{QR_ID}?type={QR_TYPE}&bank={MEMBER_ID}&sum={SUM}&cur={CUR}&crc={CRC}`
### Описание параметров URL-based payload
| Параметр | Описание | Обяз. | Формат |
| :--- | :--- | :---: | :--- |
| **HOST** | `qr.nspk.ru` — для QR_TYPE 01 и 02
`sub.nspk.ru` — для QR_TYPE 03 | y | String |
| **QR_ID** | Идентификатор зарегистрированного QR-кода в СБП | y | String (32 симв.) |
| **QR_TYPE** | Тип QR-кода:
01 — QR Static (наклейка)
02 — QR Dynamic (на кассе)
03 — QR-Subscription (привязка счета) | y | String (2 цифры) |
| **MEMBER_ID** | Идентификатор Банка Получателя (ТСП) | y | String (12 симв.) |
| **SUM** | Сумма в копейках. Обязательна для типа 02. Отсутствует для типа 03. | y/o | String (до 12 цифр) |
| **CUR** | Валюта операции (обязательна, если присутствует SUM) | y/o | String (3 симв.) |
| **CRC** | Значение контрольной суммы | y | String (4 симв.) |
---
## Приложение 2. Описание кодов ответа
Полный перечень кодов представлен на сайте НСПК. Коды, не описанные ниже, следует обрабатывать как **техническую (системную) ошибку**.
### Общие коды ошибок системы
| Код | Сообщение / Описание |
| :--- | :--- |
| **0** | **OK** (Успешно) |
| **-999** | Прочее сообщение FSCryptoProxy |
| **-71** | Неверные данные Basic-авторизации запроса |
| **-9** | Система перегружена. Повторите запрос позже |
| **-7** | Неверная подпись сообщения (ошибка ключей) |
| **-6** | Не передана подпись в заголовке Authorization |
| **-1** | Возникли проблемы при обработке запроса |
| **1** | Внутренняя ошибка |
| **2** | Терминал не обнаружен |
| **8** | Таймаут ответа |
| **25** | Терминал заблокирован |
| **1001** | Сервис временно недоступен |
### Коды ОПКЦ СБП (RQ-серия)
| Код | Описание |
| :--- | :--- |
| **RQ00000** | Запрос обработан успешно |
| **RQ03001** | Ошибка валидации. Неверный формат запроса |
| **RQ05002** | Участник (memberId) не найден в СБП |
| **RQ05005** | ТСП (merchantId) не зарегистрировано в СБП |
| **RQ05009** | Сумма (amount) меньше минимально допустимой |
| **RQ05010** | Сумма (amount) больше максимально допустимой |
| **RQ05014** | Идентификатор qrcId не найден |
| **RQ05032** | Отказ Банка Плательщика в выполнении платежа |
| **RQ05040** | Сумма возврата превышает сумму исходной операции |
| **RQ07999** | Техническая ошибка |
---
### Ошибки по конкретным методам
#### Метод `GetQRCd` (Запрос QR-кода)
| Код | Описание |
| :--- | :--- |
| **3** | Не заполнены данные запроса |
| **28** | Запрос QR-кода не удался, не получен QR_ID |
| **301** | Некорректно заполнены данные |
| **999*** | Неизвестная ошибка. Требуется уточнение статуса |
#### Метод `GetQRCstatus` (Статус платежа)
| Код | Описание |
| :--- | :--- |
| **4** | Не передан qrcId или payrrn |
| **5** | Не получены данные от СБП |
| **18** | Платеж не найден в запросах B07, B23 |
#### Методы возврата (`GetQRCreversalData`, `QRCreversal`)
| Код | Описание |
| :--- | :--- |
| **12** | Не найдены данные для возврата |
| **20** | Получен отказ на запрос возврата |
| **22** | Несоответствие payrrn и qrcId в запросе |
| **27** | Возврат невозможен: счет зачисления не равен счету списания |
| **121** | Операция оплаты еще не имеет финального статуса |
| **201** | Отказ: Недостаточно средств на счете для возврата |
---
### Коды callback-уведомлений (Оплата с привязанного счета)
Используются в методе `resolution/notification`.
| Код | Описание |
| :--- | :--- |
| **RQ05060** | Недостаточно денежных средств |
| **RQ05061** | Превышен лимит по сумме операций СБП |
| **RQ05063** | Подозрение в мошенничестве (Anti-fraud) |
| **RQ05065** | Счет заблокирован |
| **RQ05067** | Запрещено по требованию законодательства |
> **Примечание:** Использование кода `RQ05032` допускается не более чем в 20% случаев от общего числа отказов Банка Плательщика.
---
## Приложение 3. Пояснение для колонки «Required»
| Метка | Значение |
| :---: | :--- |
| **y** | **Yes** — обязательное поле |
| **o** | **Optional** — опциональное поле |
| **y/o** | **Conditional** — условно обязательное (зависит от условий запроса) |
---
## Приложение 4. Типы данных
| Нотация | Описание |
| :--- | :--- |
| **a** | Символы латинского (A-Z, a-z) и русского (А-Я, а-я) алфавитов. |
| **n** | Цифры 0-9. |
| **an** | Буквенно-цифровой формат (смесь **a** и **n**). |
| **ans** | Буквенно-цифровой формат со спецсимволами (пробел, пунктуация, знаки `№`, `%` и т.д.). |
**Кодировка:** Все данные передаются в кодировке **UTF-8**.
]]>
<_1_main_md>
signature64.txt
openssl x509 -in client.crt -pubkey -noout > signing-pub.key
openssl dgst -sha256 -signature signature.txt -verify signing-pub.key block.txt
Content-Type: application/x-www-form-urlencoded
Authorization: QMm5QWnAAj8Tp1hoIvGf1Hv7RPBoGgsDyGiR5GQ2v/MaS7Yaix6LDwAcry0UBWDZzqle2hx2fC7WbWkxXGvxK2Hcx
key-name: c2b-tsp-test
12/23/25, 11:20 AM Главная
https://alfabank.ru/sme/payservice/sbp/docs/welcome/ 5/7
Body:
Как провести тестовую оплату
1. Откройте на смартфоне ссылку https://testpay.alfabank.ru/sbp-page и нажмите Сканировать QR
2. Наведите камеру смартфона на QR-код
3. Нажмите Произвести оплату.
Готово: оплата на тестовом контуре выполнена. Переходить в выбор банков не надо.
{"command":"GetQRCd","TermNo":"30000018","qrcType":"01","amount":"100","currency":"RUB","paymentPurpose"
12/23/25, 11:20 AM Главная
https://alfabank.ru/sme/payservice/sbp/docs/welcome/ 6/7
https://testpay.alfabank.ru/sbp-page
Получение статуса платежа по QR-коду, который уже оплачен
Получить статус платежа по QR-коду можно с помощью запроса GetQRCstatus или callback-уведомления от ПШ.
Запрос GetQRCstatus позволяет получить статус по оплаченному динамическому QR-коду, кассовой платёжной ссылке или при опла
Callback-уведомление уходит по оплаченному статическому и динамическому QR-коду, по кассовой платёжной ссылке или при опла
Чтобы получать callback-уведомления, торгово-сервисному предприятию (далее — ТСП) необходимо направить на email acquiring@alf
Сервер на стороне ТСП должен быть публичным, иметь протокол HTTPS и 443 порт.
Адреса, с которых ПШ отправляет callback-уведомления: 217.12.97.124, 217.12.101.32.
Дополнительная информация по вызову метода GetQRCstatus
• В интеграционном тестовом окружении для метода GetQRCstatus введено ограничение частоты запросов: не более 4 запросов в м
• Ограничение введено в связи с лимитами на стороне НСПК (Национальная система платёжных карт): общий лимит — 60 запросов в
• Чтобы исключить паразитический/избыточный трафики обеспечить стабильность работы тестового контура, мы выделили для да
• При превышении лимита запросы будут отвергаться кодом 429 (Too Many Requests).
Переход на промышленную среду
Чтобы перейти на промышленную среду, необходимо заключить сделку по СБП с Альфа-Банком и запросить боевые доступы — для
Пример письма есть в разделе Аутентификация на промышленной среде
Срок, за который банк предоставит боевые данные, — до трёх рабочих дней.
12/23/25, 11:20 AM Главная
https://alfabank.ru/sme/payservice/sbp/docs/welcome/ 7/7
mailto:acquiring@alfabank.ru
]]>
<_2_general_provisions_md>
<_3_static_QR_cods_md>
<_4_dynamic_QR_cods_md>
<_5_cache_payment_link_SBP_md>
<_6_link_account_subscription_SBP_md>
<_7_digital_rubble_md>
)
status String (an‐20) o Статус платежа на ПлЦР
• если заполнено значение настройки ACWPstatusDR, то передаётся значение, указанное
• «RCVD» — Перевод УПК в процессе обработки
amount String (an‐1…12) o Сумма платежа в рублях с копейками
timestamp YYYY-MM-DDThh:mm:ss[.SSS] o Дата и время исполнения распоряжения на ПлЦР
payrrn String (n‐12) y Референсный номер платежа
BatchId String (n‐4…8) y Уникальный идентификатор смены (если смена терминала открыта)
TermNo String (an‐20) y Уникальный идентификатор терминала в AWGW
CreditDatePos String (ans 1‐256) y Дата операции, установленная Банком Получателя в ходе обработки уведомления НСПК (опре
merchantName ? y Наименование ТСП
purpose String (ans‐210 y Назначение платежа
b) Примерный формат запроса:
8 "accountDR": "g.ab.cbrdc.wlt.clt.abcd0123-ab12-4a12-89ab-abcdef01234G",
9 "status": "UPDATED",
10 "merchantId": "MA0000020651"
11 }
{
"ErrorCode": "Код ответа",
"message": "Расшифровка кода ответа"
}
1 {
2 "command": "paymentDR/notification",
3 "uniQrId": "AD2000670LSS7DN18SJQDNP4B05KLJL1",
4 "operationId": "546464AX45546",
5 "status": "ACWP",
6 "amount": "10241.21",
7 "timestamp": "2024-08-01T10:15:00.000Z",
8 "payrrn": "102345678912",
9 "BatchId": "998844",
10 "TermNo": "90080567",
11 "CreditDatePos": "20240802",
12 "merchantName": "Рога и Копыта",
12/23/25, 11:24 AM Цифровой рубль
https://alfabank.ru/sme/payservice/sbp/docs/digital-rub/?rp-menuOpen=1 12/13
В ответ ожидается:
• http-код «200» — Успешный ответ (Уведомление получено)
• http-код «500» — Внутренняя ошибка
13 "purpose": "Кофе и булочка"
14 }
12/23/25, 11:24 AM Цифровой рубль
https://alfabank.ru/sme/payservice/sbp/docs/digital-rub/?rp-menuOpen=1 13/13
]]>
<_8_additional_methods_API_md>
<_9_appendix_md>
1 Внутренняя ошибка <...>
3 Не заполнены данные: <...>
8 Таймаут ответа, попробуйте позже
26 Ошибка идентификации
28 Запрос QR-кода не удался, не был получен Идентификатор QR-кода
301 Некорректно заполнены данные данные: <...>
100 Ошибка во время выполнения SQL-запроса для поиска AccountDR для TermNo=
101 Ошибка во время выполнения SQL-запроса для проверки isUniQR для QrcId =
999* Неизвестная ошибка. Необходимо уточнить статус операции
Ошибки по методу GetQRCstatus
Код Описание
-1 Возникли проблемы при обработке запроса: <...>
1 Внутренняя ошибка <...>
12/23/25, 11:25 AM Приложения
https://alfabank.ru/sme/payservice/sbp/docs/additional/?rp-menuOpen=1 5/8
Код Описание
2 Терминал <номер терминала> не обнаружен
4 Не передан qrcId или payrrn
5 Не получены данные от СПБ
8 Таймаут ответа, попробуйте позже
9 Ошибка идентификации, попробуйте позже
16 Не передан параметр TermNo
18 Платеж не найден в запросах B07,B23 <...>
25 Терминал <номер терминала> заблокирован
999* Неизвестная ошибка. Необходимо уточнить статус операции.
Ошибки по методу GetQRCreversalData
Код Описание
-1 Возникли проблемы при обработке запроса: <текст с более подробным описанием ошибки>
1 Внутренняя ошибка <текст с более подробным описанием ошибки>
2 Терминал <номер терминала> не обнаружен
3 Не заполнены данные: <текст с более подробным описанием ошибки>
8 Таймаут ответа, попробуйте позже
12 Не найдены данные для возврата
16 Не передан параметр TermNo
20 Получен отказ на запрос возврата. Статус <статус и при наличии код с текстом ошибки>
21 Не удалось получить получателя перевода
22 payrrn=<значение payrrn> в запросе не соответствует данным qrcId=<значение qrcId> у которого payrrn=<значение payrrn>
23 Возврат невозможен для указанных параметров. Для payrrn=<значение payrrn> соответствует trxId=<значение trxId>, а в запросе получен <значение trxId>
24 Возврат невозможен для указанных параметров. Для qrcId=<значение qrcId> соответствует trxId=<значение trxId>, а в запросе получен <значение trxId>
25 Терминал <номер терминала> заблокирован
27 Невозможно выполнить возврат по данному Терминалу, т.к. счёт зачисления не равен счёту списания
29 Возврат невозможен. Для qrcId=<значение qrcId> не удалось найти успешный ответ на запрос GetQRCstatus
40 Возврат невозможен. Для payrrn=<значение payrrn> не удалось найти успешный ответ на запрос GetQRCstatus
1001 Превышено количество повторных запросов возврата B2C
Ошибки по методу QRCreversal
Код Описание
-1 Возникли проблемы при обработке запроса: <текст с более подробным описанием ошибки>
1 Внутренняя ошибка <текст с более подробным описанием ошибки>
12/23/25, 11:25 AM Приложения
https://alfabank.ru/sme/payservice/sbp/docs/additional/?rp-menuOpen=1 6/8
Код Описание
2 Терминал <номер терминала> не обнаружен
3 Не заполнены данные: <текст с более подробным описанием ошибки>
8 Таймаут ответа, попробуйте позже
12 Не найдены данные для возврата
13 Не найден успешный ответ на вызов GetQRCreversalData
16 Не передан параметр TermNo
20 Получен отказ на запрос возврата. Статус <статус и при наличии код с текстом ошибки>
21 Не удалось получить получателя перевода
22 payrrn=<значение payrrn> в запросе не соответствует данным qrcId=<значение qrcId> у которого payrrn=<значение payrrn>
23 Возврат невозможен для указанных параметров. Для payrrn=<значение payrrn> соответствует trxId=<значение trxId>, а в запросе получен <значение trxId>
24 Возврат невозможен для указанных параметров. Для qrcId=<значение qrcId> соответствует trxId=<значение trxId>, а в запросе получен <значение trxId>
25 Терминал <номер терминала> заблокирован
27 Невозможно выполнить возврат по данному Терминалу, т.к. счёт зачисления не равен счёту списания
40 Возврат невозможен. Для payrrn=<значение payrrn> не удалось найти успешный ответ на запрос GetQRCstatus
201 Получен отказ на запрос возврата. Статус <статус>, недостаточно средств на счёте
999* Неизвестная ошибка. Необходимо уточнить статус операции
Ошибки по методу ActivateCashQRc
Код Описание
-1 Возникли проблемы при обработке запроса: <текст с более подробным описанием ошибки>
1 Внутренняя ошибка <...>
2 Терминал <номер терминала> не обнаружен
3 Не заполнены данные: <...>
8 Таймаут ответа, попробуйте позже
16 Не передан параметр TermNo
25 Терминал <номер терминала> заблокирован
28 Запрос QR-кода не удался, не был получен Идентификатор QR-кода
41 При активации кассовой ссылки не удалось получить paramsId
44 Кассовая ссылка зарегистрирована на устройстве #'<номер терминала>' и может быть использована только на этом устройстве
301 Некорректно заполнены данные данные: <...>
999* Неизвестная ошибка. Необходимо уточнить статус операции
Коды ответов, направляемые в callback-уведомлении по сценарию «Оплата с привязанного счёта» по методу «resolution
/notification»
12/23/25, 11:25 AM Приложения
https://alfabank.ru/sme/payservice/sbp/docs/additional/?rp-menuOpen=1 7/8
ErrorCode message
«RQ05031» Отказ Банка Плательщика. Привязка счёта не найдена
«RQ05032» Отказ Банка Плательщика в проведении платежа
«RQ05060» Недостаточно денежных средств для проведения операции
«RQ05061» Превышен лимит по сумме операций по СБП
«RQ05062» Превышен лимит по количеству операций по СБП
«RQ05063» Подозрение в мошенничестве
«RQ05064» Выполнение операций в данной категории ТСП запрещено
«RQ05065» Счёт заблокирован
«RQ05066» Счёт закрыт
«RQ05067» Выполнение операции запрещено по требованию законодательства
Примечание: Применение кода ответа «RQ05032» допускается не более, чем в 20% от общего числа отказов со стороны Банка
Плательщика при выполнении Сценария «Оплата с привязанного счёта».
Приложение 3. Пояснение для колонки «required»
«y» — «Yes» обязательное;
«o» — «Optional» (опционально);
«y/o» — «Условно обязательное» определяется условиями запроса.
Приложение 4. Пояснение для колонки «Тип данных»
Нотация Описание
a Символы латинского алфавита (A–Z и a–z) с десятичными кодами из диапазонов [065-090] и [097-122] в кодировке UTF-8;
Символы русского алфавита (А-Я и а-я) с десятичными кодами из диапазона [1040-1103] в кодировке UTF-8.
n Цифры 0-9 с десятичными кодами из диапазона [048-057] в кодировке UTF-8.
an Символы латинского алфавита (A–Z и a–z) с десятичными кодами из диапазонов [065-090] и [097-122] в кодировке UTF-8;
Символы русского алфавита (А-Я и а-я) с десятичными кодами из диапазона [1040-1103] в кодировке UTF-8;
Цифры 0-9 с десятичными кодами из диапазона [048-057] в кодировке UTF-8.
ans Символы латинского алфавита (A–Z и a–z) с десятичными кодами из диапазонов [065-090] и [097-122] в кодировке UTF-8;
Символы русского алфавита (А-Я и а-я) с десятичными кодами из диапазона [1040-1103] в кодировке UTF-8;
Цифры 0-9 с десятичными кодами из диапазона [048-057] в кодировке UTF-8;
Специальные символы с десятичными кодами из диапазонов [032-047], [058-064], [091-096], [123-126] в кодировке UTF-8;
Символ «№» под номером 8470 в кодировке UTF-8.
12/23/25, 11:25 AM Приложения
https://alfabank.ru/sme/payservice/sbp/docs/additional/?rp-menuOpen=1 8/8
]]>