# API для продавца

Важно!

Приступать к интеграции с системой Mandarin следует только после согласования бизнес-процесса взаимодействия между представителями бизнес-подразделений магазина и клиентским менеджером или Руководителем проекта (в случае реализации совместного проекта по интеграции) со стороны Mandarin.

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

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

# Введение

# Адреса для отправки запросов

# Получение ApiKey

API ключ для подключения передается через клиентского менеджера или Руководителя проекта (в случае реализации совместного проекта по интеграции) со стороны Mandarin.

Изначально выдается ApiKey от тестового контура.

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

# Основные методы API

# Проверка правильности формирования запросов

Корректность формируемого запроса можно проверить с помощью сервиса https://www.jsonschemavalidator.net/

# Отправка данных заказа

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

В ответ на запрос данного метода вернется ApplicationID, по которому нужно вызвать анкету Mandarin по следующющей ссылке home/uforms?applicationId=полученный при запросе ApplicationID

Проверки, осуществляемые Mandarin при приеме данных:

  1. Amount = Price × Quantity
  2. AmountWithDiscount = PriceWithDiscount × Quantity
  3. Amount ≥ AmountWithDiscount

Если значение параметра «DeliveryCost» не равно нулю, то в составе корзины (массив «Cart») создается элемент со следующими параметрами:

  • Category: «Прочее»
  • ProductID: «Delivery»
  • Price: значение параметра «DeliveryCost»
  • PriceWithDiscount: значение параметра «DeliveryCost»
  • ProductName: «Доставка»
  • Quantity: 1

Все суммы указываются в копейках.

По окончанию обработки заявки, в зависимости от ее результата происходит переход на страницу магазина, указанную в параметрах CallBackURLsuccess или CallBackURLfail

Важно! Следующие параметры JSON запроса согласовываются представителями бизнеса магазина с клиентским менеджером или Руководителем проекта (в случае реализации совместного проекта по интеграции) со стороны Mandarin. При их неверной передаче правильность взаимодействия в рамках бизнес-процесса не гарантируется.

Параметр Обязателен Описание
ProductName Да Название
InitialFee Сумма первоначального взноса, в случае передачи данный параметр будет по умолчанию установлен на экране калькулятора.
InitialFeeInStore параметр, определяющий, где будет происходить взимание первоначального взноса - в магазина, через Mandarin или первоначальный взнос не предусмотрен (в этом случае клиент не сможет указать первоначальный взнос на экране калькулятора)
DeliveryCost стоимость доставки
DeliveryCostUse параметр определяющий использование стоимости доставки - ничего не делать, включить в сумму кредита, назначить к оплате через Mandarin с карты клиента.
CallBackURLsuccess страница, на которую будет переведен клиент после одобрения кредита.
CallBackURLfail страница, на которую будет переведен клиент в случае отказа в кредите.
PriceWithDiscount аналогично AmountWithDiscount , но для отдельного товара.
LoanTerm Срок кредита по умолчанию, в случае передачи данный параметр будет по умолчанию установлен на экране калькулятора.
ClientCanChangeTerm параметр, определяющий, сможет ли клиент изменять срок кредита на экране калькулятора.
SigningByTheStore параметр, определяющий кем будет осуществляться подписание кредитных документов - сотрудниками магазина или сотрудниками Mandarin.
ClientCanChangeInitialFee параметр, определяющий, может ли клиент самостоятельно изменить размер первоначального взноса на экране калькулятора.
PhoneFilling параметр, означающий, что заполнение анкеты клиента необходимо осуществлять по телефону через колл-центр Mandarin. Если указано значение 0, то клиент самостоятельно заполняет анкету. Если указано значение 1, то для заполнения анкеты клиенту перезвонит сотрудник колл-центра. При передаче значения 1 обязательна передача параметра Phone.
AmountWithDiscount данный параметр может быть равен параметру Amount (в случае, если клиенту предоставляется кредит) или меньше его (в случае, если клиенту предоставляется рассрочка) также данные параметры могут быть равны в случаях если клиенту предоставляется рассрочка, но размер дисконта вычисляется на стороне Mandarin.
ListFinOrgToSendApp параметр, определяющий перечень финансовых организаций, в которые должен быть отправлен запрос.

В случае если магазин при передаче запроса не передает название товаров (ProductName) в массиве Cart, по каждому товару автоматически подставляется наименование "Товар".

Пример запроса:

POST https://api.7seconds.ru/api/merch/order
{
     "$schema": "http://json-schema.org/draft-04/schema#",
     "description": "Comment describing your JSON Schema",
     "type": "object",
     "properties": {
         "ApiKey": {
             "description": "Пароль, полученный при регистрации в Mandarin, пароли для тестового и продуктового контуров различаются",
             "type": "string",
             "minLength": 32,
             "maxLength": 32
        },
         "OrderID": {
             "description": "Номер заказа в магазине",
             "type": "string",
             "minLength": 1,
             "maxLength": 16
        },
         "OrderDesc": {
             "description": "Описание заказа",
             "type": "string",
             "minLength": 1,
             "maxLength": 128
        },
         "Amount": {
             "description": "Сумма заказа в копейках без учета скидки магазина (цена которую видит клиент в корзине)",
             "type": "integer",
             "minimum": 1,
             "maximum": 100000000
        },
         "AmountWithDiscount": {
             "description": "Сумма заказа в копейках c учетом скидки магазина (под скидкой понимается размер дисконта магазина для того, чтобы у клиента была рассрочка или пониженная ставка по кредиту). Данная сумма будет в кредитном договоре.",
             "type": "integer",
             "minimum": 1,
             "maximum": 100000000
        },
         "InitialFee": {
             "description": "Сумма первоначального взноса в копейках (Данное значение будет предустановлено на калькуляторе кредита)",
             "type": "integer",
             "minimum": 0,
             "maximum": 100000000
        },
         "InitialFeeInStore": {
             "description": "Параметр, определяющий, где будет производиться оплата первоначального взноса. Если указано значение 1, то клиент должен оплатить первоначальный взнос в магазине, если 2, то оплата первоначального взноса производится через Mandarin посредством карты, если 3, то оплата первоночального взноса не предусмотрена, поле ПВ на калькуляторе будет скрыто.",
             "type": "integer",
             "minimum": 1,
             "maximum": 3
        },
         "DeliveryCost": {
             "description": "Стоимость доставки в копейках, не должна включаться в параметры Amount и AmountWithDiscount",
             "type": "integer",
             "minimum": 0,
             "maximum": 100000000
        },
         "DeliveryCostUse": {
             "description": "Параметр использования стоимости доставки, определяет в зависимости от указанного значения параметра. Значение 1 – ничего не делать с суммой доставки. Значение 2 – включить стоимость доставки в стоимость кредита. Значение 3 – назначить стоимость доставки к оплате через Mandarin посредством карты.",
             "type": "integer",
             "minimum": 1,
             "maximum": 3
        },
         "FirstName": {
             "description": "Имя клиента",
             "type": "string",
             "minLength": 1,
             "maxLength": 128
        },
         "LastName": {
             "description": "Фамилия клиента",
             "type": "string",
             "minLength": 1,
             "maxLength": 128
        },
         "MiddleName": {
             "description": "Отчество клиента",
             "type": "string",
             "minLength": 1,
             "maxLength": 128
        },
         "Email": {
             "description": "Электронная почта клиента",
             "type": "string",
             "minLength": 6,
             "maxLength": 128
        },
         "Phone": {
             "description": "Контактный телефон клиента в формате 7ХХХХХХХХХХ",
             "type": "string",
             "minLength": 1,
             "maxLength": 20
        },
         "Address": {
             "description": "Адрес доставки заказа",
             "type": "string",
             "minLength": 1,
             "maxLength": 512
        },
         "CallBackURLsuccess": {
             "description": "URL для возврата на сайт с анкеты Mandarin при одобрении кредита",
             "type": "string",
             "minLength": 1,
             "maxLength": 512
        },
         "CallBackURLfail": {
             "description": "URL для возврата на сайт с анкеты Mandarin при отказе в кредите",
             "type": "string",
             "minLength": 1,
             "maxLength": 512
        },
         "Cart": {
             "description": "Массив данных о корзине клиента",
             "type": "array",
             "items": {
                 "type": "object",
                 "properties": {
                     "Category": {
                         "description": "Категории товара по классификации магазина",
                         "type": "array",
                         "minItems": 1,
                         "uniqueItems": true,
                         "items": {
                             "description": "Отдельная категория",
                             "type": "string",
                             "minLength": 1,
                             "maxLength": 128
                        }
                    },
                     "ProductID": {
                         "description": "Идентификатор товара в магазине",
                         "type": "string",
                         "minLength": 1,
                         "maxLength": 128
                    },
                     "Price": {
                         "description": "Стоимость единицы товара в копейках без учета скидки,(цена которую видит клиент в корзине)",
                         "type": "integer",
                         "minimum": 1,
                         "maximum": 100000000
                    },
                     "PriceWithDiscount": {
                         "description": "Стоимость единицы товара в копейках c учетом скидки магазина (под скидкой понимается размер дисконта магазина для того, чтобы у клиента была рассрочка или пониженная ставка по кредиту)",
                         "type": "integer",
                         "minimum": 1,
                         "maximum": 100000000
                    },
                     "ProductName": {
                         "description": "Наименование товара",
                         "type": "string",
                         "minLength": 1,
                         "maxLength": 128
                    },
                     "Quantity": {
                         "description": "Количество единиц товара",
                         "type": "integer",
                         "minimum": 1,
                         "maximum": 100
                    }
                },
                 "required": [
                    "Category",
                    "ProductID",
                    "Price",
                    "PriceWithDiscount",
                    "Quantity"
                ],
                 "additionalProperties": false
            }
        },
         "LoanTerm": {
             "description": "Срок кредита, предустановленный на экране калькулятора. Доступный диапазон сроков передается клиентским менеджером",
             "type": "integer",
             "minimum": 1,
             "maximum": 240
        },
         "ClientCanChangeTerm": {
             "description": "Параметр, определяющий, может ли клиент самостоятельно изменить срок на экране калькулятора. Данный термин обязателен к заполнению если параметр LoanTerm отличен от null",
             "type": "boolean"
        },
         "SigningByTheStore": {
             "description": "Параметр, определяющий, будет ли магазин осуществлять подписание кредитных документов у клиента. 1 - подписывает магазин, 0 - подписывает Mandarin",
             "type": "integer",
             "minimum": 0,
             "maximum": 1
        },
         "PhoneFilling": {
             "description": "Параметр, означающий, что заполнение анкеты клиента необходимо осуществлять по телефону через колл-центр Mandarin. Если указано значение 0, то клиент самостоятельно заполняет анкету. Если указано значение 1, то для заполнения анкеты клиенту перезвонит сотрудник колл-центра. При передаче значения 1 обязательна передача параметра Phone",
             "type": "integer",
             "minimum": 0,
             "maximum": 1
        },
         "ClientCanChangeInitialFee": {
             "description": "Параметр, определяющий, может ли клиент самостоятельно изменить размер первоначального взноса на экране калькулятора.",
             "type": "boolean"
        },
         "ListFinOrgToSendApp": {
             "description": "Массив с перечнем финансовых организаций, в которые должен быть отправлен запрос (в случае если в массиве будут переданы финансовые организации, отключенные для магазина, отправка в них не произойдет). Если данный параметр не передается, отправка производится во все финансовые организации включенные для магазина",
             "type": "array",
             "minItems": 1,
             "uniqueItems": true,
             "items": {
                 "description": "Код конкретной финансовой организации",
                 "type": "string",
                 "enum": [
                    "Tinkoff",
                    "Rassrochka24",
                    "PochtaBank",
                    "ExpressBank",
                    "AlfaBank",
                    "CreditEuropeBank",
                    "GoodMoney",
                    "MigCredit012",
                    "Payps",
                    "SevenSecondsPay",
                    "Otp",
                    "SmsFinance",
                    "Rsb",
                    "Raiffeisen"
                ]
            }
        }
    },
     "required": [
        "ApiKey",
        "OrderID",
        "Amount",
        "AmountWithDiscount",
        "InitialFeeInStore",
        "DeliveryCost",
        "DeliveryCostUse",
        "CallBackURLsuccess",
        "CallBackURLfail",
        "Cart",
        "SigningByTheStore"
    ],
     "additionalProperties": false
}

