Giter VIP home page Giter VIP logo

amocrm-php's Introduction

Клиент для работы с API amoCRM

amoCRM

Build Status Latest Stable Version Total Downloads License Code Coverage Scrutinizer Code Quality Say Thanks!

Удобный и быстрый клиент на PHP для работы с API amoCRM, реализующий все методы оригинального API.

Внимание! Не актуальные ссылки на документацию

Данный пакет взаимодействует со старой версией API. Но это не значит, что это API более не поддерживается. Это полностью рабочее API, которое не собираются удалять, просто ссылки более не актуальные, к сожалению на данный момент единственным решением будет просмотр документации тут:

https://web.archive.org/web/20170801033744/https://developers.amocrm.ru/rest_api/

Переход на новую версию API не быстрый и займет много времени.

Say Thanks!

Установка

Через composer:

$ composer require dotzero/amocrm

или добавить

"dotzero/amocrm": "0.3.*"

в секцию require файла composer.json.

Без использования composer:

Скачать последнюю версию amocrm.phar.

<?php
// Использовать ее вместо vendor/autoload.php
require_once __DIR__ . '/amocrm.phar';

Быстрый старт

try {
    // Создание клиента
    $amo = new \AmoCRM\Client('SUBDOMAIN', 'LOGIN', 'HASH');

    // SUBDOMAIN может принимать как часть перед .amocrm.ru,
    // так и домен целиком например test.amocrm.ru или test.amocrm.com

    // Получение экземпляра модели для работы с аккаунтом
    $account = $amo->account;

    // Вывод информации об аккаунте
    print_r($account->apiCurrent());

    // Получение экземпляра модели для работы с контактами
    $contact = $amo->contact;

    // Заполнение полей модели
    $contact['name'] = 'ФИО';
    $contact['request_id'] = '123456789';
    $contact['date_create'] = '-2 DAYS';
    $contact['responsible_user_id'] = 697344;
    $contact['company_name'] = 'ООО Тестовая компания';
    $contact['tags'] = ['тест1', 'тест2'];

    // Добавление кастомного поля
    $contact->addCustomField(100, 'Значение');

    // Добавление кастомного поля с типом "мультисписок"
    $contact->addCustomMultiField(200, [
        1237755,
        1237757
    ]);

    // Добавление ENUM кастомного поля
    $contact->addCustomField(300, '+79261112233', 'WORK');

    // Добавление кастомного поля c SUBTYPE поля
    $contact->addCustomField(300, '+79261112233', false, 'subtype');

    // Добавление ENUM кастомного поля с типом "мультисписок"
    $contact->addCustomField(400, [
        ['+79261112233', 'WORK'],
    ]);

    // Добавление нового контакта и получение его ID
    print_r($contact->apiAdd());

} catch (\AmoCRM\Exception $e) {
    printf('Error (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage());
}

Список поддерживаемых моделей

Описание методов моделей

  • Модель account для работы с Аккаунтом

    • apiCurrent($short = false) - Получение информации по аккаунту в котором произведена авторизация
    • getUserByLogin($login = null) - Возвращает сведения о пользователе по его логину
  • Модель contact для работы с Контактами

    • apiList($parameters, $modified = null) - Метод для получения списка контактов с возможностью фильтрации и постраничной выборки
    • apiAdd($contacts = []) - Метод позволяет добавлять контакты по одному или пакетно
    • apiUpdate($id, $modified = 'now') - Метод позволяет обновлять данные по уже существующим контактам
    • apiLinks($parameters, $modified = null) - Метод для получения списка связей между сделками и контактами
  • Модель lead для работы со Сделками

    • apiList($parameters, $modified = null) - Метод для получения списка сделок с возможностью фильтрации и постраничной выборки
    • apiAdd($leads = []) - Метод позволяет добавлять сделки по одной или пакетно
    • apiUpdate($id, $modified = 'now') - Метод позволяет обновлять данные по уже существующим сделкам
  • Модель company для работы с Компаниями

    • apiList($parameters, $modified = null) - Метод для получения списка компаний с возможностью фильтрации и постраничной выборки
    • apiAdd($companies = []) - Метод позволяет добавлять компании по одной или пакетно
    • apiUpdate($id, $modified = 'now') - Метод позволяет обновлять данные по уже существующим компаниям
  • Модель customer для работы с Покупателями

    • apiList($parameters) - Метод для получения покупателей аккаунта
    • apiAdd($customers = []) - Метод позволяет добавлять покупателей по одному или пакетно
    • apiUpdate($id) - Метод позволяет обновлять данные по уже существующим покупателям
  • Модель transaction для работы с Транзакциями

    • apiList($parameters) - Метод для получения транзакций аккаунта
    • apiAdd($transactions = []) - Метод позволяет добавлять транзакции по одной или пакетно
    • apiDelete($id) - Метод позволяет удалять транзакции
  • Модель task для работы с Задачами

    • apiList($parameters, $modified = null) - Метод для получения списка задач с возможностью фильтрации и постраничной выборки
    • apiAdd($tasks = []) - Метод позволяет добавлять задачи по одной или пакетно
    • apiUpdate($id, $text, $modified = 'now') - Метод позволяет обновлять данные по уже существующим задачам
  • Модель note для работы с Примечаниями (Задачами)

    • apiList($parameters, $modified = null) - Метод для получения списка примечаний с возможностью фильтрации и постраничной выборки
    • apiAdd($notes = []) - Метод позволяет добавлять примечание по одному или пакетно
    • apiUpdate($id, $modified = 'now') - Метод позволяет обновлять данные по уже существующим примечаниям
  • Модель custom_field для работы с Дополнительными полями

    • apiAdd($fields = []) - Метод позволяет добавлять дополнительные поля по одному или пакетно
    • apiDelete($id, $origin) - Метод позволяет удалять дополнительные поля
  • Модель call для работы со Звонками

    • apiAdd($code, $key, $calls = []) - Метод позволяет добавлять звонки по одному или пакетно
  • Модель unsorted для работы со Списком неразобранных заявок

    • apiList($parameters = []) - Метод для получения списка неразобранных заявок с возможностью фильтрации и постраничной выборки
    • apiGetAllSummary() - Метод для получения агрегированной информации о неразобранных заявках
    • apiAccept($uids, $user_id, $status_id = null) - Метод для принятия неразобранных заявок
    • apiDecline($uids, $user_id) - Метод для отклонения неразобранных заявок
    • apiAddSip($sip = []) - Добавление неразобранных заявок с типом SIP
    • apiAddMail($mails = []) - Добавление неразобранных заявок с типом MAIL
    • apiAddForms($forms = []) - Добавление неразобранных заявок с типом FORMS
    • addDataLead($values) - Добавление сделки которая будет создана после одобрения заявки
    • addDataContact($values) - Добавление контакта или компании которая будет создана после одобрения заявки
  • Модель webhooks для работы с Webhooks

    • apiList() - Метод для получения списка Webhooks
    • apiSubscribe($url, $events = []) - Метод для добавления Webhooks
    • apiUnsubscribe($url, $events = []) - Метод для удаления Webhooks
  • Модель pipelines для работы с Списком воронок и этапов продаж

    • apiList($id = null) - Метод для получения списка воронок и этапов продаж
    • apiAdd($pipelines = []) - Метод позволяет добавлять воронки и этапов продаж по одной или пакетно
    • apiUpdate($id) - Метод позволяет обновлять данные по уже существующим воронкам и этапам продаж
    • apiDelete($id) - Метод позволяет удалять воронки по одной или пакетно
    • addStatusField($parameters, $id = null) - Добавление этапов воронки
  • Модель customers_periods для работы с Компаниями

    • apiList() - Метод для получения списка периодов
    • apiSet($periods = []) - Метод позволяет изменять данные по периодам
  • Модель widgets для работы с Виджетами

    • apiList($parameters = []) - Метод для получения списка доступных для установки виджетов
    • apiInstall($parameters) - Метод позволяет включать виджеты по одному или пакетно
    • apiUninstall($parameters) - Метод позволяет выключать виджеты по одному или пакетно
  • Модель catalog для работы с Каталогами

    • apiList($id = null) - Метод для получения списка каталогов аккаунта
    • apiAdd($catalogs = []) - Метод позволяет добавлять каталоги по одному или пакетно
    • apiUpdate($id) - Метод позволяет обновлять данные по уже существующим каталогам
    • apiDelete($id) - Метод позволяет удалять данные по уже существующим каталогам
  • Модель catalog_element для работы с Элементами каталога

    • apiList($parameters = []) - Метод для получения элементов каталога аккаунта
    • apiAdd($elements = []) - Метод позволяет добавлять элементы каталога по одному или пакетно
    • apiUpdate($id) - Метод позволяет обновлять данные по уже существующим элементам каталога
    • apiDelete($id) - Метод позволяет удалять данные по уже существующим элементам каталога
  • Модель links для работы со Связями между сущностями

    • apiList($parameters) - Метод для получения связей между сущностями аккаунта
    • apiLink($links = []) - Метод позволяет устанавливать связи между сущностями
    • apiUnlink($links = []) - Метод позволяет удалять связи между сущностями

Описание работы с Webhooks

Webhooks – это уведомление сторонних приложений посредством отправки уведомлений о событиях, произошедших в amoCRM. Вы можете настроить HTTP адреса ваших приложений и связанные с ними рабочие правила в настройках своего аккаунта, в разделе «API».

Список доступных уведомлений

  • add_lead - Добавить сделку
  • add_contact - Добавить контакт
  • add_company - Добавить компанию
  • add_customer - Добавить покупателя
  • update_lead - Изменить сделку
  • update_contact - Изменить контакт
  • update_company - Изменить компанию
  • update_customer - Изменить покупателя
  • delete_lead - Удалить сделку
  • delete_contact - Удалить контакт
  • delete_company - Удалить компанию
  • delete_customer - Удалить покупателя
  • status_lead - Смена статуса сделки
  • responsible_lead - Смена ответственного сделки
  • restore_contact - Восстановить контакт
  • restore_company - Восстановить компанию
  • restore_lead - Восстановить сделку
  • note_lead - Примечание в сделке
  • note_contact - Примечание в контакте
  • note_company - Примечание в компании
  • note_customer - Примечание в покупателе
try {
    $listener = new \AmoCRM\Webhooks\Listener();

    // Добавление обработчика на уведомление contacts->add
    $listener->on('add_contact', function ($domain, $id, $data) {
        // $domain Поддомен amoCRM
        // $id Id объекта связанного с уведомлением
        // $data Поля возвращаемые уведомлением
    });

    // Вызов обработчика уведомлений
    $listener->listen();

} catch (\AmoCRM\Exception $e) {
    printf('Error (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage());
}

Описание хелпера Fields

Для хранения ID полей можно воспользоваться хелпером Fields

try {
    $amo = new \AmoCRM\Client(getenv('DOMAIN'), getenv('LOGIN'), getenv('HASH'));

    // Для хранения ID полей можно воспользоваться хелпером \AmoCRM\Helpers\Fields
    $amo->fields->StatusId = 10525225;
    $amo->fields->ResponsibleUserId = 697344;

    // Добавление сделок с использованием хелпера
    $lead = $amo->lead;
    $lead['name'] = 'Тестовая сделка';
    $lead['status_id'] = $amo->fields->StatusId;
    $lead['price'] = 3000;
    $lead['responsible_user_id'] = $amo->fields->ResponsibleUserId;
    $lead->apiAdd();

    // Также можно просто использовать хелпер без клиента
    $fields = new \AmoCRM\Helpers\Fields();

    // Как объект
    $fields->StatusId = 10525225;
    $fields->ResponsibleUserId = 697344;

    // Или как массив
    $fields['StatusId'] = 10525225;
    $fields['ResponsibleUserId'] = 697344;

} catch (\AmoCRM\Exception $e) {
    printf('Error (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage());
}

Описание хелпера B2BFamily

Хелпер для отправки письма через B2BFamily с привязкой к сделке в amoCRM

try {
    $amo = new \AmoCRM\Client(getenv('DOMAIN'), getenv('LOGIN'), getenv('HASH'));

    $b2b = new \AmoCRM\Helpers\B2BFamily(
        $amo,
        getenv('B2B_APPKEY'),
        getenv('B2B_SECRET'),
        getenv('B2B_EMAIL'),
        getenv('B2B_PASSWORD')
    );

    // Подписать клиента AmoCrm на Webhooks
    $b2b->subscribe();

    // Отправить письмо и прикрепить его к сделке
    $b2b->mail(6003277, [
        'to' => '[email protected]',
        'type' => 'message',
        'subject' => 'Тест b2bfamily',
        'text' => 'Тестовое сообщение',
        'events' => [
            'trigger' => 'message_open',
            'not_open_timeout' => 1
        ]
    ]);

} catch (\AmoCRM\Helpers\B2BFamilyException $e) {
    printf('Error (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage());
}

Интеграция с фреймворками

Тестирование

Для начала установить --dev зависимости. После чего запустить:

$ vendor/bin/phpunit

Лицензия

Библиотека доступна на условиях лицензии MIT: http://www.opensource.org/licenses/mit-license.php

amocrm-php's People

Contributors

acerbic avatar andreybolonin avatar denostr avatar dmitrykuzmenkov avatar dotzero avatar dpominov avatar mihasicehcek avatar thezillo avatar tkachev-o avatar umanshield avatar valga avatar vetheslav avatar zhdusurfin avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

amocrm-php's Issues

Теряю примечания при пакетном приёме из Неразобранного

Создаю в «Неразобранном» сделки с примечанием. Код писал на основе примера:

// Сделка появится после одобрения заявки
$lead = $amo->lead;
$lead['name'] = $lead_name;
$lead['tags'] = $tags;

// Примечание появится после одобрения заявки
$note = $amo->note;
$note['element_type'] = \AmoCRM\Models\Note::TYPE_LEAD;
$note['note_type']    = \AmoCRM\Models\Note::COMMON;
$note['text']         = $note_text;

$lead['notes'] = $note;

Если принимать заявки из «Неразобранного» по одной, то примечания создаются у всех. А если выделить все заявки и принять их «пакетом», то примечание добавляется только к последней.

-
-

Help wanted!

Я очень извиняюсь, не привык пользоваться гитхабом. Случайно закрыл тему.
Ссылка на нее: #8

Найти лиды по полю

Нужно по номеру телефона найти лиды, точнее узнать есть ли лиды с таким номером. Подскажите куда копать?

Новое апи AmoCRM

Доброго времени суток.

Все началось с того, что я столкнулся с проблемой обновления поля бюджет.
$lead = $this->amoCRMConnection->lead; $lead['price'] = '200'; $lead->apiUpdate((int)$this->attachLeadId, 'now');

В новой документации за поле бюджет отвечает не price, а sale. Но запрос
$lead = $this->amoCRMConnection->lead; $lead['sale'] = '200'; $lead->apiUpdate((int)$this->attachLeadId, 'now');

НЕ обновит поле бюджет. Связано это с тем, что он общается со старым апи amocrm
Покажу на примере apiList модели Lead

$response = $this->getRequest('/private/api/v2/json/leads/list', $parameters, $modified);

А в новой документации ( и в новом апи соответственно ) запросы должны идти по другому url
$response = $this->getRequest('/api/v2/leads', $parameters, $modified);

И ответ с сервера тоже выглядит по другому. Так что это затрагивает и метод parseResponse($response, $info).

И эта проблема тянет за собой и все остальные ссылки, которые тоже ссылаются на устаревшее апи.

Неразобранное, теги и тело письма

// Добавление неразобранной заявки с примечанием из Письма
// include_once DIR . '/unsorted/email_to_lead.php';

  1. Теги не добавляются к сделке после одобрения
  2. Как добавить текст сообщения, вместо высвечивающегося "Упс! Что-то пошло не так."
  3. Какие данные можно не передавать (message_id)?

Возможно AmoCRM обновила методы API?

Удаление сделок и задач

Не нашёл как удалить сделку. Нашёл только удаление каталогов, полей и т.д. Не понимаю как удалить сделку, или там как-то хитро надо это сделать? Просто знакомой подрубил сервис yclient к амке и он создаёт очень много сделок которые вообще там не нужны. Отсюда и нужда удалять эти сделки как только они создаются.

BUG

PHP Notice: Undefined index: id in vendor/dotzero/amocrm/src/Models/Note.php on line 144
Там $result = array_map(function($item) { return $item['id']; }, $response['notes']['add']);
Рекомендую заменить на array_column

Поиск задач по времени выполнения

Доброго времени суток. Вкратце надо назначить определенного ответственного на все задачи у которых дата выполнения стоит на сегодня. Автоматом задачи создаются на ответственного по сделке, но в день выполнения задачи может работать другой менеджер и именно .
Как правильно найти назначенные задачи на сегодняшний день для всех пользователей.
Я так понимаю что $amo->note->apiList([ ... ], 'TODAY')); вернёт под дате создания задачи, или всё же по дате выполнения задачи? Как правильно передать значения диапазона complete_till, или все же надо самому фильтровать задачи?

Tags for Leads are not added

Добрый день
Пытаюсь добавить теги к сделке - не присваиваются, сделка создается успешно, без ошибок, но в амосрм теги не попадают.
Тоже самое для контакта - работает без проблем. Теги есть.

Код для сделки:

$amo          = new AmoCRM($config->amo_host, $config->amo_email, $config->amo_api);
$lead         = $amo->lead;
$lead['name'] = $config->lead_title;
$lead['status_id'] = $config->status_id;
$lead['responsible_user_id'] = $config->responsible_user_id;
$lead['tags'] = 'САЙТ';
$newLead = $lead->apiAdd();

Что я делаю не так? Ошибки нет и тега нет.

Когда в теге передавала имя домена была ошибка :

Error (0): Код ошибки 205. В случае повторного возникновения ошибки, обращайтесь в нашу техническую поддержку - [email protected]

По данному email мне не смогли помочь - говорят там только продажники и к программистам они доступа не имеют и не могут ничем помочь.

Заранее спасибо.
Яна

неразборное

Добрый .
как правильно добавить заявку в неразборное,
приэтом данные которые водятся в форму на сайте(телефон например)
при утверждении этой заявки(то есть при переносе например в первичный контакт)
должы подгружаться в соответствующее поле лида

Ошибка Could not resolve host: .amocrm.ru

Добрый день!
Я начинающий, пытаюсь разобраться с Вашей библиотекой. Установил через composer, вроде все работает, но при попытке выполнить тестовый запрос выдает ошибку:
Could not resolve host: .amocrm.ru

Подскажите в чем проблема

Время на серверах

Что делать если время на сервере амо спешит, у меня отстает... из-за этого не получается обновить поля сделки, прилетает отказ т.к. старая запись...?)

Добавить возможность использования PSR-3 логгера

<?php
require_once 'vendor/autoload.php';

// initialize a PSR-3 compatible logger. in this example, we assume that you have added monolog/monolog to your 
// composer dependencies, but really this part of the code depends on which PSR-3 compatible logger you use,
// and where you get it from usually depends on your framework.
$psr = new \Monolog\Logger('test');
$psr->pushHandler(new \Monolog\Handler\StreamHandler('test.log', Logger::DEBUG));

$amo = new \AmoCRM\Client('SUBDOMAIN', 'LOGIN', 'HASH');
$amo->logger($psr);

$contact = $amo->contact;
$contact->debug(true); // use \Monolog\Logger
$contact['name'] = 'ФИО';
$contact->apiAdd();

// should cause a log entry like: 
// [2014-12-29 13:30:04] test.INFO: POST to https://amo... (0.0802s) [] []

Постановка времени задачи "Весь день"

Никак не получается поставить задачу на весь день. передавал и "23:59" и текущей датой в timestamp формате, amo выставлял или прошлый месяц или на момент добавления задачи.
Проблема в том что уведомления не приходит в приложение о новой задаче, только за 2 минуты до завершения задачи. Поэтому нужно выставлять на весь день. в моя ошибка?

$task = $amo->task;
$task['element_id'] = $newLead;
$task['element_type'] = 2;
$task['task_type'] = 'CALL';
$task['text'] = "Новая заявка, оставленная с сайта, \nНужно связаться c клиентом";
$task['responsible_user_id'] = $ResponsUserId;
$task['complete_till'] = '1491091140';  // сегодняшнее число + 23:59
$idnewtask = $task->apiAdd();

Add/Pipeline_id doesn't work

In doc i saw add/pipeline_id https://developers.amocrm.ru/rest_api/leads_set.php
But when i tried - it goes to general pipe anyway. If i do var_dump of object where i set pipeline_id - it's not there.

$lead['pipeline_id'] = $config->call_pipeline_id;
var_dump($lead);

["values":protected]=>
  array(4) {
    ["name"]=>
    string(32) "Call from site №495"
    ["status_id"]=>
    int(12110292)
    ["responsible_user_id"]=>
    int(1033413)
    ["tags"]=>
    string(21) "Call, AdSaver"
  }

What do i do wrong?

Help wanted!

Доброго времени суток.
Не могу понять в чем именно проблема, быть может вы сможете подсказать. Происходит дублирование при создании сущностей.
Например, я создаю контакт. Во включенном debug все верно. Т.е. тело POST запроса корректное.
Запрос отправляется один, это тоже проверял.
Но в amoCRM создается два идентичных контакта. То же самое и с, например, лидами.
Запустил пример из examples, без моих классов - то же самое. Ответ от API такой, будто добавилась одна запись. Например:

["response"]=>
  array(2) {
    ["contacts"]=>
    array(1) {
      ["add"]=>
      array(1) {
        [0]=>
        array(2) {
          ["id"]=>
          int(23327682)
          ["request_id"]=>
          int(0)
        }
      }
    }
    ["server_time"]=>
    int(1484230622)
  }

Но если я отправляю такой же запрос, с таким же телом запроса, через Postman, то корректно создается одна запись.

Например, при следующем запросе создаются две записи:

$client = new \AmoWrapper\Client('xxx', 'yyy', 'zzz);
$contact = $client->contact;
$contact->debug(true);
$contact['name'] = 'ФИО';
$contact->apiAdd();

Добавление нового поля существующему контакту.

Пытаюсь обновить существующий контакт, но при изменении самого контакта, старые поля изменяются.
При добавлении email, если есть значение в нём, то добавить новый email отличный от старого не получается, идёт перезапись значения, даже со сменой типа email'а (WORK, OTHER).

примечание в сделку из неразобранного

Добавьте пожалуйста возможность добавлять примечание в сделку из неразобранного, на данный момент можно добавлять только в контакты и пример чуть поправить нужно...

          $note = $amocrm->note;
            $note['element_type'] = 1;
            $note['note_type'] = 4;
            $note['text'] = $value;
            $contact['notes'] = $note;

Ошибка 500 при отправке в неразобранное

      $client = app('amocrm');

      $unsorted = $client->unsorted;

      $uuid = \Ramsey\Uuid\Uuid::uuid4();

      $unsorted['source'] = 'site.com';
      $unsorted['source_uid'] = $uuid->toString();
      $unsorted['data'] = [
          'leads' => [
            [
              'name' => 'Обратная связь c '. $request->input('name', 'Аноним'),
            ]
          ]
      ];
      $unsorted['source_data'] = [
          'from' => [
              'email' => $request->input('email'),
              'name' => $request->input('name', 'Аноним'),
          ],
          'date' => time(),
          'subject' => 'Заявка с сайта',
          'thread_id' => 10 // Почему работет с числом больше 10 не понятно
      ];

      $unsorted->apiAddMail();
 Если прилетает ошибка от CRM то выдает 500
 
 И вопрос не по теме зачем указывать  'thread_id' ? Причем 0 не катит

Узнать ID поля

Из вашего примера:

$contact->addCustomField(448, [
        ['+79261112233', 'WORK'],
    ]);

Как вы узнаете ID поля, в данном примере — 448

Списочное пользовательское поле

Не нашёл способа добавить пользовательское поле типа \AmoCRM\Models\CustomField::TYPE_SELECT с перечислением возможных значений. Например, нужно добавить поле со списком месяцев к сущности Контакт.
Пробовал что-то в этом роде (по аналогии с текстовым полем):

$field = $amo->custom_field;
$field['name'] = 'Месяц';
$field['type'] = \AmoCRM\Models\CustomField::TYPE_SELECT;
$field['element_type'] = \AmoCRM\Models\CustomField::ENTITY_CONTACT;
$field['origin'] = 'contact_month';
$field['enums'] = ['январь', 'февраль', 'март', 'апрель', 'май', 'июнь', 'июль', 'август', 'сентябрь', 'октябрь', 'ноябрь', 'декабрь']; // Как-то так должно быть по логике, но по факту, надо как-то по-другому
$field->apiAdd();

Возможно ли решить такую задачу?

Как правильно добавлять кастомное поле для лидов?

Выполняю что-то вроде $lead->addCustomField(1965871, 4553623);
1965871 - id поля,
4553623 - id значения.
Обычные поля типа теста и чисел добавляет без проблем.
Но поля где можно выбрать только из нескольких значений не добавляются.
С контактами такой проблемы не было, только с лидами.
Поэтому у меня вопрос, может быть с лидами работа как-то отличается от работы с контактами?

Обновить Webhooks

  1. Вынести \AmoCRM\Webhooks в \AmoCRM\Webhooks\Listener, чтоб не путать в моделью.
  2. Переехать на новые названия колбеков, которые используются в офф документации, вместо самодельных, используемых сейчас.
  3. Текущий класс задеприкейтить, но не удалять.

Получение request_id при массовом добавлении сущностей.

Задача: массово добавить контакты, затем массово добавить к ним сделки.

Проблема на примере контактов:
$ids = $amo->contact->apiAdd($contactsArray);
Массив $ids будет содержать ID в AmoCRM, но нет возможности сопоставить элементы из $ids и $contactsArray.
Остаётся только добавлять контакты по одному, но их много, а количество запросов к API ограничено одним в секунду, после чего доступ к API закрывают и возвращают только по письму.

Возможное решение:
В API AmoCRM есть механизм, позволяющий побороть эту беду - параметр request_id, добавляемый к элементам в запросе будет продублирован в ответе.
Методы $xxx->apiAdd при обработке ответа API сейчас его не учитывают.

Мысли по реализации:

  1. В методы apiAdd добавить опциональный параметр $raw = false и при значении true возвращать сырой response - быстро, не сломает обратную совместимость, но добавит веселья на стороне приложения.
  2. В apiAdd добавить опциональный параметр callback - если передан в array_map использовать его.
  3. Возвращать в ApiAdd модель ApiResponse с данными из ответа. Сложнее, ломает совместимость.

Поле pipeline_id для модели unsorted

Появилась возможность создавать неразобранное для конкретной воронки.
Добавьте пожалуйста в модель Unsorted поле pipeline_id. #48

Мета информация после каждого запроса

В случае использования данной библиотеки, как консольное приложение, или как продакшен приложение, очень не хватает возможности взять адекватно информацию об ответе от сервера AmoCrm.
По сути сейчас можно включить сбор дебаг информации, которая будет в любом случае принудительно выводиться на экран, однако для прода это не корректно.
Хорошо будет, если после каждой операции можно будет обратиться к методу, который отдаст предыдущий код ошибки сервера и Body response.

Может не сработать $modified = 'now'

При update полей столкнулся с тем, что если скрипт сработает быстро, то текущий timestamp будет равен last_modified и сервер вернет ошибку.

А именно:
WebHook вызывал PHP-скрипт, который добавлял ID сделки в кастомное поле. Скрипт отрабатывал случайно (то получалось, то нет).

Если сравнивать last_modified от сервера при вызове с WebHook и time(), получим разницу в 1 секунду.

Пример:
Разница между секундами 1000 мсек.
То есть, если пришел ответ с сервера на 900 мсек (девятисотой миллисекунде), то спустя 100 мсек разница будет в секунду для значения time().
А если ответ с сервера пришел на 0 мсек, то у нас есть 1000 мсек, чтобы получить time() = last_modified.

Здесь уже срабатывает теория вероятности на получение ошибки.

По идеи на стороне AmoCRM надо сделать допуск на то, что last_modified может быть равной для update и все. Но пока они этого не сделали.

Решение:
Добавлять 1 секунду: last_modified = strtotime('+1 seconds')

Но это частный случай, который может породить другие проблемы (хоть и маловероятные).

Подписка на сделку участников

Столкнулся с такой задачей, как добавлять участников к сделке (подписаться, добавить участников).
Как я понял, данных методов нет в API.
Каким образом это можно реализовать?

Нет получается добавить событие с типом звонок в контакт.

В место text добавляю массив params

private function addCallRecord ($amocrm)
{

      $note = $amocrm->note;
      $note->debug(true); // Режим отладки
      $note['element_id'] = $this->contactId;

      $note['element_type'] = \AmoCRM\Models\Note::TYPE_CONTACT;

      if($this->callType == 'outgoing')
      {
        $note['note_type'] = \AmoCRM\Models\Note::CALL_OUT;
      }

      $note['params'] =  [
        'UNIQ' => md5(Rand(11111111,99999999)),
        'LINK' => $this->callRecFile,
        'PHONE' => $this->phone,
        'DURATION' => $this->callLength,
        'SRC' => 'asterisk'
      ];
  
      $id = $note->apiAdd();
}

Событие в контакт не добавляется
Объект $node выглядит вот так перед $node->apiAdd();

Note {#185 ▼
  #fields: array:9 [▼
    0 => "element_id"
    1 => "element_type"
    2 => "note_type"
    3 => "date_create"
    4 => "last_modified"
    5 => "request_id"
    6 => "text"
    7 => "responsible_user_id"
    8 => "created_user_id"
  ]
  #types: array:14 [▼
    1 => "Сделка создана"
    2 => "Контакт создан"
    3 => "Статус сделки изменен"
    4 => "Обычное примечание"
    5 => "Файл"
    6 => "Звонок приходящий от iPhone-приложений"
    7 => "Письмо"
    8 => "Письмо с файлом"
    10 => "Входящий звонок"
    11 => "Исходящий звонок"
    12 => "Компания создана"
    13 => "Результат по задаче"
    102 => "Входящее смс"
    103 => "Исходящее смс"
  ]
  #values: array:3 [▼
    "element_id" => 45429965
    "element_type" => 1
    "note_type" => 11
  ]
  #v1: false
  -debug: true
  -parameters: ParamsBag {#180 ▼
    -authParams: array:3 [▶]
    -getParams: []
    -postParams: []
    -proxy: null
  }
  -lastHttpCode: null
  -lastHttpResponse: null
}

