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