Nieprawidłowe żądanie w KSeF

0

Skrypt w PHP:

<?php

if ($_SERVER['REQUEST_METHOD'] == 'POST' && isset($_FILES['invoice']) && $_FILES['invoice']['error'] == UPLOAD_ERR_OK) {
    // Adres API KSeF (testowy)
    $ksefApiUrl = 'https://ksef-test.mf.gov.pl/api/v1/invoices';

    // Token KSeF (przykładowy, w rzeczywistości użyj swojego tokenu)
    $token = 'xxx';

    // Ścieżka do pliku tymczasowego
    $invoiceXmlPath = $_FILES['invoice']['tmp_name'];

    // Wczytanie zawartości pliku XML
    $invoiceData = file_get_contents($invoiceXmlPath);

    // Sprawdzenie, czy XML jest poprawny według schematu XSD
    libxml_use_internal_errors(true);
    $xml = new DOMDocument();
    $xml->loadXML($invoiceData);
    $xsdPath = 'https://magazyn.xxx.pl/schemas/Faktura_v2-0.xsd';
    if (!$xml->schemaValidate($xsdPath)) {
        echo "Plik XML jest niepoprawny według schematu XSD.<br>";
        foreach (libxml_get_errors() as $error) {
            echo htmlspecialchars($error->message) . "<br>";
        }
        exit;
    } else {
        echo "Plik XML jest poprawny według schematu XSD.<br>";
    }

    // Logowanie zawartości XML
    file_put_contents('invoice_log.xml', $invoiceData);

    // Inicjalizacja cURL
    $ch = curl_init();

    // Ustawienie opcji cURL
    curl_setopt($ch, CURLOPT_URL, $ksefApiUrl);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $invoiceData);
    curl_setopt($ch, CURLOPT_HTTPHEADER, [
        'Content-Type: application/xml',
        'Accept: application/json',
        'Authorization: Bearer ' . $token,
        'Cache-Control: no-cache',
        'Pragma: no-cache'
    ]);

    // Wykonanie żądania
    $response = curl_exec($ch);

    // Sprawdzenie błędów cURL
    if (curl_errno($ch)) {
        echo 'cURL error: ' . curl_error($ch);
    } else {
        // Odczytanie kodu odpowiedzi HTTP
        $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        if ($httpCode == 200) {
            echo "Faktura została pomyślnie wysłana do KSeF.<br>";
            echo "Odpowiedź z serwera: " . htmlspecialchars($response) . "<br>";
        } else {
            echo "Wystąpił błąd podczas wysyłania faktury do KSeF.<br>";
            echo "Status code: " . $httpCode . "<br>";
            echo "Odpowiedź z serwera: " . htmlspecialchars($response) . "<br>";

            // Logowanie odpowiedzi serwera dla celów diagnostycznych
            file_put_contents('error_log.txt', "Status code: $httpCode\nResponse: $response\n", FILE_APPEND);
        }
    }

    // Zamknięcie cURL
    curl_close($ch);
}
?>

<!DOCTYPE html>
<html lang="pl">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Upload Invoice for Validation</title>
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css">
</head>
<body>
    <div class="container">
        <h2 class="mt-4">Upload Invoice for Validation</h2>
        <form action="" method="post" enctype="multipart/form-data">
            <div class="form-group">
                <label for="invoice">Choose Invoice XML file:</label>
                <input type="file" class="form-control-file" id="invoice" name="invoice" required>
            </div>
            <button type="submit" class="btn btn-primary">Upload</button>
        </form>
    </div>
</body>
</html>

Dostaje:

Plik XML jest poprawny według schematu XSD.
Wystąpił błąd podczas wysyłania faktury do KSeF.
Status code: 400
Odpowiedź z serwera: {"exception":{"serviceCtx":"srvTEMFF","serviceCode":"0711A016-9DEB-41B0-9538-FB4A7E5DC52B","serviceName":"exception.handler","timestamp":"2024-06-07T12:23:10.759Z","exceptionDetailList":[{"exceptionCode":21180,"exceptionDescription":"Nieprawidłowe żądanie."}]}}
1

Jak robisz $invoiceData = file_get_contents($invoiceXmlPath);, to zakładam że tam jest XML?

A potem go wkładasz tutaj: curl_setopt($ch, CURLOPT_POSTFIELDS, $invoiceData);.

Opcja CURLOPT_POSTFIELDS przyjmuje słownik parametrów key-value:

  • albo jako tablica asocjacyjna, której klucze i wartości to pola POST
  • albo jako string (który chyba przekazujesz), ale ten string to musi być url-encoded string wartości.

Więc ja bym Ci proponował żebyś przekazał array, a nie string.

Pokaż najlepiej ten plik który próbujesz wysłać. Nie znam dokładnie API ksef, więc nie wiem dokładnie jakie pola trzeba dodać akurat pod to żądanie.

0
Riddle napisał(a):

Pokaż najlepiej ten plik który próbujesz wysłać. Nie znam dokładnie API ksef, więc nie wiem dokładnie jakie pola trzeba dodać akurat pod to żądanie.