Пример ответа:

{
    "$schema": "http://json-schema.org/draft-04/schema#",
    "type": "object",
    "properties": {
        "Result": {
            "description": "Результат обработки запроса",
            "type": "string",
            "enum": [
                "True",
                "False"
            ]
        },
        "Errors": {
            "description": "Массив данных об ошибка (в случае их возникновения)",
            "type": "array",
            "items": {
                "type": "object",
                "properties": {
                    "ErrorCode": {
                        "description": "Код ошибки",
                        "type": "string"
                    },
                    "ErrorDescription": {
                        "description": "Описание ошибки",
                        "type": "string"
                    }
                },
                "required": [
                    "ErrorCode",
                    "ErrorDescription"
                ],
                "additionalProperties": false
            }
        },
        "application_id": {
            "description": "Идентификатор заявки на стороне Mandarin",
            "type": "string",
            "minLength": 36,
            "maxLength": 36
        }
    },
    "required": [
        "Result"
    ],
    "additionalProperties": false
}

# - Примеры кейсов

# Пример 1

Данный запрос содержит минимальный набор обязательных параметров.

Содержание данного запроса будет успешно провалидировано.

В данном запросе:

  • Номер заказа в магазине - 123
  • Стоимость товара - 100 руб.
  • Скидка на товар не предоставляется (параметры Amount и AmountWithDiscount равны).
  • Первоначальный взнос оплачивается клиентом в магазине (параметр InitialFeeInStore = 1).
  • Доставка не оплачивается (параметр DeliveryCost = 0).
  • В случае одобрения кредита клиент попадает на страницу http://123.ru (параметр CallBackURLsuccess = "http://123.ru")
  • В случае отказа в кредите клиент попадает на страницу http://234.ru (параметр CallBackURLfail = "http://234.ru")
  • Подписание документов осуществляется силами Mandarin (параметр SigningByTheStore =0).

Корзина содержит один товар:

  • Категория "Телефон"
  • Артикул "Т1"
  • Цена 100 руб.
  • Количество - 1

Запрос

POST https://api.7seconds.ru/api/merch/order
{
    "ApiKey": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
    "OrderID": "123",
    "Amount": 10000,
    "AmountWithDiscount": 10000,
    "InitialFeeInStore": 1,
    "DeliveryCost": 0,
    "DeliveryCostUse": 1,
    "CallBackURLsuccess": "http://123.ru",
    "CallBackURLfail": "http://234.ru",
    "Cart": [
        {
            "Category": [
                "Телефон"
            ],
            "ProductID": "Т1",
            "Price": 100,
            "PriceWithDiscount": 100,
            "Quantity": 1
        }
    ],
    "SigningByTheStore": 0
}

Ответ в случае успешной обработки запроса (200 ОК)

{
    "Result": "True",
    "application_id": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
}

Ответ в случае неуспешной обработки запроса (400 Bad request)

{
     "Result": "False",
     "application_id": "",
     "Errors": [
        {
             "ErrorCode": "CartAmount",
             "ErrorDescription": "Сумма позиций заказа не соответствует общей сумме"
        }
    ]
}

Ответ в случае отравки неверного формата запроса (401 Unauthorized)

{
    "errors": {
        "request": "Ошибка сериализации запроса"
    },
    "Errors": [
        {
            "ErrorCode": "request",
            "ErrorDescription": "Ошибка сериализации запроса"
        }
    ],
    "result": false,
    "Result": false
}

Ответ в случае отравки неверного ApiKey (401 Unauthorized)

{
    "errors": {
        "ApiKey": "Ключ API некорректен"
    },
    "Errors": [
        {
            "ErrorCode": "ApiKey",
            "ErrorDescription": "Ключ API некорректен"
        }
    ],
    "result": false,
    "Result": false
}

Пример ответа в случае ошибки валидации (200 OK)

{
    "result": false,
    "Result": false,
    "errors": {
        "application_id": "Некорректный application id"
    },
    "Errors": [
        {
            "ErrorCode": "application_id",
            "ErrorDescription": "Некорректный application id"
        }
    ]
}

# Пример 2

Данный запрос содержит минимальный набор обязательных параметров.

Содержание данного запроса будет успешно провалидировано.

В данном запросе:

  • Номер заказа в магазине - 123
  • Стоимость товара - 150 руб.
  • Скидка на товар не предоставляется (параметры Amount и AmountWithDiscount равны).
  • Первоначальный взнос оплачивается клиентом через Mandarin (параметр InitialFeeInStore = 2).
  • Доставка не оплачивается (параметр DeliveryCost = 0).
  • В случае одобрения кредита клиент попадает на страницу http://123.ru (параметр CallBackURLsuccess = "http://123.ru")
  • В случае отказа в кредите клиент попадает на страницу http://234.ru (параметр CallBackURLfail = "http://234.ru")
  • Подписание документов осуществляется силами Mandarin (параметр SigningByTheStore =0)

Корзина содержит 2 товара:

Первый товар:

  • Категория "Телефон"
  • Артикул "Т1"
  • Цена 100 руб.
  • Количество - 1

Второй товар:

  • Категория "Чехол"
  • Артикул "Ч1"
  • Цена 50 руб.
  • Количество - 1

Запрос

POST https://api.7seconds.ru/api/merch/order
{
    "ApiKey": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
    "OrderID": "123",
    "Amount": 15000,
    "AmountWithDiscount": 15000,
    "InitialFeeInStore": 2,
    "DeliveryCost": 0,
    "DeliveryCostUse": 1,
    "CallBackURLsuccess": "http://123.ru",
    "CallBackURLfail": "http://234.ru",
    "Cart": [
        {
            "Category": [
                "Телефон"
            ],
            "ProductID": "Т1",
            "Price": 10000,
            "PriceWithDiscount": 10000,
            "Quantity": 1
        },
        {
             "Category": [
                "Чехол"
            ],
             "ProductID": "Ч1",
             "Price": 5000,
             "PriceWithDiscount": 5000,
             "Quantity": 1
        }
    ],
    "SigningByTheStore": 0
}

