Интеграция API Почта РФ

Данный документ описывает реализацию обмена информацией между Falcon Space и почтой РФ.

Общие входные данные:

  • Город отправления (Флаг - от двери);
  • Город получения (Флаг - до двери);
  • Длина, см;
  • Ширина, см;
  • Высота, см;
  • Вес, г.

Общий алгоритм:

  1.  Формирование текста запроса с параметрами
  2.  Отправка запроса 
  3.  Получение ответа на запрос
  4.  Парсинг ответа,  получение данных.

 

Почта РФ с авторизацией - otpravka.pochta.ru (обзор)

Для начала работы необходимо зарегистрироваться - https://passport.pochta.ru.

API Онлайн-сервиса «Отправка» - Основная информация - https://otpravka.pochta.ru/specification#/main

Взаимодействие посредством REST запросов.

Запросы и ответы сервиса используют JSON текстовый формат.

Для интеграции с API Онлайн-сервиса «Отправка» необходимо располагать:

  •     токеном авторизации приложения;
  •     ключом авторизации пользователя.

Ключ авторизации пользователя - генерируется с помощью алгоритма base64 - https://otpravka.pochta.ru/specification#/authorization-key

Токен можно узнать в настройках личного кабинета - https://otpravka.pochta.ru/settings#/api-settings

Для работы с данным сервисом и получения токена необходим договор с Почтой России!

Далее этот способ не рассматривается.

Почта РФ без авторизации

Если у Вас нет договора и доступа к api используйте эти два сервиса от Почты России. 

Расчет сроков доставки -  https://delivery.pochta.ru/#/calcmail/910

Расчет стоимости доставки - https://tariff.pochta.ru/#/calcmail/101

Почта РФ тарифы - Стоимость - PROCEDURE [api_ruPostTariff_request]

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

Сайт: https://tariff.pochta.ru/#/calcmail/101

Документация: https://tariff.pochta.ru/#/support/api

Для получения расчета клиент отправляет на сервер REST-запрос методом GET

 

Параметры запроса

 

Входные данные запроса – параметры процедуры PROCEDURE [dbo].[api_ruPostTariff_request]

Переменная

Тип

Значение по умолчанию

Описание

Примечание

1

@resultType

nvarchar(32)

'Json'

Формат запрашиваемых данных

Json - тип результата

2

@codeObject

nvarchar(32)

'47030'

Тип (код) объекта почтовой тарификации, см. Приложение 1

47030 - Посылка 1 класса – (ПРИМЕР c6v.ru)

27030 - Посылка (частное лицо или предприятие) - Посылка стандарт

3

@indexFrom

nvarchar(32)

'101000'

Индекс места отправления

101000 "МОСКВА"

4

@doorFrom

bit

 0

Флаг - от двери

 ПОКА НЕ ИСПОЛЬЗУЕТСЯ

5

@indexTo

nvarchar(32)

'690000 '

Индекс места назначения

108803 "ВОСКРЕСЕНСКОЕ"

- Владивосток

6

@doorTo

bit

0

Флаг - до двери

 ПОКА НЕ ИСПОЛЬЗУЕТСЯ

 

вес / габариты

7

@weight

nvarchar(32)

'100'

Вес

(пока считать в граммах)

8

@length    

nvarchar(32)

'10'

Длина, см

ПОКА НЕ ИСПОЛЬЗУЕТСЯ

9

@width     

nvarchar(32)

'10'

Ширина, см

ПОКА НЕ ИСПОЛЬЗУЕТСЯ

10

@height    

nvarchar(32)

'10'

Высота, см

ПОКА НЕ ИСПОЛЬЗУЕТСЯ

11

@pack      

nvarchar(32)

'10'

Тип упаковки

Возможные значения см. в Приложении 3

10 - Коробка «S»

12

@operDate  

nvarchar(8)

 

Дата тарификации YYYYMMDD

Если дата не указана, принимается значение текущей даты

 

Расчетные параметры

13

size

nvarchar(max)

 

Размер отправления (см).

Указывается 3 целочисленных значения, разделенные знаком “x”, например, size=100x50x25.

ПОКА НЕ ИСПОЛЬЗУЕТСЯ

Индексы

  • 101000 - МОСКВА
  • 344000 - Ростов
  • 163000- Архангельск
  • 690000 - Владивосток

Замечание 1. В зависимости от Кода объекта тарификации набор входных параметров может меняться.

