Download the PHP package tillio-crm/api without Composer

On this page you can find all versions of the php package tillio-crm/api. It is possible to download/install these versions without Composer. Possible dependencies are resolved automatically.

FAQ

After the download, you have to make one include require_once('vendor/autoload.php');. After that you have to import the classes with use statements.

Example:
If you use only one package a project is not needed. But if you use more then one package, without a project it is not possible to import the classes with use statements.

In general, it is recommended to use always a project to download your libraries. In an application normally there is more than one library needed.
Some PHP packages are not free to download and because of that hosted in private repositories. In this case some credentials are needed to access such packages. Please use the auth.json textarea to insert credentials, if a package is coming from a private repository. You can look here for more information.

  • Some hosting areas are not accessible by a terminal or SSH. Then it is not possible to use Composer.
  • To use Composer is sometimes complicated. Especially for beginners.
  • Composer needs much resources. Sometimes they are not available on a simple webspace.
  • If you are using private repositories you don't need to share your credentials. You can set up everything on our site and then you provide a simple download link to your team member.
  • Simplify your Composer build process. Use our own command line tool to download the vendor folder as binary. This makes your build process faster and you don't need to expose your credentials for private repositories.
Please rate this library. Is it a good library?

Informations about the package api

tillio-crm/api

Oficjalne SDK PHP dla Tillio API v2 - pełnego REST-owego API systemu Tillio CRM. Pokrywa 100% tras API (pilnowane testem kontraktowym), każda encja ma typowane DTO z named arguments, a znane pułapki kontraktu (ciche duplikaty, gubione strony, jednorazowe hasła) są zneutralizowane w kodzie, zanim żądanie w ogóle wyjdzie.

Latest Version Total Downloads PHP Version


Spis treści


Wymagania

Instalacja

Szybki start

Tryb bezpośredni (klucz API)

Dla skryptów, integracji własnych i narzędzi wewnętrznych - masz klucz API tenanta (ten sam, co w API v1, format nazwa:klucz) i tożsamość instancji:

Tryb proxy (aplikacje marketplace)

Aplikacja marketplace nie ma i nie może mieć klucza do CRM - woła platformę własnym tokenem, a platforma dokłada sekret tenanta. Token podajesz jako string albo callable wywoływane przy każdym żądaniu (odświeżanie tokenu działa wtedy samo):

Tryb wybiera konfiguracja: dokładnie jeden z apiKey/accessToken - brak lub oba naraz to ConfigurationException już w konstruktorze. Klasy zasobów są identyczne w obu trybach i nie wiedzą, którym działają.

whoami() zwraca 401 mimo poprawnego klucza? Jeśli łączysz się z adresem hostującym wiele instancji CRM (typowo środowiska deweloperskie), podaj instanceName - nazwę instancji (nagłówek X-Instance-Name). Bez niego żądanie trafia na instancję DOMYŚLNĄ serwera, a klucz innej instancji nie pasuje. Produkcyjny adres z jedną instancją per domena tego nie wymaga.

Zasoby

Każdy zasób to jawna metoda fasady (IDE i analiza statyczna widzą typy):

