Skip to content

Instantly share code, notes, and snippets.

@reinhurd
Last active January 24, 2022 13:11
Show Gist options
  • Star 6 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save reinhurd/bf16877c49140c913b1fae1095f8ca16 to your computer and use it in GitHub Desktop.
Save reinhurd/bf16877c49140c913b1fae1095f8ca16 to your computer and use it in GitHub Desktop.
Апи ФНС РФ по выдаче информации о чеках - рабочая схема подключения на ПХП
<?php
//скрыть, если не пользуетесь прокси.
$proxy="127.0.0.1:1337";
$ch = curl_init();
curl_setopt($ch, CURLOPT_PROXY, $proxy);
curl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5);
curl_setopt ($ch, CURLOPT_PROXYTYPE, 7);
curl_setopt_array($ch, array(
CURLOPT_URL => "https://openapi.nalog.ru:8090/open-api/AuthService/0.1?wsdl",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 0,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS =>"
<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:ns=\"urn://x-artefacts-gnivc-ru/inplat/servin/OpenApiMessageConsumerService/types/1.0\">
<soapenv:Header/>
<soapenv:Body>
<ns:GetMessageRequest>
<ns:Message>\n<tns:AuthRequest xmlns:tns=\"urn://x-artefacts-gnivc-ru/ais3/kkt/AuthService/types/1.0\">
<tns:AuthAppInfo>
<tns:MasterToken>/*YOUR MASTER TOKEN HERE*/</tns:MasterToken>
</tns:AuthAppInfo>
</tns:AuthRequest>
</ns:Message>
</ns:GetMessageRequest>
</soapenv:Body>
</soapenv:Envelope>",
CURLOPT_HTTPHEADER => array(
"Content-Type: text/xml"
),
));
$response = curl_exec($ch);
$error = curl_error($ch);
curl_close($ch);
//echo $response;
echo $error;
//echo html_entity_decode($response);
$dom = new DOMDocument();
$dom->loadXML($response);
foreach($dom->getElementsByTagName('Token') as $element){
$tempToken = $element->nodeValue;
}
$temptoken = $tempToken;
$ch = curl_init();
curl_setopt($ch, CURLOPT_PROXY, $proxy);
curl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5);
curl_setopt ($ch, CURLOPT_PROXYTYPE, 7);
curl_setopt_array($ch, array(
CURLOPT_URL => "https://openapi.nalog.ru:8090/open-api/ais3/KktService/0.1?wsdl",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 0,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS =>"<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\"
xmlns:ns=\"urn://x-artefacts-gnivc-ru/inplat/servin/OpenApiAsyncMessageConsumerService/types/1.0\">
<soapenv:Header/>
<soapenv:Body>
<ns:SendMessageRequest>
<ns:Message>
<tns:GetTicketRequest xmlns:tns=\"urn://x-artefacts-gnivc-ru/ais3/kkt/KktTicketService/types/1.0\">
<tns:GetTicketInfo>
<tns:Sum>12500</tns:Sum>
<tns:Date>2020-04-23T12:08:00</tns:Date>
<tns:Fn>9287440300077658</tns:Fn>
<tns:TypeOperation>1</tns:TypeOperation>
<tns:FiscalDocumentId>166865</tns:FiscalDocumentId>
<tns:FiscalSign>4264393268</tns:FiscalSign>
</tns:GetTicketInfo>
</tns:GetTicketRequest>
</ns:Message>
</ns:SendMessageRequest>
</soapenv:Body>
</soapenv:Envelope>",
CURLOPT_HTTPHEADER => array(
"FNS-OpenApi-Token: ". $temptoken ."",
"FNS-OpenApi-UserToken: /*YOUR MASTER TOKEN HERE*/",
"Content-Type: text/xml"
),
));
$response = curl_exec($ch);
$error = curl_error($ch);
curl_close($ch);
//echo $response;
echo $error;
//echo html_entity_decode($response);
$dom = new DOMDocument();
$dom->loadXML($response);
foreach($dom->getElementsByTagName('MessageId') as $element ){
$messageId = $element->nodeValue;
}
$ch = curl_init();
curl_setopt($ch, CURLOPT_PROXY, $proxy);
curl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5);
curl_setopt ($ch, CURLOPT_PROXYTYPE, 7);
curl_setopt_array($ch, array(
CURLOPT_URL => "https://openapi.nalog.ru:8090/open-api/ais3/KktService/0.1?wsdl",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 0,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS =>"<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:ns=\"urn://x-artefacts-gnivc-ru/inplat/servin/OpenApiAsyncMessageConsumerService/types/1.0\">
<soapenv:Header/>
<soapenv:Body>
<ns:GetMessageRequest>
<ns:MessageId>".$messageId."</ns:MessageId>
</ns:GetMessageRequest>
</soapenv:Body>
</soapenv:Envelope>",
CURLOPT_HTTPHEADER => array(
"FNS-OpenApi-Token: ". $temptoken ."",
"FNS-OpenApi-UserToken: /*YOUR MASTER TOKEN HERE*/",
"Content-Type: text/xml"
),
));
$response = curl_exec($ch);
$error = curl_error($ch);
curl_close($ch);
//echo $response;
echo $error;
//echo html_entity_decode($response);
$dom = new DOMDocument();
$dom->loadXML($response);
foreach($dom->getElementsByTagName('Code') as $element ){
$code = $element->nodeValue;
}
foreach($dom->getElementsByTagName('Ticket') as $element ){
$message = $element->nodeValue;
}
$x = json_decode($message, true);
var_dump($x);
@jhaoda
Copy link