Пример текста запроса - request.

 https://tariff.pochta.ru/tariff/v1/calculate?Json&object=47030&from=101000&to=690000&weight=100&pack=10&date=20200603

Примечание. Фактически в этом запросе передается только URL. Тела запроса body – нет, SELECT2 не используется.

Пример текста ответа - response.

{
    "version": "1.13.3.390",
    "place": "C5-6",
    "id": 47030,
    "name": "Посылка 1 класса",
    "typ": 47,
    "cat": 3,
    "dir": 0,
    "from": 101000,
    "to": 690000,
    "weight": 100,
    "date": 20200603,
    "time": 0,
    "date-first": 20200101,
    "postoffice": [
        {
            "index": 101000,
            "tp": 1,
            "name": "МОСКВА",
            "region": 1000000001045,
            "regid": 77,
            "place": 1000000001045,
            "parent": 127950,
            "type": 3,
            "pvz": 1,
            "item-check-men": 1,
            "item-check-view": 1,
            "move": 1,
            "pack-max": 99
        },
        {
            "index": 690000,
            "tp": 2,
            "name": "ВЛАДИВОСТОК ПОЧТАМТ",
            "region": 1005,
            "regid": 25,
            "place": 1000000031441,
            "parent": 690700,
            "type": 15
        }
    ],
    "trans": 3,
    "transid": 2,
    "transname": "авиа",
    "tariff": [
        {
            "id": "2556",
            "name": "Плата за пересылку посылки 1 класса",
            "steps": [
                {
                    "name": "Доставка из группы 1 по зоне 2",
                    "route": [
                        2556,
                        "1",
                        "2",
                        "100"
                    ],
                    "v": 14417,
                    "id": "2556-1-2-100"
                }
            ],
            "fromi": 101000,
            "from": "МОСКВА",
            "toi": 690000,
            "to": "ВЛАДИВОСТОК ПОЧТАМТ",
            "ground": {
                "val": 14417,
                "valnds": 17300,
                "ndsrate": 20.0
            }
        }
    ],
    "ground": {
        "val": 14417,
        "valnds": 17300
    },
    "pay": 14417,
    "paynds": 17300,
    "ndsrate": 20,
    "nds": 2883,
    "typcatname": "Посылка 1 класса",
    "now": "20200603T202514"
}

 

CREATE PROCEDURE [dbo].[api_ruPostTariff_request]
	@parameters ExtendedDictionaryParameter READONLY,  -- входящие параметры для внутренней обработки (используйте Key, Value2)
	@username nvarchar(32)  -- текущий пользователь.
    --  API ЗАПРОС - КЛЮЧИ  Исходные данные:
    ,@resultType nvarchar(32) = 'Json' 		-- Json		тип результата
	,@codeObject nvarchar(32) = '47030'  	-- Код объекта тарификации
    										-- 47030 - Посылка 1 класса -- ПРИМЕР c6v.ru
											-- 27030 - Посылка (частное лицо или предприятие) - Посылка стандарт

	,@indexFrom	nvarchar(32) = '101000'   	-- Индекс места отправления -- 101000 "МОСКВА".
	,@doorFrom  bit = 0 					-- Флаг - от двери -- ПРИМЕР c6v.ru -- ПОКА НЕ ИСПОЛЬЗУЕТСЯ

	,@indexTo   nvarchar(32) = '690000'   	-- Индекс места назначения -- 108803 "ВОСКРЕСЕНСКОЕ". -- 690000 - Владивосток
	,@doorTo   	bit = 0 					-- Флаг - до двери -- ПРИМЕР c6v.ru -- ПОКА НЕ ИСПОЛЬЗУЕТСЯ
	-- вес / габариты
	,@weight     nvarchar(32) = '100'   	-- Вес (грамм / кг ) -- Указывается в граммах или килограммах, в зависимости от объекта тарификации, см. Приложение 1
											-- пока считать в граммах
    -- Размер -- ПРИМЕР c6v.ru -- ПОКА НЕ ИСПОЛЬЗУЕТСЯ
	,@length     nvarchar(32) = '10'   		-- Длина, см
	,@width      nvarchar(32) = '10'   		-- Ширина, см
	,@height     nvarchar(32) = '10'   		-- Высота, см

	,@pack       nvarchar(32) = '10'   		-- Упаковка
    ,@operDate   nvarchar(8)  = ''          --'20200527'  -- Дата тарификации YYYYMMDD -- Если дата не указана, принимается значение текущей даты