Ответ в случае успешной обработки запроса (200 ОК)

{
    "Result": "True",
    "application_id": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
}

Ответ в случае неуспешной обработки запроса (400 Bad request)

{
     "Result": "False",
     "application_id": "",
     "Errors": [
        {
             "ErrorCode": "CartAmount",
             "ErrorDescription": "Сумма позиций заказа не соответствует общей сумме"
        }
    ]
}

Ответ в случае отравки неверного формата запроса (401 Unauthorized)

{
    "errors": {
        "request": "Ошибка сериализации запроса"
    },
    "Errors": [
        {
            "ErrorCode": "request",
            "ErrorDescription": "Ошибка сериализации запроса"
        }
    ],
    "result": false,
    "Result": false
}

Ответ в случае отравки неверного ApiKey (401 Unauthorized)

{
    "errors": {
        "ApiKey": "Ключ API некорректен"
    },
    "Errors": [
        {
            "ErrorCode": "ApiKey",
            "ErrorDescription": "Ключ API некорректен"
        }
    ],
    "result": false,
    "Result": false
}

Пример ответа в случае ошибки валидации (200 OK)

{
    "result": false,
    "Result": false,
    "errors": {
        "application_id": "Некорректный application id"
    },
    "Errors": [
        {
            "ErrorCode": "application_id",
            "ErrorDescription": "Некорректный application id"
        }
    ]
}

# Пример 3

Данный запрос содержит минимальный набор обязательных параметров.

Содержание данного запроса будет успешно провалидировано.

В данном запросе:

  • Номер заказа в магазине - 123
  • Стоимость товара - 150 руб.
  • Скидка на товар не предоставляется (параметры Amount и AmountWithDiscount равны).
  • Первоначальный взнос оплачивается клиентом через Mandarin (параметр InitialFeeInStore = 2).
  • Доставка оплачивается через Mandarin
  • Стоимость доставки 50 руб. (параметр DeliveryCost = 5000)
  • Стоимость доставки включается в кредит (параметр DeliveryCostUse=2)
  • В случае одобрения кредита клиент попадает на страницу http://123.ru (параметр CallBackURLsuccess = "http://123.ru")
  • В случае отказа в кредите клиент попадает на страницу http://234.ru (параметр CallBackURLfail = "http://234.ru")
  • Подписание документов осуществляется силами Mandarin (параметр SigningByTheStore =0)

Корзина содержит 2 товара:

Первый товар:

  • Категория "Телефон"
  • Артикул "Т1"
  • Цена 100 руб.
  • Количество - 1

Второй товар:

  • Категория "Чехол"
  • Артикул "Ч1"
  • Цена 50 руб.
  • Количество - 1

Запрос

POST https://api.7seconds.ru/api/merch/order
{
     "ApiKey": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
     "OrderID": 123,
     "Amount": 15000,
     "AmountWithDiscount": 15000,
     "InitialFeeInStore": 2,
     "DeliveryCost": 5000,
     "DeliveryCostUse": 2,
     "CallBackURLsuccess": "http://123.ru",
     "CallBackURLfail": "http://234.ru",
     "Cart": [
        {
             "Category": [
                "Телефон"
            ],
             "ProductID": "Т1",
             "Price": 10000,
             "PriceWithDiscount": 10000,
             "Quantity": 1
        },
        {
             "Category": [
                "Чехол"
            ],
             "ProductID": "Ч1",
             "Price": 5000,
             "PriceWithDiscount": 5000,
             "Quantity": 1
        }
    ],
     "SigningByTheStore": 0
}

Ответ в случае успешной обработки запроса (200 ОК)

{
    "Result": "True",
    "application_id": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
}

Ответ в случае неуспешной обработки запроса (400 Bad request)

{
     "Result": "False",
     "application_id": "",
     "Errors": [
        {
             "ErrorCode": "CartAmount",
             "ErrorDescription": "Сумма позиций заказа не соответствует общей сумме"
        }
    ]
}

Ответ в случае отравки неверного формата запроса (401 Unauthorized)

{
    "errors": {
        "request": "Ошибка сериализации запроса"
    },
    "Errors": [
        {
            "ErrorCode": "request",
            "ErrorDescription": "Ошибка сериализации запроса"
        }
    ],
    "result": false,
    "Result": false
}

Ответ в случае отравки неверного ApiKey (401 Unauthorized)

{
    "errors": {
        "ApiKey": "Ключ API некорректен"
    },
    "Errors": [
        {
            "ErrorCode": "ApiKey",
            "ErrorDescription": "Ключ API некорректен"
        }
    ],
    "result": false,
    "Result": false
}

Пример ответа в случае ошибки валидации (200 OK)

{
    "result": false,
    "Result": false,
    "errors": {
        "application_id": "Некорректный application id"
    },
    "Errors": [
        {
            "ErrorCode": "application_id",
            "ErrorDescription": "Некорректный application id"
        }
    ]
}

# Пример 4

Данный запрос содержит минимальный набор обязательных параметров.

Содержание данного запроса будет успешно провалидировано.

В данном запросе:

  • Номер заказа в магазине - 123
  • Стоимость товара - 150 руб.
  • Стоимость товара с учетом скидки - 130 руб.
  • Скидка на товар предоставляется (параметры Amount и AmountWithDiscount не равны). Скидка распространяется на оба товара.
  • Первоначальный взнос оплачивается клиентом через Mandarin (параметр "InitialFeeInStore" = 2).
  • Доставка оплачивается через Mandarin
  • Стоимость доставки 50 руб. (параметр "DeliveryCost" = 5000)
  • Стоимость доставки включается в кредит (параметр "DeliveryCostUse"=2)
  • В случае одобрения кредита клиент попадает на страницу http://123.ru (параметр "CallBackURLsuccess" = "http://123.ru")
  • В случае отказа в кредите клиент попадает на страницу http://234.ru (параметр "CallBackURLfail" = "http://234.ru")
  • Подписание документов осуществляется силами Mandarin (параметр "SigningByTheStore" =0).

Корзина содержит 2 товара:

Первый товар:

  • Категория "Телефон"
  • Артикул "Т1"
  • Цена - 100 руб.
  • Цена с учетом скидки - 90 руб.
  • Количество - 1

Второй товар:

  • Категория "Чехол"
  • Артикул "Ч1"
  • Цена 50 руб.
  • Цена с учетом скидки - 40 руб.
  • Количество - 1

Запрос

POST https://api.7seconds.ru/api/merch/order
{
     "ApiKey": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
     "OrderID": 123,
     "Amount": 15000,
     "AmountWithDiscount": 13000,
     "InitialFeeInStore": 2,
     "DeliveryCost": 5000,
     "DeliveryCostUse": 2,
     "CallBackURLsuccess": "http://123.ru",
     "CallBackURLfail": "http://234.ru",
     "Cart": [
        {
             "Category": [
                "Телефон"
            ],
             "ProductID": "Т1",
             "Price": 10000,
             "PriceWithDiscount": 9000,
             "Quantity": 1
        },
        {
             "Category": [
                "Чехол"
            ],
             "ProductID": "Ч1",
             "Price": 5000,
             "PriceWithDiscount": 4000,
             "Quantity": 1
        }
    ],
     "SigningByTheStore": 0
}

Ответ в случае успешной обработки запроса (200 ОК)

{
    "Result": "True",
    "application_id": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
}

Ответ в случае неуспешной обработки запроса (400 Bad request)

{
     "Result": "False",
     "application_id": "",
     "Errors": [
        {
             "ErrorCode": "CartAmount",
             "ErrorDescription": "Сумма позиций заказа не соответствует общей сумме"
        }
    ]
}

Ответ в случае отравки неверного формата запроса (401 Unauthorized)

{
    "errors": {
        "request": "Ошибка сериализации запроса"
    },
    "Errors": [
        {
            "ErrorCode": "request",
            "ErrorDescription": "Ошибка сериализации запроса"
        }
    ],
    "result": false,
    "Result": false
}

Ответ в случае отравки неверного ApiKey (401 Unauthorized)

{
    "errors": {
        "ApiKey": "Ключ API некорректен"
    },
    "Errors": [
        {
            "ErrorCode": "ApiKey",
            "ErrorDescription": "Ключ API некорректен"
        }
    ],
    "result": false,
    "Result": false
}

Пример ответа в случае ошибки валидации (200 OK)

{
    "result": false,
    "Result": false,
    "errors": {
        "application_id": "Некорректный application id"
    },
    "Errors": [
        {
            "ErrorCode": "application_id",
            "ErrorDescription": "Некорректный application id"
        }
    ]
}

# Пример 5

Данный запрос содержит минимальный набор обязательных параметров.

Содержание данного запроса будет успешно провалидировано.