jhaoda commented Feb 12, 2021

@dicrtarasov покажи, где в коде происходит «заворачивать JSON в XML затем в SOAP»?

@reinhurd
Copy link
Author

Почему то при последнем запросе, когда я передаю:
<ns:MessageId>".$messageId."</ns:MessageId>
Получаю ответ:
Запрос не соответствует формату hsm
Что это значит, а главное как это исправить?)

  1. Точно hsm, а не xsd?
  2. $messageId - в каком формате отправляете?
  3. Если у вас официальное подключение к ФНС, вам вместе с мастер-токеном должны были прислать ссылку с доступами к их хелпдеску, попробуйте задать вопрос им, нужно будет приложить отправляемые вами запросы и ответы налоговой с меткой времени. Они, правило, быстро и более-менее по теме, помогают.

@rilax
Copy link

rilax commented Feb 12, 2021

Почему то при последнем запросе, когда я передаю:
<ns:MessageId>".$messageId."</ns:MessageId>
Получаю ответ:
Запрос не соответствует формату hsm
Что это значит, а главное как это исправить?)

  1. Точно hsm, а не xsd?
  2. $messageId - в каком формате отправляете?
  3. Если у вас официальное подключение к ФНС, вам вместе с мастер-токеном должны были прислать ссылку с доступами к их хелпдеску, попробуйте задать вопрос им, нужно будет приложить отправляемые вами запросы и ответы налоговой с меткой времени. Они, правило, быстро и более-менее по теме, помогают.
  1. Точнее некуда, код ошибки 452
  2. Какой получи такой и передаю, не меняя его, вот его пример: 48bb684c-0b75-4e95-8eac-7d1cbdfac445
  3. Конечно задам, думал возможно тут мне помогут быстрее, я же не один кто пытается работать с этой API
    $messageId может его нужно передавать как то иначе? В документации вроде ничего нет на эту тему

@reinhurd
Copy link
Author

@rilax
К сожалению, не знаю, как вам помочь, код выше крутится на одном из продакшн-серверов сейчас, и все возвращает нормально. Если уверены, что нет опечаток (и данные по самому чеку переданы так, как в примере), то поможет только запрос разработчикам этой штуки)

@rilax
Copy link

rilax commented Feb 12, 2021

