Вокруг онлайн касс в последнее время дикий ажиотаж, 1 июля 2019 заканчивается последняя отсрочка, поэтому и мне пришлось заняться этим вопросом. Тем, у кого 1С или другая система особо можно не напрягаться, но если у вас собственная самописная система, то на ваши плечи ложится еще и интеграция с онлайн-кассами.
Мой опыт пригодится для интеграции с кассами Атол в режиме обмена данными по сети, ваша программа может отправлять данные на web-сервер Атол как на локалхост, так и по локальной сети, можно хоть из браузера AJAX отправлять, хоть с сервера через CURL, поэтому, неважно на каком языке написан ваш корпоративный софт, всё кроссплатформенно.
Мне на опыты попалась касса Атол 30ф — это такая простая печатная машинка с черным ящиком (ФН), так раз подходит, когда вся логика по составлению заказов лежит на внешнем софте, а не на софте, встроенном в кассу. К тому же, аппараты такого типа относительно недорогие, по сравнению с андроидными аналогами.
Отдельно хочу заметить, что «специалисты» некоторых компаний, занимающиеся поддержкой вообще не в курсе, что у Атол с 10й версии есть встроенный веб-сервер в драйвере, который принимает JSON-задания, более того, этот драйвер можно установить и на linux, судя по количеству готовых решений на малинках, могу предположить что там тоже можно установить, в дистрибутиве 10й версии драйвера установщик для arm присутствует.
Планируемая схема примерно такая — есть CRM, которая крутится на сервере в локальной сети, ее открывают из браузеров, с серверной стороны на PHP через curl будут отправляться чеки и печататься на кассе. А сама касса подключена к любому компу на Windows в этой же сети.
Говорят что если не активировать кассу, то она может работать в режиме принтера и печатать что чек недействительный, но мне это проверить не удалось, пришлось делать копеечные операции продажи и возврата.
Драйвер десятой версии скачиваем вот тут.
Перед установкой нужно установить Java той же разрядности, что и драйвер, иначе галочка web-сервер не будет доступна, если устанавливаете 64 битный драйвер ККТ, то и Java x64.
Вроде бы по логике нужно на 64 битную систему ставить 64 битный драйвер, но некоторый софт 32 битный не сможет с ним работать (вроде и к 1С такое относится, если она 32 битная).
В конце установки есть галочка — конфигурировать веб-сервер, если ее не поставили, то надо зайти в браузере на 127.0.0.1:16732/settings, поставить галочку «активировать сервер» и сохранить.
После этого нужно перезагрузить сервер через ПУСК->АТОЛ->перезапустить…
Еще сразу хочу предупредить, если запустить веб-сервер, то локальные приложения не смогут получить доступ к ККТ, я долго маялся, установил драйвер, запустил тест драйвера ккт, а он мне говорит что порт занят и всё, звонил в техподдержку местного продавца, там сказали не знаем что делать, потом десять раз перегружал комп, переустанавливал драйвер, ничего не помогает.
В общем, после того, как вы активировали и перезапустили сервер, а перед этим выключили сервер и проверили через поставляемую утилиту печать простого текста или просто проверили связь — можно приступать.
Этот веб-сервис не имеет никакой защиты по паролю, поэтому нужно сразу настроить брандмауэр Windows или другой софт, чтобы по порту 16732 могли обращаться только нужные компы, в моей ситуации это сервер на котором крутится CRM.
Общение с веб-сервисом вообще отдельная тема, очень интересная...
А дальше приведу рабочий вариант, он подходит для тех ситуаций, когда оплата только одним методом, а не так что часть налом и часть безналом, еще в нем используется система налогообложения по умолчанию, еще не высчитывается НДС, хотел дописать код, потом выкладывать, но думаю остались еще такие люди, которым до 1 июля эта информация нужнее, чем после. Сразу скажу, что класс требует доработки, много сырого, нет обработки ошибок, всё сделано за пару часов без учета чтения документации, данный код больше как пример и советую очень детально изучить документацию и адаптировать под ваши конкретные процессы.
Тут есть такие недоработки, которые я еще поправлю
Ну и в процессе внедрения боюсь еще много ошибок поймать, вот к примеру, если задание долго висит в статусе wait, то лучше его удалить из очереди, иначе последующие задания зависнут на несколько минут, я такой глюк поймал один раз, уже не надеялся что распечатает и тут сижу сижу, а оно хоп и напечатало сразу два чека подряд отправленных раннее…
В целом можно и с сайта в будущем собирать эквайринги, если в них не будет онлайн-чеков, пока не определились какой эквайринг привинтить. Но решение такое, больше наверно как идея для решения, время покажет как приживется эта касса.
Предупреждение, тем, кто невнимательно прочитал статью и не очень компетентен в вопросе безопасности — данный веб-сервис не имеет шифрования (https), не имеет авторизации, даже если это используется только в локальной сети — настройте защиту на доступ к порту.
Мой опыт пригодится для интеграции с кассами Атол в режиме обмена данными по сети, ваша программа может отправлять данные на web-сервер Атол как на локалхост, так и по локальной сети, можно хоть из браузера AJAX отправлять, хоть с сервера через CURL, поэтому, неважно на каком языке написан ваш корпоративный софт, всё кроссплатформенно.
Мне на опыты попалась касса Атол 30ф — это такая простая печатная машинка с черным ящиком (ФН), так раз подходит, когда вся логика по составлению заказов лежит на внешнем софте, а не на софте, встроенном в кассу. К тому же, аппараты такого типа относительно недорогие, по сравнению с андроидными аналогами.
Отдельно хочу заметить, что «специалисты» некоторых компаний, занимающиеся поддержкой вообще не в курсе, что у Атол с 10й версии есть встроенный веб-сервер в драйвере, который принимает JSON-задания, более того, этот драйвер можно установить и на linux, судя по количеству готовых решений на малинках, могу предположить что там тоже можно установить, в дистрибутиве 10й версии драйвера установщик для arm присутствует.
Планируемая схема примерно такая — есть CRM, которая крутится на сервере в локальной сети, ее открывают из браузеров, с серверной стороны на PHP через curl будут отправляться чеки и печататься на кассе. А сама касса подключена к любому компу на Windows в этой же сети.
Говорят что если не активировать кассу, то она может работать в режиме принтера и печатать что чек недействительный, но мне это проверить не удалось, пришлось делать копеечные операции продажи и возврата.
Драйвер десятой версии скачиваем вот тут.
Перед установкой нужно установить Java той же разрядности, что и драйвер, иначе галочка web-сервер не будет доступна, если устанавливаете 64 битный драйвер ККТ, то и Java x64.
Вроде бы по логике нужно на 64 битную систему ставить 64 битный драйвер, но некоторый софт 32 битный не сможет с ним работать (вроде и к 1С такое относится, если она 32 битная).
В конце установки есть галочка — конфигурировать веб-сервер, если ее не поставили, то надо зайти в браузере на 127.0.0.1:16732/settings, поставить галочку «активировать сервер» и сохранить.
После этого нужно перезагрузить сервер через ПУСК->АТОЛ->перезапустить…
Еще сразу хочу предупредить, если запустить веб-сервер, то локальные приложения не смогут получить доступ к ККТ, я долго маялся, установил драйвер, запустил тест драйвера ккт, а он мне говорит что порт занят и всё, звонил в техподдержку местного продавца, там сказали не знаем что делать, потом десять раз перегружал комп, переустанавливал драйвер, ничего не помогает.
В общем, после того, как вы активировали и перезапустили сервер, а перед этим выключили сервер и проверили через поставляемую утилиту печать простого текста или просто проверили связь — можно приступать.
Этот веб-сервис не имеет никакой защиты по паролю, поэтому нужно сразу настроить брандмауэр Windows или другой софт, чтобы по порту 16732 могли обращаться только нужные компы, в моей ситуации это сервер на котором крутится CRM.
Общение с веб-сервисом вообще отдельная тема, очень интересная...
- Генерируем уникальный uuid для задания
- Отправляем задание методом POST
- Долбимся на веб-сервис, ожидая результата задания с нашим UUID, может быть так, что несколько секунд у нашего задания будет висеть статус wait, а может возникнуть error, если в запросе что-то не так сформировали...
А дальше приведу рабочий вариант, он подходит для тех ситуаций, когда оплата только одним методом, а не так что часть налом и часть безналом, еще в нем используется система налогообложения по умолчанию, еще не высчитывается НДС, хотел дописать код, потом выкладывать, но думаю остались еще такие люди, которым до 1 июля эта информация нужнее, чем после. Сразу скажу, что класс требует доработки, много сырого, нет обработки ошибок, всё сделано за пару часов без учета чтения документации, данный код больше как пример и советую очень детально изучить документацию и адаптировать под ваши конкретные процессы.
код на php для примера работы с api (использовать только в учебных целях)
<?php
Class AtolWebDriver
{
protected $addr="127.0.0.1",$port="16732";
public $timeout = 30; //таймаут соединений
public $operator;
function __construct($addr=false,$port=false)
{
if ($addr!==false) $this->addr=$addr;
if ($port!==false) $this->port=$port;
}
public function CallAPI($method, $data,$_url="/requests")
{
$url = "http://".$this->addr.":".$this->port.$_url;
$curl = curl_init($url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl,CURLOPT_TIMEOUT, $this->timeout);
$headers = ['Content-Type: application/json'];
curl_setopt($curl,CURLOPT_HTTPHEADER, $headers);
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $method);
curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($data));
$resp = curl_exec($curl);
$data = json_decode($resp,1);
$code = curl_getinfo($curl, CURLINFO_HTTP_CODE);
curl_close($curl);
$res= [$data,$code,$resp];
print_r($res);
return $res;
}
//получает результат задания
public function get_res($uuid)
{
$ready = false;
$cnt=0;
$res_url = '/requests/'.$uuid;
while (!$ready && ++$cnt<60)
{
usleep(500000); //подождем чуть, прежде чем просить ответ
list($res,$code,$resp) = $this->CallAPI('GET',[],$res_url);
$ready = ($res['results'][0]['status'] == 'ready');
if ($ready) return $res;
}
return false; //не удалось получить результата
}
//создает задание
public function add_req($uuid,$req)
{
return $this->CallAPI('POST', ['uuid'=>$uuid,'request'=>$req]);
}
//генерирует уникальный id для задания
public function gen_uuid()
{
return exec('uuidgen -r');
}
//выполняет задание и возвращает его результат
public function atol_task($type,$req=[])
{
$req['type'] = $type;
$uuid = $this->gen_uuid();
$req = $this->add_req($uuid,$req);
if ($req[1]!='201') return false; //ошибка добавления
$res = $this->get_res($uuid);
//ошибка результата
if ($res===false || !isset($res['results'][0])) return false;
return $res['results'][0];
}
/*дальше уже идут конкретные задачи*/
//статус смены
public function get_shift_status()
{
$res = $this->atol_task('getShiftStatus');
if ($res===false) return false;
//closed / opened / expired
return $res['result']['shiftStatus']['state'];
}
//открытие смены
public function open_shift()
{
$status = $this->get_shift_status();
//eсли истекла, то надо закрыть
if ($status=="expired") $this->close_shift();
if ($status=="opened") return "Не могу открыть открытую смену";
$res = $this->atol_task('openShift',['operator'=>$this->operator]);
}
//закрытие смены
public function close_shift()
{
$status = $this->get_shift_status();
if ($status=="closed") return "Не могу закрыть закрытую смену";
$res = $this->atol_task('closeShift',['operator'=>$this->operator]);
}
public function items_prepare($items)
{
$res_items = [];
$summ = 0;
while ($item = array_shift($items))
{
$res_item = $item;
if (!isset($item['type']))
$res_item['type']="position";
if (isset($item['price']) && isset($item['quantity']))
{
$res_item['amount'] = $item['price']*$item['quantity'];
$res_item['tax'] = ['type'=>'none'];
$summ+=$res_item['amount'];
}
$res_items[] = $res_item;
}
return [$res_items,$summ];
}
//продажа sell, возврат sellReturn
public function fiskal($type_op="sell",$items,$pay_type="cash")
{
$data = [];
$data['operator'] = $this->operator;
$data['payments'] = [];
list($data['items'],$summ) = $this->items_prepare($items);
//+++тут может быть несколько типов оплаты одновременно
$data['payments'][] = ['type'=>$pay_type,'sum'=>$summ];
$res = $this->atol_task($type_op,$data);
}
}
//тут передается ip где крутится web-сервис драйвера Атол, можно еще и порт передать
$atol = new AtolWebDriver('192.168.100.10');
//тут надо фио кассира
$atol->operator = ['name'=>'сист.администратор'];
//составляем массив товаров с количеством и ценой
$items = [];
$items[] = ['name'=>'Пакет полиэтиленовый','price'=>0.7,'quantity'=>1];
$items[] = ['name'=>'Пакет бумажный','price'=>0.4,'quantity'=>1];
//открываем смену
$atol->open_shift();
//продаем товары
$atol->fiskal("sell",$items);
sleep(10); //немного подождем, чтобы успеть оторвать чек
//а теперь сделаем возврат всего этого, т.к. это просто проверка
$atol->fiskal("sellReturn",$items);
//еще подождем перед огромным чеком
sleep(20);
//закрываем смену, печатаем отчет
$atol->close_shift();
Тут есть такие недоработки, которые я еще поправлю
- Округление дробей при подсчете сумм, нужно округлять до копеек, иначе можно получить 1.000000001 или 0.999999999
- При правильном написании остальной логики программы такое обычно не возникает, но в ходе тестов я поймал себя на том, что задание вернуло результат error, а я ждал ready
Ну и в процессе внедрения боюсь еще много ошибок поймать, вот к примеру, если задание долго висит в статусе wait, то лучше его удалить из очереди, иначе последующие задания зависнут на несколько минут, я такой глюк поймал один раз, уже не надеялся что распечатает и тут сижу сижу, а оно хоп и напечатало сразу два чека подряд отправленных раннее…
В целом можно и с сайта в будущем собирать эквайринги, если в них не будет онлайн-чеков, пока не определились какой эквайринг привинтить. Но решение такое, больше наверно как идея для решения, время покажет как приживется эта касса.
Предупреждение, тем, кто невнимательно прочитал статью и не очень компетентен в вопросе безопасности — данный веб-сервис не имеет шифрования (https), не имеет авторизации, даже если это используется только в локальной сети — настройте защиту на доступ к порту.
Popadanec
Зашёл почитать, думая что обычную «печатную машинку» научили работать в режиме принтера чеков, но нет, они будут по прежнему свалены в углу в связи с новым законом.
Называйте вещи своими именами. Касса это касса возможно со встроенным принтером чеков, а принтер чеков это принтер чеков.
Плюс цена у этой «кассы» очень странная. Быстрый гуглёж показал что есть решения с клавиатурой и экраном вплоть до практически двух кратной разницы в стоимости при такой же скорости печати. А значит производитель щедро накрутил цену. Как с штрих сканерами. На Али они стоят порой в десять раз дешевле при аналогичном качестве работы.
PavelBelyaev Автор
Ну она где-то стоит 11, а где-то 6, на Авито вообще бу можно снятые с учёта за 4 найти Атол, где вы за 2-3 нашли с экраном и кнопками и зачем это надо, если онлайн касса предусматривает номенклатуру, а это уже вся логика в 1с или подобной учётной софтине.
Popadanec
MadNick92
Работая в сфере автоматизации и создавая интеграционные решения — могу сказать, что переплатить за надежность, за адекватные средства интеграции и т.д. стоит, а первая ссылка что Вы нашли, купите и начните пользоваться в обычном режиме, сообщите о результатах!
Popadanec
У меня маленький бизнес не требующий таких решений. Две кассы эвотор 7.2 вроде. Два магазина. Всё что мне нужно они делают. Что не делают, пишу в тех поддержку
эвоторатовароучётной системы и мне порой в течении дня добавляют/изменяют функционал. Тех. поддержка эвотора работает только с багами, предложения по улучшению/изменению интерфейса кассы/ЛК они скидывают в спам. За год ни одно не прошло из того что кассиров реально каждый день раздражает.Сейчас к примеру спамят рекламой сигарет(в смысле перехода на новый их учёт). Уже неделю активно долбят по нескольку раз за день, и отключить ни как нельзя. А это сильно мешает продавцам. Сигареты, алкоголь и другая продукция требующая нового учёта у меня никогда не продавалась и не может продаваться, что можно посмотреть по коду ОКВЭД и давать таргетированную рекламу или вовсе её отключить на кассе.
Fzero0
Атол 30ф это фискальный регистратор, а те что вы показали это автономные онлайн кассы. Да они дешевле, но вся суть 54 ФЗ что государство «заставит» всех перейти на товароучетные системы и тогда Вам придется убрать свою автономную ккм и купить фискальный регистратор и 1С
Popadanec
Автономная онлайн касса, это обычная оффлайн касса. Их могут использовать только в районах без интернета.
Все попавшие на скрин? судя по описанию умеют передавать данные ОФД, через wi-fi, сим карту, LAN, синий зуб или USB.
Fzero0
автономные в смысле работают без ПК, вы можете загружать в них номенклатуру, через какой нибудь интерфейс и работать по коду товара или с помощью сканера
Popadanec
Самая дешёвая к примеру умеет судя по инструкции синхронизироваться с 1C и печатать с ПК, но там какие то траблы в новой версии, то ли программно ограничили этот функционал, то ли глюки.
Аппаратно ЭЛВЕС-МФ вроде как там одно и тоже что в Атол 30ф, только добавили клаву и экран и программно зарезали функционал.
PavelBelyaev Автор
Тут немного в другом вопрос — какой аппарат можно интегрировать быстренько с собственной системой управления торговлей, чтобы отправлять чеки, а не какой дешевле можно купить.
AKudinov
Наверное, стОит присмотреться к арифметике с фиксированной точкой. Например, в копейках целыми числами считать.
Собственно, когда-то двоично-десятичные числа именно для этого и придумали.
PavelBelyaev Автор
Обычно я привожу к копейкам все цены (12 рублей 33 копейки = 1233 копеек) и потом их суммирую, только при умножении 1233 на 1.234 (такое количество бывает, когда ламинат кратно упаковкам продается, ну или кратно доскам), то там снова надо до целых округлять. Вчера больше цель была в краткие сроки все основные операции на апи провернуть и примерчик накидать как это работает, а дальше хоть на BASH через консольный curl можно отправлять задачки на печать по аналогии, у кого-то видел на nodejs товароучетные программы.
irbis_al
Так я немного не понял… Касса на Винде?.. Какая же тут кросплатформенность.
Вот если бы API сервер JSON был бы внутри аппарата(вставить ту же малинку себе внутрь) и тогда мне не надо ставить всякие драйвера… а просто делаю request из любого языка из любой ОС… Это уже уровень.
Или хотя бы кроссплатформенное rest api(и не обязательно полный web сервер поднимать)
Типа запустил(в любой ОС) java -jar atol.jar или node atol.js и всё запустился.
(У нас например так но атол я снял с поддержки… Можно об этом почитать в топике https://habr.com/ru/post/453822/
PavelBelyaev Автор
Касса просто к пользовательскому компу зацеплена пока что, который на винде (а CRM на другом компе, который вообще в другой комнате), но драйвера аналогичные есть на linux x64/x32/arm, хоть где ставишь, по сети шлешь json запросы на порт 16732. Просто пока не хочу плодить устройства и подключить к любому уже существующему компу.
Можно например Orange Pi Zero приклеить к аппарату сбоку и по Ethernet подключить, сделать небольшой транспорт запросов, дополнив его авторизацией и поправив еще контроль очередей и обработку зависших заданий.
У меня точно такие же были пожелания чтобы касса была самостоятельной, даже рассматривал кассы типа Эвотор и похожие другие, но Эвотор вещь в себе, весь обмен через облако идет и аппарат сам себе компьютер, а с любого своего адреса на него долбиться или с него собирать данные со своего сервера без написания нативного приложения под их андроид не получится (так мне в оф. поддержке ответили).
irbis_al
А Вы с linux ом хорошол работаете?.. Там вот там не всё просто, драйвера эти не везде ставятся..(Как правило это ubuntu какой нибудь последней версии с последним или конкретным ядром).Я использую CentOS и когда я проводил исследования они не поднимались. Проще было чем "трахаться" со стыковкой драйверов и ОС самому писать на низкоуровневом протоколе(те же затраты сил и нервов)… В случае атола внутри она "такая калоша" ,-хуже низкоуровневого протокола для ФР не видел.
PavelBelyaev Автор
Не тестировал, может еще через 2-3 версии всё допилят, но люди вроде удачно запускали на малинках. Предлагаю запилить образ для малинки который из коробки работает как надо, только вот где раздобыть подешевле аппарат для опытов, чтобы он умел печатать без ФН. На Авито большинство касс продают дороже чем новая в магазине, цены то совсем не монитоорят что оно подешевело…
foatto
«Вот если бы API сервер JSON был бы внутри аппарата(вставить ту же малинку себе внутрь)»
Полтора года назад после весьма энергичных поисков я нашёл только одного производителя таких касс (для вставки ФН вскрывал корпус, там была какая-то платка какого-то *** Pi).
402d
По моему мнению, атол поздно сделал это решение.
За три года уже написано много серверов для ККМ.
Есть как аппаратно-программные (ардуинки со специальной прошивкой),
так и разной степени удобности / платности под обычный ПК.
Но то, что Вы сейчас описали в статье по удобству установки / интеграции
по моему мнению проигрывает практически всем.
Fzero0
Как насчет скорости побития я подымал такое решение только на Windows машине ККМ была подключена по TCP/IP и скорость работы оставляла желать лучшего…
PavelBelyaev Автор
Скорость не очень, сам демон атоловский, который обрабатывает эти задачки слегка тупит, мог бы в реальном времени ответы присылать на запросы, но он ставит в очередь и даже элементарно глянуть состояние смены нужно отправить задачу, а потом ждать 0.2-0.4 сек результата, с определенной периодичностью стучаться надо GET запросами и проверять состояние задачки, ну у нас может в среднем 2 чека в час будет, чеки вроде вполне шустро печатает, не больше секунды от отправки до старта печати, но я один раз поймал глюк когда задание зависло и всю очередь остановило, наверно когда запускал и останавливал веб-сервис что-то запнулось.
foatto
«у Атол с 10й версии есть встроенный веб-сервер в драйвере, который принимает JSON-задания»
Хм, таки есть жизнь
на Марсесо сторонним софтом…Чуть более года полтора назад я перебрал чуть ли не все аппараты, заколебал всех местных поставщиков и только у Старруса была касса с поддержкой JSON (с жутко глючным настроечным софтом, я два ФН запорол, пока они отлаживались на мне).
У какой-то кассы (не помню уже) был жуткий бинарный формат, видимо сделанный в спешке на основе «проводного» протокола.
Другие производители и вовсе не хотели давать протокол («кто ты такой?»).
В отличие от описываемого в статье аппарата касса от Старруса давала ответ сразу, без повторных запросов.
Впереди работа с маркировкой, скучать не придётся.
Но рынок цивилизируется, радует.
rivaufa
у меня не получается. в как проверить есть ли вообще связь ккт с этим сервером? драйвер установился, настройки открываются, а команды не выполняются
PavelBelyaev Автор
Сперва нужно перезапустить сервер после установки, там так написано, ну после того как галочку активировать ставите и сохраняете.
А потом проверить состояние смены, если не может получить, то смотреть выхлоп в результатах curl, а и еще важный момент забыл упомянуть, uuid генерируется через exec('uuidgen -r');
это требует установленной консольной утилиты, если команда uuidgen в консоли не выполняется…
Я тут уже новую версию библиотеки почти сделал пока к рабочему проекту прикручиваю, обработки всех ошибок сделал — когда нет соединения с сервером, когда с сервером общается, но сам ккт выключен и сервер до него достучаться не может и всякое такое
rivaufa
сервер перезапускала, UUid генерируется, в ответ выходит:
Array ( [0] => [1] => 0 [2] => )
и все…
curl выдают bool(false)
жду, наверно, новую версию.
rivaufa
может проблема в том, что " есть CRM, которая крутится на сервере в локальной сети, ее открывают из браузеров" а моя не на локале, а на хостинге?
PavelBelyaev Автор
Это достаточно опасно, как уже ниже написали в комментарии. В статье я указал что у этой штуки отсутствует защита и в той же локалке я этот порт очень жестко зарезал брандмауэром, только с одного локального компа доступно. По-хорошему тут либо по впн каким-то образом или через ssh прокидавать порт или на локальном компе, где всё это крутится сделать транспорт. А еще у этой штуки есть питоновская библиотека, что позволит свой какой-то longpool накатать, который будет ждать событий от CRM и на них реагировать. Моя библиотека, которая тут в учебных целях размещена — возвратит false, если не удалось доступ получить к серверу, если не удалось разместить задание или если на задание не удалось ответ получить. Но по листингу понятно что никакого ответа нет, в том месте, где возвращает массив [json_decode($resp),$code,$resp] — везде пусто…
Я вообще вижу лучшее решение ситуации на будущее — использовать например RabbitMQ и связать Python/Go транспорт с моей системой на PHP, т.к. работа через веб-сервер не только не очень безопасна, но и немного подтупливает с ответом на запросы, некоторые запросы действительно нуждаются в отложенной отработке, например печать чека, но вот элементарно проверить состояние смены, статус аппарата (вдруг бумага закончилась) и всё такое — могло бы сразу ответы выдавать, и то что авторизацию + шифрование по https не придумали это дикий недочет…
Fzero0
Если Ваша CRM Крутится на хостинге то вам порт (16732) Атоловского WEb сервера надо будет покинуть во внешний мир, что есть не очень гуд. Вы из локальной сети проверьте просто набросайте страницу которая отправит пост запрос на 127.0.0.1:16732/requests только желательно не с фискальными операциями а Отчет или печать клише (чтобы проверить связь) что нибудь типа такого