В данном запросе:

  • Номер заказа в магазине - 123
  • Стоимость товара - 150 руб.
  • Стоимость товара с учетом скидки - 130 руб.
  • Скидка на товар предоставляется (параметры Amount и AmountWithDiscount не равны). Скидка распространяется на один товар.
  • Первоначальный взнос оплачивается клиентом через Mandarin (параметр "InitialFeeInStore" = 2).
  • Доставка оплачивается через Mandarin
  • Стоимость доставки 50 руб. (параметр "DeliveryCost" = 5000)
  • Стоимость доставки включается в кредит (параметр "DeliveryCostUse"=2)
  • В случае одобрения кредита клиент попадает на страницу http://123.ru (параметр "CallBackURLsuccess" = "http://123.ru")
  • В случае отказа в кредите клиент попадает на страницу http://234.ru (параметр "CallBackURLfail" = "http://234.ru")
  • Подписание документов осуществляется силами Mandarin (параметр "SigningByTheStore" =0).

Корзина содержит 2 товара:

Первый товар:

  • Категория "Телефон"
  • Артикул "Т1"
  • Цена - 100 руб.
  • Цена с учетом скидки - 80 руб.
  • Количество - 1

Второй товар:

  • Категория "Чехол"
  • Артикул "Ч1"
  • Цена 50 руб.
  • Цена с учетом скидки - 50 руб.
  • Количество - 1

Запрос

POST https://api.7seconds.ru/api/merch/order
{
     "ApiKey": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
     "OrderID": 123,
     "Amount": 15000,
     "AmountWithDiscount": 13000,
     "InitialFeeInStore": 2,
     "DeliveryCost": 5000,
     "DeliveryCostUse": 2,
     "CallBackURLsuccess": "http://123.ru",
     "CallBackURLfail": "http://234.ru",
     "Cart": [
        {
             "Category": [
                "Телефон"
            ],
             "ProductID": "Т1",
             "Price": 10000,
             "PriceWithDiscount": 8000,
             "Quantity": 1
        },
        {
             "Category": [
                "Чехол"
            ],
             "ProductID": "Ч1",
             "Price": 5000,
             "PriceWithDiscount": 5000,
             "Quantity": 1
        }
    ],
     "SigningByTheStore": 0
}

Ответ в случае успешной обработки запроса (200 ОК)

{
    "Result": "True",
    "application_id": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
}

Ответ в случае неуспешной обработки запроса (400 Bad request)

{
     "Result": "False",
     "application_id": "",
     "Errors": [
        {
             "ErrorCode": "CartAmount",
             "ErrorDescription": "Сумма позиций заказа не соответствует общей сумме"
        }
    ]
}

Ответ в случае отравки неверного формата запроса (401 Unauthorized)

{
    "errors": {
        "request": "Ошибка сериализации запроса"
    },
    "Errors": [
        {
            "ErrorCode": "request",
            "ErrorDescription": "Ошибка сериализации запроса"
        }
    ],
    "result": false,
    "Result": false
}

Ответ в случае отравки неверного ApiKey (401 Unauthorized)

{
    "errors": {
        "ApiKey": "Ключ API некорректен"
    },
    "Errors": [
        {
            "ErrorCode": "ApiKey",
            "ErrorDescription": "Ключ API некорректен"
        }
    ],
    "result": false,
    "Result": false
}

Пример ответа в случае ошибки валидации (200 OK)

{
    "result": false,
    "Result": false,
    "errors": {
        "application_id": "Некорректный application id"
    },
    "Errors": [
        {
            "ErrorCode": "application_id",
            "ErrorDescription": "Некорректный application id"
        }
    ]
}

# Передача в Mandarin информации об отгрузке товара

Метод используется после того как интернет-магазин отгрузил клиенту товар/оказал услугу.

Передача данной информации в Mandarin обязательна.

В случае наличия по заказу частичного отказа перед передечей статуса об отгрузке магазин должен передать статус в соответствии с разделом «Отправка магазином информации о возврате/отказе клиента от товара/услуги».

Пример запроса:

POST https://api.7seconds.ru/api/merch/shipmentstatus
{
    "$schema": "http://json-schema.org/draft-04/schema#",
    "description": "Comment describing your JSON Schema",
    "type": "object",
    "properties": {
        "ApiKey": {
            "description": "Пароль, полученный при регистрации в Mandarin, пароли для тестового и продуктового контуров различаются",
            "type": "string",
            "minLength": 32,
            "maxLength": 32
        },
        "OrderID": {
            "description": "Номер заказа в магазине",
            "type": "string",
            "minLength": 1,
            "maxLength": 16
        },
        "ApplicationID": {
            "description": "Идентификатор заявки Mandarin",
            "type": "string"
        }
    },
    "required": [
        "ApiKey",
        "OrderID",
        "ApplicationID"
    ],
    "additionalProperties": false
}

Пример ответа:

{
    "$schema": "http://json-schema.org/draft-04/schema#",
    "type": "object",
    "properties": {
        "Result": {
            "description": "Результат обработки запроса",
            "type": "string",
            "enum": [
                "True",
                "False"
            ]
        },
        "Errors": {
            "description": "Массив данных об ошибка (в случае их возникновения)",
            "type": "array",
            "items": {
                "type": "object",
                "properties": {
                    "ErrorCode": {
                        "description": "Код ошибки",
                        "type": "string"
                    },
                    "ErrorDescription": {
                        "description": "Описание ошибки",
                        "type": "string"
                    }
                },
                "required": [
                    "ErrorCode",
                    "ErrorDescription"
                ],
                "additionalProperties": false
            }
        }
    },
    "required": [
        "Result"
    ],
    "additionalProperties": false
}

Возможные значения параметра Result:

  • True - запрос принят успешно
  • False - запрос принят неуспешно.

# - Примеры кейсов

Содержание данного запроса будет успешно провалидировано.

В данном запросе:

  • Номер заказа в магазине по которому произошла отгрузка товара - 123456
  • Номер заявки в Mandarin - 8c24bd01-dddf-4123-a52d-b8c1010b1908

Запрос

POST https://api.7seconds.ru/api/merch/shipmentstatus
{
 "ApiKey": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
 "OrderID": "123456",
 "ApplicationID": "8c24bd01-dddf-4123-a52d-b8c1010b1908"
}

Ответ в случае успешной обработки запроса (200 ОК)

{
 "Result": "True",
}

Ответ в случае неуспешной обработки запроса (400 Bad request)

{
    "Result": "False",
    "Errors": [
        {
            "ErrorCode": "AppID",
            "ErrorDescription": "Не найдена заявка с переданным ApplicationID"
        }
    ]
}

Ответ в случае отравки неверного формата запроса (401 Unauthorized)

{
    "errors": {
        "request": "Ошибка сериализации запроса"
    },
    "Errors": [
        {
            "ErrorCode": "request",
            "ErrorDescription": "Ошибка сериализации запроса"
        }
    ],
    "result": false,
    "Result": false
}

Ответ в случае отравки неверного ApiKey (401 Unauthorized)

{
    "errors": {
        "ApiKey": "Ключ API некорректен"
    },
    "Errors": [
        {
            "ErrorCode": "ApiKey",
            "ErrorDescription": "Ключ API некорректен"
        }
    ],
    "result": false,
    "Result": false
}

Пример ответа в случае ошибки валидации (200 OK)

{
    "result": false,
    "Result": false,
    "errors": {
        "application_id": "Некорректный application id"
    },
    "Errors": [
        {
            "ErrorCode": "application_id",
            "ErrorDescription": "Некорректный application id"
        }
    ]
}

# Запрос статуса заявки

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

Пример запроса:

POST https://api.7seconds.ru/api/merch/getapplicationstatus
{
    "$schema": "http://json-schema.org/draft-04/schema#",
    "description": "Comment describing your JSON Schema",
    "type": "object",
    "properties": {
        "ApiKey": {
            "description": "Пароль, полученный при регистрации в Mandarin, пароли для тестового и продуктового контуров различаются",
            "type": "string",
            "minLength": 32,
            "maxLength": 32
        },
        "application_id": {
            "description": "Идентификатор заявки на стороне Mandarin",
            "type": "string",
            "minLength": 36,
            "maxLength": 36
        }
    },
    "additionalProperties": false
}

Пример ответа:

{
    "$schema": "http://json-schema.org/draft-04/schema#",
    "description": "Comment describing your JSON Schema",
    "type": "object",
    "properties": {
        "ApiKey": {
            "description": "Пароль, полученный при регистрации в Mandarin, пароли для тестового и продуктового контуров различаются",
            "type": "string",
            "minLength": 32,
            "maxLength": 32
        },
        "ApplicationID": {
            "description": "Идентификатор заявки на стороне Mandarin",
            "type": "string",
            "minLength": 36,
            "maxLength": 36
        },
        "ApplicationDate": {
            "description": "Дата и время получения от магазина заявки в формате «гггг-мм-дд чч:мм:сс zzz»",
            "type": "string",
            "format": "date-time"
        },
        "Status": {
            "description": "Статус заявки",
            "type": "string"
        },
        "StatusID": {
            "description": "Код статуса заявки",
            "type": "string"
        },
        "OrderID": {
            "description": "Номер заказа в магазине",
            "type": "string",
            "minLength": 1,
            "maxLength": 16
        },
        "FirstName": {
            "description": "Имя клиента",
            "type": "string",
            "minLength": 1,
            "maxLength": 128
        },
        "LastName": {
            "description": "Фамилия клиента",
            "type": "string",
            "minLength": 1,
            "maxLength": 128
        },
        "MiddleName": {
            "description": "Отчество клиента",
            "type": "string",
            "minLength": 1,
            "maxLength": 128
        },
        "Phone": {
            "description": "Контактный телефон клиента в формате 7ХХХХХХХХХХ",
            "type": "string",
            "minLength": 1,
            "maxLength": 20
        },
        "Email": {
            "description": "Электронная почта клиента",
            "type": "string",
            "minLength": 6,
            "maxLength": 128
        },
        "Amount": {
            "description": "Сумма заказа в копейках без учета скидки магазина (цена которую видит клиент в корзине)",
            "type": "integer",
            "minimum": 1,
            "maximum": 100000000
        },
        "AmountWithDiscount": {
            "description": "Сумма заказа в копейках c учетом скидки магазина (под скидкой понимается размер дисконта магазина для того, чтобы у клиента была рассрочка или пониженная ставка по кредиту). Данная сумма будет в кредитном договоре",
            "type": "integer",
            "minimum": 1,
            "maximum": 100000000
        },
        "InitialFee": {
            "description": "Сумма первоначального взноса в копейках (Данное значение будет предустановлено на калькуляторе кредита)",
            "type": "integer",
            "minimum": 0,
            "maximum": 100000000
        },
        "InitialFeeInStore": {
            "description": "Параметр, определяющий, где будет производиться оплата первоначального взноса. Если указано значение 1, то клиент должен оплатить первоначальный взнос в магазине, если 2, то оплата первоначального взноса производится через Mandarin посредством карты, если 3, то оплата первоночального взноса не предусмотрена, поле ПВ на калькуляторе будет скрыто.",
            "type": "number",
            "minimum": 1,
            "maximum": 3
        },
        "CreditDate": {
            "description": "Дата и время выдачи кредита (момент передачи статуса выдачи от Mandarin в финансовую организацию) в формате «гггг-мм-дд чч:мм:сс zzz»",
            "type": "string",
            "format": "date-time"
        },
        "CreditSumm": {
            "description": "Сумма фактического платежа на расчетный счет мерчанта (в копейках)",
            "type": "integer",
            "minimum": 1,
            "maximum": 100000000
        },
        "FinOrg": {
            "description": "Наименование финансовой организации одобрившей кредит",
            "type": "string",
            "minLength": 1,
            "maxLength": 1000
        },
        "RejectDate": {
            "description": "Дата и время перечисления средств по возврату от Mandarin в финансовую организацию в формате «гггг-мм-дд чч:мм:сс zzz»",
            "type": "string",
            "format": "date-time"
        },
        "RejectOrderID": {
            "description": "Номер возврата в магазине",
            "type": "string",
            "minLength": 1,
            "maxLength": 16
        },
        "RejectPrincipal": {
            "description": "Сумма основного долга, перечисленная от Mandarin в финансовую организацию в рамках возврата в копейках",
            "type": "integer",
            "minimum": 1,
            "maximum": 100000000
        },
        "RejectInterest": {
            "description": "Сумма процентов, перечисленная от Mandarin в финансовую организацию в рамках возврата в копейках, указывается только если магазин компенсирует проценты за клиента",
            "type": "integer",
            "minimum": 1,
            "maximum": 100000000
        },
        "RejectInitialFee": {
            "description": "Сумма первоначального взноса, перечисленная от Mandarin заемщику в рамках возврата в копейках",
            "type": "integer",
            "minimum": 1,
            "maximum": 100000000
        },
        "CardNumber": {
            "description": "Маска карты, с которой производится оплата первоначального взноса в формате 123456XXXXXX7890",
            "type": "string",
            "minLength": 16,
            "maxLength": 16
        }
    },
    "required": [
        "ApiKey",
        "ApplicationID",
        "ApplicationDate",
        "Status",
        "StatusID",
        "OrderID",
        "Amount",
        "AmountWithDiscount",
        "InitialFeeInStore"
    ],
    "additionalProperties": false
}

# Передача данных о факте отказа/возврата товара

Метод используется в случае, если клиент обратился в магазин с целю возврата товара.

Пример запроса:

POST https://api.7seconds.ru/api/merch/Applicationreject
{
    "$schema": "http://json-schema.org/draft-04/schema#",
    "description": "Comment describing your JSON Schema",
    "type": "object",
    "properties": {
        "ApiKey": {
            "description": "Пароль, полученный при регистрации в Mandarin, пароли для тестового и продуктового контуров различаются",
            "type": "string",
            "minLength": 32,
            "maxLength": 32
        },
        "OrderID": {
            "description": "Номер заказа в магазине",
            "type": "string",
            "minLength": 1,
            "maxLength": 16
        },
        "ApplicationID": {
            "description": "Идентификатор заявки Mandarin",
            "type": "string"
        },
        "ApplicationDate": {
            "description": "Дата и время получения от магазина заявки в формате «гггг-мм-дд чч:мм:сс zzz»",
            "type": "string",
            "format": "date-time"
        },
        "RejectOrderID": {
            "description": "Номер возврата в магазине",
            "type": "string"
        },
        "MoneySource": {
            "description": "Источник перечисления средств в магазин. Передается 1 если источник средств – Mandarin. Передается 2, если источник средств Финансовая организация",
            "type": "number",
            "minimum": 1,
            "maximum": 2
        },
        "PercentCompensation": {
            "description": "Параметр, определяющий, погашает ли магазин за клиента сумму процентов по кредиту. Передается 1, если погашает, и 2 если не погашает",
            "type": "number",
            "minimum": 1,
            "maximum": 2
        },
        "ShipmentType": {
            "description": "Параметр, определяющий, была ли отгрузка товара клиенту или нет. Передается 1, если отгрузка была, и 2, если отгрузки не было",
            "type": "number",
            "minimum": 1,
            "maximum": 2
        },
        "InitialFee": {
            "description": "Сумма первоначального взноса в копейках (Данное значение будет предустановлено на калькуляторе кредита)",
            "type": "integer",
            "minimum": 0,
            "maximum": 100000000
        },
        "CreditSumm": {
            "description": "Сумма фактического платежа на расчетный счет мерчанта (в копейках)",
            "type": "integer",
            "minimum": 1,
            "maximum": 100000000
        },
        "CompensationSumm": {
            "description": "Сумма, перечисляемая магазином на Mandarin при возврате товара",
            "type": "integer",
            "minimum": 0,
            "maximum": 100000000
        },
        "InitialFeeInStore": {
            "description": "Параметр, определяющий, где была произведена оплата первоначального взноса. Если указано значение 1, то клиент должен оплатить первоначальный взнос в магазине, если 2, то оплата первоначального взноса производится через Mandarin, если 3, первоночального взноса не было",
            "type": "number"
        },
        "RejectType": {
            "description": "Тип возврата, если указано 1, то полный возврат, если 2, то частичный",
            "type": "integer",
            "minimum": 1,
            "maximum": 2
        },
        "RejectCart": {
            "description": "Массив данных о товарах составляющих возврат/отказ",
            "type": "array",
            "items": {
                "type": "object",
                "properties": {
                    "Category": {
                        "description": "Категории товара по классификации магазина",
                        "type": "array",
                        "minItems": 1,
                        "uniqueItems": true,
                        "items": {
                            "type": "string",
                            "minLength": 1,
                            "maxLength": 128
                        }
                    },
                    "ProductID": {
                        "description": "Идентификатор товара в магазине",
                        "type": "string",
                        "minLength": 1,
                        "maxLength": 128
                    },
                    "Price": {
                        "description": "Стоимость единицы товара в копейках без учета скидки, (цена которую видит клиент в корзине)",
                        "type": "integer",
                        "minimum": 1,
                        "maximum": 100000000
                    },
                    "PriceWithDiscount": {
                        "description": "Стоимость единицы товара в копейках c учетом скидки магазина (под скидкой понимается размер дисконта магазина для того, чтобы у клиента была рассрочка или пониженная ставка по кредиту)",
                        "type": "integer",
                        "minimum": 1,
                        "maximum": 100000000
                    },
                    "ProductName": {
                        "description": "Наименование товара",
                        "type": "string",
                        "minLength": 1,
                        "maxLength": 128
                    },
                    "Quantity": {
                        "description": "Количество единиц товара",
                        "type": "integer",
                        "minimum": 1,
                        "maximum": 100
                    }
                },
                "required": [
                    "Category",
                    "ProductID",
                    "Price",
                    "PriceWithDiscount",
                    "Quantity"
                ],
                "additionalProperties": false
            }
        }
    },
    "required": [
        "ApiKey",
        "OrderID",
        "ApplicationID",
        "RejectOrderID",
        "MoneySource",
        "PercentCompensation",
        "ShipmentType",
        "InitialFee",
        "CreditSumm",
        "CompensationSumm",
        "InitialFeeInStore",
        "RejectType",
        "RejectCart"
    ],
    "additionalProperties": false
}

Параметр «PercentCompensation» является обязательным, если значение параметра ShipmentType = 1

Обязательность параметра CompensationSumm определяется в соответствии с таблицей:

Значение параметра ShipmentType Значение параметра MoneySource Значение параметра PercentCompensation Обязательность параметра CompensationSumm
1 1 1 true
2 1 1 false
1 2 1 true
2 2 1 false
1 1 2 true
2 1 2 false
1 2 2 true
2 2 2 false