Metoda fasady Zakres Przykłady
contractors() kartoteki kontrahentów + adresy + upsert docs/examples/contractors.md
contacts() osoby kontaktowe + upsert docs/examples/contacts.md
products() produkty docs/examples/products.md
productGroups() grupy produktów (drzewo) docs/examples/product-groups.md
warehouses() magazyny docs/examples/warehouses.md
stocks() stany magazynowe (para magazyn/produkt) docs/examples/stocks.md
orders() zamówienia z pozycjami docs/examples/orders.md
notes() notatki + załączniki + szablony docs/examples/notes.md
tickets() zgłoszenia + wątki wiadomości docs/examples/tickets.md
leads() leady docs/examples/leads.md
tasks() zadania + komentarze + załączniki + szablony docs/examples/tasks.md
projects() projekty docs/examples/projects.md
pipelineItems() szanse sprzedaży (pozycje lejków) docs/examples/pipeline-items.md
services() usługi u kontrahentów docs/examples/services.md
serviceCatalog() katalog usług + grupy docs/examples/service-catalog.md
users() użytkownicy systemowi (hasło startowe!) docs/examples/users.md
dictionaries() wszystkie słowniki, procesy, lejki docs/examples/dictionaries.md
customFields() definicje pól niestandardowych + pliki pól FILE docs/examples/custom-fields.md
dms() repozytorium plików kontrahenta docs/examples/dms.md
generatedDocuments() generator dokumentów docs/examples/generated-documents.md
mail() wysyłka maili, szablony, załączniki docs/examples/mail.md
wiki() baza wiedzy (bazy, kategorie, wpisy) docs/examples/wiki.md
calendars() kalendarze + wydarzenia (API >= 2.2.0) docs/examples/calendars.md
phoneCalls() połączenia telefoniczne (API >= 2.10.0) docs/.ai/phone-calls/
textMessages() wiadomości SMS (API >= 2.10.0) docs/.ai/text-messages/
lookup() kto dzwoni i kto pisze: szukanie po numerze (API >= 2.10.0) i po adresie e-mail (API >= 2.15.0) docs/.ai/lookup/
integrations() konfiguracja Tillio Calls (API >= 2.11.0) docs/.ai/integrations/

Systemowe na fasadzie: health(), whoami(), selfcheck(), openapi(), modules() - docs/examples/systemowe.md.

Fasada udostępnia też warstwę surową - przydatną w nietypowych scenariuszach i wtedy, gdy Twoja instancja API ma trasę nowszą niż to wydanie SDK: get()/post()/put()/delete() (dowolna ścieżka v2/..., z retry i limiterem), postMultipart() (upload plików, domyślnie bez retry), listPage() i iterateAll() (surowe strony i pełne przebiegi) oraz download() (pobranie pliku spod podpisanego downloadUrl).

Odczyt: strony i pełne przebiegi

Listy zwracają Page<T> z typowanymi DTO i metadanymi stronicowania:

Do pełnych przebiegów służy generator iterate() - przechodzi wszystkie strony, oddając rekordy po jednym:

Filtry dokładne po liczbie całkowitej (id, contractorId, leadId, ownerUserId i pozostałe *Id na każdej liście) przyjmują od API 2.17.0 listę do 100 wartości - podajesz tablicę, SDK skleja ją do ?id=12,15,18. Tak sprawdzisz paczkę znanych rekordów jednym zapytaniem, a id nieobecne w odpowiedzi oznacza rekord usunięty w CRM (leady i szanse CRM kasuje bez śladu - innego sposobu na wykrycie usunięcia nie ma):

Pustą listę, więcej niż 100 wartości i element, który nie jest liczbą całkowitą (albo tekstem bez przecinka), SDK odrzuca InvalidFilterException, zanim żądanie wyjdzie - pusta lista bez filtra zwróciłaby wszystkie rekordy.

iterate() domyślnie wymusza sort=id - i to nie jest kosmetyka. API stronicuje przez LIMIT/OFFSET z domyślnym sortowaniem po dacie modyfikacji, czyli kolumnie, która ZMIENIA SIĘ w trakcie przebiegu: rekord zmodyfikowany między stronami wypada z niepobranego zakresu (cicha utrata) albo wraca drugi raz. id jest unikalne i niezmienne, więc tylko ono daje porządek, którego nic nie przestawi. Jawne sort w filtrach wygrywa z wymuszeniem; stany magazynowe (bez sortowalnego id) nie wymuszają niczego same z siebie.

Każde DTO odczytu ma pełny, surowy rekord w $raw / toArray() - pola dodane w nowszych wydaniach API nie giną i nie wywracają SDK. Kwoty są stringami dziesiętnymi ("1999.90") - rzutowanie na float gubi grosze, więc SDK tego nie robi za Ciebie.

Zapis: DTO, duplikaty, upsert

Input-DTO z named arguments; null znaczy "nie wysyłaj pola":

Kluczowe zachowania:

Obsługa błędów