<?xml version="1.0" encoding="UTF-8"?>
<Faktura xmlns="http://crd.gov.pl/wzor/2023/06/29/12648/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://crd.gov.pl/wzor/2023/06/29/12648/ Faktura_v2-0.xsd">
  <Naglowek>
    <KodFormularza kodSystemowy="FA (2)" wersjaSchemy="1-0E">FA</KodFormularza>
    <WariantFormularza>2</WariantFormularza>
    <DataWytworzeniaFa>2024-06-07T13:04:37</DataWytworzeniaFa>
    <SystemInfo>Magnet</SystemInfo>
  </Naglowek>
  <Podmiot1>
    <DaneIdentyfikacyjne>
      <NIP>5771876945</NIP>
      <Nazwa>xxx</Nazwa>
    </DaneIdentyfikacyjne>
    <Adres>
      <KodKraju>PL</KodKraju>
      <AdresL1>ul. xxx 17</AdresL1>
      <AdresL2>42-000 xxxx<AdresL2>
    </Adres>
  </Podmiot1>
  <Podmiot2>
    <DaneIdentyfikacyjne>
      <NIP>7010796111</NIP>
      <Nazwa>xxxx</Nazwa>
    </DaneIdentyfikacyjne>
    <Adres>
      <KodKraju>PL</KodKraju>
      <AdresL1>Ul. ALEJE JEROZOLIMSKIE 43</AdresL1>
      <AdresL2>02-001 WARSZAWA</AdresL2>
    </Adres>
  </Podmiot2>
  <Fa>
    <KodWaluty>PLN</KodWaluty>
    <P_1>2024-06-06</P_1>
    <P_2>119/06/2024</P_2>
    <P_13_1>14.5</P_13_1>
    <P_14_1>2.71</P_14_1>
    <P_15>17.21</P_15> 
    <WierszeFaktur>
      <WierszFaktury>
        <NrWierszaFa>1</NrWierszaFa>
        <P_7>CD-R HP 700 MB x52</P_7>
        <P_8A>10</P_8A>
        <P_8B>szt.</P_8B>
        <P_9A>11.79</P_9A>
        <P_11>11.79</P_11>
        <P_12>23</P_12>
        <P_14A>14.5</P_14A>
      </WierszFaktury>
    </WierszeFaktur>
  </Fa>
</Faktura>
0

Znajdź dokumentację tego endpointa pod który strzelasz, i wrzuć tu link.

0
Riddle napisał(a):

Znajdź dokumentację tego endpointa pod który strzelasz, i wrzuć tu link.

No właśnie nic nie ma po za :https://ksef-test.mf.gov.pl/

0
xoree napisał(a):
Riddle napisał(a):

Znajdź dokumentację tego endpointa pod który strzelasz, i wrzuć tu link.

No właśnie nic nie ma po za :https://ksef-test.mf.gov.pl/

To skąd wziąłeś to?

$ksefApiUrl = 'https://ksef-test.mf.gov.pl/api/v1/invoices';
0
Riddle napisał(a):
xoree napisał(a):
Riddle napisał(a):

Znajdź dokumentację tego endpointa pod który strzelasz, i wrzuć tu link.

No właśnie nic nie ma po za :https://ksef-test.mf.gov.pl/

To skąd wziąłeś to?

$ksefApiUrl = 'https://ksef-test.mf.gov.pl/api/v1/invoices';

Podany był przykładowy adres API dla środowiska testowego (gdzieś w necie) ogólnie błędy zwraca poprawnie np. exceptionCode 21180 bo były też inne ale rozwiązałem z nimi problem.
Pytanie jest jeszcze inne czy token jest jedna dla wszystkich api czy do testów trzeba mieć inne.

0

A czy w tym przykładzie był przykład body zadania post? Jeśli tak, to wklej tutaj.

0
Riddle napisał(a):

A czy w tym przykładzie był przykład body zadania post? Jeśli tak, to wklej tutaj.

Odpowiedź z serwera: [Odpowiedź serwera w formacie JSON]

A może ktoś zna inny testowy Endpoint ?

1

Jedna moja uwaga. Skoro mogą zaorać tą wersję KSEF lub w ogóle z tego systemu zrezygnować, czemu ma służyć integracja? Bo z tego co mówią media ta wersja była na tyle wadliwa, że na pewno nie będą jej wprowadzać. Tym samym nie ma jasnej dokumentacji integracji. Jak masz zgadywać endpointy to cała ta zabawa nie ma sensu.
Podstawowa dokumentacja musi być.
Może to średnio pomocny technicznie post, ale moim zdaniem musisz to brać pod uwagę.

0
jurek1980 napisał(a):

Jedna moja uwaga. Skoro mogą zaorać tą wersję KSEF lub w ogóle z tego systemu zrezygnować, czemu ma służyć integracja? Bo z tego co mówią media ta wersja była na tyle wadliwa, że na pewno nie będą jej wprowadzać. Tym samym nie ma jasnej dokumentacji integracji. Jak masz zgadywać endpointy to cała ta zabawa nie ma sensu.
Podstawowa dokumentacja musi być.
Może to średnio pomocny technicznie post, ale moim zdaniem musisz to brać pod uwagę.

To informacja ważna, bo jeśli będzie nowa wersja to prace wstrzymuje.

1

Pierwszy artykuł z brzegu https://grantthornton.pl/publikacja/mf-ksef-niewejdzie-w-zycie-1-lipca-2024-r/
W innych jest większa krytyka i jeszcze późniejsze daty lub w ogóle info o rezygnacji z tego systemu. Poczytaj.

0
jurek1980 napisał(a):

Pierwszy artykuł z brzegu https://grantthornton.pl/publikacja/mf-ksef-niewejdzie-w-zycie-1-lipca-2024-r/
W innych jest większa krytyka i jeszcze późniejsze daty lub w ogóle info o rezygnacji z tego systemu. Poczytaj.

Wiesz to ze nie wejdzie w lipcu to ja wiem, bo ma wejść (duże firmy) 01.02.2026 (a male firmy) kwiecień 2026 ale nie wiedziałem ze API będzie nowe ....

1 użytkowników online, w tym zalogowanych: 0, gości: 1