fakturoid / fakturoid-php

Fakturoid PHP bindings
https://www.fakturoid.cz/api
MIT License
30 stars 16 forks source link

Nepochopitelný HTTP CODE 500 #30

Closed Javorxdd closed 11 months ago

Javorxdd commented 11 months ago

Zdravím,

po vytvoření faktury jakožto: pay_proforma dostávám nepochopitelný kód 500, ikdyž je faktura vytvořená a přijde mi do mailu. Chyba: [error] 26#26: *1764 FastCGI sent in stderr: "PHP message: PHP Fatal error: Uncaught Fakturoid\Exception: {"errors":{"event":"pay_proforma cannot be fired"}}

edariedl commented 11 months ago

@Javorxdd Dobrý den, odpověď 422 Unprocessable entity s tuto chybouvou hláškou API typicky vrací, když není možné danou akci vykonat nad daným dokladem, například protože je zálohovka už zaplacená, nebo se nejedná o zálohovku.

Pošlete prosím detaily na podpora@fakturoid.cz - zejména o jaký konkrétní účet a doklad se jednalo - na základě těchto infomrací by mělo být možné zjistit, pro API vrátilo právě tuto odpověď.

Javorxdd commented 11 months ago

@edariedl Dobrý den,

poprosím Vás, aby jste si znovu přečetl nadpis a text toho vlákna. Tímto se tak vyhneme možné budoucí hádce. Nic o 422 Unprocessable entity nevím.

edariedl commented 11 months ago

@Javorxdd Dobrý den,

omlouvám se za nedostatečné vysvětlení.

Před odpovědí jsem prověřoval logy i zdrojové kódy Fakturoidu. Logy neukazovaly žádný status kód 500 Internal serve error při volání invoices/id/fire.json?event=pay_proforma. Stejně tak podle zdrojových kódů Fakturoid neumí vrátit tělo odpovědi {"errors":{"event":"pay_proforma cannot be fired"}} a zároveň status kód 500 Internal server error. S touto chybou se vždy vrací status kód 422 Unprocessable entity. Neevidujeme ani žádné produkční výjimky z volání pay_proforma.

PHP knihovna vyhodí výjimku Fakturoid\Exception vždy když se z API vrátí status kód 400 a vyšší. Proto jsem předpokládal, že šlo u status kódu spíš o přehlédnutí. Za to se omlouvám.

Pro důkladnější prověření opravdu potřebujeme, abyste nám napsal na podpora@fakturoid.cz s detaily o jaký doklad se jednalo a kdy přesně se požadavek posílal. Bez toho není možné prověřit co přesně se stalo.

Javorxdd commented 11 months ago

Již jsem posílal error paní do chatu, když jsem s ní něco řešil. Tato chyba se mi ukázala vždy, když jsem vytvářel fakturu ve stylu: „pay_proforma.“

Zde přikládám error z konzole:

2023/12/15 14:17:37 [error] 32#32: *3479 FastCGI sent in stderr: "PHP message: PHP Fatal error: Uncaught Fakturoid\Exception: {"errors":{"event":"pay_proforma cannot be fired"}} in /home/container/webroot/vendor/fakturoid/fakturoid-php/lib/Fakturoid/Request.php:93 Stack trace:

0 /home/container/webroot/vendor/fakturoid/fakturoid-php/lib/Fakturoid/Requester.php(11): Fakturoid\Request->run()

1 /home/container/webroot/vendor/fakturoid/fakturoid-php/lib/Fakturoid/Client.php(436): Fakturoid\Requester->run()

2 /home/container/webroot/vendor/fakturoid/fakturoid-php/lib/Fakturoid/Client.php(360): Fakturoid\Client->run()

3 /home/container/webroot/vendor/fakturoid/fakturoid-php/lib/Fakturoid/Client.php(97): Fakturoid\Client->post()

4 /home/container/webroot/charge.php(102): Fakturoid\Client->fireInvoice()

edariedl commented 11 months ago

Tato výjimka je naprosto v pořádku objeví se vždy, když server vráti 4xx nebo 5xx status kód. Důležité je, co uvidíte, pokud ji odchytíte přes try ... catch

try {
    $subject = $f->createSubject(array('name' => '', 'email' => 'aloha@pokus.cz'));
} catch (Fakturoid\Exception $e) {
    $e->getCode(); // 422
    $e->getMessage(); // '{"errors":{"name":["je povinná položka","je příliš krátký/á/é (min. 2 znaků)"]}}'
}

Tyto výjimky tak při implemetnaci PHP knihovny musíte odchytávat a zpracovávat. Samotný stacktrace pro tuto výjimky není důležitý. Pro nalezení chyby musíme vědět o jaký endpoint šlo, případně jaká data se odesílala, o jaké konkrétní se jednalo doklady a tak podobně.


Dohledal jsem si konverzaci z dnešní podpory a na základě účtu prověřil, proč tuto odpověď ze serveru dostáváte.

pay_proforma je možné volat pouze na faktury, které mají proforma=true, pokud toto neplatí, API vrátí 422 a v těle vrátí chybu, kterou jste popsal výše. Prověřil jsem konkrétně Vaši situaci a problém je v tom, že faktura, na kterou pay_proforma volate není proforma. Zkuste místo pay_proforma použít obyčejné pay, to by to mělo vyřešit.

Dejte prosím vědět, jestli se to povedlo.

Javorxdd commented 11 months ago

A bude ta faktura při použití atributu „pay“ vytvořená jako zaplacená, nebo ne?

edariedl commented 11 months ago

Vytvoření a zaplacení faktury jsou vždy 2 API požadavky:

  1. Vytvoříte fakturu přes POST /api/v3/accounts/{slug}/invoices.json
  2. Nově vytvořenou fakturu zaplatíte přes /api/v3/accounts/{slug}/invoices/{id}/fire.json?event=pay
Javorxdd commented 11 months ago

Já bych ji právě potřeboval vytvořit. Zaplacenou posílám jinak.

edariedl commented 11 months ago

S tím prosím napište na podpora@fakturoid.cz a popište, čeho se snažíte dosáhnout a přidat i kontext proč ať Vám můžeme poradit přímo pro Vaši konkrétní situaci.