Перейти к содержимому
Разделы

Внешние заказы и POS

Передать подписанную ревизию отмены внешнего заказа

POST/external-order-ingress/{sourceId}/orders/{externalOrderId}/cancel

Открытые заказы Hallify отменяются атомарно на основании их исходного коммерческого допуска или явно проверенного подтверждения для прежних данных. Переданные заказы остаются доступными для явного решения оператором. Результаты ранее выполненных команд можно повторно получить и после окончания покрытия подписки. Профиль Hallify HMAC external-orders использует HMAC-SHA256. Каноническое сообщение: RFC3339 + "." + стабильный JSON с сортировкой ключей. Передайте x-hallify-timestamp в формате RFC3339; допустимое расхождение — ±300 секунд. Формат x-hallify-signature: строчные шестнадцатеричные символы; сравнение выполняется за постоянное время. Используйте выданный текст base64url как секрет в UTF-8. Content-Type: application/json. Некорректная подпись: 401 Webhook signature is invalid. Просроченное время: 401 Webhook timestamp is stale. Повторы и конфликты определяются ревизией заказа и отпечатком тела.

Авторизация

x-hallify-signature: <HALLIFY_SIGNATURE>

Подпись HMAC-SHA256. Точный протокол каждой операции указан в метаданных x-hallify-hmac и её описании.

Руководство по подключению

Параметры

sourceIdПуть · Обязательно

Настроенный источник приёма данных или интеграции в пределах авторизованного родительского ресурса.

string · uuid
Полное определение
{
  "format": "uuid",
  "type": "string",
  "example": "9b6163a8-afea-4877-818b-8e2ae28a2845"
}
externalOrderIdПуть · Обязательно

Идентификатор внешнего заказа, назначенный провайдером в пределах авторизованного HMAC-источника.

string
Полное определение
{
  "type": "string",
  "example": "example"
}
x-hallify-timestampЗаголовок · Обязательно

Время в формате RFC3339; допустимое расхождение часов — ±300 секунд.

string
Полное определение
{
  "type": "string",
  "example": "example"
}

Тело запроса

Обязательно

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

application/json

ExternalOrderCancelIngressDto
Полное определение
{
  "$ref": "#/components/schemas/ExternalOrderCancelIngressDto"
}

Ответы

201Возвращает записанную ревизию отмены внешнего заказа. Заказы Hallify, вышедшие из открытого состояния, сохраняют процесс разрешения ситуации оператором.
ExternalOrderIngressCancelResultDto
Полное определение
{
  "$ref": "#/components/schemas/ExternalOrderIngressCancelResultDto"
}
Пример ответа · 201 · application/json
{
  "id": "a42073ae-5313-4ace-86d8-86fb33fde1a9",
  "status": "example",
  "externalRevision": 1,
  "duplicate": false
}
400Некорректный идентификатор источника внешних заказов или тело отмены.
TranslatedErrorDto
Полное определение
{
  "$ref": "#/components/schemas/TranslatedErrorDto"
}
Пример ответа · 400 · application/json
{
  "statusCode": 400,
  "error": "errors:http.badRequest",
  "code": "HTTP_BAD_REQUEST",
  "message": "errors:http.badRequest",
  "translationKey": "errors:http.badRequest"
}
401HMAC-подпись внешнего заказа недействительна или просрочена.
TranslatedErrorDto
Полное определение
{
  "$ref": "#/components/schemas/TranslatedErrorDto"
}
Пример ответа · 401 · application/json
{
  "statusCode": 401,
  "error": "errors:http.unauthorized",
  "code": "HTTP_UNAUTHORIZED",
  "message": "errors:http.unauthorized",
  "translationKey": "errors:http.unauthorized"
}
404Источник внешних заказов или заказ не найден.
TranslatedErrorDto
Полное определение
{
  "$ref": "#/components/schemas/TranslatedErrorDto"
}
Пример ответа · 404 · application/json
{
  "statusCode": 404,
  "error": "errors:http.notFound",
  "code": "HTTP_NOT_FOUND",
  "message": "errors:http.notFound",
  "translationKey": "errors:http.notFound"
}
409Ревизия внешнего заказа или состояние заказа конфликтует с текущим состоянием. POS_EXTERNAL_ORDER_ORIGINAL_EVIDENCE_REQUIRED означает, что у исходного заказа нет ни подтверждения коммерческого допуска, ни явно проверенного подтверждения для продолжения прежних данных. Требуется проверка исходных данных; текущее покрытие подписки не заменяет такого подтверждения.
TranslatedErrorDto
Полное определение
{
  "$ref": "#/components/schemas/TranslatedErrorDto"
}
Пример ответа · 409 · application/json
{
  "statusCode": 409,
  "error": "errors:http.conflict",
  "code": "HTTP_CONFLICT",
  "message": "errors:http.conflict",
  "translationKey": "errors:http.conflict"
}
503Недоступны данные подписи внешнего заказа, подтверждение исходного заказа, исходные данные команды или состояние повторного выполнения.
TranslatedErrorDto
Полное определение
{
  "$ref": "#/components/schemas/TranslatedErrorDto"
}
Пример ответа · 503 · application/json
{
  "statusCode": 503,
  "error": "errors:http.serviceUnavailable",
  "code": "HTTP_SERVICE_UNAVAILABLE",
  "message": "errors:http.serviceUnavailable",
  "translationKey": "errors:http.serviceUnavailable"
}

Схемы

ExternalOrderCancelIngressDto

Открытые заказы Hallify отменяются атомарно.

externalRevisionОбязательно

Монотонно возрастающая ревизия externalRevision для оптимистичного контроля конкурентных изменений. Ограничения: минимум 1.

integer
Полное определение
{
  "type": "integer",
  "minimum": 1,
  "description": "Монотонно возрастающая ревизия `externalRevision` для оптимистичного контроля конкурентных изменений. Ограничения: минимум 1.",
  "example": 1
}
reasonОбязательно

Причина reason, введённая человеком и сохранённая как обоснование решения или свидетельство аудита. Ограничения: минимальная длина 3; максимальная длина 500.

string
Полное определение
{
  "type": "string",
  "minLength": 3,
  "maxLength": 500,
  "description": "Причина `reason`, введённая человеком и сохранённая как обоснование решения или свидетельство аудита. Ограничения: минимальная длина 3; максимальная длина 500.",
  "example": "Synthetic example"
}
Полное определение
{
  "type": "object",
  "properties": {
    "externalRevision": {
      "type": "integer",
      "minimum": 1,
      "description": "Монотонно возрастающая ревизия `externalRevision` для оптимистичного контроля конкурентных изменений. Ограничения: минимум 1.",
      "example": 1
    },
    "reason": {
      "type": "string",
      "minLength": 3,
      "maxLength": 500,
      "description": "Причина `reason`, введённая человеком и сохранённая как обоснование решения или свидетельство аудита. Ограничения: минимальная длина 3; максимальная длина 500.",
      "example": "Synthetic example"
    }
  },
  "required": [
    "externalRevision",
    "reason"
  ],
  "description": "Открытые заказы Hallify отменяются атомарно.",
  "example": {
    "externalRevision": 1,
    "reason": "Synthetic example"
  }
}
ExternalOrderIngressCancelResultDto

Возвращает записанную ревизию отмены и итоговое состояние обработки заказа Hallify.

Полное определение
{
  "oneOf": [
    {
      "type": "object",
      "required": [
        "id",
        "status",
        "externalRevision",
        "duplicate"
      ],
      "properties": {
        "id": {
          "type": "string",
          "format": "uuid",
          "description": "UUID Hallify для `id`.",
          "example": "a42073ae-5313-4ace-86d8-86fb33fde1a9"
        },
        "status": {
          "type": "string",
          "description": "Текущий статус жизненного цикла `status`.",
          "example": "example"
        },
        "externalRevision": {
          "type": "integer",
          "minimum": 0,
          "description": "Монотонно возрастающая ревизия `externalRevision` для оптимистичного контроля конкурентных изменений. Ограничения: минимум 0.",
          "example": 1
        },
        "duplicate": {
          "type": "boolean",
          "enum": [
            false
          ],
          "description": "Допустимые значения `duplicate`: false.",
          "example": false
        }
      },
      "example": {
        "id": "a42073ae-5313-4ace-86d8-86fb33fde1a9",
        "status": "example",
        "externalRevision": 1,
        "duplicate": false
      }
    },
    {
      "type": "object",
      "required": [
        "id",
        "status",
        "duplicate"
      ],
      "properties": {
        "id": {
          "type": "string",
          "format": "uuid",
          "description": "UUID Hallify для `id`.",
          "example": "a7476fce-e842-42a4-896a-c23b0e88b420"
        },
        "status": {
          "type": "string",
          "description": "Текущий статус жизненного цикла `status`.",
          "example": "example"
        },
        "duplicate": {
          "type": "boolean",
          "enum": [
            true
          ],
          "description": "Допустимые значения `duplicate`: true.",
          "example": true
        }
      },
      "example": {
        "id": "a7476fce-e842-42a4-896a-c23b0e88b420",
        "status": "example",
        "duplicate": true
      }
    }
  ],
  "description": "Возвращает записанную ревизию отмены и итоговое состояние обработки заказа Hallify.",
  "example": {
    "id": "a42073ae-5313-4ace-86d8-86fb33fde1a9",
    "status": "example",
    "externalRevision": 1,
    "duplicate": false
  }
}
TranslatedErrorDto

Стабильная оболочка ошибки общего обработчика HTTP-исключений. Дополнительные машинные данные домена вложены в details.

statusCodeОбязательно

HTTP-статус, повторённый из ответа.

integer
Полное определение
{
  "type": "integer",
  "description": "HTTP-статус, повторённый из ответа.",
  "example": 400
}
errorОбязательно

Ключ перевода HTTP-категории, например errors:http.conflict. Конкретную причину определяют code и translationKey.

string
Полное определение
{
  "type": "string",
  "description": "Ключ перевода HTTP-категории, например errors:http.conflict. Конкретную причину определяют code и translationKey.",
  "example": "errors.request.invalid"
}
codeОбязательно

Стабильный машинный код домена либо стандартный HTTP_*, если доменный код не задан. Используйте это поле и HTTP-статус для программной логики; локализованная формулировка не управляет повторами или бизнес-решениями.

string
Полное определение
{
  "type": "string",
  "example": "HTTP_BAD_REQUEST",
  "description": "Стабильный машинный код домена либо стандартный HTTP_*, если доменный код не задан. Используйте это поле и HTTP-статус для программной логики; локализованная формулировка не управляет повторами или бизнес-решениями."
}
messageОбязательно

Ключ перевода, идентичный translationKey. API не возвращает локализованный текст интерфейса. Найдите перевод ключа и подставьте translationValues в приложении-потребителе.

string
Полное определение
{
  "type": "string",
  "example": "errors:http.badRequest",
  "description": "Ключ перевода, идентичный translationKey. API не возвращает локализованный текст интерфейса. Найдите перевод ключа и подставьте translationValues в приложении-потребителе."
}
translationKeyОбязательно

Канонический ключ перевода, идентичный message. Ключи errors:http.* соответствующего статуса описывают неуточнённые ошибки. Публичные ключи и пояснения EN/RU перечислены в Developers; неизвестный ключ требует локализованного запасного сообщения в клиенте.

string
Полное определение
{
  "type": "string",
  "example": "errors:http.badRequest",
  "description": "Канонический ключ перевода, идентичный message. Ключи errors:http.* соответствующего статуса описывают неуточнённые ошибки. Публичные ключи и пояснения EN/RU перечислены в Developers; неизвестный ключ требует локализованного запасного сообщения в клиенте."
}
translationValuesНеобязательно

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

object
Полное определение
{
  "type": "object",
  "additionalProperties": {
    "oneOf": [
      {
        "type": "string",
        "example": "example"
      },
      {
        "type": "number",
        "example": 0
      },
      {
        "type": "boolean",
        "example": true
      }
    ],
    "example": "example"
  },
  "description": "Необязательные скалярные значения параметров шаблона перевода. Обрабатывайте их как данные, экранируйте при отображении и никогда не используйте как настройки переводчика.",
  "example": {
    "exampleKey": "example"
  }
}
validationErrorsНеобязательно

Ошибки проверки полей с ключами переводов и стабильными кодами валидаторов. Введённые значения и исходные тексты валидаторов не включаются.

array
Полное определение
{
  "description": "Ошибки проверки полей с ключами переводов и стабильными кодами валидаторов. Введённые значения и исходные тексты валидаторов не включаются.",
  "type": "array",
  "items": {
    "$ref": "#/components/schemas/ValidationErrorDto"
  },
  "example": [
    {
      "field": "email",
      "translationKey": "validation:isEmail",
      "code": "isEmail",
      "message": "validation:isEmail"
    }
  ]
}
detailsНеобязательно

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

