{"id":15023770,"url":"https://github.com/livevasiliy/amocrm-api-php","last_synced_at":"2025-10-03T22:31:07.439Z","repository":{"id":62518083,"uuid":"466117171","full_name":"livevasiliy/amocrm-api-php","owner":"livevasiliy","description":"Downgrade версия библиотеки на PHP 5.6 для работы с API amoCRM","archived":false,"fork":true,"pushed_at":"2022-03-07T20:57:53.000Z","size":1264,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2024-12-05T20:48:13.602Z","etag":null,"topics":["amocrm","amocrm-api","amocrm-php","php56"],"latest_commit_sha":null,"homepage":"","language":"PHP","has_issues":false,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":"amocrm/amocrm-api-php","license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/livevasiliy.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2022-03-04T12:36:44.000Z","updated_at":"2022-03-07T20:48:00.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/livevasiliy/amocrm-api-php","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/livevasiliy%2Famocrm-api-php","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/livevasiliy%2Famocrm-api-php/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/livevasiliy%2Famocrm-api-php/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/livevasiliy%2Famocrm-api-php/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/livevasiliy","download_url":"https://codeload.github.com/livevasiliy/amocrm-api-php/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":235198510,"owners_count":18951503,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["amocrm","amocrm-api","amocrm-php","php56"],"created_at":"2024-09-24T19:59:25.337Z","updated_at":"2025-10-03T22:31:06.957Z","avatar_url":"https://github.com/livevasiliy.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"![amoCRM API Library](.github/logo.png?raw=true)\n\n# amoCRM API Library\n\n[![Latest Version](https://img.shields.io/github/release/amocrm/amocrm-api-php)](https://github.com/amocrm/amocrm-api-php/releases)\n[![Build Status](https://img.shields.io/travis/amocrm/amocrm-api-php)](https://travis-ci.org/github/amocrm/amocrm-api-php/)\n[![Total Downloads](https://img.shields.io/packagist/dt/amocrm/amocrm-api-library.svg)](https://packagist.org/packages/amocrm/amocrm-api-library)\n\n## Данный репозитории является форком официальным для старых версии PHP\n\n## Если вы работаете с более новыми версиями, пожалуйста, используйте [официальный репозиторий](https://github.com/amocrm/amocrm-api-php) \n\nВ данном пакете представлен API клиент с поддержкой основных сущностей и авторизацией по протоколу OAuth 2.0 в amoCRM. \nДля работы библиотеки требуется PHP версии не ниже 5.6.\n\n## Оглавление\n- [Установка](#установка)\n- [Начало работы](#начало-работы-и-авторизация)\n- [Подход к работе с библиотекой](#подход-к-работе-с-библиотекой)\n- [Поддерживаемые методы и сервисы](#поддерживаемые-методы-и-сервисы)\n- [Обработка ошибок](#обработка-ошибок)\n- [Фильтры](#Фильтры)\n- [Работа с Custom Fields сущностей](#работа-с-дополнительными-полями-сущностей)\n- [Работа с тегами сущностей](#работа-с-тегами-сущностей)\n- [Особенности работы с источниками](#особенности-работы-с-источниками)\n- [Константы](#константы)\n- [Работа в случае смены субдомена аккаунта](#Работа-в-случае-смены-субдомена-аккаунта)\n- [Одноразовые токены интеграций, расшифровка](#одноразовые-токены-интеграций-расшифровка)\n- [Примеры](#примеры)\n\n## Установка\n\nУстановить библиотеку можно с помощью composer:\n\n```\ncomposer require livevasiliy/amocrm-api-library\n```\n\n## Начало работы и авторизация\n\nДля начала использования вам необходимо создать объект библиотеки:\n```php\n$apiClient = new \\AmoCRM\\Client\\AmoCRMApiClient($clientId, $clientSecret, $redirectUri);\n```\n\nТакже предоставляется фабрика для создания объектов `\\AmoCRM\\Client\\AmoCRMApiClientFactory`.\nДля ее использования вам нужно реализовать интерфейс `\\AmoCRM\\OAuth\\OAuthConfigInterface` и `\\AmoCRM\\OAuth\\OAuthServiceInterface`\n\n```php\n$apiClientFactory = new \\AmoCRM\\Client\\AmoCRMApiClientFactory($oAuthConfig, $oAuthService);\n$apiClient = $apiClientFactory-\u003emake();\n```\n\nПри использовании фабрики вам не нужно устанавливать callback onAccessTokenRefresh, при обновлении токена будет вызван метод saveOAuthToken из $oAuthService (\\AmoCRM\\OAuth\\OAuthServiceInterface).\n\nЗатем необходимо создать объект (`\\League\\OAuth2\\Client\\Token\\AccessToken`) Access токена из вашего хранилища токенов и установить его в API клиент.\n\nТакже необходимо установить домен аккаунта amoCRM в виде СУБДОМЕН.amocrm.(ru/com).\n\nВы можете установить функцию-callback на событие обновления Access токена, если хотите дополнительно обрабатывать новый токен (например сохранять его в хранилище токенов):\n```php\n$apiClient-\u003esetAccessToken($accessToken)\n        -\u003esetAccountBaseDomain($accessToken-\u003egetValues()['baseDomain'])\n        -\u003eonAccessTokenRefresh(\n            function (\\League\\OAuth2\\Client\\Token\\AccessTokenInterface $accessToken, string $baseDomain) {\n                saveToken(\n                    [\n                        'accessToken' =\u003e $accessToken-\u003egetToken(),\n                        'refreshToken' =\u003e $accessToken-\u003egetRefreshToken(),\n                        'expires' =\u003e $accessToken-\u003egetExpires(),\n                        'baseDomain' =\u003e $baseDomain,\n                    ]\n                );\n            });\n```\n\nОтправить пользователя на страницу авторизации можно 2мя способами:\n1. Отрисовав кнопку на сайт:\n```php\n$apiClient-\u003egetOAuthClient()-\u003egetOAuthButton(\n            [\n                'title' =\u003e 'Установить интеграцию',\n                'compact' =\u003e true,\n                'class_name' =\u003e 'className',\n                'color' =\u003e 'default',\n                'error_callback' =\u003e 'handleOauthError',\n                'state' =\u003e $state,\n            ]\n        );\n```\n2. Отправив пользователя на страницу авторизации\n```php\n$authorizationUrl = $apiClient-\u003egetOAuthClient()-\u003egetAuthorizeUrl([\n            'state' =\u003e $state,\n            'mode' =\u003e 'post_message', //post_message - редирект произойдет в открытом окне, popup - редирект произойдет в окне родителе\n        ]);\n\nheader('Location: ' . $authorizationUrl);\n```\n\nДля получения Access Token можно использовать следующий код в обработчике, который будет находиться по адресу, указанному в redirect_uri\n```php\n$accessToken = $apiClient-\u003egetOAuthClient()-\u003egetAccessTokenByCode($_GET['code']);\n```\n\nПример авторизации можно посмотреть в файле examples/get_token.php\n\n## Подход к работе с библиотекой\n\nВ библиотеке используется сервисный подход. Для каждой сущности имеется сервис.\nДля каждого метода имеется свой объект коллекции и модели.\nРабота с данными происходит через коллекции и методы библиотеки.\n\nМодели и коллекции имеют методы ```toArray()``` и ```toApi()```, методы возвращают представление объекта в виде массива и в виде данных, отправляемых в API.\n\nТакже для работы с коллекциями имеются следующие методы:\n\n1. ```add(BaseApiModel $model): self``` - добавляет модель в конец коллекции.\n2. ```prepend(BaseApiModel $value): self``` - добавляет модель в начало коллекции.\n3. ```all(): array``` - возвращает массив моделей в коллекции.\n4. ```first(): ?BaseApiModel``` - получение первой модели в коллекции.\n5. ```last(): ?BaseApiModel``` - получение последней модели в коллекции.\n6. ```count(): int``` - получение кол-ва элементов в коллекции.\n7. ```isEmpty(): bool``` - проверяет, что коллекция не пустая.\n8. ```getBy($key, $value): ?BaseApiModel``` - получение модели по значению ключа.\n9. ```replaceBy($key, $value, BaseApiModel $replacement): void``` - замена модели по значению ключа.\n10. ```removeBy($key, $value): int``` - удаление моделей по значению ключа, возвращает количество удаленных моделей.\n11. ```removeFirstBy($key, $value): bool``` - удаление первой модели по значению ключа, возвращает true если модель была удалена.\n12. ```chunk(int $size): array``` - разделение коллекции на массив состоящий из коллекций определенной длины.\n13. ```pluck(string $column): array``` - получение массива значений моделей коллекции по названию свойства.\n\nПри работе с библиотекой необходимо не забывать о лимитах API amoCRM.\nДля оптимальной работы с данными лучше всего создавать/изменять за раз не более 50 сущностей в методах, где есть пакетная обработка.\n\nНужно не забывать про обработку ошибок, а также не забывать о безопасности хранилища токенов. **Утечка токена грозит потерей доступа к аккаунту.**\n\n## Поддерживаемые методы и сервисы\n\nБиблиотека поддерживает большое количество методов API. Методы сгруппированы в объекты-сервисы. Получить объект сервиса можно вызвав необходимый метод у библиотеки, например:\n```php\n$leadsService = $apiClient-\u003eleads();\n```\n\nВ данный момент доступны следующие сервисы:\n\n| Сервис               | Цель сервиса                  |\n|----------------------|-------------------------------|\n| notes                | Примечание сущности           |\n| tags                 | Теги сущностей                |\n| tasks                | Задачи                        |\n| leads                | Сделки                        |\n| contacts             | Контакты                      |\n| companies            | Компании                      |\n| catalogs             | Каталоги                      |\n| catalogElements      | Элементы каталогов            |\n| customFields         | Пользовательские поля         |\n| customFieldGroups    | Группы пользовательских полей |\n| account              | Информация об аккаунте        |\n| roles                | Роли пользователей            |\n| users                | Роли юзеров                   |\n| customersSegments    | Сегменты покупателей          |\n| events               | Список событий                |\n| webhooks             | Вебхуки                       | \n| unsorted             | Неразобранное                 |\n| pipelines            | Воронки сделок                |\n| statuses             | Статусы сделок                |\n| widgets              | Виджеты                       |\n| lossReason           | Причины отказа                |\n| transactions         | Покупки покупателей           |\n| customers            | Покупатели                    |\n| customersStatuses    | Сегменты покупателя           |\n| customersBonusPoints | Бонусные баллы покупателя     |\n| calls                | Звонки                        |\n| products             | Товары                        |\n| links                | Массовая привязка сущностей   |\n| shortLinks           | Короткие ссылки               |\n| talks                | Беседы                        |\n| sources              | Источники                     |\n| chatTemplates        | Шаблоны чатов                 |\n| entitySubscriptions  | Подписчики сущности           |\n| getOAuthClient       | oAuth сервис                  |\n| getRequest           | Голые запросы                 |\n\n#### Для большинства сервисов есть базовый набор методов:\n\n1. getOne - Получить 1 сущность\n    1. id (int|string) - id сущности\n    2. with (array) - массив параметров with, которые поддерживает модель сервиса\n    3. Результатом выполнения будет модель сущности\n    ```php\n    getOne($id, array $with =\u003e []);\n    ```\n\n2. get Получить несколько сущностей:\n    1. filter (BaseEntityFilter) - фильтр для сущности\n    2. with (array) - массив параметров with, которые поддерживает модель сервиса\n    3. Результатом выполнения будет коллекция сущностей\n    ```php\n    get(BaseEntityFilter $filter = null, array $with = []);\n    ```\n   \n3. addOne Создать одну сущность:\n    1. model (BaseApiModel) - модель создаваемой сущности\n    2. Результатом выполнения будет модель сущности\n    ```php\n    addOne(BaseApiModel $model);\n    ```\n   \n4. add Создать сущности пакетно:\n    1. collection (BaseApiCollection) - коллекция моделей создаваемой сущности\n    2. Результатом выполнения будет коллекция моделей сущности\n    ```php\n    add(BaseApiCollection $collection);\n    ```\n\n5. updateOne Обновить одну сущность:\n    1. model (BaseApiModel) - модель создаваемой сущности\n    2. Результатом выполнения будет модель сущности\n    ```php\n    updateOne(BaseApiModel $model);\n    ```\n   \n6. update Обновить сущности пакетно:\n    1. collection (BaseApiCollection) - коллекция моделей создаваемой сущности\n    2. Результатом выполнения будет коллекция моделей сущности\n    ```php\n    update(BaseApiCollection $collection);\n    ```\n   \n7. syncOne Синхронизировать одну модель с сервером:\n    1. model (BaseApiModel) - коллекция моделей создаваемой сущности\n    2. with (array) - массив параметров with, которые поддерживает модель сервиса\n    4. Результатом выполнения будет коллекция моделей сущности\n    ```php\n    syncOne(BaseApiModel $model, $with = []);\n    ```\n   \nНе все методы доступны во всех сервисах. В случае их вызова будет выброшены Exception.\n\nНекоторые сервисы имеют специфичные методы, ниже рассмотрим сервисы, которые имеют специфичные методы.\n\n#### Методы доступные в сервисе ```leads```:\n1. addComplex Создать сделки пакетно со связанным контакт и компанией через [комплексный метод](https://www.amocrm.ru/developers/content/crm_platform/leads-api#leads-complex-add) с поддержкой [контроля дублей](https://www.amocrm.ru/developers/content/crm_platform/duplication-control)\n    1. collection (LeadsCollection) - коллекция моделей создаваемой сущности\n    2. Результатом выполнения будет новая коллекция созданных сущностей\n    ```php\n    addComplex(LeadsCollection $collection);\n    ```\n2. addOneComplex Создать одну сделку со связанным контакт и компанией через [комплексный метод](https://www.amocrm.ru/developers/content/crm_platform/leads-api#leads-complex-add) с поддержкой [контроля дублей](https://www.amocrm.ru/developers/content/crm_platform/duplication-control)\n    1. collection (LeadsCollection) - коллекция моделей создаваемой сущности\n    2. Результатом выполнения будет новая модель созданной сделки\n    ```php\n    addOneComplex(LeadModel $model);\n    ```\n\nПодробнее про использование метода комплексного создания смотрите в [примере](examples/leads_complex_actions.php)\n\n#### Методы доступные в сервисе ```getOAuthClient```:\n1. getAuthorizeUrl получение ссылки на авторизация\n    1. options (array)\n        1. state (string) состояние приложения\n    2. Результатом выполнения будет строка со ссылкой на авторизация приложения\n    ```php\n    getAuthorizeUrl(array $options = []);\n    ```\n   \n2. getAccessTokenByCode получение access токена по коду авторизации\n    1. code (string) код авторизации\n    2. Результатом выполнения будет объект (AccessTokenInterface)\n    ```php\n    getAccessTokenByCode(string $code);\n    ```\n   \n3. getAccessTokenByRefreshToken получение access токена по refresh токену\n    1. accessToken (AccessTokenInterface) объект access токена\n    2. Результатом выполнения будет объект (AccessTokenInterface)\n    ```php\n    getAccessTokenByRefreshToken(AccessTokenInterface $accessToken);\n    ```\n   \n4. setBaseDomain установка базового домена, куда будут отправляться запросы необходимые для работы с токенами\n    1. domain (string)\n    ```php\n    setBaseDomain(string $domain);\n    ```\n\n5. setAccessTokenRefreshCallback установка callback, который будет вызван при обновлении access токена\n    1. function (callable)\n    ```php\n    setAccessTokenRefreshCallback(callable $function);\n    ```\n\n6. getOAuthButton установка callback, который будет вызван при обновлении access токена\n    1. options (array)\n        1. state (string) состояние приложения\n        2. color (string)\n        3. title (string)\n        4. compact (bool)\n        5. class_name (string)\n        6. error_callback (string)\n        7. mode (string)\n    2. Результатом выполнения будет строка с HTML кодом кнопки авторизации\n    ```php\n    getOAuthButton(array $options = []);\n    ```\n   \n7. exchangeApiKey метод для обмена API ключа на код авторизации\n    1. login - email пользователя, для которого обменивается API ключ\n    2. apiKey - API ключ пользователя\n    3. Код авторизации будет прислан на указанный в настройках приложения redirect_uri\n    ```php\n    exchangeApiKey(string $login, string $apiKey);\n    ```\n\n#### Методы связей доступны в сервисах ```leads```, ```contacts```, ```companies```, ```customers```:\n\n1. link Привязать сущность\n    1. model (BaseApiModel) - модель главной сущности\n    2. links (LinksCollection|LinkModel) - коллекция или модель связи\n    3. Результатом выполнения является коллекция связей (LinksCollection)\n    ```php\n    link(BaseApiModel $model, $linkedEntities);\n    ```\n\n2. getLinks Получить связи сущности\n    1. model (BaseApiModel) - модель главной сущности\n    2. filter (LinksFilter) - фильтр для связей\n    3. Результатом выполнения является коллекция связей (LinksCollection)\n    ```php\n    getLinks(BaseApiModel $model, LinksFilter $filter);\n    ```\n       \n3. unlink Отвязать сущность\n    1. model (BaseApiModel) - модель главной сущности\n    2. links (LinksCollection|LinkModel) - коллекция или модель связи\n    3. Результатом выполнения является bool значение\n    ```php\n    unlink(BaseApiModel $model, $linkedEntities);\n    ```\n\n#### Методы удаления доступны в сервисах ```transactions```, ```lossReasons```, ```statuses```, ```pipelines```, ```customFields```, ```customFieldsGroups```, ```roles```, ```customersStatuses```:\n\n1. delete\n    1. model (BaseApiModel) - модель сущности\n    2. Результатом выполнения является bool значение\n    ```php\n    deleteOne(BaseApiModel $model);\n    ```\n   \n2. deleteOne\n    1. collection (BaseApiCollection) - коллекция моделей сущностей\n    2. Результатом выполнения является bool значение\n    ```php\n    deleteOne(BaseApiModel $model);\n    ```\n\n\n#### Методы доступные в сервисе ```customers```:\n1. setMode Смена режима покупателей (периодические покупки или сегментация). Если покупатели выключены - то они будут включены.\n    1. mode (string) - тип режима (periodicity или segments)\n    1. isEnabled (bool) - включен ли функционал покупателей, по-умолчанию - true\n    2. Результатом выполнения является строка названия включенного режима или null в случае отключения функционала\n    ```php\n    setMode(string $mode, bool $isEnabled = true);\n    ```\n\n#### Методы доступные в сервисе ```customersBonusPoints```:\n1. earnPoints Начисляет бонусные баллы покупателю\n    1. model (BonusPointsActionModel) - модель в которой Id покупателя и количество баллов для начисления\n    2. Результатом выполнения является обновленное количество бонусных баллов покупателя или null в случае если произошла ошибка\n    ```php\n    earnPoints(BonusPointsActionModel $bonusPointsActionModel)\n    ```\n\n2. redeemPoints Списывает бонусные баллы покупателя\n    1. model (BonusPointsActionModel) - модель в которой Id покупателя и количество баллов для списания\n    2. Результатом выполнения является обновленное количество бонусных баллов покупателя или null в случае если произошла ошибка\n    ```php\n    redeemPoints(BonusPointsActionModel $bonusPointsActionModel)\n    ```\n\n#### Методы доступные в сервисе ```notes```, ```entitySubscriptions```:\n1. getByParentId Получение данных по ID родительской сущности\n    1. parentId - ID родительской сущности\n    2. filter (BaseEntityFilter) - фильтр\n    3. with (array) - массив параметров with, которые поддерживает модель сервиса\n    ```php\n   getByParentId(int $parentId, BaseEntityFilter $filter = null, array $with = []);\n    ```\n\n\n#### Методы доступные в сервисе ```account```\n1. getCurrent\n    1. with (array) - массив параметров with, которые поддерживает модель сервиса\n    2. Результатом выполнения является модель AccountModel\n    ```php\n    getCurrent(array $with = []);\n    ```\n   \n\n#### Методы доступные в сервисе ```unsorted```\n1. addOne Создать одну сущность:\n    1. model (BaseApiModel) - модель создаваемой сущности\n    2. Результатом выполнения будет модель сущности\n    ```php\n    addOne(BaseApiModel $model);\n    ```\n   \n2. add Создать сущности пакетно:\n    1. collection (BaseApiCollection) - коллекция моделей создаваемой сущности\n    2. Результатом выполнения будет коллекция моделей сущности\n    ```php\n    add(BaseApiCollection $collection);\n    ```\n\n3. link\n    1. model (BaseApiModel) - модель неразобранного\n    2. body (array) - массив дополнительной информации для привязки \n    2. Результатом выполнения будет модель LinkUnsortedModel\n    ```php\n    link(BaseApiModel $unsortedModel, $body = []);\n    ```\n   \n4. accept\n    1. model (BaseApiModel) - модель неразобранного\n    2. body (array) - массив дополнительной информации для принятия \n    2. Результатом выполнения будет модель AcceptUnsortedModel\n    ```php\n    accept(BaseApiModel $unsortedModel, $body = []);\n    ```\n\n5. decline\n    1. model (BaseApiModel) - модель неразобранного\n    2. body (array) - массив дополнительной информации для отклонения \n    2. Результатом выполнения будет модель DeclineUnsortedModel\n    ```php\n    decline(BaseApiModel $unsortedModel, $body = []);\n    ```\n\n6. summary\n    1. filter (BaseEntityFilter) - фильтр для сущности\n    2. Результатом выполнения будет модель UnsortedSummaryModel\n    ```php\n    summary(BaseEntityFilter $filter);\n    ```\n   \n\n#### Методы доступные в сервисе ```webhooks```\n\n1. subscribe\n    1. model (WebhookModel) - модель вебхука\n    2. Результатом выполнения является модель WebhookModel\n    ```php\n    subscribe(WebhookModel $webhookModel);\n    ```\n   \n2. unsubscribe\n    1. model (WebhookModel) - модель вебхука\n    2. Результатом выполнения является bool значение\n    ```php\n    unsubscribe(WebhookModel $webhookModel);\n    ```\n\n\n#### Методы доступные в сервисе ```widgets```\n\n1. install\n    1. model (WidgetModel) - модель виджета\n    2. Результатом выполнения является модель WidgetModel\n    ```php\n    install(WidgetModel $widgetModel);\n    ```\n   \n2. uninstall\n    1. model (WidgetModel) - модель виджета\n    2. Результатом выполнения является модель WidgetModel\n    ```php\n    uninstall(WidgetModel $widgetModel);\n    ```\n \n#### Методы доступные в сервисе ```products```\n\n1. settings\n    1. Результатом выполнения является модель ProductsSettingsModel\n    ```php\n    settings();\n    ```\n   \n2. updateSettings\n    1. model (ProductsSettingsModel) - модель виджета\n    2. Результатом выполнения является модель ProductsSettingsModel\n    ```php\n    updateSettings(ProductsSettingsModel $productsSettings);\n    ```\n\n#### Методы, доступные в сервисе ```talks```\n\n1. close\n   1. model (TalkCloseActionModel) - модель для закрытия беседы\n   2. Результатом выполнения - является закрытие беседы или запуск NPS-бота для последующего закрытия беседы\n    ```php\n    close(TalkCloseActionModel $closeAction)\n    ```\n\n## Обработка ошибок\n\nВызов методов библиотеки может выбрасывать ошибки типа ```AmoCRMApiException```.\nВ данные момент доступны следующие типы ошибок, они все наследуют AmoCRMApiException:\n\n|Тип                                                 |Условия                                                                                               |\n|----------------------------------------------------|------------------------------------------------------------------------------------------------------|\n|AmoCRM\\Exceptions\\AmoCRMApiConnectExceptionException|Подключение к серверу не было выполнено                                                               |\n|AmoCRM\\Exceptions\\AmoCRMApiErrorResponseException   |Сервер вернул ошибку на выполняемый запрос                                                            |\n|AmoCRM\\Exceptions\\AmoCRMApiHttpClientException      |Произошла ошибка http клиента                                                                         |\n|AmoCRM\\Exceptions\\AmoCRMApiNoContentException       |Сервер вернул код 204 без результата, ничего страшного не произошло, просто нет данных на ваш запрос  |\n|AmoCRM\\Exceptions\\AmoCRMApiTooManyRedirectsException|Слишком много редиректов (в нормальном режиме не выкидывается)                                        |\n|AmoCRM\\Exceptions\\AmoCRMoAuthApiException           |Ошибка в oAuth клиенте                                                                                |\n|AmoCRM\\Exceptions\\BadTypeException                  |Передан неверный тип данных                                                                          |\n|AmoCRM\\Exceptions\\InvalidArgumentException          |Передан неверный аргумент                                                                            |\n|AmoCRM\\Exceptions\\NotAvailableForActionException    |Метод не доступен для вызова                                                                          |\n|AmoCRM\\Exceptions\\AmoCRMApiPageNotAvailableException|Выбрасывается в случае запроса следующей или предыдущей страницы коллекции, когда страница отсутствует|\n|AmoCRM\\Exceptions\\AmoCRMMissedTokenException        |Не установлен Access Token для выполнения запроса                                                     |\n\nУ выброшенных Exception есть следующие методы:\n1. ```getErrorCode()```\n2. ```getTitle()```\n3. ```getLastRequestInfo()```\n4. ```getDescription()```\n\nУ ошибки типа AmoCRMApiErrorResponseException есть метод ```getValidationErrors()```, который вернет ошибки валидации входных данных.\n\n## Фильтры\n\nВ данный момент библиотека поддерживает фильтры для следующих сервисов:\n\n|Сервис                                                       |Фильтр                                     |Особенности                                                                                       |Поддерживает ли сортировку? |\n|-------------------------------------------------------------|-------------------------------------------|--------------------------------------------------------------------------------------------------|----------------------------|\n|```catalogElements```                                        |```\\AmoCRM\\Filters\\CatalogElementsFilter```|Доступен в ограниченном виде, в будущих версиях будет расширен                                    |❌                          |\n|```companies```                                              |```\\AmoCRM\\Filters\\CompaniesFilter```      |Доступен только на аккаунтах, которые подключены к тестированию функционала фильтрации по API     |✅                          |\n|```contacts```                                               |```\\AmoCRM\\Filters\\ContactsFilter```       |Доступен только на аккаунтах, которые подключены к тестированию функционала фильтрации по API     |✅                          |\n|```customers```                                              |```\\AmoCRM\\Filters\\CustomersFilter```      |Доступен только на аккаунтах, которые подключены к тестированию функционала фильтрации по API     |✅                          |\n|```leads```                                                  |```\\AmoCRM\\Filters\\LeadsFilter```          |Доступен только на аккаунтах, которые подключены к тестированию функционала фильтрации по API     |✅                          |\n|```events```                                                 |```\\AmoCRM\\Filters\\EventsFilter```         |Фильтр для списка событий                                                                         |❌                          |\n|```leads```, ```contacts```, ```customers```, ```companies```|```\\AmoCRM\\Filters\\LinksFilter```          |Фильтр для получения связей для метода `\\AmoCRM\\EntitiesServices\\HasLinkMethodInterface::getLinks`|❌                          |\n|```notes```                                                  |```\\AmoCRM\\Filters\\NotesFilter```          |Фильтра для `\\AmoCRM\\EntitiesServices\\EntityNotes::get`                                           |✅                          |\n|```tags```                                                   |```\\AmoCRM\\Filters\\TagsFilter```           |Фильтр для `\\AmoCRM\\EntitiesServices\\EntityTags::get`                                             |❌                          |\n|```tasks```                                                  |```\\AmoCRM\\Filters\\TasksFilter```          |Фильтр для метода `\\AmoCRM\\EntitiesServices\\Tasks::get`                                           |✅                          |\n|```unsorted```                                               |```\\AmoCRM\\Filters\\UnsortedFilter```       |Фильтр для метода `\\AmoCRM\\EntitiesServices\\Unsorted::get`                                        |✅                          |\n|```unsorted```                                               |```\\AmoCRM\\Filters\\UnsortedSummaryFilter```|Фильтр для метода `\\AmoCRM\\EntitiesServices\\Unsorted::summary`                                    |❌                          |\n|```webhooks```                                               |```\\AmoCRM\\Filters\\WebhooksFilter```       |Фильтр для метода получения хуков                                                                 |❌                          |\n|```sources```                                                |```\\AmoCRM\\Filters\\SourcesFilter```        |Фильтр для метода получения источников `\\AmoCRM\\EntitiesServices\\Sources::get`                    |❌                          |\n|```chatTemplates```                                          |```\\AmoCRM\\Filters\\Chats\\TemplatesFilter```|Фильтр для метода получения шаблонов чатов `\\AmoCRM\\EntitiesServices\\Chats\\Templates::get`        |❌                          |\n|Сервисы, где необходима постраничная навигация               |```\\AmoCRM\\Filters\\PagesFilter```          |Фильтр, который подходит для любого сервиса, где есть постраничная навигация                      |❌                          |\n\n\n## Работа с дополнительными полями сущностей\n\nДополнительные поля доступны у сущностей следующих сервисов:\n1. ```leads```\n2. ```contacts```\n3. ```companies```\n4. ```customers```\n5. ```catalogElements```\n6. ```segments```\n\nУ моделей, которые возвращаются этими сервисами, поля можно получить через метод ```getCustomFieldsValues()```.\nНа вызов данного метода возвращается объект ```CustomFieldsValuesCollection``` или ```null```, \nесли значений полей нет.\n\nВнутри коллекции ```CustomFieldsValuesCollection``` находятся модели значений полей, \nвсе модели наследуются от ```BaseCustomFieldValuesModel```, но зависят от типа поля.\n\nУ моделей, наследующих ```BaseCustomFieldValuesModel``` доступны следующие методы:\n1. ```getFieldId```, ```setFieldId``` - получение/установка id поля\n2. ```getFieldType``` - получение типа поля\n3. ```getFieldCode```, ```setFieldCode``` - получение/установка кода поля\n4. ```getFieldName```, ```setFieldName``` - получение/установка названия поля\n5. ```getValues```, ```setValues``` - получение/установка коллекции значений\n\nТак как некоторые поля могут иметь несколько значений,\nв свойстве values хранится именно коллекция значений типа ```BaseCustomFieldValueCollection```.\nМоделями коллекции являются модели типа ```BaseCustomFieldValueModel```.\n\n#### Схема отношений объектов:\n\n```CustomFieldsValuesCollection 1 \u003c---\u003e n BaseCustomFieldValuesModel```\n\n```BaseCustomFieldValuesModel::getValues() 1 \u003c---\u003e 1 BaseCustomFieldValueCollection```\n\n```BaseCustomFieldValueCollection 1 \u003c---\u003e n BaseCustomFieldValueModel```\n\n#### Для разных типов полей мы уже подготовили разные модели и коллекции:\n\nNamespace, в котором находятся модели значения - ```\\AmoCRM\\Models\\CustomFieldsValues\\ValueModels```\n\nNamespace, в котором находятся коллекции моделей значения - ```\\AmoCRM\\Models\\CustomFieldsValues\\ValueCollections```\n\nNamespace, в котором находятся модели дополнительных полей - ```\\AmoCRM\\Models\\CustomFieldsValues```\n\n| Тип поля            | Модель значения                    | Коллекция моделей значений              | Модель доп поля                     | Контакт | Сделка | Компания | Покупатель | Каталог | Сегмент |\n|---------------------|------------------------------------|-----------------------------------------|-------------------------------------|:-------:|:------:|:--------:|:----------:|:-------:|:-------:|\n| Текст               | TextCustomFieldValueModel          | TextCustomFieldValueCollection          | TextCustomFieldValuesModel          | ✅       | ✅     | ✅       | ✅          | ✅      | ✅       |\n| Число               | NumericCustomFieldValueModel       | NumericCustomFieldValueCollection       | NumericCustomFieldValuesModel       | ✅       | ✅     | ✅       | ✅          | ✅      | ✅       |\n| Флаг                | CheckboxCustomFieldValueModel      | CheckboxCustomFieldValueCollection      | CheckboxCustomFieldValuesModel      | ✅       | ✅     | ✅       | ✅          | ✅      | ✅       |\n| Список              | SelectCustomFieldValueModel        | SelectCustomFieldValueCollection        | SelectCustomFieldValuesModel        | ✅       | ✅     | ✅       | ✅          | ✅      | ✅       |\n| Мультисписок        | MultiselectCustomFieldValueModel   | MultiselectCustomFieldValueCollection   | MultiSelectCustomFieldValuesModel   | ✅       | ✅     | ✅       | ✅          | ✅      | ✅       |\n| Мультитекст         | MultitextCustomFieldValueModel     | MultitextCustomFieldValueCollection     | MultitextCustomFieldValuesModel     | ✅       | ❌     | ❌       | ❌          | ❌      | ❌       |\n| Дата                | DateCustomFieldValueModel          | DateCustomFieldValueCollection          | DateCustomFieldValuesModel          | ✅       | ✅     | ✅       | ✅          | ✅      | ✅       |\n| Ссылка              | UrlCustomFieldValueModel           | UrlCustomFieldValueCollection           | UrlCustomFieldValuesModel           | ✅       | ✅     | ✅       | ✅          | ✅      | ✅       |\n| Дата и время        | DateTimeCustomFieldValueModel      | DateTimeCustomFieldValueCollection      | DateTimeCustomFieldValuesModel      | ✅       | ✅     | ✅       | ✅          | ✅      | ✅       |\n| Текстовая область   | TextareaCustomFieldValueModel      | TextareaCustomFieldValueCollection      | TextareaCustomFieldValuesModel      | ✅       | ✅     | ✅       | ✅          | ✅      | ✅       |\n| Переключатель       | RadiobuttonCustomFieldValueModel   | RadiobuttonCustomFieldValueCollection   | RadiobuttonCustomFieldValuesModel   | ✅       | ✅     | ✅       | ✅          | ✅      | ✅       |\n| Короткий адрес      | StreetAddressCustomFieldValueModel | StreetAddressCustomFieldValueCollection | StreetAddressCustomFieldValuesModel | ✅       | ✅     | ✅       | ✅          | ✅      | ✅       |\n| Адрес               | SmartAddressCustomFieldValueModel  | SmartAddressCustomFieldValueCollection  | SmartAddressCustomFieldValuesModel  | ✅       | ✅     | ✅       | ❌          | ❌      | ❌       |\n| День рождения       | BirthdayCustomFieldValueModel      | BirthdayCustomFieldValueCollection      | BirthdayCustomFieldValuesModel      | ✅       | ✅     | ✅       | ❌          | ❌      | ❌       |\n| Юр. лицо            | LegalEntityCustomFieldValueModel   | LegalEntityCustomFieldValueCollection   | LegalEntityCustomFieldValuesModel   | ✅       | ✅     | ✅       | ❌          | ❌      | ❌       |\n| Цена                | PriceCustomFieldValueModel         | PriceCustomFieldValueCollection         | PriceCustomFieldValuesModel         | ❌       | ❌     | ❌       | ❌          | ✅      | ❌       |\n| Категория           | CategoryCustomFieldValueModel      | CategoryCustomFieldValueCollection      | CategoryCustomFieldValuesModel      | ❌       | ❌     | ❌       | ❌          | ✅      | ❌       |\n| Предметы            | ItemsCustomFieldValueModel         | ItemsCustomFieldValueCollection         | ItemsCustomFieldValuesModel         | ❌       | ❌     | ❌       | ❌          | ✅      | ❌       |\n| Метка               | TrackingDataCustomFieldValueModel  | TrackingDataCustomFieldValueCollection  | TrackingDataCustomFieldValuesModel  | ❌       | ✅     | ❌       | ❌          | ❌      | ❌       |\n| Связанная сущность  | LinkedEntityCustomFieldValueModel  | LinkedEntityCustomFieldValueCollection  | LinkedEntityCustomFieldValuesModel  | ❌       | ❌     | ❌       | ❌          | ✅      | ❌       |\n\nПример кода, как создать коллекцию значения полей сущности:\n```php\n//Создадим модель сущности\n$lead = new LeadModel();\n$lead-\u003esetId(1);\n//Создадим коллекцию полей сущности\n$leadCustomFieldsValues = new CustomFieldsValuesCollection();\n//Создадим модель значений поля типа текст\n$textCustomFieldValuesModel = new TextCustomFieldValuesModel();\n//Укажем ID поля\n$textCustomFieldValuesModel-\u003esetFieldId(123);\n//Добавим значения\n$textCustomFieldValuesModel-\u003esetValues(\n    (new TextCustomFieldValueCollection())\n        -\u003eadd((new TextCustomFieldValueModel())-\u003esetValue('Текст'))\n);\n//Добавим значение в коллекцию полей сущности\n$leadCustomFieldsValues-\u003eadd($textCustomFieldValuesModel);\n//Установим в сущности эти поля\n$lead-\u003esetCustomFieldsValues($leadCustomFieldsValues);\n``` \n\nЧтобы удалить значения поля доступен специальный объект ```\\AmoCRM\\Models\\CustomFieldsValues\\ValueCollections\\NullCustomFieldValueCollection```.\n\nПередав этот объект, вы зануляете значение поля.\n\nПример:\n```php\n//Создадим модель сущности\n$lead = new LeadModel();\n$lead-\u003esetId(1);\n//Создадим коллекцию полей сущности\n$leadCustomFieldsValues = new CustomFieldsValuesCollection();\n//Создадим модель значений поля типа текст\n$textCustomFieldValuesModel = new TextCustomFieldValuesModel();\n//Укажем ID поля\n$textCustomFieldValuesModel-\u003esetFieldId(123);\n//Обнулим значения\n$textCustomFieldValuesModel-\u003esetValues(\n    (new NullCustomFieldValueCollection())\n);\n//Добавим значение в коллекцию полей сущности\n$leadCustomFieldsValues-\u003eadd($textCustomFieldValuesModel);\n//Установим сущности эти поля\n$lead-\u003esetCustomFieldsValues($leadCustomFieldsValues);\n```\n\n## Работа с тегами сущностей\n\nТеги доступны как отдельный сервис ```tags```.\nПри создании данного сервиса, вы указываете тип сущности, с тегами которой вы будете работать.\n\nВ данный момент доступны:\n1. EntityTypesInterface::LEADS,\n2. EntityTypesInterface::CONTACTS,\n3. EntityTypesInterface::COMPANIES,\n4. EntityTypesInterface::CUSTOMERS,\n\nДля работы с тегами конкретной сущности, нужно взаимодействовать с конкретной моделью сущности.\nС помощью методов ```getTags``` и ```setTags``` вы можете получить коллекцию тегов сущности или установить её.\n\nДля изменения тегов вам необходимо передавать всю коллекцию тегов, иначе теги могут быть потеряны.\n\nПример добавления/изменения тегов у сущности:\n```php\n//Создадим модель сущности\n$lead = new LeadModel();\n$lead-\u003esetId(1);\n//Создадим коллекцию тегов с тегами и установим их в сущности\n$lead-\u003esetTags((new TagsCollection())\n    -\u003eadd(\n        (new TagModel())\n            -\u003esetName('тег')\n    )-\u003eadd(\n        (new TagModel())\n            -\u003esetId(123123)\n    )\n);\n```\n\nили\n\n```php\n//Создадим модель сущности\n$lead = new LeadModel();\n$lead-\u003esetId(1);\n//Создадим коллекцию тегов с тегами и установим их в сущности\n$lead-\u003esetTags(\n    TagsCollection::fromArray([\n        [\n            'name' =\u003e 'тег',\n        ],\n        [\n            'id' =\u003e 123,\n        ],\n    ])\n);\n```\n\nДля удаления тегов в setTags можно передать в ```setTags``` специальный объект ```\\AmoCRM\\Collections\\NullTagsCollection```.\n\nПример удаления тегов у сущности:\n```php\n//Создадим модель сущности\n$lead = new LeadModel();\n$lead-\u003esetId(1);\n//Удалим теги\n$lead-\u003esetTags((new NullTagsCollection()));\n```\n\n## Особенности работы с источниками\n\nНа данный момент источники созданные интеграциями учитываются только при создании неразобранного из чатов.\n\nПри добавлении источника обязательными полями являются `external_id`, `name` интеграция может создать в аккаунте\nне более 50 активных источников на аккаунт. При удалении источника, к примеру, со значением `external_id: 'sales'`\nи при повторном создании с тем же `external_id` crm может вернуть `id` раннее удаленного источника. Поэтому не стоит \nна стороне интеграции формировать первичный ключ из поля `id`.\n\nЧтобы источник отображался в кнопке whatsapp CRM Plugin необходимо указать поле источника `services` с таким содержимым:\n```json\n [\n   {\n      \"type\": \"whatsapp\",\n      \"pages\": [\n         {\n            \"id\": \"\u003cидентификатор или номер телефона\u003e\",\n            \"name\": \"My WhatsApp\",\n            \"link\": \"\u003cномер телефона\u003e\"\n         }\n      ]\n   }\n]\n\n```\nЧтобы правильно сформировать поле `services` можно воспользоваться моделью ```\\AmoCRM\\Collections\\Sources\\SourceServicesCollection```\n\n### Источник по-умолчанию\n\nИсточник по-умолчанию (с полем `default=true`) может быть только один или отсутствовать совсем. При отсутствии источника\nпо-умолчанию в сделках будет указан источник АПИ-интеграция с названием интеграции (как при создании неразобранного через АПИ).\n\nЧтобы сменить источник по-умолчанию, достаточно нужному источнику проставить поле `default=true`, у предыдущего источника\nполе default будет выставлено в `default=false`. Но при удалении источника по-умолчанию интеграция сама должна указать \nновый источник по-умолчанию.\n\n### Миграция интеграции на множественные источники (для интеграций с чатами)\n\nИсточник по-умолчанию может быть использован интеграцией при переходе на множественные источники, особенно если\nинтеграция поддерживает опцию написать первым. \n\nК примеру исходное состояние:  \n   Есть аккаунт с подключенной интеграцией с чатами, эта интеграция поддерживает только 1 источник. \n   На данный момент нам не важно как была установлена интеграция: через DP или маркетплейс.\n\nИнтеграция начинает внедрение поддержки множественных источников, логически разобьем на этапы:  \n\n**1 этап**   \nИнтеграция умеет работать с АПИ источниками (но не отправляет и не принимает источник в сообщениях amojo). \nДобавляет источник по-умолчанию, который логически соответствует источнику, использовавшемуся когда не было поддержки нескольких источников. Теперь crm будет присылать в сообщениях `external_id` этого источника для всех чатов которые явно \nне закреплены за конкретным источником.\n\n**2 этап**  \nИнтеграция умеет работать с источниками и при отправке сообщений от клиента (при создании чата) указывает `external_id`\nВсе чаты с новыми сообщениями становятся размеченными по источнику. \n\nТак же интеграция теперь обрабатывает источник и учитывает его при отправке сообщения от менеджера, в том числе при начале чата с клиентом (опция \"написать первым\").\n\n**3 этап**  \nИнтеграция позволяет администратору аккаунта добавить (через интеграцию) второй и последующие источники.\nВся переписка числится за каким-то источником\n\n**Важный момент**\nИсточник по-умолчанию не привязывается к чатам, если его явно не передавали с сообщениями и тогда при смене \nисточника по-умолчанию чат без разметки будет \"числиться\" за новым источником\n\n## Константы\n\nОсновные константы находятся в интерфейсе ```\\AmoCRM\\Helpers\\EntityTypesInterface```.\n\nТакже доступны константы в следующих классах/интерфейсах:\n1. ```\\AmoCRM\\OAuth\\AmoCRMOAuth::BUTTON_COLORS``` - доступные цвета для кнопки на сайт\n2. ```\\AmoCRM\\Models\\Unsorted\\BaseUnsortedModel``` - константы для кодов категорий неразобранного\n3. ```\\AmoCRM\\Models\\CustomFields\\BirthdayCustomFieldModel``` - константы для свойства remind у поля День Рождения\n4. ```\\AmoCRM\\Models\\Interfaces\\CallInterface``` - константы статусов звонков\n5. ```\\AmoCRM\\EntitiesServices\\Interfaces\\HasParentEntity``` - константы для ключей в запросах методов, у которых есть родительский сущность (в данный момент только notes)\n6. ```\\AmoCRM\\Models\\CustomFieldsValues\\ValueModels\\ItemsCustomFieldValueModel``` - константы для ключей значения поля Items\n7. ```\\AmoCRM\\Models\\Rights\\RightModel``` - константы, связанные с правами\n8. ```\\AmoCRM\\Models\\AccountModel``` - константы для аргумента with для сервиса ```account```\n9. ```\\AmoCRM\\Models\\TaskModel``` - константы для дефолтных типов задач\n10. ```\\AmoCRM\\Models\\NoteType\\TargetingNote``` - константы поддерживаемых внешних сервисов для примечаний о таргетинге (добавляют DP) \n11. ```\\AmoCRM\\Models\\RoleModel``` - константы для аргумента with для сервиса ```roles```\n12. ```\\AmoCRM\\Models\\Factories\\NoteFactory``` - константы типов примечаний\n13. ```\\AmoCRM\\Models\\NoteType\\MessageCashierNote``` - статусы примечания \"Сообщение кассиру\"\n14. ```\\AmoCRM\\Models\\LeadModel``` - константы для аргумента with для сервиса ```leads```\n15. ```\\AmoCRM\\Filters\\Interfaces\\HasOrderInterface``` - константы для сортировки\n16. ```\\AmoCRM\\Models\\EventModel``` - константы для аргумента with для сервиса ```events```\n17. ```\\AmoCRM\\Models\\CustomFields\\CustomFieldModel``` - константы типов полей\n18. ```\\AmoCRM\\Models\\Customers\\CustomerModel``` - константы для аргумента with для сервиса ```customers```\n19. ```\\AmoCRM\\Models\\ContactModel``` - константы для аргумента with для сервиса ```contacts```\n20. ```\\AmoCRM\\Models\\CompanyModel``` - константы для аргумента with для сервиса ```companies```\n21. ```\\AmoCRM\\Models\\CatalogElementModel``` - константы для аргумента with для сервиса ```catalogElements```\n22. ```\\AmoCRM\\Enum\\InvoicesCustomFieldsEnums``` - константы для работы с полями каталога счетов\n23. ```\\AmoCRM\\Enum\\Chats\\Templates\\Buttons\\ButtonsEnums``` - типы кнопок шаблонов чатов\n24. ```\\AmoCRM\\Enum\\Sources\\SourceServiceTypeEnum``` - типы сервисов для источников\n\n## Работа в случае смены субдомена аккаунта\n\n```php\n/**\n * Получим модель с информацией о домене аккаунта по access_token\n * Подробнее: @see AccountDomainModel\n *\n * Запрос уходит на www.amocrm.ru/oauth2/account/subdomain\n * С Authorization: Bearer {access_token}\n * curl 'https://www.amocrm.ru/oauth2/account/subdomain' -H 'Authorization: Bearer {access_token}'\n *\n * @example examples/get_account_subdomain.php\n */\n$accountDomain = $apiClient-\u003egetOAuthClient()\n        -\u003egetAccountDomain($accessToken);\n\n// Возьмём из полученной модели текущий subdomain аккаунта и засетим наш апи клиент\n$apiClient-\u003esetAccountBaseDomain($accountDomain-\u003egetSubdomain());\n// ... дальше продолжаем работу с апи клиентом\n```\n\n## Одноразовые токены интеграций, расшифровка\n```php\n// Как пример, получим заголовки с реквеста\n// И получим нужный нам X-Auth-Token\n$token = $_SERVER['HTTP_X_AUTH_TOKEN'];\n\ntry {\n    /**\n     * Одноразовый токен для интеграций, для того чтобы его получить используйте\n     * метод this.$authorizedAjax() в своей интеграции\n     * Подробнее: @link https://www.amocrm.ru/developers/content/web_sdk/mechanics\n     *\n     * Данный токен должен передаваться в заголовках вместе с запросом на ваш удаленный сервер\n     * X-Auth-Token: {disposable_token}\n     * Время жизни токена: 30 минут\n     *\n     * Расшифруем пришедший токен и получим модель с информацией\n     * Подробнее: @see DisposableTokenModel\n     */\n    $disposableTokenModel = $apiClient-\u003egetOAuthClient()\n        -\u003eparseDisposableToken($token);\n\n    var_dump($disposableTokenModel-\u003etoArray());\n} catch (DisposableTokenExpiredException $e) {\n    // Время жизни токена истекло\n    printError($e);\n    die;\n} catch (DisposableTokenInvalidDestinationException $e) {\n    // Не прошёл проверку на адресата токена\n    printError($e);\n    die;\n} catch (DisposableTokenVerificationFailedException $e) {\n    // Токен не прошел проверку подписи\n    printError($e);\n    die;\n}\n```\nТакже вы можете распарсить и модель одноразового токена для Salesbot/Marketingbot.\nДля этого необходимо сделать вызов метода `parseBotDisposableToken`:\n```php\n$token = 'XXX';\ntry {\n    /**\n     * Одноразовый токен для ботов, его вы можете получить, сделав вызов widget_request в виджете в боте\n     * Подробнее: @link https://www.amocrm.ru/developers/content/digital_pipeline/salesbot#handler-widget_request\n     *\n     * Данный токен содержит в себе информацию об аккаунте и о сущности, с которой работает бот\n     * Для продолжения бота необходимо сделать запрос на метод, который был получен в теле хука\n     * Подробнее: @link https://www.amocrm.ru/developers/content/crm_platform/widgets-api#widget-continue  \n     *\n     * Расшифруем пришедший токен и получим модель с информацией\n     * Подробнее: @see BotDisposableTokenModel\n     */\n    $botDisposableTokenModel = $apiClient-\u003egetOAuthClient()\n        -\u003eparseBotDisposableToken($token);\n\n    var_dump($botDisposableTokenModel-\u003etoArray());\n} catch (DisposableTokenExpiredException $e) {\n    // Время жизни токена истекло\n    printError($e);\n    die;\n} catch (DisposableTokenInvalidDestinationException $e) {\n    // Не прошёл проверку на адресата токена\n    printError($e);\n    die;\n} catch (DisposableTokenVerificationFailedException $e) {\n    // Токен не прошел проверку подписи\n    printError($e);\n    die;\n}\n```\n\n## Примеры\n\nВ рамках данного репозитория имеется папка examples с различными примерами.\n\nДля их работы необходимо добавить в неё файл .env со следующим содержимым, указав ваши значения:\n```dotenv\nCLIENT_ID=\"UUID интеграци\"\nCLIENT_SECRET=\"Секретный ключ интеграции\"\nCLIENT_REDIRECT_URI=\"https://example.com/examples/get_token.php (Важно обратить внимание, что он должен содержать в себе точно тот адрес, который был указан при создании интеграции)\"\n```\n\nЗатем вы можете поднять локальный сервер командой ```composer serve```. После конфигурации необходимо перейти в браузере на страницу\n```http://localhost:8181/examples/get_token.php``` для получения Access Token.\nДля получения доступа к вашему локальному серверу извне можно использовать сервис ngrok.io. \n\nПосле авторизации вы можете проверить работу примеров, обращаясь к ним из браузера. Стоит отметить, что для корректной работы примеров\nнеобходимо проверить ID сущностей в них.\n\n## Работа с Issues\nЕсли вы столкнулись с проблемой при работе с библиотекой, вы можете составить Issue, который будет рассмотрен при первой возможности.\n\nПри составлении, детально опишите проблему, приложите примеры кода, а также ответы на запросы из `getLastRequestInfo`.\n\nНе забывайте удалять из примеров значимые данные, которые не должны стать достоянием общественности.\n\nТакже могут быть рассмотрены пожелания по улучшению библиотеки.\n\nВы можете предложить свои исправления/изменения исходного кода библиотеки, посредством создания Issue с описанием, а также Pull request с упоминанием Issue в комментарии к нему. \nОни будут рассмотрены и будут приняты или отклонены. Некоторые Pull Request могут остаться без ответа и действия, в случае, если правки потенциально жизнеспособны, но в данный момент не являются ключевыми для проекта.\n\nЕсли вы столкнулись с проблемой функционала amoCRM - обратитесь в техническую поддержку через чат в вашем аккаунте.\n\n## License\n\nMIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flivevasiliy%2Famocrm-api-php","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flivevasiliy%2Famocrm-api-php","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flivevasiliy%2Famocrm-api-php/lists"}