AS
BEGIN

-- Дата тарификации YYYYMMDD -- Если дата не указана, принимается значение текущей даты
-- 112 = ггггммдд --'20200527'
IF  LEN(  ISNULL ( @operDate   , '' ) )=0
SET @operDate  =  CONVERT ( nvarchar(8) , GETDATE() , 112 )
-- exec as_print @str = @operDate


DECLARE @apiUrl 		nvarchar(max) = '' 		-- Финальная строка для отправки -- @apiStr -- ФАКТИЧЕСКИ ЭТО Url
DECLARE @apiCommomStr 	nvarchar(max) = '' 	    -- Общая часть для всех запросов
SET     @apiCommomStr   = 'https://tariff.pochta.ru/tariff/v1/calculate?' -- ? знак в конце Обязательно

-- size Строка Размер отправления (см). Указывается 3 целочисленных значения, разделенные знаком “x”, например, size=100x50x25. Возможные значения: 1–1000
-- формируется по вх.парам
-- ПРИМЕР c6v.ru -- ПОКА НЕ ИСПОЛЬЗУЕТСЯ
DECLARE @size nvarchar(max) = ''
SET     @size =  @length + 'x' + @width + 'x' + @height
-- exec as_print @str=@size

SET  @apiUrl  = @apiUrl + @apiCommomStr
                        + @resultType
                        + IIF ( LEN(  ISNULL ( @codeObject , '' ) )>0, '&object=' + @codeObject, '' )
                        + IIF ( LEN(  ISNULL ( @indexFrom  , '' ) )>0, '&from=' + @indexFrom, '' )
                        + IIF ( LEN(  ISNULL ( @indexTo    , '' ) )>0, '&to=' + @indexTo, '' )
                        + IIF ( LEN(  ISNULL ( @weight     , '' ) )>0, '&weight=' + @weight, '' )
                        + IIF ( LEN(  ISNULL ( @pack       , '' ) )>0, '&pack=' + @pack, '' )
                        + IIF ( LEN(  ISNULL ( @operDate   , '' ) )>0, '&date=' + @operDate, '' )


    -- ОТЛАДКА
	insert into as_trace (text, username, code , created )   values( @apiUrl , @username, 'api_ruPostTariff_request' , GETDATE() )

    -- ПРАВИЛЬНАЯ СТРОКА
    -- select '' Msg, 1 Result, 'https://tariff.pochta.ru/tariff/v1/calculate?json&object=27030&from=101000&to=108803&weight=1000&pack=10&date=20200527' Url
    -- ФАКТИЧЕСКИ ВЕСЬ ЗАПРОС ОТПРАВЛЯЕСТ В Url
    select '' Msg, 1 Result, @apiUrl AS Url

	-- SELECT 2 PARAMETERS - параметры, которые будут передаваться во внешний источник
	-- select 'id' name, '5' value, '' [type] -- form (в форме передается), header (в http headers), get запросы передавайте прямо в URL
END

Почта РФ тарифы - Стоимость - PROCEDURE [api_ruPostTariff_response]

 Результат запроса может быть как сообщение с информацией, так и сообщение с ошибкой.

 Список возможных сообщений об ошибке.

  1.  'Ошибка! Строка @response не является JSON!' (Проверка ответа оператором ISJSON() )
  2.  'Ошибка! Запрос @response вернул ошибку! '… @errorText.

Пример текста ответа – response – с ошибкой.

{
    "caption": "Ошибки тарификации",
    "version": "1.13.3.390",
    "error": [
        "Не указан объект тарификации в параметре object. (1301)"
    ],
    "errors": [
        {
            "msg": "Не указан объект тарификации в параметре object.",
            "code": 1301
        }
    ]
}

Если ошибок в ответе не обнаружено, из ответа выбираются такие данные:

  • Итого сумма без НДС
  • Итого сумма с НДС
  • Ставка НДС %
  • Сумма НДС
  • Название операции
  • Дата и Время выполнения

Пример текста – результат: "Операция: Посылка 1 класса Итого сумма без НДС: 144.71 руб. Итого НДС ( Ставка 20% ):28.38 руб. Итого сумма с НДС: 173.00 руб."

PROCEDURE [dbo].[api_ruPostTariff_response]