oneOf
Полное определение
{
  "description": "Необязательные сведения о доменных препятствиях или ошибках валидации.",
  "oneOf": [
    {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/JsonValue"
      },
      "example": [
        "example"
      ]
    },
    {
      "type": "object",
      "additionalProperties": {
        "$ref": "#/components/schemas/JsonValue"
      },
      "example": {
        "exampleKey": "example"
      }
    }
  ],
  "example": [
    "example"
  ]
}
Полное определение
{
  "type": "object",
  "properties": {
    "statusCode": {
      "type": "integer",
      "description": "HTTP-статус, повторённый из ответа.",
      "example": 400
    },
    "error": {
      "type": "string",
      "description": "Ключ перевода HTTP-категории, например errors:http.conflict. Конкретную причину определяют code и translationKey.",
      "example": "errors.request.invalid"
    },
    "code": {
      "type": "string",
      "example": "HTTP_BAD_REQUEST",
      "description": "Стабильный машинный код домена либо стандартный HTTP_*, если доменный код не задан. Используйте это поле и HTTP-статус для программной логики; локализованная формулировка не управляет повторами или бизнес-решениями."
    },
    "message": {
      "type": "string",
      "example": "errors:http.badRequest",
      "description": "Ключ перевода, идентичный translationKey. API не возвращает локализованный текст интерфейса. Найдите перевод ключа и подставьте translationValues в приложении-потребителе."
    },
    "translationKey": {
      "type": "string",
      "example": "errors:http.badRequest",
      "description": "Канонический ключ перевода, идентичный message. Ключи errors:http.* соответствующего статуса описывают неуточнённые ошибки. Публичные ключи и пояснения EN/RU перечислены в Developers; неизвестный ключ требует локализованного запасного сообщения в клиенте."
    },
    "translationValues": {
      "type": "object",
      "additionalProperties": {
        "oneOf": [
          {
            "type": "string",
            "example": "example"
          },
          {
            "type": "number",
            "example": 0
          },
          {
            "type": "boolean",
            "example": true
          }
        ],
        "example": "example"
      },
      "description": "Необязательные скалярные значения параметров шаблона перевода. Обрабатывайте их как данные, экранируйте при отображении и никогда не используйте как настройки переводчика.",
      "example": {
        "exampleKey": "example"
      }
    },
    "validationErrors": {
      "description": "Ошибки проверки полей с ключами переводов и стабильными кодами валидаторов. Введённые значения и исходные тексты валидаторов не включаются.",
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/ValidationErrorDto"
      },
      "example": [
        {
          "field": "email",
          "translationKey": "validation:isEmail",
          "code": "isEmail",
          "message": "validation:isEmail"
        }
      ]
    },
    "details": {
      "description": "Необязательные сведения о доменных препятствиях или ошибках валидации.",
      "oneOf": [
        {
          "type": "array",
          "items": {
            "$ref": "#/components/schemas/JsonValue"
          },
          "example": [
            "example"
          ]
        },
        {
          "type": "object",
          "additionalProperties": {
            "$ref": "#/components/schemas/JsonValue"
          },
          "example": {
            "exampleKey": "example"
          }
        }
      ],
      "example": [
        "example"
      ]
    }
  },
  "required": [
    "statusCode",
    "error",
    "code",
    "message",
    "translationKey"
  ],
  "description": "Стабильная оболочка ошибки общего обработчика HTTP-исключений. Дополнительные машинные данные домена вложены в details.",
  "example": {
    "statusCode": 400,
    "error": "errors:http.badRequest",
    "code": "HTTP_BAD_REQUEST",
    "message": "errors:http.badRequest",
    "translationKey": "errors:http.badRequest"
  }
}
ValidationErrorDto

Ошибка проверки поля с путём поля, стабильным кодом валидатора и ключом перевода. Человекочитаемый текст принадлежит приложению-потребителю.

fieldОбязательно

Публичный путь поля. Вложенные свойства и индексы массива разделены точками.

string
Полное определение
{
  "type": "string",
  "example": "email",
  "description": "Публичный путь поля. Вложенные свойства и индексы массива разделены точками."
}
translationKeyОбязательно

Ключ перевода этого валидатора, идентичный message. Найдите его в клиентском словаре; см. публичный каталог ошибок Developers.

