Исходный код вики Протокол интеграции систем внешних наливов с Топаз "Web Офис"
Скрыть последних авторов
| author | version | line-number | content |
|---|---|---|---|
![]() |
1.1 | 1 | ====== **v 1.0.1** ====== |
| 2 | |||
| 3 | == Настройка перед интеграцией == | ||
| 4 | |||
| 5 | |||
![]() |
19.1 | 6 | Перед началом интеграции, уполномоченный сотрудник компании, предоставляющей услуги внешних наливов (далее Интегратор), передает в ООО "Топаз-сервис" следующую информацию: |
![]() |
1.1 | 7 | |
| 8 | 1. Базовый url тестового окружения системы внешнего налива | ||
| 9 | 1. Список ip адресов, с которых будут приходить запросы от тестового окружения системы внешнего налива | ||
| 10 | 1. Базовый url боевого окружения системы внешнего налива | ||
| 11 | 1. Список ip адресов, с которых будут приходить запросы от боевого окружения системы внешнего налива | ||
| 12 | 1. Официальное название системы внешних наливов, которое будет указано в Топаз "Web Офис" | ||
| 13 | 1. Иконку системы внешних наливов в формате svg с соотношением сторон 1:1 | ||
| 14 | |||
| 15 | После получения информации по указанным пунктам, от ООО "Топаз-сервис" будет предоставлен тестовый доступ для настройки интеграции. | ||
| 16 | |||
![]() |
19.1 | 17 | Также будет предоставлен секретный ключ (тестового и боевого окружения) для идентификации системы внешних наливов в "Топаз-Web Office". |
![]() |
1.1 | 18 | |
![]() |
18.1 | 19 | (% class="box errormessage" %) |
| 20 | ((( | ||
![]() |
19.1 | 21 | === **Данный ключ необходимо будет передавать во всех запросах от внешней системы в "Топаз-Web Office" в заголовке (header) externalSystemApikey** === |
![]() |
18.1 | 22 | ))) |
| 23 | |||
![]() |
20.1 | 24 | == ApiKey == |
![]() |
19.1 | 25 | |
| 26 | (% class="wikigeneratedid" %) | ||
| 27 | Интегратору необходимо для каждого своего клиента (сети АЗС) сформировать и хранить в собственной базе данных уникальный Apikey. | ||
| 28 | С помощью этого Apikey происходит идентификация клиента (сети АЗС) при обмене между "Топаз-Web Office" и системой Интегратора. | ||
| 29 | |||
![]() |
15.1 | 30 | == Адрес для отправки запросов == |
| 31 | |||
![]() |
16.1 | 32 | Базовым адресом **(baseUrl)** для выполнения запросов является [[https:~~/~~/topazoffice.ru/ms/external-fueling/integration>>https://topazoffice.ru/ms/external-fueling/integration]] |
![]() |
15.1 | 33 | |
![]() |
1.1 | 34 | == Получение списка АЗС и их конфигураций == |
| 35 | |||
![]() |
19.1 | 36 | Внешняя система опрашивает "Топаз-Web Office" для получения списка АЗС и их конфигураций **через HTTP **запрос на **baseUrl **с префиксом **/station?apikey={apikey **}, запрос типа **GET **, timeout 10 секунд. |
![]() |
1.1 | 37 | |
| 38 | В ответ Топаз "Web Офис" дает ответ в формате **JSON** | ||
| 39 | |||
| 40 | **...** | ||
| 41 | |||
![]() |
11.1 | 42 | {{code language="javascript"}} |
| 43 | { | ||
![]() |
9.2 | 44 | // идентификатор станции АЗС |
| 45 | string Id | ||
| 46 | // статус станции: true – доступна, false – выключена | ||
| 47 | bool Enable, | ||
| 48 | // наименование станции | ||
| 49 | string Name, | ||
| 50 | // адрес станции | ||
| 51 | string Address, | ||
| 52 | // гео точка на карте | ||
| 53 | location Location | ||
![]() |
6.1 | 54 | { |
![]() |
9.2 | 55 | double Lat, |
| 56 | double Lon }, | ||
| 57 | // словарь доступных ТРК | ||
| 58 | Dictionary Columns { | ||
| 59 | // номер колонки | ||
| 60 | (int32) Key: | ||
| 61 | { | ||
![]() |
6.1 | 62 | // список доступных типов топлива |
| 63 | "Fuels": [ "a92", "a95", "diesel_premium", ... N ] | ||
| 64 | } | ||
| 65 | } ... N | ||
![]() |
11.1 | 66 | } |
| 67 | {{/code}} | ||
![]() |
1.1 | 68 | |
| 69 | **Возможные идентификаторы топлива** | ||
| 70 | |||
| 71 | |ID|Марка | ||
| 72 | |diesel|дизель | ||
| 73 | |diesel_premium|брендированный дизель | ||
| 74 | |a80|бензин марки А80 | ||
| 75 | |a92|бензин марки А92 | ||
| 76 | |a92_premium|брендированный бензин марки А92 | ||
| 77 | |a95|бензин марки А95 | ||
| 78 | |a95_premium|брендированный бензин марки А95 | ||
| 79 | |a98|бензин марки А98 | ||
| 80 | |a98_premium|брендированный бензин марки А98 | ||
| 81 | |a100|бензин марки А100 | ||
| 82 | |a100_premium|брендированный бензин марки А100 | ||
| 83 | |propane|газ пропан | ||
| 84 | |metan|метан | ||
| 85 | |||
| 86 | == Получение прайс-листа == | ||
| 87 | |||
![]() |
19.1 | 88 | Внешняя система опрашивает "Топаз-Web Office" для получения прайс-листа **HTTP **запросом на **baseUrl **с префиксом **/price?apikey={apikey} **, запрос типа **GET **, timeout 10секунд. |
![]() |
1.1 | 89 | |
![]() |
11.1 | 90 | В ответ Топаз "Web Офис" дает ответ в формате **JSON**{{{}}} |
![]() |
1.1 | 91 | |
![]() |
11.1 | 92 | {{code language="javascript"}} |
| 93 | { | ||
| 94 | { | ||
| 95 | // идентификатор станции внутри Топаз "Web Офис" | ||
| 96 | string StationId, | ||
| 97 | // идентификатор топлива | ||
| 98 | string ProductId, | ||
| 99 | // цена за 1 литр | ||
| 100 | double Price | ||
| 101 | }, | ||
| 102 | …. N | ||
| 103 | } | ||
| 104 | {{/code}} | ||
![]() |
1.1 | 105 | |
![]() |
7.1 | 106 | |
| 107 | |||
![]() |
12.1 | 108 | **Пример ответа**{{{}}} |
![]() |
1.1 | 109 | |
![]() |
12.1 | 110 | {{code language="javascript"}} |
| 111 | { | ||
| |
20.2 | 112 | {"StationId": "0001", "ProductId": "a92", "Price": 38.66}, |
| 113 | {"StationId": "0001", "ProductId": "a95_premium", "Price": 45.21}, | ||
| 114 | {"StationId": "0002", "ProductId": "a92", "Price": 38.98}, | ||
![]() |
12.1 | 115 | } |
| 116 | {{/code}} | ||
![]() |
1.1 | 117 | |
| 118 | == Обработка заказа == | ||
| 119 | |||
| 120 | [[image:https://wiki.topazelectro.ru/download/attachments/1179735/image2023-1-19_16-21-33.png?version=1&modificationDate=1716374642000&api=v2]] | ||
| 121 | |||
![]() |
19.1 | 122 | Информирование "Топаз-Web Office" о заказе и их статусах осуществляется **HTTP **запросом на **baseUrl **с префиксом **/order **, запрос типа **POST **, timeout 10 секунд. |
![]() |
1.1 | 123 | |
| 124 | |||
![]() |
13.1 | 125 | **Тело запроса содержит JSON вида Order**{{{}}} |
![]() |
1.1 | 126 | |
| |
20.2 | 127 | {{code language="javascript"}} |
![]() |
13.1 | 128 | { |
| 129 | // идентификатор заказа | ||
| 130 | string Id | ||
| 131 | // дата и время создания в UTC, формат даты yyyy-MM-dd'T'HH:mm:ss.SSSSSSS'Z' либо yyyy-MM-dd HH:mm:ss | ||
| 132 | String DateCreate | ||
| 133 | // значение заказа | ||
| 134 | double OrderVolume | ||
| 135 | // идентификатор станции АЗС | ||
| 136 | string StationExtendedId | ||
| 137 | // номер колонки | ||
| 138 | int ColumnId | ||
| 139 | // идентификатор топлива | ||
| 140 | string FuelId | ||
| 141 | // стоимость 1 литра топлива | ||
| 142 | double PriceFuel | ||
| 143 | // сумма заказа | ||
| 144 | double Sum | ||
| 145 | // кол-во литров | ||
| 146 | double Litre | ||
| 147 | // итого оплачено | ||
| 148 | double SumPaid | ||
| 149 | // статус заказа | ||
| 150 | OrderStatus Status | ||
| 151 | // дата и время завершения заказа UTC, формат даты yyyy-MM-dd'T'HH:mm:ss.SSSSSSS'Z' либо yyyy-MM-dd HH:mm:ss | ||
| 152 | String DateEnd | ||
| 153 | // идентификатор причины отмены заказа | ||
| 154 | string ReasonId | ||
| 155 | // причина отмены | ||
| 156 | string Reason | ||
| 157 | // итого сумма литров залито | ||
| 158 | double LitreCompleted | ||
| 159 | // итого оплачено по завершению заказа | ||
| 160 | double SumPaidCompleted | ||
| 161 | // идентификатор договора | ||
| 162 | string ContractId | ||
| 163 | } | ||
| 164 | {{/code}} | ||
![]() |
1.1 | 165 | |
| 166 | Параметр **OrderType **– тип заказа может принимать следующие значения: | ||
| 167 | |||
| |
20.3 | 168 | * **Money **– заправка на фиксированную сумму |
| 169 | * **Liters **– заправка на литры | ||
![]() |
1.1 | 170 | |
| 171 | Параметр **Status **– статус заказа может принимать следующие значения | ||
| 172 | |||
| 173 | * **OrderCreated **– заказ создан и полностью оплачен | ||
| |
20.3 | 174 | * **Accepted **- АЗС готова начать налив |
| 175 | * **Expired **– статус от АЗС не поступил в течение 30 минут | ||
![]() |
1.1 | 176 | * **Completed **– заказа завершен успешно |
| 177 | * **StationCanceled **– заказ отменен оператором АЗС или же Топаз "Web Офис" | ||
| 178 | * **UserCanceled **– заказ отменен пользователем | ||
| 179 | |||
| 180 | Параметр **ContractId **– стандартными типами договора, по которому обрабатывается заказ | ||
| 181 | |||
| 182 | * **Individual **– договор возмездного оказания услуг (физические лица) | ||
| 183 | * **Corporation **- договор купли продажи топлива (юридические лица) | ||
| 184 | |||
| 185 | Так же можно указать любые другие типы договора по договоренности между сетью АЗС и внешней системой. | ||
| 186 | |||
| 187 | При получении заказа в статусе **OrderCreated **Топаз "Web Офис" проверяет ряд параметров **StationExtendedId **– в случае если идентификатор станции не найден в Топаз "Web Офис", то Топаз "Web Офис" дает ответ **400** | ||
| 188 | |||
| 189 | **FuelId **+ **PriceFuel **– в случае если стоимость топлива в Топаз "Web Офис" отличается от присланной, то Топаз "Web Офис" дает ответ **402** | ||
| 190 | |||
| 191 | == Передача статусов о заказе == | ||
| 192 | |||
| |
20.2 | 193 | === Статус Accepted === |
![]() |
1.1 | 194 | |
![]() |
19.1 | 195 | Данный статус сообщает внешней системе о том, что заказ принят и обработан в "Топаз-Web Office" |
![]() |
1.1 | 196 | |
![]() |
19.1 | 197 | Данный статус "Топаз-Web Office" отсылает после того, как были произведены некоторые действия с заказом (например, заказ сохранен в базе данных) и система готова перейти на следующий шаг |
![]() |
1.1 | 198 | |
![]() |
19.1 | 199 | В случае если внешняя система дала ответ, отличный от **200 ОК **, то "Топаз-Web Office" отсылает статус Canceled и прекращает обработку заказ |
![]() |
1.1 | 200 | |
![]() |
17.1 | 201 | **baseUrl + /api/order/accept POST** |
![]() |
1.1 | 202 | |
| 203 | **apikey={apikey}&orderId={ordeId}** | ||
| 204 | |||
| 205 | все параметры являются обязательными | ||
| 206 | |||
| 207 | === Статус Fueling === | ||
| 208 | |||
![]() |
19.1 | 209 | Данный статус сообщает внешней системе о том, что "Топаз-Web Office" готов запустить колонку (начать пролив) |
![]() |
1.1 | 210 | |
![]() |
19.1 | 211 | Данный статус "Топаз-Web Office" отсылает перед началом пуска колонки |
![]() |
1.1 | 212 | |
![]() |
19.1 | 213 | В случае если внешняя система дала ответ, отличный от **200 ОК **, то "Топаз-Web Office" отсылает статус Canceled и прекращает обработку заказ |
![]() |
1.1 | 214 | |
![]() |
17.1 | 215 | **baseUrl + /api/order/fueling POST** |
![]() |
1.1 | 216 | |
| 217 | **apikey={apikey}&orderId={ordeId}** | ||
| 218 | |||
| 219 | все параметры являются обязательными | ||
| 220 | |||
| 221 | === Статус Canceled === | ||
| 222 | |||
| 223 | Данный статус сообщает внешней системе о том, что заказ следует отменить | ||
| 224 | |||
![]() |
17.1 | 225 | **baseUrl + /api/order/canceled** |
![]() |
1.1 | 226 | |
| 227 | **POST** | ||
| 228 | |||
| 229 | **apikey={apikey}&orderId={ordeId}&reason={reason}** | ||
| 230 | |||
| 231 | все параметры являются обязательными | ||
| 232 | |||
| 233 | **reason – **текстовая причина отмены | ||
| 234 | |||
| 235 | === Статус Completed === | ||
| 236 | |||
| 237 | Данный статус сообщает внешней системе о том, что заказ выполнен и топливо залито | ||
| 238 | |||
![]() |
19.1 | 239 | В случае если внешняя система дала ответ отличный от **200 ОК **, то "Топаз-Web Office" отсылает запросы с некоторым отложенным количеством времени до момента получения ответа **200 ОК** |
![]() |
1.1 | 240 | |
![]() |
17.1 | 241 | **baseUrl + /api/order/completed POST** |
![]() |
1.1 | 242 | |
| 243 | **apikey={apikey}&orderId={ordeId}&litre={litre}&extendedOrderId={extendedOrderId}&** | ||
| 244 | |||
| 245 | **extendedDate={extendedDate}** | ||
| 246 | |||
| 247 | все параметры являются обязательными | ||
| 248 | |||
| 249 | **litre **– кол-во пролитых литров, указывается как **double **с разделителем точка **extendedOrderId **– идентификатор заказа в АСУ сети | ||
| 250 | |||
| 251 | **extendedDate **– дата по которой АСУ строит отчет для сверки, формат **dd.MM.yyyy HH:mm:ss** | ||
| 252 | |||
| 253 | === Отправка счетчика налива === | ||
| 254 | |||
![]() |
19.1 | 255 | В момент процесса налива "Топаз-Web Office" может сообщать внешней системе статус счетчика налива |
![]() |
1.1 | 256 | |
![]() |
19.1 | 257 | Для этого с периодичностью от 5 – 10 секунд "Топаз-Web Office" выполняет следующий запрос |
![]() |
1.1 | 258 | |
![]() |
17.1 | 259 | **baseUrl + /api/order/volume** |
![]() |
1.1 | 260 | |
| 261 | **POST** | ||
| 262 | |||
| 263 | **apikey={apikey}&orderId={ordeId}&litre={litre}** | ||
| 264 | |||
| 265 | все параметры являются обязательными | ||
| 266 | |||
| 267 | **litre **– кол-во пролитых на момент отправки запроса литров, указывается как double с разделителем точка | ||
| 268 | |||
| 269 | == Проверка статуса работы станции == | ||
| 270 | |||
![]() |
17.1 | 271 | Перед формирование заказ внешняя система делает запрос на станцию для определения доступности и готовности станции принять заказ **baseUrl **с префиксом |
![]() |
1.1 | 272 | |
![]() |
17.1 | 273 | **/ping?apikey={apikey}&stationId={stationId}&columnId={columnId}, stationId **– идентификатор станции |
![]() |
1.1 | 274 | |
| 275 | **columnId **– идентификатор ТРК | ||
| 276 | |||
| 277 | запрос типа **GET **, timeout 10 секунд. | ||
| 278 | |||
| 279 | == Статусы ответов == | ||
| 280 | |||
| 281 | **200 ОК **– станция и ТРК готова принять и обработать заказ | ||
| 282 | |||
| 283 | **400 **– станция или ТРК не найдена (не верный идентификатор станции или ТРК) **404 **– ТРК занята / ТРК не готова принять заказ | ||
| 284 | |||
| 285 | любой ответ не **200 ОК **– интерпретируется как на станции нет интернета / станция не доступна |