API zawsze zwraca prawdziwy status HTTP i typowany kontrakt błędu {field, code, message} - SDK zamienia go na hierarchię wyjątków (wspólny przodek TillioApiException):

Wyjątek Kiedy Co robić
ValidationException (400/422) złe query / złe body, errors z kompletem powodów popraw rekord, leć dalej
FieldUnavailableException instancja CRM bez kolumny (stan przejściowy) zaktualizuj CRM, nie dane
ExternalIdAlreadyUsedException klucz integracji zajęty przez inną kartotekę konflikt do rozstrzygnięcia przez człowieka
AuthenticationException (401) zły klucz/tenant przerwij przebieg, popraw konfigurację
AccessDeniedException (403) brak uprawnień klucza nadaj uprawnienia w CRM
TenantBlockedException (403) instancja zablokowana zgłoś operatorowi
NotFoundException (404) nie ma rekordu o tym id mapowanie id nieaktualne
UserLimitReachedException (409) brak wolnej licencji na konto stan biznesowy - nie ponawiaj
RateLimitException (429) limit po stronie API SDK ponawia sam; niesie retryAfterSeconds
MaintenanceException (503) przerwa serwisowa wróć przy następnym harmonogramie
ServiceUnavailableException (503) funkcja niedostępna w tej instancji (np. brak modułu kalendarza) włącz moduł w CRM - retry nic nie da
FeatureNotSupportedException (501) trasa istnieje, ale CRM tej instalacji jest za stary na tę funkcję zaktualizuj CRM - retry nic nie da
ServerException (5xx) awaria API/CRM SDK ponawia sam
ProxyAccessDeniedException platforma nie zezwala apce na tę operację popraw manifest apki, nie klucz
TransportException żądanie w ogóle nie dojechało SDK ponawia sam

Kolejność catchów ma znaczenie: FieldUnavailableException i ExternalIdAlreadyUsedException dziedziczą po ValidationException - łap je PRZED nią, jeżeli chcesz je obsłużyć osobno.

Retry i limity żądań

Wbudowane, bez konfiguracji:

Wszystko jest konfigurowalne - konsument pracujący w krótkich porcjach ustawia krótkie sufity (lepiej oddać porcję i wrócić), skrypt wsadowy może czekać dłużej:

Pliki: upload i pobieranie

Upload (DMS, załączniki notatek/zadań, załączniki maili) idzie WYŁĄCZNIE przez multipart/form-data - w API nie ma wariantu JSON. SDK ogarnia to typem FileUpload:

Pobieranie: API nigdy nie zwraca binariów. Metadane pliku niosą downloadUrl - podpisany link do storage'u ważny około 1 minuty, pobierany bez nagłówków Tillio:

Nie buforuj linku; po wygaśnięciu odczytaj metadane ponownie. downloadUrl null znaczy "środowisko bez podpisywania", nie "brak pliku". Dokumenty DMS adresuje się WYŁĄCZNIE stringowym publicId - pole id to referencja CRM, która w ścieżce nie działa.

Ograniczenia trybu proxy

Konfiguracja - wszystkie klucze

Klucz Tryb Opis (domyślna)
apiKey bezpośredni klucz nazwa:klucz tenanta
tenantDomain, tenantId bezpośredni tożsamość instancji (nagłówki tenanta)
instanceName bezpośredni nazwa instancji CRM na serwerze wieloinstancyjnym (nagłówek X-Instance-Name); pomijasz na produkcji z jedną instancją per adres
accessToken proxy string albo callable(): string, rozwiązywane per żądanie
connector proxy publiczny id połączenia CRM przy >1
server oba adres serwera (prod per tryb)
timeout / connectTimeout oba sekundy (30 / 10)
caFile oba ścieżka do CA bundle (CURLOPT_CAINFO) - dla środowisk bez curl.cainfo, np. PHP CLI na Windows; weryfikacji TLS nie da się wyłączyć
rateLimits oba okna limitera [sekundy => maks. żądań]; [] = wyłączony
maxAttempts oba łączna liczba prób żądania (4)
retryBaseDelay / retryMaxDelay oba backoff wykładniczy [s] (0.5 / 30)
maxRetryAfter oba sufit dla Retry-After [s] (60)
transport / clock oba wstrzykiwane w testach

