Интеграция API Служба доставки Деловые линии
Данный документ описывает реализацию обмена информацией между Falcon Space и службой доставки Деловые линии.
Общие входные данные:
- Город отправления (Флаг - от двери);
- Город получения (Флаг - до двери);
- Длина, см;
- Ширина, см;
- Высота, см;
- Вес, г.
Общий алгоритм:
- Формирование текста запроса с параметрами
- Отправка запроса
- Получение ответа на запрос
- Парсинг ответа, получение данных.
Деловые линии - https://dev.dellin.ru/api/
Общая информация
API состоит из двух модулей, которые можно обозначить следующим образом: без использования данных клиента — публичный API (например: калькулятор) и с использованием данных клиента — API личного кабинета (например: заказы).
Необходимо учесть, что авторизация для них различна.
API умеет общаться при помощи двух форматов данных: JSON и XML. Вы можете использовать любой из них в зависимости от ваших предпочтений.
Различия в функционале между ними - отсутствуют.
Взаимодействовать с нашим API необходимо при помощи метода POST,
а выбор формата между JSON и XML осуществляется через передачу заголовка content-type.
Для JSON мы принимаем content-type равный application/json (стандарт RFC4627)
Наше API работает в кодировке utf-8.
Шаг 1 - Зарегистрировать API-ключ
Авторизация приложения
Прежде чем приступить к работе с нашим API вам необходимо пройти процедуру регистрации.
Результатом регистрации в нашей системе, для вас будет ключ приложения.
Зарегистрировать API-ключ
https://dev.dellin.ru/registration/
На почту придет:
Ключ приложения: DXXXXXX-XXXX-XXXX-XXXX-69DF350E6C34
Шаг 2 - Зарегистрировать Личный кабинет (стандартный)
Некоторые функции Личного кабинета недоступны в режиме ограниченного доступа.
Режимы доступа к Личному кабинету - https://www.dellin.ru/unlimitedAccess/
Расчёт стоимости по публичным тарифам в режиме ограниченного доступа – доступен.
Калькулятор стоимости и сроков перевозки - https://dev.dellin.ru/api/calculation/calculator/
Расчет стоимости перевозки – Примеры - https://dev.dellin.ru/api/examples/calculation/
Порядок работы:
Работа проходит в 2 этапа
Этап 1 - Авторизация пользователя и получение sessionID. ( сессия выдается на 1 мес. – 30 дней)
Этап 2 – Работа по полученному sessionID отправка запросов по расчету тарифов.
Деловые линии - Авторизация - PROCEDURE [dbo].[api_ruDelLinLogin_request]
- URL: https://api.dellin.ru/v1/customers/login.json
- Content-Type: application/json
- Метод запроса: POST
- Формат на выходе: JSON
Пример текста запроса - request.
URL: https://api.dellin.ru/v1/customers/login.json
JSON – BODY
{
"appkey": "DXXXXXX-XXXX-XXXX-XXXX-69DF350E6C34",
"login": "mail@yandex.ru",
"password": "Dellin_test_pwd1"
}
Пример текста ответа - response.
{
"sessionID": "CE0BDD33-AXXX-XXXX-XXXX-E424C52F1797"
}
DROP TABLE [dbo].[api_DelLinSessions]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[api_DelLinSessions](
[id] [int] IDENTITY(1,1) NOT NULL,
[sessionID] [nvarchar](max) NULL,
[session_start_time] [datetime] NULL,
[expire_time] [datetime] NULL,
[response] [nvarchar](max) NULL,
[errorMsg] [nvarchar](max) NULL,
[DelLinAppKey] [nvarchar](max) NULL,
[DelLinLogin] [nvarchar](max) NULL,
[DelLinPassword] [nvarchar](max) NULL,
[created] [datetime] NULL,
[userСreator] [nvarchar](max) NULL,
[updated] [datetime] NULL,
[userUpdater] [nvarchar](max) NULL,
CONSTRAINT [PK_api_DelLinSessions] PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
CREATE PROCEDURE [dbo].[api_ruDelLinLogin_request]
@parameters ExtendedDictionaryParameter READONLY, -- входящие параметры для внутренней обработки (используйте Key, Value2)
@username nvarchar(32) -- текущий пользователь.
AS
BEGIN
-- Авторизация пользователя , работа с сессией
DECLARE @DelLinAppKey nvarchar(max) = ''
, @DelLinLogin nvarchar(max) = ''
, @DelLinPassword nvarchar(max) = ''
-- ! НАРУШЕНИЕ ПРАВИЛ БЕЗОПАСНОСТИ ! Явно указаны параметры авторизации
SET @DelLinAppKey = 'DXXXXXX-XXXX-XXXX-XXXX-69DF350E6C34'
SET @DelLinLogin = 'mail@yandex.ru'
SET @DelLinPassword= 'Dellin_test_pwd1'
DECLARE @apiUrl1 nvarchar(max) = '' -- Финальная строка для отправки -- ФАКТИЧЕСКИ ЭТО Url
DECLARE @jsonRequest1 nvarchar(max) = '' -- текст json-объекта
SET @apiUrl1 = N'https://api.dellin.ru/v1/customers/login.json'
/* SET @jsonRequest1 = N'{' +
+ N'"appkey": "DXXXXXX-XXXX-XXXX-XXXX-69DF350E6C34",' +
+ N'"login": "mail@yandex.ru",' +
+ N'"password": "Dellin_test_pwd1"' +
+ N'}' */
SET @jsonRequest1 = N'{' + CHAR(10)
+ N'"appkey": "' + @DelLinAppKey +'",'+CHAR(10)
+ N'"login": "' + @DelLinLogin +'",'+CHAR(10)
+ N'"password": "' + @DelLinPassword +'"' +CHAR(10) -- последняя строка без запятой
+ N'}'
-- ОТЛАДКА
insert into as_trace ( header, text, username, code , created ) values( 'apiUrl1' , @apiUrl1 , @username, 'api_ruDelLinLogin_request' , GETDATE() )
insert into as_trace ( header, text, username, code , created ) values( '@jsonRequest1' , @jsonRequest1 , @username, 'api_ruDelLinLogin_request' , GETDATE() )
-- SELECT 1
select '' Msg, 1 Result
, @apiUrl1 Url
, 'application/json' ContentType -- явное указание для HEADER
-- SELECT 2 PARAMETERS - параметры, которые будут передаваться во внешний источник
select 'id' name
, @jsonRequest1 value -- это body
, 'json' [type] -- form (в форме передается), header (в http headers), get запросы передавайте прямо в URL
-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-- выполнить 1-й api request в результатате Response получим sessionID - ДАННЫЕ В ТАБЛ. api_DelLinSessions
END
Деловые линии - Авторизация - PROCEDURE [dbo].[api_ruDelLinLogin_response]
Для работы нужна постоянная таблица в базе - [api_DelLinSessions]
Результат запроса может быть как сообщение с информацией, так и сообщение с ошибкой.
Список возможных сообщений об ошибках.
1 - 'Ошибка! Запрос @response вернул ошибку! '… @errorText.
Если ошибок в ответе не обнаружено, из ответа выбираются такие данные: sessionID
Далее значение sessionID Записывается в постоянную таблицу в базе - [dbo].[api_DelLinSessions]
Пример текста – результат: Создана сессия @sessionID = CE0BDD33-AXXX-XXXX-XXXX-E424C52F1797
CREATE PROCEDURE [dbo].[api_ruDelLinLogin_response]
@response nvarchar(max),
@parameters ExtendedDictionaryParameter READONLY, -- входящие параметры для внутренней обработки (используйте Key, Value2 - те же что и на request)
@username nvarchar(32)
AS
BEGIN
-- ! для работы нужна постоянная таблица в базе - [dbo].[api_DelLinSessions] !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
DECLARE @DelLinAppKey nvarchar(max) = ''
, @DelLinLogin nvarchar(max) = ''
, @DelLinPassword nvarchar(max) = ''
-- ! НАРУШЕНИЕ ПРАВИЛ БЕЗОПАСНОСТИ ! Явно указаны параметры авторизации - те же параметры, что и в проц. _request
SET @DelLinAppKey = 'DXXXXXX-XXXX-XXXX-XXXX-69DF350E6C34'
SET @DelLinLogin = 'mail@yandex.ru'
SET @DelLinPassword= 'Dellin_test_pwd1'
-- ОТЛАДКА
-- exec as_print @str='api_ruPostDelivery_response'
insert into as_trace (text, username, code , created ) values( @response, @username, 'api_ruDelLinLogin_response' , GETDATE() )
DECLARE @jsonResponse1 nvarchar(max) = N''
SET @jsonResponse1 = @response
-- SET @jsonResponse1 = N'{"sessionID": "5CE0BDD33-AXXX-XXXX-XXXX-E424C52F1797"}' -- "expire_time": "2020-07-01 16:21:13"
-- SET @jsonResponse1 = N'{ "errors": "Unauthorized" }'
-- Анализ результатата Response
-- Ответ { "sessionID": "00000000-0000-0000-0000-000000000000" }
-- Обработка ошибок { "errors": "Unauthorized" }
DECLARE @sessionID NVARCHAR(MAX)
-- Обработка ошибки в ответе
DECLARE @presentError bit = 0, @errorText NVARCHAR(MAX), @errorCode NVARCHAR(MAX), @errorMsg NVARCHAR(MAX)
SELECT @presentError = IIF( JSON_VALUE( @jsonResponse1, '$.errors') IS NULL , 0 , 1 )
, @errorMsg = JSON_VALUE( @jsonResponse1, '$.errors')
--
, @sessionID = JSON_VALUE( @jsonResponse1, '$.sessionID')
INSERT INTO [dbo].[api_DelLinSessions] ([sessionID] ,[session_start_time]
,[response] ,[errorMsg] ,[DelLinAppKey] ,[DelLinLogin] ,[DelLinPassword]
,[created] ,[userСreator]
)
VALUES ( @sessionID, GETDATE()
,@response , @errorMsg , @DelLinAppKey , @DelLinLogin, @DelLinPassword
,GETDATE(), @username
)
IF @presentError = 1
BEGIN
SET @errorText = ' text:'+ ISNULL( @errorMsg, '' )
SELECT 'Ошибка! Запрос @response вернул ошибку! '+ ISNULL( @errorText, '' ) Msg, 0 Result, @jsonResponse1 Response
RETURN
END
-- Данные сессии
-- https://api.dellin.ru/v1/customers/session_info.json
-- { "appkey":"00000000-0000-0000-0000-000000000000", "sessionID":"00000000-0000-0000-0000-000000000000" }
-- ответ для активной сессии { "session": { "expire_time": "2014-04-12 18:01", "expired": false } }
-- ответ для сессии, срок действия которой истек { "session": { "expire_time": null, "expired": true } }
-- SELECT 1
select 'Создана сессия @sessionID = ' + @sessionID AS Msg
, 1 Result, @response Response
-- SELECT 2 Внешние действия
END
Деловые линии - Калькулятор - PROCEDURE [dbo].[api_ruDelLinCalculator_request]
- URL: https://api.dellin.ru/v2/calculator
- Content-Type: application/json
- Метод запроса: POST
- Формат на выходе: JSON
Входные данные запроса – параметры процедуры PROCEDURE [dbo].[api_ruDelLinCalculator_request]
№ |
Переменная |
Тип |
Значение по умолчанию |
Описание |
Примечание |
1 |
@deliveryType |
nvarchar(10) |
'express' |
Вид межтерминальной перевозки груза, для которого будет рассчитана стоимость. |
"auto"- автодоставка; "express" - экспресс-доставка; "letter" - письмо; "avia" - авиадоставка; "small" - доставка малогабаритного груза. |
arrival Данные по доставке груза до получателя |
|||||
2 |
@arrival_variant |
nvarchar(10) |
'terminal' |
Способ доставки груза |
"terminal" - доставка груза от/до терминала. "address" - доставка груза от адреса отправителя/до адреса получателя |
3 |
@arrival_terminalID |
nvarchar(256) |
'36' |
ID терминала отправки/доставки груза из "Справочника терминалов |
terminal id 36 Москва Север terminal id 17 Москва офис terminal id 108 Ростов-на-Дону Вавилова terminal id 30 Архангельск terminal id 295 Владивосток |
derival Данные по доставке груза от отправителя |
|||||
4 |
@derival_ variant |
nvarchar(10) |
'terminal' |
Способ доставки груза |
|
5 |
@derival_terminalID |
nvarchar(256) |
'295' |
|
terminal id 295 Владивосток |
6 |
@derival_produceDate |
nvarchar(10) |
'' |
Дата выполнения заказа. "ГГГГ-ММ-ЧЧ" |
|
7 |
@requester_role |
nvarchar(32) |
'sender' |
Роль в перевозке |
"sender" - отправитель; "receiver" - получатель; / "payer" - плательщик; "third" - третье лицо |
cargo Информация о грузе |
|||||
8 |
@quantity |
int |
1 |
Количество грузовых мест, шт |
Значение по умолчанию - "1". |
9 |
@length |
numeric(20,3) |
10 |
Длина самого длинного грузового места, м |
приходит Длина (в сантиметрах) - ПЕРЕСЧЕТ в м |
10 |
@width |
numeric(20,3) |
10 |
Ширина самого широкого грузового места, м |
приходит Ширина (в сантиметрах) ПЕРЕСЧЕТ в м |
11 |
@weight |
numeric(20,3) |
100 |
Вес самого тяжелого грузового места, кг |
приходит Вес (грамм ) ПЕРЕСЧЕТ! Вес (в килограммах) |
12 |
@height |
numeric(20,3) |
10 |
Высота самого высокого грузового места, м. |
приходит Высота (в сантиметрах) - ПЕРЕСЧЕТ в м |
13 |
@freightName |
nvarchar(256) |
'Не обязательно Характер груза' |
Характер груза - описание |
Не обязательный параметр |
14 |
@hazardClass |
nvarchar(10) |
'0' |
Класс опасности груза. |
Значение по умолчанию - "0" |
Оплата перевозки |
|||||
15 |
@paymentCity |
nvarchar(max) |
'2500000100000000000000000' |
Код КЛАДР города оплаты |
|
16 |
@paymentType |
nvarchar(10) |
'cash' |
Вид оплаты. Используется для проверки |
"cash" - оплата наличными; "noncash" - безналичный расчёт |
Расчетные параметры |
|||||
17 |
@totalVolume |
|
|
Общий объём груза, м3. |
|
18 |
@totalWeight |
|
|
Общий вес груза, кг. |
вес * кол-во |
Коды городов КЛАДР
name |
codeKLADR |
г. Москва |
7700000000000000000000000 |
Ростов-на-Дону г (Ростовская обл.) |
6100000100000000000000000 |
Архангельск г (Архангельская обл.) |
2900000100000000000000000 |
Владивосток г (Приморский край) |
2500000100000000000000000 |
Перед отправкой запроса, идет поиск значения sessionID из постоянной таблицы в базе - [dbo].[api_DelLinSessions].
Если sessionID не обнаружена – возвращается ошибка.
Список возможных сообщений об ошибках.
- Ошибка! Не определен @sessionID для @username
- Ошибка! При определении @sessionID=… для @username Возникла ошибка: @errorMsg
Если ошибок нет , формируется запрос.
Пример текста запроса - request.
URL: https://api.dellin.ru/v2/calculator
JSON - BODY
{
"appkey": "DXXXXXX-XXXX-XXXX-XXXX-69DF350E6C34",
"sessionID":"CCE0BDD33-AXXX-XXXX-XXXX-E424C52F1797",
"delivery":
{
"deliveryType":{
"type":"express"
},
"arrival":{
"variant":"terminal",
"terminalID":"36"
},
"derival":{
"produceDate":"2020-06-03",
"variant":"terminal",
"terminalID":"295"
}
},
"members":{
"requester":{
"role":"sender"
}
},
"cargo":{
"quantity":1,
"length":0.100,
"width":0.100,
"height":0.100,
"weight":0.100,
"totalVolume":0.001,
"totalWeight":0.100,
"freightName":"Не обязательно Характер груза",
"hazardClass":"0"
},
"payment":{
"paymentCity":"2500000100000000000000000",
"type":"cash"
}
}
Пример текста ответа - response
Ответ приведен не полностью.
{
"metadata": {
"status": 200,
"generated_at": "2020-06-04 13:46:27"
},
"data": {
"derival": {
"terminal": "Владивосток",
"price": 0,
"premiumDetails": [],
"discountDetails": [
{
"name": "Скидка за заказ из Личного Кабинета",
"value": 13.5,
"date": null,
"announcement": true,
"public": true
}
],
"terminals": [
{
…
}
]
},
"express": {
"price": 1030.0,
"premium": 0,
"discount": 0,
"premiumDetails": [],
"discountDetails": []
},
"arrival": {
"terminal": "Москва",
"price": 100.0,
"premiumDetails": [],
"discountDetails": [],
"terminals": [
{
….
}
]
},
"price": 1304.0,
"priceMinimal": "small",
"orderDates": {
"pickup": null,
"senderTerminalTime": "18:00:00",
"arrivalToOspSender": "2020-06-04",
"derivalFromOspSender": "2020-06-05",
"arrivalToOspReceiver": "2020-06-17",
"giveoutFromOspReceiver": "2020-06-17 09:00:00",
"derivalFromOspReceiver": null
},
"deliveryTerm": 0,
"insurance": 159.0,
"insuranceComponents": {
"cargoInsurance": 115.0,
"termInsurance": 44.0
},
"notify": {
"price": 15.0,
"premium": 0,
"discount": 0,
"premiumDetails": [],
"discountDetails": []
},
"simpleShippingAvailable": true
}
}
CREATE PROCEDURE [dbo].[api_ruDelLinCalculator_request]
@parameters ExtendedDictionaryParameter READONLY, -- входящие параметры для внутренней обработки (используйте Key, Value2)
@username nvarchar(32) -- текущий пользователь.
-- ВХ.ПАРАМ
,@deliveryType nvarchar(10) = 'express' -- Вид межтерминальной перевозки груза, для которого будет рассчитана стоимость.
-- "auto"- автодоставка; /"express" - экспресс-доставка; /"letter" - письмо; / "avia" - авиадоставка; /"small" - доставка малогабаритного груза.
-- arrival Данные по доставке груза до получателя
,@arrival_variant nvarchar(10) = 'terminal' -- Способ доставки груза -- "terminal" - доставка груза от/до терминала./ "address" - доставка груза от адреса отправителя/до адреса получателя
,@arrival_terminalID nvarchar(256) = '36' -- ID терминала отправки/доставки груза из "Справочника терминалов"
-- ! Допускается передача только одного из следующих параметров: "terminalID", "addressID", "address", "city"
-- terminal id 36 Москва Север
-- terminal id 17 Москва офис
-- terminal id 108 Ростов-на-Дону Вавилова
-- terminal id 30 Архангельск
-- terminal id 295 Владивосток
-- Пока не используеется в формировании запроса
,@arrival_city nvarchar(max) = '7700000000000000000000000' -- Код КЛАДР города. Используется только для параметра "request.arrival".
-- name codeKLADR
-- г. Москва 7700000000000000000000000
-- Ростов-на-Дону г (Ростовская обл.) 6100000100000000000000000
-- Архангельск г (Архангельская обл.) 2900000100000000000000000
-- Владивосток г (Приморский край) 2500000100000000000000000
-- derival Данные по доставке груза от отправителя
,@derival_variant nvarchar(10) = 'terminal'
,@derival_terminalID nvarchar(256) = '295' -- terminal id 295 Владивосток
,@derival_produceDate nvarchar(10) = '' -- Дата выполнения заказа. "ГГГГ-ММ-ЧЧ" Используется только для параметра "request.derival"
--
,@requester_role nvarchar(32) = 'sender' -- Роль в перевозке. "sender" - отправитель; / "receiver" - получатель; / "payer" - плательщик; / "third" - третье лицо
-- cargo Информация о грузе -- размерность величин, как во всех процедурах -- СДЕЛАТЬ ПЕРЕСЧЕТ !!!
,@quantity int = 1 -- integer Количество грузовых мест, шт. Значение по умолчанию - "1".
,@length numeric(20,3) = 10 -- float Длина самого длинного грузового места, м.
-- приходит Длина (в сантиметрах) - ПЕРЕСЧЕТ в м numeric(20,3)
,@width numeric(20,3) = 10 -- float Ширина самого широкого грузового места, м.
-- приходит Ширина (в сантиметрах) - ПЕРЕСЧЕТ в м numeric(20,3)
,@weight numeric(20,3) = 100 -- float Вес самого тяжелого грузового места, кг
-- приходит Вес (грамм ) – ПЕРЕСЧЕТ! Вес (в килограммах) numeric(20,3)
,@height numeric(20,3) = 10 -- float Высота самого высокого грузового места, м.
-- приходит Высота (в сантиметрах) - ПЕРЕСЧЕТ в м numeric(20,3)
-- ,@totalVolume -- РАСЧЕТ -- float Общий объём груза, м3. -- РАСЧЕТ
-- ,@totalWeight -- РАСЧЕТ -- float Общий вес груза, кг. -- РАСЧЕТ = вес * кол-во
,@freightName nvarchar(256) = 'Не обязательно Характер груза' -- string Характер груза - описание
,@hazardClass nvarchar(10) = '0' -- Класс опасности груза. Значение по умолчанию - "0"
-- Оплата перевозки
,@paymentCity nvarchar(max) = '2500000100000000000000000' -- Код КЛАДР города оплаты.
,@paymentType nvarchar(10) = 'cash' -- Вид оплаты.: "cash" - оплата наличными; / "noncash" - безналичный расчёт. - Используется для проверки
AS
BEGIN
-- ! для работы нужна постоянная таблица в базе - [dbo].[api_DelLinSessions] !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-- Дата выполнения заказа. "ГГГГ-ММ-ЧЧ" Используется только для параметра "request.derival"
-- 23 ISO8601 гггг-мм-дд
IF LEN( ISNULL ( @derival_produceDate , '' ) )=0
SET @derival_produceDate = CONVERT ( nvarchar(10) , GETDATE() , 23 )
-- РАСЧЕТ / ПЕРЕСЧЕТ
-- в 1 сантиметре 0.01 метра. Один (1) метр равен 100 см
DECLARE @length_m numeric(20,3)
SET @length_m = @length * 0.01 -- float Длина самого длинного грузового места, м. -- приходит Длина (в сантиметрах) - ПЕРЕСЧЕТ в м numeric(20,3)
DECLARE @width_m numeric(20,3)
SET @width_m = @width * 0.01 -- float Ширина самого широкого грузового места, м. -- приходит Ширина (в сантиметрах) - ПЕРЕСЧЕТ в м numeric(20,3)
DECLARE @height_m numeric(20,3)
SET @height_m = @height * 0.01 -- float Высота самого высокого грузового места, м. -- приходит Высота (в сантиметрах) - ПЕРЕСЧЕТ в м numeric(20,3)
-- 1 Грамм равно 0.001 Килограмма
DECLARE @weight_kg numeric(20,3)
SET @weight_kg = @weight * 0.001 -- float Вес самого тяжелого грузового места, кг - приходит Вес (грамм ) – ПЕРЕСЧЕТ! Вес (в килограммах) numeric(20,3)
-- умножить длину, ширину и высоту
DECLARE @totalVolume_m3 numeric(20,3)
SET @totalVolume_m3 = @length_m * @width_m * @height_m -- float Общий объём груза, м3. -- РАСЧЕТ
--
DECLARE @totalWeight_kg numeric(20,3)
SET @totalWeight_kg = @weight_kg * @quantity -- РАСЧЕТ -- float Общий вес груза, кг. -- РАСЧЕТ = вес * кол-во Мест
-------------------------------------------------------------------------------------------
-- Авторизация пользователя , работа с сессией
DECLARE @DelLinAppKey nvarchar(max) = ''
, @DelLinLogin nvarchar(max) = ''
, @DelLinPassword nvarchar(max) = ''
-- ! НАРУШЕНИЕ ПРАВИЛ БЕЗОПАСНОСТИ ! Явно указаны параметры авторизации
SET @DelLinAppKey = 'DXXXXXX-XXXX-XXXX-XXXX-69DF350E6C34'
SET @DelLinLogin = 'mail@yandex.ru'
SET @DelLinPassword= 'Dellin_test_pwd1'
-------------------------------------------------------------------------------------------
DECLARE @sessionID NVARCHAR(MAX) , @errorMsg NVARCHAR(MAX)
-- Поиск доступной сесии для @username , берем запись последнюю по id
SELECT TOP 1 @sessionID = ISNULL( sessionID , '') , @errorMsg = ISNULL( errorMsg , '')
FROM dbo.api_DelLinSessions
WHERE userСreator = @username -- сессию создал текущий пользователь
AND DelLinAppKey = @DelLinAppKey
AND DelLinLogin = @DelLinLogin
AND DelLinPassword = @DelLinPassword
ORDER BY id DESC
-- ОТЛАДКА
insert into as_trace ( header, text, username, code , created ) values( '@sessionID', @sessionID , @username, 'api_ruDelLinCalculator_request' , GETDATE() )
insert into as_trace ( header, text, username, code , created ) values( '@errorMsg' , @errorMsg , @username, 'api_ruDelLinCalculator_request' , GETDATE() )
IF LEN( @sessionID )=0
BEGIN
-- SET @errorText = ' text:'+ ISNULL( @errorMsg, '' )
SELECT 'Ошибка! Не определен @sessionID для @username '+ ISNULL( @username, '' ) +'. Возможная ошибка '+ ISNULL( @errorMsg, '' ) Msg, 0 Result
RETURN
END
IF LEN( @errorMsg )>0
BEGIN
-- SET @errorText = ' text:'+ ISNULL( @errorMsg, '' )
SELECT 'Ошибка! При определении @sessionID='+ ISNULL( @sessionID, '' ) +' для @username '+ ISNULL( @username, '' ) +' Возникла ошибка: '+ ISNULL( @errorMsg, '' ) Msg, 0 Result
RETURN
END
-------------------------------------------------------------------------------------------
-- На данном этапе есть @sessionID
-------------------------------------------------------------------------------------------
DECLARE @apiUrl1 nvarchar(max) = '' -- Финальная строка для отправки -- ФАКТИЧЕСКИ ЭТО Url
DECLARE @jsonRequest1 nvarchar(max) = '' -- текст json-объекта
SET @apiUrl1 = 'https://api.dellin.ru/v2/calculator'
SET @jsonRequest1 = N'{' + CHAR(10)
+ N'"appkey": "' + @DelLinAppKey +'",'+ CHAR(10)
+ N'"sessionID":"' + @sessionID +'",'+ CHAR(10)
+ N'"delivery": ' + CHAR(10)
+ N'{' + CHAR(10)
+ N'"deliveryType":{' + CHAR(10)
+ N' "type":"' + @deliveryType + '"' + CHAR(10)
+ N' },' + CHAR(10)
-- arrival Данные по доставке груза до получателя
+ N'"arrival":{' + CHAR(10)
+ N' "variant":"' + @arrival_variant +'",' + CHAR(10)
+ N' "terminalID":"'+ @arrival_terminalID +'"' + CHAR(10)
+ N' },' + CHAR(10)
-- derival Данные по доставке груза от отправителя
+ N'"derival":{' + CHAR(10)
+ N' "produceDate":"'+ @derival_produceDate +'",' + CHAR(10)
+ N' "variant":"' + @derival_variant +'",' + CHAR(10)
+ N' "terminalID":"' + @derival_terminalID +'"' + CHAR(10)
+ N' }' + CHAR(10)
+ N'},' + CHAR(10) -- закрытие секции delivery
--
+ N'"members":{' + CHAR(10)
+ N' "requester":{' + CHAR(10)
+ N' "role":"'+ @requester_role +'"' + CHAR(10)
+ N' }' + CHAR(10)
+ N' },' + CHAR(10)
--
+ N'"cargo":{' + CHAR(10) -- ЗНАЧЕНИЯ БЕЗ КАВЫЧЕК
+ N' "quantity":'+ TRY_CAST( @quantity AS nvarchar ) +',' + CHAR(10)
+ N' "length":' + TRY_CAST( @length_m AS nvarchar ) +',' + CHAR(10)
+ N' "width":' + TRY_CAST( @width_m AS nvarchar ) +',' + CHAR(10)
+ N' "height":' + TRY_CAST( @height_m AS nvarchar ) +',' + CHAR(10)
+ N' "weight":' + TRY_CAST( @weight_kg AS nvarchar) +',' + CHAR(10)
-- --
+ N' "totalVolume":'+ TRY_CAST( @totalVolume_m3 AS nvarchar ) +',' + CHAR(10)
+ N' "totalWeight":'+ TRY_CAST( @totalWeight_kg AS nvarchar ) +',' + CHAR(10)
-- --
+ N' "freightName":"'+ @freightName +'"' +',' + CHAR(10)
+ N' "hazardClass":"'+ @hazardClass +'"' + CHAR(10)
+ N'},' + CHAR(10) -- закрытие секции cargo
+ N'"payment":{' + CHAR(10)
+ N' "paymentCity":"'+ @paymentCity +'"' +',' +CHAR(10)
+ N' "type":"' + @paymentType +'"' + CHAR(10)
+ N'}' + CHAR(10) -- закрытие секции payment
+ N'}' -- Конец строки
-------------------------------------------------------------------------------------------
-- ОТЛАДКА
insert into as_trace ( header, text, username, code , created ) values( 'apiUrl1' , @apiUrl1 , @username, 'api_ruDelLinCalculator_request' , GETDATE() )
insert into as_trace ( header, text, username, code , created ) values( '@jsonRequest1' , @jsonRequest1 , @username, 'api_ruDelLinCalculator_request' , GETDATE() )
-------------------------------------------------------------------------------------------
-- SELECT 1
select '' Msg, 1 Result
, @apiUrl1 Url -- (адрес, куда будет идти запрос)
, 'application/json' ContentType -- явное указание для HEADER
-- SELECT 2 PARAMETERS - параметры, которые будут передаваться во внешний источник
select 'id' name
, @jsonRequest1 value -- это body
, 'json' [type] -- form (в форме передается), header (в http headers), get запросы передавайте прямо в URL
END
Деловые линии - Калькулятор - PROCEDURE [dbo].[api_ruDelLinCalculator_response]
Результат запроса может быть как сообщение с информацией, так и сообщение с ошибкой.
Список возможных сообщений об ошибках.
- 'Ошибка! Строка @response не является JSON!' - (Проверка ответа оператором ISJSON() ).
- 'Ошибка! Запрос @response вернул ошибку! '@errorText1 – в ответе JSON есть строка errors.
- 'Ошибка! Запрос @response вернул ошибку! ' @errorCode0 @errortitle0 @errordetail0 - в ответе JSON есть массив данных с перечнем ошибок, содержащий поля Code / title / detail.
Если ошибок в ответе не обнаружено, из ответа выбираются такие данные:
- Статус - Эмуляция http-кода состояния.
В случае успешного выполнения возвращается код "200" (OK) /- ошибка код 400
- Данные по доставке груза от отправителя – Имя терминала отправителя
- Данные по доставке груза до получателя– Имя терминала получателя
- Итоговая стоимость для выбранного вида перевозки
- Дата отправки с терминала-отправителя
- Дата прибытия на терминал-получатель
- Дата и время, с которого груз готов к выдаче на терминале
Пример текста – результат: "(Статус: 200) Доставка: Владивосток - Москва. Сумма: 1304.0. Дата отправки: 2020-06-05. Будет готов к выдаче: 2020-06-17 09:00:00. "
CREATE PROCEDURE [dbo].[api_ruDelLinCalculator_response]
@response nvarchar(max),
@parameters ExtendedDictionaryParameter READONLY, -- входящие параметры для внутренней обработки (используйте Key, Value2 - те же что и на request)
@username nvarchar(32)
AS
BEGIN
-- ОТЛАДКА
-- ответ слишком длинная строка - /api/req/ruDelLinCalculator (/asapi): String or binary data would be truncated.
-- LEN( @response ) = 3386
-- insert into as_trace (text, username, code , created ) values( TRY_CAST ( LEN( @response ) AS nvarchar) , @username, 'api_ruDelLinCalculator_response' , GETDATE() )
insert into as_trace (header , text, username, code , created ) values( '1 , 1024', SUBSTRING ( @response , 1 , 1024 ) , @username, 'api_ruDelLinCalculator_response' , GETDATE() )
insert into as_trace (header , text, username, code , created ) values( '1025 , 1024', SUBSTRING ( @response , 1025 , 1024 ) , @username, 'api_ruDelLinCalculator_response' , GETDATE() )
insert into as_trace (header , text, username, code , created ) values( '2049 , 1024', SUBSTRING ( @response , 2049 , 1024 ) , @username, 'api_ruDelLinCalculator_response' , GETDATE() )
insert into as_trace (header , text, username, code , created ) values( '3073 , 1024', SUBSTRING ( @response , 3073 , 1024 ) , @username, 'api_ruDelLinCalculator_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 )
IF @presentJSON <> 1
BEGIN
SELECT 'Ошибка! Строка @response не является JSON!' Msg, 0 Result, @response Response
RETURN
END
-- Обработка ошибки в ответе
DECLARE @presentError1 bit = 0 , @errorText1 NVARCHAR(MAX)
--
, @presentError2 bit = 0
, @errorCode0 NVARCHAR(MAX), @errortitle0 NVARCHAR(MAX) , @errordetail0 NVARCHAR(MAX)
, @errorCode1 NVARCHAR(MAX), @errortitle1 NVARCHAR(MAX) , @errordetail1 NVARCHAR(MAX)
, @errorCode2 NVARCHAR(MAX), @errortitle2 NVARCHAR(MAX) , @errordetail2 NVARCHAR(MAX)
-- Данные
, @statust NVARCHAR(MAX) -- Эмуляция http-кода состояния. В случае успешного выполнения возвращается код "200" (OK)
-- ошибка код 400
, @derival_terminal NVARCHAR(MAX) -- Данные по доставке груза от отправителя
, @arrival_terminal NVARCHAR(MAX) -- Данные по доставке груза до получателя
, @price NVARCHAR(MAX) -- Итоговая стоимость для выбранного вида перевозки
, @derivalFromOspSender NVARCHAR(MAX) -- Дата отправки с терминала-отправителя
, @arrivalToOspReceiver NVARCHAR(MAX) -- Дата прибытия на терминал-получатель
, @giveoutFromOspReceiver NVARCHAR(MAX) -- Дата и время, с которого груз готов к выдаче на терминале
SELECT @presentError1 = IIF( JSON_VALUE( @json1, '$.errors') IS NULL , 0 , 1 ) -- Проверка массива JSON_QUERY '$.error[0]'
, @errorText1 = JSON_VALUE( @json1, '$.errors')
--
, @presentError2 = IIF( JSON_QUERY( @json1, '$.errors[0]') IS NULL , 0 , 1 )
, @errorCode0 = JSON_VALUE( @json1, '$.errors[0].code')
, @errortitle0 = JSON_VALUE( @json1, '$.errors[0].title')
, @errordetail0 = JSON_VALUE( @json1, '$.errors[0].detail')
--
, @errorCode1 = JSON_VALUE( @json1, '$.errors[1].code')
, @errortitle1 = JSON_VALUE( @json1, '$.errors[1].title')
, @errordetail1 = JSON_VALUE( @json1, '$.errors[1].detail')
--
, @errorCode2 = JSON_VALUE( @json1, '$.errors[2].code')
, @errortitle2 = JSON_VALUE( @json1, '$.errors[2].title')
, @errordetail2 = JSON_VALUE( @json1, '$.errors[2].detail')
-- Данные
, @statust = JSON_VALUE( @json1, '$.metadata.status')
, @derival_terminal = JSON_VALUE( @json1, '$.data.derival.terminal') -- Данные по доставке груза от отправителя
, @arrival_terminal = JSON_VALUE( @json1, '$.data.arrival.terminal') -- Данные по доставке груза до получателя
, @price = JSON_VALUE( @json1, '$.data.price') -- Итоговая стоимость для выбранного вида перевозки
, @derivalFromOspSender = JSON_VALUE( @json1, '$.data.orderDates.derivalFromOspSender') -- Дата отправки с терминала-отправителя
, @arrivalToOspReceiver = JSON_VALUE( @json1, '$.data.orderDates.arrivalToOspReceiver') -- Дата прибытия на терминал-получатель
, @giveoutFromOspReceiver = JSON_VALUE( @json1, '$.data.orderDates.giveoutFromOspReceiver') -- Дата и время, с которого груз готов к выдаче на терминале
IF @presentError1 = 1
BEGIN
SELECT 'Ошибка! Запрос @response вернул ошибку! '+ ISNULL( @errorText1, '' ) Msg, 0 Result, @response Response
RETURN
END
IF @presentError2 = 1
BEGIN
SELECT 'Ошибка! Запрос @response вернул ошибку! '
+ IIF( @errorCode0 IS NULL , '' , ' code:'+ @errorCode0 + ' title:' + @errortitle0 + ' detail:' + @errordetail0 )
+ IIF( @errorCode1 IS NULL , '' , ' code:'+ @errorCode1 + ' title:' + @errortitle1 + ' detail:' + @errordetail1 )
+ IIF( @errorCode2 IS NULL , '' , ' code:'+ @errorCode2 + ' title:' + @errortitle2 + ' detail:' + @errordetail2 )
AS Msg
, 0 Result, @response Response
RETURN
END
DECLARE @deliveryText NVARCHAR(MAX)
--
SET @deliveryText = '(Статус: '+ @statust +') Доставка: '+ ISNULL( @derival_terminal, '' ) + ' - ' + ISNULL( @arrival_terminal , '' ) +'. '
+'Сумма: ' + ISNULL( @price, '' )+'. '
+'Дата отправки: ' + ISNULL( @derivalFromOspSender, '' )
+'. Будет готов к выдаче: '+ISNULL( @giveoutFromOspReceiver, '' )+'. '
-- SELECT 1
select @deliveryText as Msg, 1 Result, @response Response
-- SELECT 2 Внешние действия
END
Google поиск по нашей документации
- Руководства
- Основа Falcon Space
- Основные компоненты
- Возможности
- Коммуникация с пользователем
- Дизайн, стилизация, юзабилити
- Лендинги
- Универсальный API
- Примеры интеграций Прием платежей через Яндекс.Кассу Онлайн-платежи. Интеграция с Робокассой (платежный шлюз) Zapier интеграция на платформе Falcon Space Интеграция коллтрекинга МАНГО ОФИС (режим Площадка) Интеграция API DaData.ru подсказки по адресам Интеграция API Курсы валют Центрального Банка РФ в веб-платформе Falcon Space Интеграция API Почта РФ Интеграция API Служба доставки СДЭК (CDEK) Интеграция API Служба доставки Деловые линии Интеграция импорт и парсинг файла CSV Интеграция API IpGeoBase Город по IP-адресу Интеграция API DaData.ru Город по IP-адресу Как вычислить расстояние между 2 точками с координатами через Google Maps Сканирование штрихкодов и QR кодов через камеру и с картинок Получение данных контрагента по ИНН Прием платежей на сайте через CloudPayments Как сделать интеграцию с Мой Склад Внедрение подсказок dadata на сайт Вывод точек на карте Яндекс. Интеграция с Яндекс Карты Интеграция с телефонией Zadarma.com Получение данных о контрагенте - интеграция с сервисом ЗаЧестныйБизнес Интеграция с AMO CRM Как импортировать данные в базу CRM из Google Контакты Вход/регистрация через ВКонтакте(vk.com) Интеграция CRM с онлайн чатом на сайте (Replain) Как связать yandex metrika clientID с пользователем на сайте и посмотреть полный путь его по сайту? Телеграм. Работа с файлами Как сделать обработку входящей почты (создание клиента в CRM из Email) Интеграция сайта с ChatGPT (openAI) Интеграция с Яндекс Метрика Интернет-эквайринг Тинькоф Банк Интеграция с платежным шлюзом LifePay Как сделать вебхук для передачи данных с Тильды на Falcon Space Пополнение средств через Yookassa (Юкасса) Тинькофф Банк - уведомление в учетную систему по операциям с расчетным счетом Интеграция с Ютуб. Получение роликов канала Интеграция с Ozon, Wildberries - извлечение статистики
- Каталоги
- Навигация
- Документы
- Дополнительные компоненты
- Продвижение, SEO
- Системные моменты
- Системное администрирование
- HOWTO
- Таблицы
- Формы
- Загрузка файлов, картинок
- Работа с SQL
- HOWTO JS
- HOWTO Верстка
- Решение проблем
Выгода от использования Falcon Space
В 2-3 раза экономнее и быстрее, чем заказная разработка
Более гибкая, чем коробочные решения и облачные сервисы
Используйте готовые решения и изменяйте под свои потребности
- Шаг 1. Создать концепт проекта
- Шаг 2. Получить оценку бюджета (КП)
- Шаг 3. Заключить договор
- Шаг 4. Создать совместно техническое задание
- Шаг 5. Поэтапная реализация проекта