Link Поиск Меню Развернуть Документ

Уведомление по умолчанию

Если в настройках Магазина была активирована опция отправки автоматических уведомлений о смене статуса Заказа, то при поступлении оплаты в пользу Заказа, система «Инвойсбокс» осуществит запрос на специальный URL, который указан в настройках Магазина.

На указанный URL будет осуществлен POST запрос с Content-Type: application/json в теле которого будет находиться объект OrderNotification.

OrderNotification

Повторяет структуру OrderResponse, основные поля:

Свойство Обязательное Тип Описание
id да string(36) Идентификатор заказа в системе «Инвойсбокс», например: 01771534-1a57-f184-dee3-ebeb91dded75
status да string(50) enum Статус заказа, например: completed, canceled
merchantId да string(36) Идентификатор магазина, например: 01771534-1a57-f184-dee3-ebeb91dded76
merchantOrderId да string(36) Идентификатор заказа в учётной системе магазина, например: O-12345
merchantOrderIdVisible нет string(100) Номер заказа, отображаемый на платежной странице. Если не заполнено, показывается значение из merchantOrderId например 111TN22-33
amount да float Сумма заказа, например: 19658.45
customer да Customer Информация о заказчике
currencyId да string(3) enum Валюта заказа, например: RUB, USD,EUR, GBP
createdAt да datetime Дата создания заказа, например: 2020-12-22T00:00:00+00:00

Заказ считается оплаченным, если его статус равен completed. В этом случае Магазин должен сверить сумму Заказа в запросе с суммой Заказа в своей системе учёта. Если не совпадает, в обработке запроса нужно отказать и вернуть ошибку.

Формат ответа

В случае успешности обработки запроса веб-сервис Магазина должен вернуть объект NotificationSuccess, а в случае ошибки - NotificationError. HTTP код в обоих случаях должен быть равен 200. Запросы с кодом отличные от 200 считаются ошибочными. Так же ошибочными считаются ответы, не содержащий валидный json.

NotificationSuccess

Свойство Обязательное Тип Описание
status да string(50) В случе успешной обработки допустимо только одно значение - success

Пример объекта NotificationSuccess:

{
  "status" : "success"
}

NotificationError

Свойство Обязательное Тип Описание
status да string(50) enum В случае ошибки обработки запроса допустимо только одно значение - error
code нет string(100) enum Код ошибки - значение из справочника NotificationErrorCode, по умолчанию out_of_service
message нет string(500) Детальное описание ошибки в текстовом формате

Пример объекта NotificationError:

{
  "status" : "error",
  "code" : "order_wrong_amount",
  "message" : "Сумма заказа не соответствует сумме оплаты"
}

NotificationErrorCode

Код ошибки Описание
out_of_service Техническая ошибка обработки запроса веб сервером Магазина, при получении этого кода ошибки система «Инвойсбокс» будет пытаться повторить этот запрос еще 10 раз в течение последующих суток.
order_wrong_amount Сумма заказа в Магазине не соответствует сумме заказа в уведомлении
order_already_paid Заказ уже оплачен другим инструментом оплаты :warning:
order_not_found Заказ не найден в учётной системе Магазина
shipping_unavailable Услуга не может быть оказана или товар не может быть доставлен
signature_error Ошибка проверки подписи запроса

Обратите внимание, в случае, если аналогичный запрос с тем же идентификатором (id) уже был обработан ранее успешно в вашей системе, то в этом случае следует вернуть статус успешной обработки уведомления status = success.

В случае, если заказ в вашей системе был оплачен ранее уведомлением с другим идентификатором (id) или иным платёжным инструментом, то следует вернуть ошибку status = error, code = order_already_paid.

Время выполнения запроса

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

Подпись запроса

При обработке запроса уведомления Магазину необходимо проверить его целостность. Для этого необходимо сформировать подпись тела входящего запроса и сравнить со значением из заголовка X-Signature. Если эти значения не совпадают, необходимо сформировать ответ NotificationError с NotificationErrorCode signature_error. Электронная подпись формируется путем криптографического преобразования содержимого тела запроса с использованием ключа и алгоритма выбранных в настройках уведомлений. По умолчанию используется алгоритм sha1 и метод hmac. Ключ можно получить в настройках интеграции магазина в ЛК Инвойсбокс.

Пример проверки подписи на языке PHP
<?php

$xSignature = false;
foreach (getallheaders() as $header => $value)
    if (strtolower($header) == "x-signature") {
        $xSignature = $value;
        break;
    }
}

if (!$xSignature) {
    // Ошибка, подпись запроса не получена
    header("Content-Type: application/json");
    die('{"status":"error","code":"out_of_service"}');
}

$payload = file_get_contents("php://input");
$apiKey = ""; // Согласованный ключ для подписи
$calcSignature = hash_hmac("sha1", $payload, $apiKey);

if ($xSignature != $calcSignature) {
    // Ошибка, подпись запроса неверная
    header("Content-Type: application/json");
    die('{"status":"error","code":"signature_error"}');
}

Пример проверки подписи на языке Python
import hashlib
import hmac
import json

# Проверьте правильность пути и метода в декораторе @app.route()
# - его нужно подстроить под ваше веб-приложение.
@app.route("/invoicebox_callback", methods=['POST'])

async def invoicebox_callback():
    x_signature = request.headers.get('x-signature')
    if not x_signature:
        # Ошибка, подпись запроса не получена
        response = jsonify({'status': 'error', 'code': 'out_of_service'})
        response.headers["Content-Type"] = "application/json"
        return response, 400
    
    # Согласованный ключ для подписи
    api_key = ""
    payload = request.data
    calc_signature = hmac.new(api_key.encode(), payload, hashlib.sha1).hexdigest()
    
    if x_signature != calc_signature:
        # Ошибка, подпись запроса неверная
        response = jsonify({'status': 'error', 'code': 'signature_error'})
        response.headers["Content-Type"] = "application/json"
        return response, 400

Для удобства, смотрите также PHP SDK

Система мониторинга и автоматическое тестирование интеграции

В системе мониторинга «Инвойсбокс» реализовано автоматическое тестирование работоспособности интеграции.

Для проверки корректности интеграции, система может направлять тестовое уведомление, в котором в качестве идентификатора заказа в учётной системе магазина будет передано пустое значение, в качестве идентификатора заказа в системе «Инвойсбокс» будет передано значение ffffffff-ffff-ffff-ffff-ffffffffffff.

При получении такого запроса, система учёта магазина должна проверить корректность подписи запроса, сверить идентификатор магазина с настройками и вернуть ответ по резултатам проверки.


Читать далее »