При этом дебаг без ошибок

[DEBUG] url: https://zuckerstudio.amocrm.ru/private/api/v2/json/notes/set?USER_LOGIN=login&USER_HASH=hash

[DEBUG] headers: Array ( [0] => Content-Type: application/json )

[DEBUG] post params: {"request":{"notes":{"add":[{"element_id":45429965,"element_type":1,"note_type":11}]}}} [DEBUG] curl_exec: {"response":{"notes":{"add":[]},"server_time":1520577837}} [DEBUG] curl_getinfo: Array ( [url] => https://zuckerstudio.amocrm.ru/private/api/v2/json/notes/set?USER_LOGIN=login&USER_HASH=hash [content_type] => application/json; charset="utf-8" [http_code] => 200 [header_size] => 1058 [request_size] => 313 [filetime] => -1 [ssl_verify_result] => 0 [redirect_count] => 0 [total_time] => 0.316862 [namelookup_time] => 2.5E-5 [connect_time] => 0.046507 [pretransfer_time] => 0.159193 [size_upload] => 87 [size_download] => 58 [speed_download] => 183 [speed_upload] => 274 [download_content_length] => -1 [upload_content_length] => 87 [starttransfer_time] => 0.316842 [redirect_time] => 0 [redirect_url] => [primary_ip] => 88.212.240.252 [certinfo] => Array ( ) [primary_port] => 443 [local_ip] => 10.0.1.4 [local_port] => 60246 )
[DEBUG] curl_error: [DEBUG] curl_errno: 0

И вроде все хорошо, а в контакте пусто

Обработка ошибок соединения

Периодически возникает исключение с текстом: couldn't connect to host
Иногда настолько часто, что это ломает логику работы. Я обрабатываю такие исключения, но лучше, чтобы само расширение производило попытку отправить запрос заново, если сервер amocrm оказывается недоступен.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.