Пример ответа:

{
    "$schema": "http://json-schema.org/draft-04/schema#",
    "type": "object",
    "properties": {
        "Result": {
            "description": "Результат обработки запроса",
            "type": "string",
            "enum": [
                "True",
                "False"
            ]
        },
        "Errors": {
            "description": "Массив данных об ошибка (в случае их возникновения)",
            "type": "array",
            "items": {
                "type": "object",
                "properties": {
                    "ErrorCode": {
                        "description": "Код ошибки",
                        "type": "string"
                    },
                    "ErrorDescription": {
                        "description": "Описание ошибки",
                        "type": "string"
                    }
                },
                "required": [
                    "ErrorCode",
                    "ErrorDescription"
                ],
                "additionalProperties": false
            }
        }
    },
    "required": [
        "Result"
    ],
    "additionalProperties": false
}

Возможные значения параметра Result:

  • True - запрос принят успешно
  • False - запрос принят неуспешно.

# Метод предодобрения

# Запрос в Mandarin статуса задолженности клиента

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

Важно! Данная возможность имеется не для всех финансовых организаций.

Она доступна только для магазинов, получивших согласование через клиентского менеджера или Руководителя проекта (в случае реализации совместного проекта по интеграции) со стороны Mandarin.

Пример запроса:

POST https://api.7seconds.ru/api/merch/ClientDebtStatus
{
    "ApiKey ": {
        "description": "Пароль, полученный при регистрации в Mandarin, пароли для тестового и продуктового контуров различаются",
        "type": "String",
        "Lenght": 32,
        "required": true
    },
    "OrderID": {
        "description": "Номер заказа в магазине",
        "type": "String",
        "minLenght": 1,
        "maxLenght": 16,
        "required": true
    },
    "ApplicationID": {
        "description": "ID заявки в Mandarin",
        "type": "GUID",
        "required": true
    }
}

Пример ответа:

{
    "ApplicationID": {
        "description": "ID заявки в Mandarin",
        "type": "GUID"
    },
    "DebtStatus": {
        "description": "Статус задолженности, 0 - кредит не был оформлен, 1 - кредит активен, 2 - кредит был погашен",
        "type": "integer",
        "minimum": 0,
        "maximal": 2
    },
    "BasicDebt": {
        "description": "Остаток основного долга в копейках",
        "type": "integer",
        "minimum": 0,
        "maximal": 1000000000
    },
    "Interest": {
        "description": "Остаток процентов по основному долгу",
        "type": "integer",
        "minimum": 0,
        "maximal": 1000000000
    },
    "StatusDate": {
        "description": "Дата, на которую актуальна информация о задолженности «гггг-мм-дд»",
        "type": "String",
        "minLenght": 1,
        "maxLenght": 1000
    },
    "FinOrg": {
        "description": "Наименование финансовой организации",
        "type": "String",
        "minLenght": 1,
        "maxLenght": 100
    },
    "AgreementNumber": {
        "description": "Номер кредитного договора/договора займа",
        "type": "String",
        "minLenght": 1,
        "maxLenght": 100
    }
}

# Метод предодобрения

Метод используется для запроса на получения идентификатора анкеты клиента для предодобрения кредита.

В ответ на запрос данного метода вернется PrescoreAppID, по которому нужно вызвать анкету Mandarin по следующей ссылке:

/home/prescore?prescoreid=полученный при запросе PrescoreAppID

По окончанию обработки заявки, в зависимости от ее результата происходит переход на страницу магазина, указанную в параметрах CallBackURLsuccess или CallBackURLfail

Пример запроса:

POST https://api.7seconds.ru/api/merch/prescore/
{
    "$schema": "http://json-schema.org/draft-04/schema#",
    "description": "Comment describing your JSON Schema",
    "type": "object",
    "properties": {
        "ApiKey": {
            "description": "Пароль, полученный при регистрации в Mandarin, пароли для тестового и продуктового контуров различаются",
            "type": "string",
            "minLength": 32,
            "maxLength": 32
        },
        "CallBackURLsuccess": {
            "description": "URL для возврата на сайт с виджета Mandarin при одобрении лимита",
            "type": "string",
            "minLength": 1,
            "maxLength": 512
        },
        "CallBackURLfail": {
            "description": "URL для возврата на сайт с виджета Mandarin при отказе в лимите",
            "type": "string",
            "minLength": 1,
            "maxLength": 512
        },
    "required": [
        "ApiKey",
        "CallBackURLsuccess",
        "CallBackURLfail",

    ],
    "additionalProperties": false
}

Пример ответа:

{
    "$schema": "http://json-schema.org/draft-04/schema#",
    "type": "object",
    "properties": {
        "Result": {
            "description": "Результат обработки запроса",
            "type": "string",
            "enum": [
                "True",
                "False"
            ]
        },
        "Errors": {
            "description": "Массив данных об ошибка (в случае их возникновения)",
            "type": "array",
            "items": {
                "type": "object",
                "properties": {
                    "ErrorCode": {
                        "description": "Код ошибки",
                        "type": "string"
                    },
                    "ErrorDescription": {
                        "description": "Описание ошибки",
                        "type": "string"
                    }
                },
                "required": [
                    "ErrorCode",
                    "ErrorDescription"
                ],
                "additionalProperties": false
            }
        },
        "PrescoreAppID": {
            "description": "Идентификатор заявки предодобрения на стороне Mandarin",
            "type": "string",
            "minLength": 36,
            "maxLength": 36
        }
    },
    "required": [
        "Result",
        "application_id"
    ],
    "additionalProperties": false
}

# Методы для работы с кредитными документами по API (подписание документов)

# Метод для получения перечня документов для подписания

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

Обращение к данному методу возможно только по заявкам, по которым имеется статус LoanOpened

Пример запроса:

POST https://api.7seconds.ru/api/merch/getdocumentslist
{
    "$schema": "http://json-schema.org/draft-04/schema#",
    "description": "Comment describing your JSON Schema",
    "type": "object",
    "properties": {
        "ApiKey": {
            "description": "Пароль, полученный при регистрации в Mandarin, пароли для тестового и продуктового контуров различаются",
            "type": "string",
            "minLength": 32,
            "maxLength": 32
        },
        "application_id": {
            "description": "Идентификатор заявки на стороне Mandarin",
            "type": "string",
            "minLength": 36,
            "maxLength": 36
        }
    },
    "required": [
        "ApiKey",
        "application_id"
    ],
    "additionalProperties": false
}

Пример ответа:

{
    "$schema": "http://json-schema.org/draft-04/schema#",
    "description": "Comment describing your JSON Schema",
    "type": "object",
    "properties": {
        "ResultData": {
            "type": "object",
            "properties": {
                "DownloadDocs": {
                    "type": "array",
                    "items": {
                        "type": "object",
                        "minProperties": 1,
                        "properties": {
                            "DownloadDocumentId": {
                                "description": "Идентификатор документа для скачивания",
                                "type": "string",
                                "minLength": 36,
                                "maxLength": 36
                            },
                            "DocumentName": {
                                "description": "Наименование документа для скачивания",
                                "type": "string"
                            }
                        },
                        "required": [
                            "DownloadDocumentId",
                            "DocumentName"
                        ],
                        "additionalProperties": false
                    }
                },
                "UploadDocs": {
                    "type": "array",
                    "items": {
                        "type": "object",
                        "minProperties": 1,
                        "properties": {
                            "UploadDocumentId": {
                                "description": "Идентификатор документа для загрузки",
                                "type": "string"
                            },
                            "DocumentName": {
                                "description": "Наименование документа для загрузки",
                                "type": "string"
                            },
                            "MultiPage": {
                                "description": "Параметр, определяющи, может ли загружаемый со стороны магазина документ иметь несколько страниц (True) или нет(False).",
                                "type": "boolean"
                            }
                        },
                        "required": [
                            "UploadDocumentId",
                            "DocumentName",
                            "MultiPage"
                        ],
                        "additionalProperties": false
                    }
                }
            },
            "required": [
                "DownloadDocs",
                "UploadDocs"
            ],
            "additionalProperties": false
        },
        "Result": {
            "description": "Результат обработки запроса",
            "type": "string",
            "enum": [
                "True",
                "False"
            ]
        },
        "Errors": {
            "description": "Массив данных об ошибка (в случае их возникновения)",
            "type": "array",
            "items": {
                "type": "object",
                "properties": {
                    "ErrorCode": {
                        "description": "Код ошибки",
                        "type": "string"
                    },
                    "ErrorDescription": {
                        "description": "Описание ошибки",
                        "type": "string"
                    }
                },
                "required": [
                    "ErrorCode",
                    "ErrorDescription"
                ],
                "additionalProperties": false
            }
        }
    },
    "required": [
        "Result"
    ],
    "additionalProperties": false
}

# Метод для получения файлов документов для подписания

Метод используется для получения файлов кредитных документов для подписания у клиента. Обращение к данному методу возможно только по заявкам, по которым имеется статус "WaitSignDocs"

Пример запроса:

POST https://api.7seconds.ru/api/merch/downloaddocument
{
    "$schema": "http://json-schema.org/draft-04/schema#",
    "description": "Comment describing your JSON Schema",
    "type": "object",
    "properties": {
        "ApiKey": {
            "description": "Пароль, полученный при регистрации в Mandarin, пароли для тестового и продуктового контуров различаются",
            "type": "string",
            "minLength": 32,
            "maxLength": 32
        },
        "application_id": {
            "description": "Идентификатор заявки на стороне Mandarin",
            "type": "string",
            "minLength": 36,
            "maxLength": 36
        },
        "DownloadDocumentId": {
            "description": "Идентификатор документа для скачивания",
            "type": "string",
            "minLength": 36,
            "maxLength": 36
        }
    },
    "required": [
        "ApiKey",
        "application_id",
        "DownloadDocumentId"
    ],
    "additionalProperties": false
}

В ответ происходит передача файла документа для подписания.

# Метод для загрузки сканов подписанных документов

Метод используется для передачи в HappyLend сканов подписанных кредитных документов клиента.

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

  • имеется статус WaitSignDocs и отсутствует статус SentToVerification
  • имеется статус VerificationFailed и отсутствует статус VerificationPassed

В случае загрузки нескольких страниц по одностраничному документу (по документу установлен параметр MultiPage:true в рамках Метода для получения перечня документов для подписания, происходит возврат ошибки.

Пример запроса:

POST https://api.7seconds.ru/api/merch/uploadsigneddocument
{
    "$schema": "http://json-schema.org/draft-04/schema#",
    "description": "Comment describing your JSON Schema",
    "type": "object",
    "properties": {
        "ApiKey": {
            "description": "Пароль, полученный при регистрации в Mandarin, пароли для тестового и продуктового контуров различаются",
            "type": "string",
            "minLength": 32,
            "maxLength": 32
        },
        "application_id": {
            "description": "Идентификатор заявки на стороне Mandarin",
            "type": "string",
            "minLength": 36,
            "maxLength": 36
        },
        "UploadDocument": {
            "description": "Загружаемый документ",
            "type": "object",
            "properties": {
                "UploadDocumentId": {
                    "description": "Идентификатор документа для загрузки",
                    "type": "string"
                },
                "DocumentPages": {
                    "description": "Массив страниц документа",
                    "type": "array",
                    "items": {
                        "type": "object",
                        "minProperties": 1,
                        "properties": {
                            "PageNumber": {
                                "description": "Порядковая страница документа",
                                "type": "integer"
                            },
                            "DocumentTypeExtention": {
                                "description": "Расширение файла",
                                "type": "string"
                            },
                            "Data": {
                                "description": "Содержимое документа в формате base64binary",
                                "type": "string"
                            }
                        },
                        "required": [
                            "PageNumber",
                            "DocumentTypeExtention",
                            "Data"
                        ],
                        "additionalProperties": false
                    }
                }
            },
            "required": [
                "UploadDocumentId",
                "DocumentPages"
            ],
            "additionalProperties": false
        }
    },
    "required": [
        "ApiKey",
        "application_id",
        "UploadDocument"
    ],
    "additionalProperties": false
}

Пример ответа:

{
    "$schema": "http://json-schema.org/draft-04/schema#",
    "type": "object",
    "properties": {
        "Result": {
            "description": "Результат обработки запроса",
            "type": "string",
            "enum": [
                "True",
                "False"
            ]
        },
        "Errors": {
            "description": "Массив данных об ошибка (в случае их возникновения)",
            "type": "array",
            "items": {
                "type": "object",
                "properties": {
                    "ErrorCode": {
                        "description": "Код ошибки",
                        "type": "string"
                    },
                    "ErrorDescription": {
                        "description": "Описание ошибки",
                        "type": "string"
                    }
                },
                "required": [
                    "ErrorCode",
                    "ErrorDescription"
                ],
                "additionalProperties": false
            }
        }
    },
    "required": [
        "Result"
    ],
    "additionalProperties": false
}

# Метод для запуска верификации документов

Метод используется для запуска на стороне HappyLend процесса верификации подписанных кредитных документов клиента.

Обращение к данному методу возможно только по заявкам, по которым имеется статус WaitSignDocs и отсутствует статус VerificationPassed

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

Пример запроса

POST https://api.7seconds.ru/api/merch/verifydocuments
{
    "$schema": "http://json-schema.org/draft-04/schema#",
    "description": "Comment describing your JSON Schema",
    "type": "object",
    "properties": {
        "ApiKey": {
            "description": "Пароль, полученный при регистрации в Mandarin, пароли для тестового и продуктового контуров различаются",
            "type": "string",
            "minLength": 32,
            "maxLength": 32
        },
        "application_id": {
            "description": "Идентификатор заявки на стороне Mandarin",
            "type": "string",
            "minLength": 36,
            "maxLength": 36
        }
    },
    "required": [
        "ApiKey",
        "application_id"
    ],
    "additionalProperties": false
}

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

{
    "$schema": "http://json-schema.org/draft-04/schema#",
    "type": "object",
    "properties": {
        "Result": {
            "description": "Результат обработки запроса",
            "type": "string",
            "enum": [
                "True",
                "False"
            ]
        },
        "Errors": {
            "description": "Массив данных об ошибка (в случае их возникновения)",
            "type": "array",
            "items": {
                "type": "object",
                "properties": {
                    "ErrorCode": {
                        "description": "Код ошибки",
                        "type": "string"
                    },
                    "ErrorDescription": {
                        "description": "Описание ошибки",
                        "type": "string"
                    }
                },
                "required": [
                    "ErrorCode",
                    "ErrorDescription"
                ],
                "additionalProperties": false
            }
        }
    },
    "required": [
        "Result"
    ],
    "additionalProperties": false
}

# Метод для получения замечаний по верификации документов

Метод используется для получения комментариев по верификации подписанных клиентом кредитных документов в случае если верификация была проведена неуспешно.

Обращение к данному методу возможно только по заявкам, по которым имеется статус VerificationFailed и отсутствует статус VerificationPassed

Пример запроса

POST https://api.7seconds.ru/api/merch/getverificationcomments
{
    "$schema": "http://json-schema.org/draft-04/schema#",
    "description": "Comment describing your JSON Schema",
    "type": "object",
    "properties": {
        "ApiKey": {
            "description": "Пароль, полученный при регистрации в Mandarin, пароли для тестового и продуктового контуров различаются",
            "type": "string",
            "minLength": 32,
            "maxLength": 32
        },
        "application_id": {
            "description": "Идентификатор заявки на стороне Mandarin",
            "type": "string",
            "minLength": 36,
            "maxLength": 36
        }
    },
    "required": [
        "ApiKey",
        "application_id"
    ],
    "additionalProperties": false
}

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

{
    "$schema": "http://json-schema.org/draft-04/schema#",
    "description": "Comment describing your JSON Schema",
    "type": "object",
    "properties": {
        "ResultData": {
            "type": "object",
            "properties": {
                "VerificationFailComment": {
                    "description": "Комментарии с причинами отказа в верификации документов",
                    "type": "string"
                }
            },
            "additionalProperties": false
        },
        "Result": {
            "description": "Результат обработки запроса",
            "type": "string",
            "enum": [
                "True",
                "False"
            ]
        },
        "Errors": {
            "description": "Массив данных об ошибка (в случае их возникновения)",
            "type": "array",
            "items": {
                "type": "object",
                "properties": {
                    "ErrorCode": {
                        "description": "Код ошибки",
                        "type": "string"
                    },
                    "ErrorDescription": {
                        "description": "Описание ошибки",
                        "type": "string"
                    }
                },
                "required": [
                    "ErrorCode",
                    "ErrorDescription"
                ],
                "additionalProperties": false
            }
        }
    },
    "required": [
        "Result"
    ],
    "additionalProperties": false
}

# Работа с CallBack уведомлениями

# Введение

  • Метод отправки: POST
  • Формат: application/json

CallBack - это уведомления магазину о статусе оформления кредита.

Данный способ используется в случае «глубокой» интеграции, когда происходит интеграция бэкофисных систем магазина с системой Mandarin.

Для использования CallBack магазин должен реализовать на своей стороне сервис по приему CallBack и передать в Mandarin URL, на который будут отправляться POST-запросы со статусами. Пример кода реализации указан в конце раздела.

Формат передаваемого JSON описан в ниже

# Безопасность

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

При реализации проверки сообщения, обратите внимания на следующие моменты:

  1. Cообщением является тело запроса
  2. Хэш вычисляется функцией SHA-1
  3. В качестве ключа используется ApiKey полученный от Mandarin (при тестировании – от тестового контура, при работе на продуктовом контуре – от продуктового контура).
  4. Вычисленное значение передается в кодировке base64.

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

Важно! Параметры объекта `Passport` передаются по отдельному согласованию с Mandarin.

Пример запроса:

{
    "$schema": "http://json-schema.org/draft-04/schema#",
    "type": "object",
    "properties": {
        "ApplicationID": {
            "description": "Идентификатор заявки на стороне Mandarin",
            "type": "string",
            "minLength": 36,
            "maxLength": 36
        },
        "ApplicationDate": {
            "description": "Дата и время получения от магазина заявки",
            "type": "string",
            "format": "date-time"
        },
        "Status": {
            "description": "Расшифровка статуса заявки",
            "type": "string",
            "minLength": 1,
            "maxLength": 100
        },
        "StatusID": {
            "description": "Код статуса заявки",
            "type": "string",
            "minLength": 1,
            "maxLength": 100
        },
        "OrderID": {
            "description": "Номер заказа в магазине",
            "type": "string",
            "minLength": 1,
            "maxLength": 100
        },
        "FirstName": {
            "description": "Имя клиента",
            "type": "string",
            "minLength": 1,
            "maxLength": 100
        },
        "LastName": {
            "description": "Фамилия клиента",
            "type": "string",
            "minLength": 1,
            "maxLength": 100
        },
        "MiddleName": {
            "description": "Отчество клиента",
            "type": "string",
            "minLength": 1,
            "maxLength": 100
        },
        "Phone": {
            "description": "Мобильный телефон клиента в формате 7ХХХХХХХХХХ (на данный номер высылаются все коды подтверждения)",
            "type": "string",
            "minLength": 11,
            "maxLength": 11
        },
        "Email": {
            "description": "E-mail клиента",
            "type": "string",
            "format": "email"
        },
        "Amount": {
            "description": "Сумма заказа в копейках без учета скидки магазина",
            "type": "integer",
            "minimum": 1,
            "maximum": 100000000
        },
        "AmountWithDiscount": {
            "description": "Сумма заказа в копейках c учетом скидки магазина (под скидкой понимается размер дисконта магазина для того, чтобы у клиента была рассрочка или пониженная ставка по кредиту)",
            "type": "integer",
            "minimum": 1,
            "maximum": 100000000
        },
        "InitialFee": {
            "description": "Сумма первоначального взноса в копейках",
            "type": "integer",
            "minimum": 1,
            "maximum": 100000000
        },
        "InitialFeeInStore": {
            "description": "Параметр, определяющий, где будет производиться оплата первоначального взноса. Если указано значение 1, то клиент должен оплатить первоначальный взнос в магазине, если 2, то оплата первоначального взноса производится через Mandarin, если 3, то оплата первоночального взноса не предусмотрена",
            "type": "integer",
            "minimum": 1,
            "maximum": 3
        },
        "CreditDate": {
            "description": "Дата и время выдачи кредита (момент передачи статуса выдачи от Mandarin в финансовую организацию)",
            "type": "string",
            "format": "date-time"
        },
        "CreditSumm": {
            "description": "Сумма фактического платежа на расчетный счет мерчанта (в копейках)",
            "type": "integer",
            "minimum": 1,
            "maximum": 100000000
        },
        "FinOrg": {
            "description": "Наименование финансовой организации которую выбрал клиент для получения кредита",
            "type": "string",
            "minLength": 1,
            "maxLength": 100
        },
        "RejectDate": {
            "description": "Дата и время перечисления средств по возврату от Mandarin в финансовую организацию",
            "type": "string",
            "format": "date-time"
        },
        "RejectOrderID": {
            "description": "Номер возврата в магазине",
            "type": "string",
            "minLength": 1,
            "maxLength": 16
        },
        "RejectPrincipal": {
            "description": "Сумма основного долга, перечисленная от Mandarin в финансовую организацию в рамках возврата в копейках",
            "type": "integer",
            "minimum": 1,
            "maximum": 1000000
        },
        "RejectInterest": {
            "description": "Сумма процентов, перечисленная от Mandarin в финансовую организацию в рамках возврата в копейках, указывается только если магазин компенсирует проценты за клиента",
            "type": "integer",
            "minimum": 1,
            "maximum": 100000000
        },
        "RejectInitialFee": {
            "description": "Сумма первоначального взноса, перечисленная от Mandarin заемщику в рамках возврата в копейках",
            "type": "integer",
            "minimum": 1,
            "maximum": 100000000
        },
        "CardNumber": {
            "description": "Маска карты, с которой производится оплата первоначального взноса в формате 123456XXXXXX7890",
            "type": "string",
            "minLength": 16,
            "maxLength": 16
        },
        "Passport": {
            "description": "Массив паспортных данных (передается по договоренности с магазином) ",
            "type": "object",
            "properties": {
                "Number": {
                    "description": "Номер паспорта",
                    "type": "string",
                    "minLength": 6,
                    "maxLength": 6
                },
                "Series": {
                    "description": "Серия паспорта",
                    "type": "string",
                    "minLength": 4,
                    "maxLength": 4
                },
                "BirthDate": {
                    "description": "Дата рождения",
                    "type": "string",
                    "format": "date-time"
                },
                "IssueDate": {
                    "description": "Дата выдачи паспорта",
                    "type": "string",
                    "format": "date-time"
                },
                "Code": {
                    "description": "Код подразделения выдачи паспорта в формате ХХХХХХ",
                    "type": "string",
                    "minLength": 6,
                    "maxLength": 6
                },
                "Emitent": {
                    "description": "Кем выдан паспорт",
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 1000
                },
                "BirthPlace": {
                    "description": "Место рождения",
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 300
                },
                "Gender": {
                    "description": "Пол клиента (True - Мужской, False - Женский)",
                    "type": "boolean"
                }
            },
            "additionalProperties": false
        },
        "FIOTranslit": {
            "description": "Массив данных транслитерации ФИО на английском языке",
            "type": "object",
            "properties": {
                "FirstNameEng": {
                    "description": "Имя клиента в транслитерации на английский",
                    "type": "string"
                },
                "LastNameEng": {
                    "description": "Фамилия клиента в транслитерации на английский",
                    "type": "string"
                },
                "MiddleNameEng": {
                    "description": "Отчество клиента в транслитерации на английский",
                    "type": "string"
                }
            },
            "additionalProperties": false
        }
    },
    "additionalProperties": false
}

При приеме CallBack от Mandarin магазин должен отправить в Mandarin ответ, сформированный в соответствии со следующей JSON-схемой:

{
     "$schema": "http://json-schema.org/draft-04/schema#",
     "title": "",
     "description": "",
     "type": "object",
     "properties": {
         "Result": {
             "description": "Результат обработки запроса",
             "type": "string",
             "enum": [
                "True",
                "False"
            ]
        },
         "Errors": {
             "description": "Массив данных об ошибка (в случае их возникновения)",
             "type": "array",
             "items": {
                 "type": "object",
                 "properties": {
                     "ErrorCode": {
                         "description": "Код ошибки, определяется на cтороне магазина",
                         "type": "string"
                    },
                     "ErrorDescription": {
                         "description": "Описание ошибки, определяется на стороне магазина",
                         "type": "string"
                    }
                },
                 "required": [
                    "ErrorCode",
                    "ErrorDescription"
                ],
                 "additionalProperties": false
            }
        }
    },
     "required": [
        "Result"
    ],
     "additionalProperties": false
}

# Примеры

Пример CallBack уведомления от Mandarin

{
    "ApplicationID": "445a75a2-4a0f-462c-9380-afdb8c6f103d",
    "ApplicationDate": "2018-05-16 14:49:51+03:00",
    "Status": "Кредит одобрен",
    "StatusID": "CredAppr",
    "OrderID": "31978",
    "FirstName": "Иван",
    "LastName": "Иванов",
    "MiddleName": "Иванович",
    "Phone": "71112223344",
    "Email": "mail@mail.ru",
    "Amount":1000,
    "AmountWithDiscount":9000,
    "InitialFee":0,
    "InitialFeeInStore":1,
    "CreditDate": "2018-05-16 14:59:25+03:00",
    "CreditSumm":9000,
    "FinOrg": "Альфа Банк",
    "RejectDate": "2018-05-16 14:49:51+03:00",
    "RejectOrderID": "31978",
    "RejectPrincipal":8500,
    "RejectInterest":1000,
    "RejectInitialFee":0,
    "CardNumber": "123456XXXXXX7890",
    "Passport": {
        "Number": "1234",
        "Series": "123456",
        "BirthDate": "1990-05-16 00:00:00+03:00",
        "IssueDate": "2000-05-16 00:00:00+03:00",
        "Code": "123456",
        "Emitent": "Паспортный стол г.Москва",
        "BirthPlace": "Гор. Москва",
        "Gender": true
    },
    "FIOTranslit": {
        "FirstNameEng": "Ivan",
        "LastNameEng": "Ivanov",
        "MiddleNameEng": "Ivanovitch"
    }
}

Пример ответа магазина на CallBack от Mandarin

В случае успешной обработки полученного CallBack:

{
    "Result": "True"
}

В случае неуспешной обработки полученного CallBack:

{
    "Result": "False",
    "Errors": ["Ошибка в параметре Amount","AmountError"]
}

Пример кода реализации

Ниже указан пример кода реализации сервиса на языке C#:

// контроллер апи ASP.NET Web API
public CallbackController: ApiController
 {
  // Аттрибут указывающий что запрос приходит методом HTTP POST с данными в теле запроса
  [HttpPost]
  // Метод обработки callback, формат callback описан в JSON схеме
  public HttpResponseMessage GetMandarinCallback([FromBody] SevenSecondsCallback callback) {
   // обработка callback

   return Json(new // возврат результата обработки
    {
     result = true
    });
  }
 }