CREATE PROCEDURE [dbo].[api_ruPostTariff_response]
	@response nvarchar(max),
	@parameters ExtendedDictionaryParameter READONLY,  -- входящие параметры для внутренней обработки (используйте Key, Value2 - те же что и на request)

	@username nvarchar(32)
AS
BEGIN
    -- ОТЛАДКА
    -- exec as_print @str='api_ruPostTariff_response'
	insert into as_trace (text, username, code , created) values(@response, @username, 'api_ruPostTariff_response' , GETDATE() )


    DECLARE @json1 NVARCHAR(MAX)  = N''
	SET @json1 = @response

    -- Для проверки правильности JSON формата существует функция ISJSON, которая возвращает 1, если это JSON, 0 — если нет и NULL, если был передан NULL
    DECLARE @presentJSON bit = 0
    SELECT @presentJSON = ISNULL( ISJSON( @json1 ) , 0 )
    -- SELECT @presentJSON
    IF @presentJSON <> 1
    BEGIN
        SELECT 'Ошибка! Строка @response не является JSON!' Msg, 0 Result, @response Response
        RETURN
    END


    -- Обработка ошибки в ответе
    DECLARE @presentError bit = 0, @errorText NVARCHAR(MAX), @errorCode NVARCHAR(MAX), @errorMsg NVARCHAR(MAX)
    -- ошибка
    -- https://tariff.pochta.ru/tariff/v1/calculate?Json&27030&101000&108803&1000&10&20200527
    -- {"caption": "Ошибки тарификации","version": "1.12.19.385","error": ["Не указан объект тарификации в параметре object. (1301)"],"errors": [{"msg":"Не указан объект тарификации в параметре object.","code":1301}]}

	DECLARE @pay		NVARCHAR(MAX) -- Итого сумма без НДС
          , @paynds		NVARCHAR(MAX) -- Итого сумма с НДС
          , @ndsrate	NVARCHAR(MAX) -- Ставка НДС %
          , @nds		NVARCHAR(MAX) -- Сумма НДС
          , @typcatname NVARCHAR(MAX) -- Название операции
          , @now		NVARCHAR(MAX) -- Дата и Время выполнения

	-- Чтобы извлечь скалярное значение из JSON, можно воспользоваться функцией JSON_VALUE:
      SELECT @presentError = IIF( JSON_VALUE( @json1, '$.error[0]') IS NULL  , 0 , 1 )
           , @errorText    = JSON_VALUE( @json1, '$.error[0]')
           , @errorCode    = JSON_VALUE( @json1, '$.errors[0].code')
           , @errorMsg     = JSON_VALUE( @json1, '$.errors[0].msg')
           -- Данные
           , @pay 			= JSON_VALUE( @json1, '$.pay')
           , @paynds 		= JSON_VALUE( @json1, '$.paynds')
           , @ndsrate 		= JSON_VALUE( @json1, '$.ndsrate')
           , @nds 			= JSON_VALUE( @json1, '$.nds')
           , @typcatname 	= JSON_VALUE( @json1, '$.typcatname')
           , @now 			= JSON_VALUE( @json1, '$.now')


      IF @presentError = 1
      BEGIN
          SELECT 'Ошибка! Запрос @response вернул ошибку! '+ ISNULL( @errorText, '' ) Msg, 0 Result, @response Response
          RETURN
      END

	 DECLARE @payInt		NVARCHAR(MAX) -- Итого сумма без НДС -- Целое
          , @payDecimal		NVARCHAR(MAX) -- Итого сумма без НДС -- дробное
          , @payndsInt		NVARCHAR(MAX) -- Итого сумма с НДС -- Целое
          , @payndsDecimal	NVARCHAR(MAX) -- Итого сумма с НДС -- дробное
          , @ndsInt			NVARCHAR(MAX) -- Сумма НДС -- Целое
          , @ndsDecimal		NVARCHAR(MAX) -- Сумма НДС -- дробное

    SELECT @payInt        = ISNULL( SUBSTRING ( @pay , 1 , LEN(@pay) - 2 )		, '' )
         , @payDecimal    = ISNULL( SUBSTRING ( REVERSE( @pay ), 1 ,2 )			, '' )
         , @payndsInt     = ISNULL( SUBSTRING ( @paynds , 1 , LEN(@paynds) - 2 ), '' )
         , @payndsDecimal = ISNULL( SUBSTRING ( REVERSE( @paynds ), 1 ,2 )		, '' )
         , @ndsInt        = ISNULL( SUBSTRING ( @nds , 1 , LEN(@nds) - 2 )		, '' )
         , @ndsDecimal    = ISNULL( SUBSTRING ( REVERSE( @nds ), 1 ,2 )			, '' )


	-- SELECT 1
	select 'Операция: '+ ISNULL( @typcatname, '' )
         + ' Итого сумма без НДС: '+ ISNULL( @payInt, '' )  + '.'    + ISNULL( @payDecimal, '' ) +' руб.'
         + ' Итого НДС ( Ставка '  + ISNULL( @ndsrate, '' ) +'% ):'  + ISNULL( @ndsInt, '' )  + '.'  + ISNULL( @ndsDecimal, '' ) +' руб.'
         + ' Итого сумма с НДС: '  + ISNULL( @payndsInt , '' ) + '.' + ISNULL( @payndsDecimal, '' ) +' руб.' AS Msg --
          , 1 Result , @response Response


	-- SELECT 2 Внешние действия