@rilax
К сожалению, не знаю, как вам помочь, код выше крутится на одном из продакшн-серверов сейчас, и все возвращает нормально. Если уверены, что нет опечаток (и данные по самому чеку переданы так, как в примере), то поможет только запрос разработчикам этой штуки)

Причина была в том что я указывал тег "Sum в формате с точкой, а нужно указывать значение в копейках. Получается что я передавал ему не верный формат, а он на него зачем то возвращал messageId, а должен по идее уже на том этапе начать на меня ругаться

@reinhurd
Copy link
Author

@rilax ну здорово, что разобрались. Да, у них есть такая фишка. Даже если запрос построен целиком неверно, они все равно вернут Id сообщения.
До декабря 20-го ранее сразу писали, что данные по чеку предоставлены некорректно или не в том формате, но теперь у них более непонятная система ошибок.

@vladimir-ko
Copy link

Как только не делал... на втором запросе ошибка "Произошла внутренняя ошибка"
код полностью скопировал, с данными

@reinhurd
Copy link
Author

@vladimir-ko а вы мастер токен вставили свой? запрос отправляете с одобренного ip?
Если прям нигде нет опечаток - пишите им в техподдержку, контур своего сервиса они пока еще не меняли.

@vladimir-ko
Copy link

@vladimir-ko а вы мастер токен вставили свой? запрос отправляете с одобренного ip?
Если прям нигде нет опечаток - пишите им в техподдержку, контур своего сервиса они пока еще не меняли.

Мастер токен вставил, тмп токен получаю. Код скопирован полностью. Скорее всего в ТП стучаться нужно.

@AntonK19
Copy link

А ни у кого не было вот такой ошибки ?

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
    <soap:Body>
        <GetMessageResponse xmlns="urn://x-artefacts-gnivc-ru/inplat/servin/OpenApiAsyncMessageConsumerService/types/1.0">
            <ProcessingStatus>COMPLETED</ProcessingStatus>
            <Message>
                <GetTicketResponse xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"
                    xmlns="urn://x-artefacts-gnivc-ru/ais3/kkt/KktTicketService/types/1.0">
                    <Result>
                        <Code>543</Code>
                        <Message>Внутренняя ошибка сервиса проверки фискального признака</Message>
                    </Result>
                </GetTicketResponse>
            </Message>
        </GetMessageResponse>
    </soap:Body>
</soap:Envelope>

Чек запрашиваю вот так

<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\"
                 xmlns:ns=\"urn://x-artefacts-gnivc-ru/inplat/servin/OpenApiAsyncMessageConsumerService/types/1.0\">
    <soapenv:Header/>
    <soapenv:Body>
        <ns:SendMessageRequest>
            <ns:Message>
                <tns:GetTicketRequest  xmlns:tns=\"urn://x-artefacts-gnivc-ru/ais3/kkt/KktTicketService/types/1.0\">
                    <tns:GetTicketInfo>
                        <tns:Sum>73400</tns:Sum>
                        <tns:Date>2021-03-28T15:13</tns:Date>
                        <tns:Fn>9280440300746022</tns:Fn>
                        <tns:TypeOperation>1</tns:TypeOperation>
                        <tns:FiscalDocumentId>36652</tns:FiscalDocumentId>
                        <tns:FiscalSign>665700876</tns:FiscalSign>
                    </tns:GetTicketInfo>
                </tns:GetTicketRequest>
            </ns:Message>
        </ns:SendMessageRequest>
    </soapenv:Body>
</soapenv:Envelope>

@reinhurd
Copy link
Author

@vell1903
Проверьте, корректно ли внесли все данные с чека для запроса. Иногда QR бывает нечеткий, и (если вы получаете все данные из него) может давать ошибочные цифры, если старая библиотека для распознавания.

Если все верно (и тип чека действительно 1) проверьте формат даты. Я всегда засылаю с секундами, у вас на примере их нет.

@AntonK19
Copy link

AntonK19 commented Mar 30, 2021

@reinhurd Да, дел оказалось в секундах. Спасибо

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment