--- swagger: '2.0' info: title: API для фискализации чеков contact: { email: ecom@raiffeisen.ru, name: Support e-mail } x-logo: url: images/raifflogo.png backgroundColor: '#FFFFFF' altText: Raiff logo tag: general description: | Свои предложения и идеи о документации можно оставить в репозитории по адресу: https://github.com/Raiffeisen-DGTL/ecom-API/blob/master/fiscal.yml # Оплата по 54-ФЗ По закону от 22.05.2003 № 54–ФЗ "О применении контрольно-кассовой техники при осуществлении расчетов в Российской Федерации" при оплате товаров, работ или услуг необходимо формировать фискальный чек и отправлять его в налоговую с помощью кассы. # Общая схема работы Схема работы: # Подключение онлайн-кассы Услуга фискализации чеков через онлайн-кассу доступна для клиентов банка, подключивших один из продуктов: * Интернет-эквайринг * СБП (только для оплаты на сайте) ## OFD.ru 1. Подключите онлайн-кассу в сервисе [OFD.ru](https://raiffeisen.ofd.ru/) 2. Зарегистрируйте кассу в ФНС через сервис Ferma [по инструкции](https://static.ofd.ru/mail/2020/03/code_activate_and_promocode.pdf) 3. Составьте заявку на подключение В заявке необходимо указать данные: * Поставщик кассового оборудования – OFD.ru * Идентификаторы мерчантов (publicId) * Применяемая система налогообложения * E-mail (для получения чека, если E-mail не указан покупателем) * Логин, пароль и идентификатор группы ККТ от OFD.ru (см. ниже) Для получения данных по подключенной кассе в OFD.ru перейдите в раздел Ferma в [личном кабинете клиента](https://lk.ofd.ru/ferma/dashboard) и пролистайте до виджета "Реквизиты доступа". Скопируйте логин, пароль и идентификатор группы ККТ для подключения. 4. Отправьте заявку в банк одним из способов: * По E-mail ecom@raiffeisen.ru. Пример заявки доступнен при нажатии на E-mail * Через менеджера банка. Для этого отправьте ему безопасным способом необходимые для подключения данные. ## АТОЛ Онлайн 1. Зарегистрируйтесь в сервисе ["АТОЛ Онлайн"](https://online.atol.ru/lk/Account/Register?partnerUid=18583cd5-dae2-4fb1-a98b-f4b80d891eb0) и подключите онлайн-кассу 2. Заключите договор с [оператором фискальных данных](https://www.nalog.gov.ru/rn77/related_activities/registries/fiscaloperators/) 3. Составьте заявку на подключение В заявке необходимо указать данные: * Поставщик кассового оборудования – "АТОЛ Онлайн" * Идентификаторы мерчантов (publicId) * Применяемая система налогообложения * E-mail (для получения чека, если E-mail не указан покупателем) * Логин, пароль и идентификатор группы ККТ от "АТОЛ Онлайн" (см. ниже) Чтобы получить логин, пароль и идентификатор, зайдите в [личный кабинет "АТОЛ Онлайн"](https://online.atol.ru/lk/Account/Login). Выберите раздел "Мои компании", нажмите кнопку "Настройки интегратора". Скачается XML-файл с настройками, найдите в файле элемент access, в нём будут все три параметра: login, password, group_code. Если возникли трудности, обратитесь в техподдержку "АТОЛ Онлайн". 4. Отправьте заявку в банк одним из способов: * По E-mail ecom@raiffeisen.ru. Пример заявки доступнен при нажатии на E-mail * Через менеджера банка. Для этого отправьте ему безопасным способом необходимые для подключения данные. ## Чек-Онлайн 1. Зарегистрируйтесь в сервисе ["Чек-Онлайн"](https://www.chekonline.ru) и подключите онлайн-кассу 2. Заключите договор с [оператором фискальных данных](https://www.nalog.gov.ru/rn77/related_activities/registries/fiscaloperators/) 3. Составьте заявку на подключение В заявке необходимо указать данные: * Поставщик кассового оборудования – "Чек-Онлайн" * Идентификаторы мерчантов (publicId) * Применяемая система налогообложения * E-mail (для получения чека, если E-mail не указан покупателем) * Логин, пароль и идентификатор группы ККТ от "Чек-Онлайн" (см. ниже) Чтобы получить логин и пароль, зайдите в [личный кабинет клиента](https://cabinet.chekonline.ru/Account/Login). Откройте раздел "Предприятия", найдите в списке нужную компанию и нажмите на иконку в поле "Авторизация". Откроется раздел, в котором можно выбрать существующие логин и пароль или сгенерировать новые. Для получения идентификатора группы ККТ вернитесь в раздел "Предприятия" и выберите нужную компанию из списка. В открывшемся профиле предприятия скопируйте API Group ID. 4. Отправьте заявку в банк одним из способов: * По E-mail ecom@raiffeisen.ru. Пример заявки доступнен при нажатии на E-mail * Через менеджера банка. Для этого отправьте ему безопасным способом необходимые для подключения данные. servers: - url: https://e-commerce.raiffeisen.ru/api description: Production API - url: https://test.ecom.raiffeisen.ru/api description: Sandbox API x-tagGroups: - name: API tags: - authorization - fiscal-controller - name: Ошибки tags: - errors - name: Версионирование tags: - doc-changelog tags: - name: authorization x-displayName: 'Авторизация' description: | Для успешной авторизации необходимо использовать: * secretKey - секретный ключ, который используется для межсервисного взаимодействия. Данный ключ мерчант получает при регистрации. BАЖНО: Секретный ключ необходимо хранить в защищенном месте, нельзя публиковать на сторонних ресурсах или передавать третьим лицам. Межсервисные запросы авторизуются посредством секретного ключа API (SECRET_KEY). Параметр авторизации указывается в заголовке Authorization, значение которого формируется как "Bearer SECRET_KEY". - name: fiscal-controller x-displayName: 'Методы API' description: | Для фискализации чеков через партнёра Райффайзенбанк предоставляет API из следующих запросов: * Сохранение чека * Регистрация чека * Получение статуса чека Bзаимодействие осуществляется по протоколу HTTP с использованием методов POST, PUT, GET. В описании каждого запроса явно указаны требуемые метод, адрес и параметры. POST-запросы используют JSON-структуру, PUT- и GET-запросы работают со строками запросов. Ответ любого метода возвращает HTTP-код. Если при обработке запроса происходит ошибка, API дополнительно возвращает ее описание. - name: errors x-displayName: 'Справочник ошибок' description: | Ответ любого метода содержит код сообщения (code). Если в процессе обработки любого запроса произойдет логическая ошибка, API вернет описание ошибки (message). Описание основных ошибок: code | message ------------|------ FISCAL_CLIENT_NOT_FOUND | Фискальный клиент {value} не найден MERCHANT_NOT_FOUND | Мерчант с publicId = {value} не зарегистрирован в сервисе CREDENTIALS_NOT_FOUND | Учетные данные ОФД для мерчанта с publicId = {value} не найдены RECEIPT_TYPE_NOT_SUPPORTED | Регистрация чеков типа {value} не поддерживается RECEIPT_VALIDATION_FAILED | Чек не прошел валидацию. Причина: {value} RECEIPT_NOT_FOUND | Чек с id = {value} не найден RECEIPT_STATUS_CONFLICT | Чек {value} в статусе {value}, действие невозможно TOKEN_REQUEST_FAILED | Не удалось получить токен для отправки чека в ОФД RECEIPT_REGISTRATION_FAILED | Не удалось зарегистрировать чек {value} STATUS_REQUEST_FAILED | Не удалось запросить статус чека ofdId = {value} мерчанта с publicId = {value} - name: doc-changelog x-displayName: 'История изменений' description: | ## 07.07.2021 Первая версия документа ## 13.07.2021 * Добавлена диаграмма последовательности * Описаны методы и параметры API * Приведен справочник ошибок * Добавлено описание ошибок для каждого метода ## 28.07.2021 * Обновлено описание методов API * Изменена обязательность параметра для имени покупателя (client/name) * Добавлено описание ошибки 400 Bad Request * Дополнен справочник ошибок ## 11.08.2021 * Обновлен справочник ошибок * Скорректировано описание методов API ## 20.08.2021 * Изменено ограничение для параметра "Номер чека" (receiptNumber) со 128 символов до 99 * Добавлен новый параметр "Признак предмета расчета" (paymentObject) на уровне позиции чека * Актуализирована статусная модель * Скорректировано описание отдельных параметров API ## 20.09.2021 * В POST-запросе на создание (обновление) чека объект vat заменен на строковый параметр vatType * В ответе на POST-запрос на создание (обновление) чека объект vat заменен на строковый параметр vatType * В инструкцию добавлен поставщик кассового оборудования OFD.RU * Скорректировано описание параметра nomenclatureCode ## 06.10.2021 * Добавлен поставщик кассового оборудования "Чек-Онлайн" * Инструкция по подключению фискализации разделена по поставщикам кассовых решений * Обновлена структура документа paths: /fiscal/v1/receipts/sell: post: tags: - fiscal-controller summary: Сохранение чека прихода operationId: postSell description: Метод предназначен для создания нового чека прихода с указанным receiptNumber. Также позволяет обновить уже существующий чек прихода при повторном запросе с тем же receiptNumber. Метод возвращает тело чека, а также его тип и статус в дополнительных параметрах ответа. consumes: - application/json;charset=UTF-8 produces: - application/json;charset=UTF-8 parameters: - in: header name: Authorization type: string description: Bearer secret key required: true - in: body name: Receipt required: true schema: "$ref": "#/definitions/Receipt" responses: "200": description: Ответ с успешным результатом schema: "$ref": "#/definitions/Response" "400": description: Ответ с неуспешным результатом schema: "$ref": "#/definitions/Error400" "403": description: Ответ с неуспешным результатом schema: "$ref": "#/definitions/Error403" "409": description: Ответ с неуспешным результатом schema: "$ref": "#/definitions/Error409" deprecated: false x-codeSamples: - lang: 'cURL' source: | curl --location --request POST 'https://test.ecom.raiffeisen.ru/api/fiscal/v1/receipts/sell' \ --header 'content-type: application/json' \ --header 'Authorization: Bearer eyJ0eXA***' \ --data-raw' { "receiptNumber": 3000827351831, "client": { "email": "customer@domain.ru", "name": "Иванов Иван Иванович" }, "items": [ { "name": "Шоколадные конфеты", "price": 600.00, "quantity": 2, "amount": 1200.00, "paymentObject": "commodity", "measurementUnit": "кг", "nomenclatureCode": "00 00 00 00 12 00 AB 00", "vatType": "vat20" }, { "name": "Вода минеральная 1л", "price": 120.00, "quantity": 20, "amount": 2400.00, "paymentObject": "commodity", "measurementUnit": "шт", "vatType": "vat20" } ], "total": 3600.00 }' /fiscal/v1/receipts/sell/{receiptNumber}: put: tags: - fiscal-controller summary: Регистрация чека прихода operationId: putSell description: > Метод предназначен для отправки чека прихода на регистрацию в ОФД. Метод возвращает тело чека, а также его тип и статус в дополнительных параметрах ответа. После отправки чека на регистрацию он будет недоступен для редактирования. produces: - application/json;charset=UTF-8 parameters: - in: path name: receiptNumber type: string description: Уникальный номер чека maxLength: 99 required: true - in: header name: Authorization type: string description: Bearer secret key required: true responses: "200": description: Ответ с успешным результатом schema: "$ref": "#/definitions/Response" "403": description: Ответ с неуспешным результатом schema: "$ref": "#/definitions/Error403" "404": description: Ответ с неуспешным результатом schema: "$ref": "#/definitions/Error404" "409": description: Ответ с неуспешным результатом schema: "$ref": "#/definitions/Error409" "500": description: Ответ с неуспешным результатом schema: "$ref": "#/definitions/Error500" deprecated: false x-codeSamples: - lang: 'cURL' source: | curl --location --request PUT 'https://test.ecom.raiffeisen.ru/api/fiscal/v1/receipts/sell/3000827351831' \ --header 'Authorization: Bearer eyJ0eXA***' get: tags: - fiscal-controller summary: Получение статуса чека прихода operationId: getSellStatus description: > Метод предназначен для получения актуального статуса чека прихода. Чек может принимать один из четырех статусов: * "NEW" – чек создан и может быть отредактирован перед отправкой на регистрацию, * "IN_PROGRESS" – чек в процессе регистрации, * "DONE" – чек успешно зарегистрирован, * "FAILED" – при регистрации чека возникла ошибка, * "AWAITING" – чек в ожидании отправки на регистрацию (технический статус). Метод возвращает тело чека, а также его тип и статус в дополнительных параметрах ответа. produces: - application/json;charset=UTF-8 parameters: - in: path name: receiptNumber type: string description: Уникальный номер чека maxLength: 99 required: true - in: header name: Authorization type: string description: Bearer secret key required: true responses: "200": description: Ответ с успешным результатом schema: "$ref": "#/definitions/Response" "403": description: Ответ с неуспешным результатом schema: "$ref": "#/definitions/Error403" "404": description: Ответ с неуспешным результатом schema: "$ref": "#/definitions/Error404" deprecated: false x-codeSamples: - lang: 'cURL' source: | curl --location --request GET 'https://test.ecom.raiffeisen.ru/api/fiscal/v1/receipts/sell/3000827351831' \ --header 'Authorization: Bearer eyJ0eXA***' /fiscal/v1/receipts/refund: post: tags: - fiscal-controller summary: Сохранение чека возврата operationId: postRefund description: > Метод предназначен для создания нового чека возврата с указанным receiptNumber. Также позволяет обновить уже существующий чек возврата при повторном запросе с тем же receiptNumber. Метод возвращает тело чека, а также его тип и статус в дополнительных параметрах ответа. consumes: - application/json;charset=UTF-8 produces: - application/json;charset=UTF-8 parameters: - in: header name: Authorization type: string description: Bearer secret key required: true - in: body name: Receipt required: true schema: "$ref": "#/definitions/Receipt" responses: "200": description: Ответ с успешным результатом schema: "$ref": "#/definitions/Response" "400": description: Ответ с неуспешным результатом schema: "$ref": "#/definitions/Error400" "403": description: Ответ с неуспешным результатом schema: "$ref": "#/definitions/Error403" "409": description: Ответ с неуспешным результатом schema: "$ref": "#/definitions/Error409" deprecated: false x-codeSamples: - lang: 'cURL' source: | curl --location --request POST 'https://test.ecom.raiffeisen.ru/api/fiscal/v1/receipts/refund' \ --header 'content-type: application/json' \ --header 'Authorization: Bearer eyJ0eXA***' \ --data-raw' { "receiptNumber": 3000827351831, "client": { "email": "customer@domain.ru", "name": "Иванов Иван Иванович" }, "items": [ { "name": "Шоколадные конфеты", "price": 600.00, "quantity": 2, "amount": 1200.00, "paymentObject": "commodity", "measurementUnit": "кг", "nomenclatureCode": "00 00 00 00 12 00 AB 00", "vatType": "vat20" }, { "name": "Вода минеральная 1л", "price": 120.00, "quantity": 20, "amount": 2400.00, "paymentObject": "commodity", "measurementUnit": "шт", "vatType": "vat20" } ], "total": 3600.00 }' /fiscal/v1/receipts/refund/{receiptNumber}: put: tags: - fiscal-controller summary: Регистрация чека возврата operationId: putRefund description: > Метод предназначен для отправки чека возврата на регистрацию в ОФД. Метод возвращает тело чека, а также его тип и статус в дополнительных параметрах ответа. После отправки чека на регистрацию он будет недоступен для редактирования. produces: - application/json;charset=UTF-8 parameters: - in: path name: receiptNumber type: string description: Уникальный номер чека maxLength: 99 required: true - in: header name: Authorization type: string description: Bearer secret key required: true responses: "200": description: Ответ с успешным результатом schema: "$ref": "#/definitions/Response" "403": description: Ответ с неуспешным результатом schema: "$ref": "#/definitions/Error403" "404": description: Ответ с неуспешным результатом schema: "$ref": "#/definitions/Error404" "409": description: Ответ с неуспешным результатом schema: "$ref": "#/definitions/Error409" "500": description: Ответ с неуспешным результатом schema: "$ref": "#/definitions/Error500" deprecated: false x-codeSamples: - lang: 'cURL' source: | curl --location --request PUT 'https://test.ecom.raiffeisen.ru/api/fiscal/v1/receipts/refund/3000827351831' \ --header 'Authorization: Bearer eyJ0eXA***' get: tags: - fiscal-controller summary: Получение статуса чека возврата operationId: getRefundStatus description: > Метод предназначен для получения актуального статуса чека возврата. Чек может принимать один из четырех статусов: * "NEW" – чек создан и может быть отредактирован перед отправкой на регистрацию, * "IN_PROGRESS" – чек в процессе регистрации, * "DONE" – чек успешно зарегистрирован, * "FAILED" – при регистрации чека возникла ошибка, * "AWAITING" – чек в ожидании отправки на регистрацию (технический статус). Метод возвращает тело чека, а также его тип и статус в дополнительных параметрах ответа. produces: - application/json;charset=UTF-8 parameters: - in: path name: receiptNumber type: string description: Уникальный номер чека maxLength: 99 required: true - in: header name: Authorization type: string description: Bearer secret key required: true responses: "200": description: Ответ с успешным результатом schema: "$ref": "#/definitions/Response" "403": description: Ответ с неуспешным результатом schema: "$ref": "#/definitions/Error403" "404": description: Ответ с неуспешным результатом schema: "$ref": "#/definitions/Error404" deprecated: false x-codeSamples: - lang: 'cURL' source: | curl --location --request GET 'https://test.ecom.raiffeisen.ru/api/fiscal/v1/receipts/refund/3000827351831' \ --header 'Authorization: Bearer eyJ0eXA***' definitions: Receipt: type: object required: - receiptNumber - client - items - total properties: receiptNumber: type: string description: Уникальный номер чека. Создается на стороне мерчанта. Формат A-Za-z0-9_- maxLength: 99 example: 3000827351831 client: type: object required: - email description: Данные о покупателе properties: email: type: string description: Электронный адрес покупателя для отправки чека. Заполняется по формату E-mail maxLength: 64 example: customer@domain.ru name: type: string description: ФИО покупателя maxLength: 256 example: Иванов Иван Иванович items: type: array description: Позиции чека items: type: object required: - name - price - quantity - amount - vatType properties: name: type: string description: Наименование товара, работы, услуги, иного предмета расчета maxLength: 128 example: Шоколадные конфеты price: type: bigDecimal (8, 2) description: Цена за единицу товара, работы, услуги, иного предмета расчета в рублях example: 1000.00 quantity: type: bigDecimal (5, 3) description: Количество/вес example: 1.2 amount: type: bigDecimal (8, 2) description: Сумма в рублях. Должна равняться произведению цены на количество (price * quantity) example: 1200.00 paymentObject: type: string description: Признак предмета расчета. Если параметр не передан, то заполняется на стороне выбранного ОФД в соответствии с установленным протоколом enum: - commodity - excise - job - service - payment - another example: commodity measurementUnit: type: string description: Единица измерения товара, работы, услуги, иного предмета расчета maxLength: 16 example: кг nomenclatureCode: type: string description: Номенклатурный код товара в 16-ричном представлении с пробелами или в формате GS1. Например, "00 00 00 00 12 00 AB 00" или "010463003407001221CMK45BrhN0WLf" maxLength: 150 example: 00 00 00 00 12 00 AB 00 vatType: type: string description: Ставка НДС на позицию чека enum: - none - vat0 - vat10 - vat110 - vat20 - vat120 example: vat20 total: type: bigDecimal (8, 2) description: Итоговая сумма чека в рублях example: 1200.00 title: Receipt Response: type: object required: - receiptNumber - receiptType - status - client - items - total properties: receiptNumber: type: string description: Уникальный номер чека. Создается на стороне мерчанта. Формат A-Za-z0-9_- maxLength: 99 example: 3000827351831 receiptType: type: string description: Тип чека (чек прихода, чек возврата) enum: - SELL - REFUND example: SELL status: type: string description: Статус регистрации чека enum: - NEW - IN_PROGRESS - DONE - FAILED - AWAITING example: NEW client: type: object required: - email description: Данные о покупателе properties: email: type: string description: Электронный адрес покупателя для отправки чека. Заполняется по формату E-mail maxLength: 64 example: customer@domain.ru name: type: string description: ФИО покупателя maxLength: 256 example: Иванов Иван Иванович items: type: array description: Позиции чека items: type: object required: - name - price - quantity - amount - vatType properties: name: type: string description: Наименование товара, работы, услуги, иного предмета расчета maxLength: 128 example: Шоколадные конфеты price: type: bigDecimal (8, 2) description: Цена за единицу товара, работы, услуги, иного предмета расчета в рублях example: 1000.00 quantity: type: bigDecimal (5, 3) description: Количество/вес example: 1.2 amount: type: bigDecimal (8, 2) description: Сумма в рублях. Должна равняться произведению цены на количество (price * quantity) example: 1200.00 paymentObject: type: string description: Признак предмета расчета. Если параметр не передан, то заполняется на стороне выбранного ОФД в соответствии с установленным протоколом enum: - commodity - excise - job - service - payment - another example: commodity measurementUnit: type: string description: Единица измерения товара, работы, услуги, иного предмета расчета maxLength: 16 example: кг nomenclatureCode: type: string description: Номенклатурный код товара в 16-ричном представлении с пробелами или в формате GS1. Например, "00 00 00 00 12 00 AB 00" или "010463003407001221CMK45BrhN0WLf" maxLength: 150 example: 00 00 00 00 12 00 AB 00 vatType: type: string description: Ставка НДС на позицию чека enum: - none - vat0 - vat10 - vat110 - vat20 - vat120 example: vat20 total: type: bigDecimal (8, 2) description: Итоговая сумма чека в рублях example: 1200.00 title: Response Error400: type: object properties: code: type: string description: Код ошибки example: 'RECEIPT_VALIDATION_FAILED' message: type: string description: Описание ошибки example: 'Чек не прошел валидацию. Причина: {value}' title: Error400 Error403: type: object properties: code: type: string description: Код ошибки example: 'MERCHANT_NOT_FOUND' message: type: string description: Описание ошибки example: 'Мерчант с publicId = {value} не зарегистрирован в сервисе' title: Error403 Error404: type: object properties: code: type: string description: Код ошибки example: 'RECEIPT_NOT_FOUND' message: type: string description: Описание ошибки example: 'Чек с id = {value} не найден' title: Error404 Error409: type: object properties: code: type: string description: Код ошибки example: 'RECEIPT_STATUS_CONFLICT' message: type: string description: Описание ошибки example: 'Чек {value} в статусе {value}, действие невозможно' title: Error409 Error500: type: object properties: code: type: string description: Код ошибки example: 'RECEIPT_REGISTRATION_FAILED' message: type: string description: Описание ошибки example: 'Не удалось зарегистрировать чек {value}' title: Error500