Ifirma.pl - API

Udało się komuś podpisać poprawnie zapytanie do ifirmy? I jeżeli tak, to może posiada kod rubiego, który działa? (ewentualnie może być curl)

Ja w tym momencie mam coś takiego i dostaję, że nagłówek autoryzacji jest błędny: https://github.com/drogus/ifirma-api/blob/master/lib/ifirma/auth_middleware.rb#L18

Alternatywnie podobnie curlem:

[code]BODY=’[{“a”:“b”}]’
KEY_TYPE=faktura
USER="drogus@gmail.com"
URI=https://ifirma.pl/iapi/fakturakraj.json
KEY=…klucz-do-api…
MESSAGE_HASH=echo -n $URI$USER$KEY_TYPE$BODY | openssl dgst -sha1 -hmac $KEY

curl -H “Accept: application/json” -H “Content-Type: application/json”
-H “Authentication: IAPIS user=$USER, hmac-sha1=$MESSAGE_HASH” -X POST -d $BODY $URI[/code]
Rezultat:

{"response":{"Kod":403,"Informacja":"Niepoprawny hash przesyłanej wiadomości."}}

Nie mówię już o tym, że odpowiedzi z błędami są wysyłane jako 200 OK, a status jest w body. HTTP spec FTW :wink:

hmm, nie próbowałeś kontaktować się z biurem obsługi klienta? Może będą mogli pomóc;)

Próbowałem, na razie nie ma odpowiedzi. Stwierdziłem, że jeżeli ktoś to już u siebie rozwiązał, to będzie szybciej.

  1. Sprawdzałeś działanie kodu z http://www.ifirma.pl/api/przyklad_api.zip ?

  2. Może brakuje w nagłówku żądania “Content-type” wartości charset=UTF-8 ?

Dlaczego dostaję komunikat o niepoprawnym hashu przesłanej wiadomości?
Przyczyną może być złe obliczanie funkcji hash w przypadku gdy użyto niepoprawnego kodowania
polskich znaków. Polskie znaki powinny być zakodowane zgodnie z UTF-8.

Przeoczyłem to, dzięki.

Nie wysyłam żadnych znaków UTF-8, dodanie charsetu niestety nie pomaga.

@marr: dzięki za naprowadzenie.

Okazuje się, że sama zabawa w szyfrowanie nie wystarczy, trzeba jeszcze wygenerowany klucz zamienić w ten sposób, że każde 2 kolejne znaki traktujemy jako liczbę heksadecymalną, zamieniamy na system dziesiątkowy i wstawiamy odpowiadający znak ASCII. Później to samo tylko, że w drugą stronę.

[code]# klucz traktujemy w ten sposób
key.to_s.scan(/…/).map { |hex| hex.to_i(16).chr }.join("")

a hmac-sha1 mielimy tak:

hmac.each_byte.map { |a| a.to_s(16) }.join("")[/code]
Czy ktoś jest mi w stanie wytłumaczyć jaki to ma sens? Bo może czegoś nie widzę.

I druga sprawa, ifirma ma jedno z gorszych API jakie do tej pory widziałem, a dokumentacja jest biedna, jedyne co nawiązuje do tego problemu, to: “HashWiadomosci powinien być zapisany w postaci heksadecymalnej.”. Rozumiem, że niektórzy lubią sobie pogrzebać w kodzie pehapa i wyczaić jak to właściwie powinno działać, ale ja znam inne sposoby na spędzanie czasu.

Dla potomnych, jakby ktoś to musiał jeszcze implementować, trochę się pomyliłem z tym co trzeba zrobić po szyfrowaniu, nie sprawdziłem jak dokładnie działa pehapowa funkcja bin2hex - to co podałem wyżej działa tylko dla niektórych przypadków, odpowiednik w ruby można uzyskać tak: https://github.com/drogus/ifirma-api/blob/master/lib/ifirma/auth_middleware.rb#L34