string
Полное определение
{
  "type": "string",
  "example": "validation:isEmail",
  "description": "Ключ перевода этого валидатора, идентичный message. Найдите его в клиентском словаре; см. публичный каталог ошибок Developers."
}
codeОбязательно

Стабильный идентификатор валидатора для ошибки поля. Пользовательские валидаторы могут определять дополнительные идентификаторы.

string
Полное определение
{
  "type": "string",
  "example": "isEmail",
  "description": "Стабильный идентификатор валидатора для ошибки поля. Пользовательские валидаторы могут определять дополнительные идентификаторы."
}
messageОбязательно

Ключ перевода, описывающий ошибку проверки поля, идентичный translationKey. Введённые значения и тексты валидаторов не включаются.

string
Полное определение
{
  "type": "string",
  "example": "validation:isEmail",
  "description": "Ключ перевода, описывающий ошибку проверки поля, идентичный translationKey. Введённые значения и тексты валидаторов не включаются."
}
translationValuesНеобязательно

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

object
Полное определение
{
  "type": "object",
  "additionalProperties": {
    "oneOf": [
      {
        "type": "string",
        "example": "example"
      },
      {
        "type": "number",
        "example": 0
      },
      {
        "type": "boolean",
        "example": true
      }
    ],
    "example": "example"
  },
  "description": "Необязательные скалярные значения параметров шаблона перевода. Обрабатывайте их как данные, экранируйте при отображении и никогда не используйте как настройки переводчика.",
  "example": {
    "exampleKey": "example"
  }
}
Полное определение
{
  "type": "object",
  "properties": {
    "field": {
      "type": "string",
      "example": "email",
      "description": "Публичный путь поля. Вложенные свойства и индексы массива разделены точками."
    },
    "translationKey": {
      "type": "string",
      "example": "validation:isEmail",
      "description": "Ключ перевода этого валидатора, идентичный message. Найдите его в клиентском словаре; см. публичный каталог ошибок Developers."
    },
    "code": {
      "type": "string",
      "example": "isEmail",
      "description": "Стабильный идентификатор валидатора для ошибки поля. Пользовательские валидаторы могут определять дополнительные идентификаторы."
    },
    "message": {
      "type": "string",
      "example": "validation:isEmail",
      "description": "Ключ перевода, описывающий ошибку проверки поля, идентичный translationKey. Введённые значения и тексты валидаторов не включаются."
    },
    "translationValues": {
      "type": "object",
      "additionalProperties": {
        "oneOf": [
          {
            "type": "string",
            "example": "example"
          },
          {
            "type": "number",
            "example": 0
          },
          {
            "type": "boolean",
            "example": true
          }
        ],
        "example": "example"
      },
      "description": "Необязательные скалярные значения параметров шаблона перевода. Обрабатывайте их как данные, экранируйте при отображении и никогда не используйте как настройки переводчика.",
      "example": {
        "exampleKey": "example"
      }
    }
  },
  "required": [
    "field",
    "translationKey",
    "code",
    "message"
  ],
  "description": "Ошибка проверки поля с путём поля, стабильным кодом валидатора и ключом перевода. Человекочитаемый текст принадлежит приложению-потребителю.",
  "example": {
    "field": "email",
    "translationKey": "validation:isEmail",
    "code": "isEmail",
    "message": "validation:isEmail"
  }
}
JsonValue

Рекурсивно допустимое JSON-значение. Используется только там, где контракт явно разрешает произвольные структурированные данные.

Полное определение
{
  "oneOf": [
    {
      "type": "string",
      "nullable": true,
      "example": "example"
    },
    {
      "type": "number",
      "example": 0
    },
    {
      "type": "boolean",
      "example": true
    },
    {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/JsonValue"
      },
      "example": [
        "example"
      ]
    },
    {
      "type": "object",
      "additionalProperties": {
        "$ref": "#/components/schemas/JsonValue"
      },
      "example": {
        "exampleKey": "example"
      }
    }
  ],
  "description": "Рекурсивно допустимое JSON-значение. Используется только там, где контракт явно разрешает произвольные структурированные данные.",
  "example": "example"
}

Hallify использует обязательные cookies и опциональную аналитику.

Обязательные cookies поддерживают вход, язык и тему. Аналитика выключена, пока вы явно ее не разрешите.