---
# System prepended metadata

title: Концепция технической интеграции безопасной сделки в ZZap

---

# Концепция технической интеграции безопасной сделки в ZZap

## 1. Создание и оплата

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

По клику на кнопку вы отправляете: id заказа, информацию о товарах, id продавца, координаты продавца, имя и телефон покупателя в наш API 

POST запрос ориентировочно будет принимать следующую структуру в json:

```jsonld=
{
    "id": строка, обязательный,
    "items": [ обязательный, не пустой
        {
            "id": строка, обязательный
            "name": строка, обязательный
            "description": строка или null
            "price": число в рублях, обязательный
            "quantity": число, обязательный
            "weight": число в килограммах, больше нуля
            "height": число в сантиметрах, больше нуля
            "width": число в сантиметрах, больше нуля
            "length": число в сантиметрах, больше нуля
        }
    ],
    "seller": { обязательный
        "id": не пустая строка, обязательный
        "name": не пустая строка, обязательный
        "phone": не пустая строка, только цифры, валидный номер телефона, обязательный
        "email": строка
    },
    "buyer": {
        "id": не пустая строка
        "name": не пустая строка, обязательный
        "phone": не пустая строка, только цифры, валидный номер телефона, обязательный
        "email": строка
    },
    "delivery": {
        "from": {
            "location": { 
                "region": строка или null
                "city": строка или null
                "address": строка или null
                "lat": число в градусах, от -90 до +90 (с юга на север, 0 - экватор)
                "lng": число в градусах, от -180 до +180 (с запада на восток, 0 - гринвич)
            }
        }
    }
}
```

Для определения города продавца необходимо передать в струтуру delivery.from.location координаты lat, lng. Если координаты отсутсвуют, то не будет расчитана предварительная стоимость доставки. Продавец сможет указать город отправления в интерфейсе обработки заказа.

В случае успешного ответа нужно открыть пользователю в iframe url `https://zzap.nalogka.ru/order/{id заказа}/create?s={подпись}&failed_url={адрес страницы ошибки в процессе оформления или оплаты}` (точный адрес уточним позднее), в которому покупатель увидит интерфейс вида:

![](https://i.imgur.com/1X3UO0q.png)

Интерфейс предварительный. Вероятно что него еще будут вноситься изменения.

Пользователь выбирает город получения и пункт выдачи. 

Видит предварительную стоимость доставки (в случае если нам удалось определить город отправителя), стоимость товаров, размер комиссии и сумму к оплате онлайн.

Покупатель заполняет необходимые данные и переходит на оплату прямо в iframe.

В случае успешной оплаты покупатель внутри iframe'а перенаправляется на страницу с информацией о заказе.

В случае неудачи, также внутри iframe'а, перенаправляется на служебную страницу, адрес которой был передан в failed_url. Это позволит вам обработать ситуацию по своему усмотрению: вывести текст ошибки в iframe или закрыть iframe и показать ошибку через alert.


# 2. Обработка заказа продавцом

Продавцу в интерфейсе ZZap необходимо показать iframe в которому будет открыт url `https://zzap.nalogka.ru/order/{id заказа}/processing?s={подпись}` (точный адрес уточним позднее). В этом iframe продавцу будет доступен интерфейс состоящий из трех шагов:

**1. Подтверждение**
![](https://i.imgur.com/tnDJd9z.png)


**2. Доставка**
![](https://i.imgur.com/K7UbZUr.png)


![](https://i.imgur.com/HwYlC5f.png)


**3. Выплата**

![](https://i.imgur.com/KbHRm6w.png)


## 3. Отслеживание статуса

Предполагается что будет iframe который будет выводить состояние заказа. Содержимое должно запрашиваться по адресу `https://zzap.nalogka.ru/order/{id заказа}/status?s={подпись}` (точный адрес уточним позднее).

В окне коротельно будем выводить текстом статус заказа, инфо о доставке  (цена сроки, номер накладной если создан, трекинг если едет и т.п.) плюс кнопку отмены для покупателя.

В интерфейсе ZZap, там где потребуется, можно будет добавить кнопку по нажатию на которую будет открываться iframe с информацией по заказу.

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

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

1. Конкатенируем:
1.1 путь и параметры URL запроса (например /some/url?param1=1&param2=val), из списка исключаем параметр с именем s;
1.2 тело запроса (с точностью до байта, т.е. пробельные символы в начале и в конце тела имеют значение);
1.3 секрет (выдается нами и указывается у нас в конфиге приложения).
2. От полученной строки вычисляем hash по алгоритму sha256.

Подпись передается в hex-представлении в заголовке X-Nalogka-Signature (для API запросов) или в параметре запроса с именем s (для открытия страниц в браузере).

## Вебхуки

События заказа, включая собранные на нашей стороне данные о продавце и покупателе, мы будем передевать через механизм вебхуков на адрес обработчика который вы нам сообщите. Структуру данных определим позднее. Запросы будут подписываться по описанному выше алгоритму.