END

Почта РФ - Сроки Доставки - PROCEDURE [api_ruPostDelivery_request]

 Автоматический расчет нормативных сроков доставки почтовых отправлений.

Сайт: https://delivery.pochta.ru/#/calcmail/913

Документация:  https://delivery.pochta.ru/#/support/api

 Для получения расчета клиент отправляет на сервер REST-запрос методом GET

Параметры запроса

 

Входные данные запроса – параметры процедуры PROCEDURE [api_ruPostDelivery_request]

Переменная

Тип

Значение по умолчанию

Описание

Примечание

1

@resultType

nvarchar(32)

'Json'

Формат запрашиваемых данных

Json - тип результата

2

@codeObject

nvarchar(32)

'47030'

Тип (код) объекта почтовой тарификации, см. Приложение 1

47030 - Посылка 1 класса – 

27030 - Посылка (частное лицо или предприятие) - Посылка стандарт

3

@indexFrom

nvarchar(32)

'101000'

Индекс места отправления

101000 "МОСКВА"

4

@indexTo

nvarchar(32)

'690000 '

Индекс места назначения

108803 "ВОСКРЕСЕНСКОЕ"

- Владивосток

5

@operDate  

nvarchar(8)

 

Дата тарификации YYYYMMDD

Если дата не указана, принимается значение текущей даты

Пример текста запроса - request.

https://delivery.pochta.ru/delivery/v1/calculate?Json&object=47030&from=101000&to=690000&date=20200603

Примечание. Фактически в этом запросе передается только URL. Тела запроса body – нет, SELECT2 не используется.

Пример текста ответа - response.

{
    "version": "1.13.3.390",
    "place": "D_21",
    "id": 47030,
    "name": "Посылка 1 класса",
    "typ": 47,
    "cat": 3,
    "dir": 0,
    "from": 101000,
    "to": 690000,
    "date": 20200603,
    "time": 0,
    "date": 20200603,
    "time": 0,
    "date-first": 20200218,
    "postoffice": [

        {
            "index": 101000,
            "tp": 1,
            "name": "МОСКВА",
            "region": 1000000001045,
            "regid": 77,
            "place": 1000000001045,
            "parent": 127950,
            "type": 3,
            "pvz": 1,
            "item-check-men": 1,
            "item-check-view": 1,
            "move": 1,
            "pack-max": 99
        },
        {
            "index": 690000,
            "tp": 2,
            "name": "ВЛАДИВОСТОК ПОЧТАМТ",
            "region": 1005,
            "regid": 25,
            "place": 1000000031441,
            "parent": 690700,
            "type": 15
        }
    ],
    "tariff": [
        {
            "id": "5072",
            "name": "Нормативный срок доставки отправлений 1 класса",
            "steps": [
                {
                    "name": "Прямая между населенными пунктами",
                    "route": [
                        "5072",
                        "45000000",
                        "5701000001"
                    ],
                    "z": 4,
                    "id": "5072-45000000-5701000001"
                }
            ],
            "fromi": 101000,
            "from": "МОСКВА",
            "toi": 690000,
            "to": "ВЛАДИВОСТОК ПОЧТАМТ",
            "delivery": {
                "min": 2,
                "max": 4
            }
        }
    ],
    "delivery": {
        "min": 2,
        "max": 4
    },
    "typcatname": "Посылка 1 класса",
    "now": "20200603T204906"
}

CREATE PROCEDURE [dbo].[api_ruPostDelivery_request]
	@parameters ExtendedDictionaryParameter READONLY,  -- входящие параметры для внутренней обработки (используйте Key, Value2)
	@username nvarchar(32)  -- текущий пользователь.
    --
    ,@resultType nvarchar(32) = 'Json' 		-- Json		тип результата
	,@codeObject nvarchar(32) = '47030'  	-- Код объекта тарификации
    										-- 47030 - Посылка 1 класса -- ПРИМЕР c6v.ru
											-- 27030 - Посылка (частное лицо или предприятие) - Посылка стандарт

	,@indexFrom	nvarchar(32) = '101000'   	-- Индекс места отправления -- 101000 "МОСКВА".

	,@indexTo   nvarchar(32) = '690000'   	-- Индекс места назначения -- 108803 "ВОСКРЕСЕНСКОЕ". -- владивосток 690000

    ,@operDate   nvarchar(8)  = ''          --'20200527'  -- Дата тарификации YYYYMMDD
    										-- Дату необходимо указывать по местному времени.Если дата не указана–принимаетсязначение текущей датыпо московскому времени

AS
BEGIN

-- Дата тарификации YYYYMMDD
-- Дату необходимо указывать по местному времени.Если дата не указана–принимаетсязначение текущей датыпо московскому времени
-- 112 = ггггммдд --'20200527'
IF  LEN(  ISNULL ( @operDate   , '' ) )=0
SET @operDate  =  CONVERT ( nvarchar(8) , GETDATE() , 112 )
-- exec as_print @str = @operDate

DECLARE @apiUrl 		nvarchar(max) = '' 		-- Финальная строка для отправки -- @apiStr -- ФАКТИЧЕСКИ ЭТО Url
DECLARE @apiCommomStr 	nvarchar(max) = '' 	    -- Общая часть для всех запросов
SET     @apiCommomStr   = 'https://delivery.pochta.ru/delivery/v1/calculate?' -- ? знак в конце Обязательно

SET  @apiUrl  = @apiUrl + @apiCommomStr
                        + @resultType
                        + IIF ( LEN(  ISNULL ( @codeObject , '' ) )>0, '&object=' + @codeObject, '' )
                        + IIF ( LEN(  ISNULL ( @indexFrom  , '' ) )>0, '&from=' + @indexFrom, '' )
                        + IIF ( LEN(  ISNULL ( @indexTo    , '' ) )>0, '&to=' + @indexTo, '' )
                        + IIF ( LEN(  ISNULL ( @operDate   , '' ) )>0, '&date=' + @operDate, '' )


    -- ОТЛАДКА
    -- exec as_print @str='api_ruPostTariff_request'
	insert into as_trace (text, username, code , created )   values( @apiUrl , @username, 'api_ruPostDelivery_request' , GETDATE() )
    -- ФАКТИЧЕСКИ ВЕСЬ ЗАПРОС ОТПРАВЛЯЕСТ В Url
    select '' Msg, 1 Result, @apiUrl AS Url


	-- SELECT 2 PARAMETERS - параметры, которые будут передаваться во внешний источник
	-- select 'id' name, '5' value, '' [type] -- form (в форме передается), header (в http headers), get запросы передавайте прямо в URL
END

Почта РФ - Сроки Доставки - PROCEDURE [api_ruPostDelivery_response]

 Результат запроса может быть как сообщение с информацией, так и сообщение с ошибкой.

 Список возможных сообщений об ошибках.

  1. 'Ошибка! Строка @response не является JSON!' (Проверка ответа оператором ISJSON() )
  2. 'Ошибка! Запрос @response вернул ошибку! '… @errorText.

Пример текста ответа – response – с ошибкой

{
    "caption": "Ошибки тарификации",
    "version": "1.13.3.390",
    "data": {
        "id": 47030,
        "typ": 47,
        "cat": 3,
        "dir": 0,
        "name": "Посылка 1 класса",
        "seq": 47030,
        "date": 20200603,
        "date-first": 20200218
    },
    "error": [
        "Неверное значение параметра \"Индекс места назначения\" (to). значение \"6900001111\" не является параметром почтового объекта. (1301)"
    ],
    "errors": [
        {
            "msg": "Неверное значение параметра \"Индекс места назначения\" (to). значение \"6900001111\" не является параметром почтового объекта.",
            "code": 1301
        }
    ]
}

Если ошибок в ответе не обнаружено, из ответа выбираются такие данные:

  •  Минимальное нормативное количество дней доставки отправления
  •  Максимальное нормативное количество дней доставки отправления
  •  Название операции
  •  Дата и Время выполнения

Пример текста – результат: "Операция: Посылка 1 класса Срок доставки: от 2 до 4 дней."

CREATE PROCEDURE [dbo].[api_ruPostDelivery_response]
	@response nvarchar(max),
	@parameters ExtendedDictionaryParameter READONLY,  -- входящие параметры для внутренней обработки (используйте Key, Value2 - те же что и на request)

	@username nvarchar(32)
AS
BEGIN
    -- ОТЛАДКА
    -- exec as_print @str='api_ruPostDelivery_response'
	insert into as_trace (text, username, code , created  ) values(@response, @username, 'api_ruPostDelivery_response' , GETDATE() )


    DECLARE @json1 NVARCHAR(MAX)  = N''
	SET @json1 = @response

    -- Для проверки правильности JSON формата существует функция ISJSON, которая возвращает 1, если это JSON, 0 — если нет и NULL, если был передан NULL
    DECLARE @presentJSON bit = 0
    SELECT @presentJSON = ISNULL( ISJSON( @json1 ) , 0 )
    -- SELECT @presentJSON
    IF @presentJSON <> 1
    BEGIN
        SELECT 'Ошибка! Строка @response не является JSON!' Msg, 0 Result, @response Response
        RETURN
    END

	-- Обработка ошибки в ответе
    DECLARE @presentError bit = 0, @errorText NVARCHAR(MAX), @errorCode NVARCHAR(MAX), @errorMsg NVARCHAR(MAX)

	DECLARE  @typcatname NVARCHAR(MAX) -- Название операции
           , @now		NVARCHAR(MAX) -- Дата и Время выполнения
           --
    DECLARE @deliveryDaysMin NVARCHAR(MAX)
	DECLARE @deliveryDaysMax NVARCHAR(MAX)

	-- Чтобы извлечь скалярное значение из JSON, можно воспользоваться функцией JSON_VALUE:
    SELECT @presentError = IIF( JSON_VALUE( @json1, '$.error[0]') IS NULL  , 0 , 1 )
           , @errorText    = JSON_VALUE( @json1, '$.error[0]')
           , @errorCode    = JSON_VALUE( @json1, '$.errors[0].code')
           , @errorMsg     = JSON_VALUE( @json1, '$.errors[0].msg')
           -- Данные
           , @typcatname 	= JSON_VALUE( @json1, '$.typcatname')
           , @now 			= JSON_VALUE( @json1, '$.now')
           , @deliveryDaysMin = JSON_VALUE( @json1, '$.delivery.min')
	 	   , @deliveryDaysMax = JSON_VALUE( @json1, '$.delivery.max')

      IF @presentError = 1
      BEGIN
          SELECT 'Ошибка! Запрос @response вернул ошибку! '+ ISNULL( @errorText, '' ) Msg, 0 Result, @response Response
          RETURN
      END

    DECLARE @deliveryText NVARCHAR(MAX)
    -- Срок доставки: от 2 до 4 дней.
    IF ISNULL( @deliveryDaysMin, '' ) <> ISNULL( @deliveryDaysMax, '' ) SET @deliveryText = 'Срок доставки: от ' + ISNULL( @deliveryDaysMin, '' )+' до '+ISNULL( @deliveryDaysMax, '' )+' дней.'
    IF ISNULL( @deliveryDaysMin, '' )  = ISNULL( @deliveryDaysMax, '' ) SET @deliveryText = 'Срок доставки: ' + ISNULL( @deliveryDaysMin, '' )+' дней.'

	-- SELECT 1
	select 'Операция: '+ ISNULL( @typcatname, '' ) +' '+ @deliveryText AS  Msg
          , 1 Result, @response Response

	-- SELECT 2 Внешние действия

END

Falcon Space - функциональная веб-платформа разработки на узком стеке MS SQL/Bootstrap. Вводная по Falcon Space
Насколько полезной была статья?

Google поиск по нашей документации

Выгода от использования Falcon Space

В 2-3 раза экономнее и быстрее, чем заказная разработка
Более гибкая, чем коробочные решения и облачные сервисы
Используйте готовые решения и изменяйте под свои потребности
Нужна бесплатная консультация?
Планируете делать веб-проект?
Сайт использует Cookie. Правила конфиденциальности OK