Интеграция 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 (Юкасса) Тинькофф Банк - уведомление в учетную систему по операциям с расчетным счетом Интеграция с Ютуб. Получение роликов канала
- Каталоги
- Навигация
- Документы
- Дополнительные компоненты
- Продвижение, SEO
- Системные моменты
- Системное администрирование
- HOWTO
- Таблицы
- Формы
- Загрузка файлов, картинок
- Работа с SQL
- HOWTO JS
- HOWTO Верстка
- Решение проблем
Falcon Space
Это снижение стоимости владения
за счет меньшего количества людей для поддержки и узкого стека разработки. Про снижение стоимости владения продуктом
Это быстрое внесение изменений
по ходу эксплуатации программы. Как создается функционал на платформе
Это простой удобный интерфейс
адаптация под мобильные устройства. Про юзабилити платформы