Nieznany klucz konfiguracji = ConfigurationException (literówka nie może po cichu zamienić się w żądania bez nagłówka).

Przykłady i integracja przez AI

Integrujesz przez asystenta AI (Claude, Cursor, Copilot)? Wskaż mu katalog docs/.ai/. Zaczyna się od ai_integration.md (wspólne wzorce: jak rozwiązywać osoby i słowniki na id, obsługa błędów, dwa tryby auth), a playbooki domenowe (tasks/, contractors/, notes/) pokazują krok po kroku, jak zamienić polecenie w języku naturalnym na wywołania SDK - tak, żeby "dodaj zadanie dla czterech osób z zespołu" zadziałało bez zgadywania id.

Testy

Zestaw zawiera test kontraktowy (RouteCoverageTest - każda z 243 tras mapy wskazuje istniejącą metodę SDK; pełne porównanie 1:1 ze specyfikacją instancji włączysz, pobierając GET /v2/openapi.json i ustawiając TILLIO_OPENAPI_FILE) oraz test przenośności (zero zależności spoza TillioCrm\Api w src/).

Wersjonowanie

Semver, start 0.1.0; przed 1.0.0 zmiany łamiące = minor. Historia: CHANGELOG.md. Wersję instancji API sprawdzisz przez $client->health()['version'], a jej pełny kontrakt przez $client->openapi().

Troubleshooting

Każde żądanie HTTPS pada: SSL certificate problem

PHP CLI (typowo na Windows) nie ma skonfigurowanego curl.cainfo. Wskaż plik CA bundle w konfiguracji: 'caFile' => 'C:/Program Files/Git/mingw64/etc/ssl/certs/ca-bundle.crt'. Weryfikacji TLS nie da się wyłączyć przez SDK - można tylko podać właściwy zestaw zaufanych CA.

ValidationException (400) na liście, choć filtr wygląda dobrze

API v2 odrzuca NIEZNANY parametr zapytania błędem 400 (literówka w filtrze nie zwróci po cichu całej bazy). Sprawdź nazwę filtra w PHPDoc metody list() danego zasobu - dokumentuje komplet filtrów wg kontraktu.

IncompleteDuplicateCheckException przed wysłaniem żądania

To strażnik SDK, nie błąd API: duplicateCheck wskazuje pole, które nie ma wartości w payloadzie. API pominęłoby taki warunek z samym ostrzeżeniem i mogłoby założyć duplikat - uzupełnij wartość pola albo zdejmij je z duplicateCheck.

403 w trybie proxy: ProxyAccessDeniedException czy AccessDeniedException?

ProxyAccessDeniedException = platforma nie zezwala aplikacji na tę operację (popraw manifest apki). AccessDeniedException = klucz API nie ma uprawnień w CRM (nadaj je w panelu). To dwa różne miejsca naprawy.

ServiceUnavailableException (503) na kalendarzach albo szablonach

Moduł jest wyłączony w planie tej instancji - to nie chwilowa awaria i SDK tego nie ponawia. Sprawdź $client->modules(), zanim zaczniesz pisać w dany moduł.

Pełny przebieg (iterate()) gubi albo dubluje rekordy

Nie nadpisuj wymuszonego sort=id własnym sort w filtrach przy pełnym przejściu - sortowanie po zmiennej kolumnie (np. dacie modyfikacji) przestawia rekordy między stronami. Zostaw domyślne sort=id.

Wsparcie

Licencja

MIT © Tillio CRM


All versions of api with dependencies

PHP Build Version
Package Version
Requires php Version ^8.3
ext-curl Version *
ext-json Version *
Composer command for our command line client (download client) This client runs in each environment. You don't need a specific PHP version etc. The first 20 API calls are free. Standard composer command

The package tillio-crm/api contains the following files

Loading the files please wait ...