Przykład wywołania REST API KSeF w Pythonie - dla tych co zaczynają
Cześć,
Widzę że sporo osób pyta o integracje z KSeF przez API, więc pomyślałam że wrzucę prosty przykład w Pythonie jak to wygląda w praktyce. U nas w biurze to programista zrobił cały system, ale jak testowałam środowisko demo to właśnie takim skryptem sprawdzałam podstawowe rzeczy.
**Logowanie do API:**
```python
import requests
import hashlib
import base64
url = "https://ksef-demo.mf.gov.pl/api/online/Session/InitSigned"
headers = {
"Content-Type": "application/json"
}
token = "twoj-token-autoryzacyjny" # z podpisu kwalifikowanego
data = {
"contextIdentifier": {
"type": "onip",
"identifier": "1234567890" # NIP
}
}
response = requests.post(url, json=data, headers=headers)
print(response.json())
```
To jest uproszczona wersja bo prawdziwe logowanie wymaga podpisu kwalifikowanego (InitSigned), ale żeby zrozumieć strukturę zapytań to wystarczy.
**Wysyłka faktury:**
Po zalogowaniu dostajemy SessionToken i wtedy można wysłać XML z fakturą:
```python
session_token = "twoj-session-token-z-logowania"
url = "https://ksef-demo.mf.gov.pl/api/online/Invoice/Send"
headers = {
"Content-Type": "application/xml",
"SessionToken": session_token
}
with open("faktura_FA2.xml", "rb") as f:
xml_data = f.read()
response = requests.put(url, data=xml_data, headers=headers)
print(response.json())
```
Oczywiście w produkcji to wszystko jest bardziej skomplikowane - obsługa błędów, retry, logowanie, ale zasada działania taka właśnie jest.
Największym problemem jest właściwie wygenerowanie poprawnego XMLa w schemacie FA(2) - API samo w sobie jest dość proste, REST jak REST. Polecam najpierw wrzucić kilka faktur ręcznie przez demo żeby zobaczyc jak system reaguje na błędy.
Mamy u siebie wrapper w Pythonie który to wszystko opakowuje + kolejkowanie zadań (bo jak masz 50 klientów to nie będziesz ręcznie wysyłał), ale to już temat na osobny wątek.
Jak ktoś ma konkretne pytania to chętnie pomogę w miarę możliwości.
5 odpowiedzi
Twoja odpowiedź
Zaloguj się, aby odpowiedzieć w tej dyskusji.