Coder Social home page Coder Social logo

dotzero / amocrm-php Goto Github PK

View Code? Open in Web Editor NEW
219.0 26.0 110.0 374 KB

:sparkles: Удобный и быстрый клиент для работы с API amoCRM

Home Page: https://dotzero.github.io/amocrm-php/

License: MIT License

PHP 100.00%
amocrm php api crm

amocrm-php's Introduction

:suspect: Welcome to my GitHub profile! :godmode:

I lead the architectural design of high-performance microservices at a dynamic AdTech company. I'm also a passionate cybersecurity enthusiast who thrives on exploration and embraces the digital nomad lifestyle.

var dotzero = struct {
	about    any
	tech     []string
	contacts any
}{
	about: struct {
		name    string
		company string
		role    string
	}{
		"Alexander", "AdTech", "TeamLead",
	},
	tech: []string{"golang", "python", "shell scripts"},
	contacts: struct {
		telegram string
		gmail    string
	}{
		telegram: "@dot_zero",
		gmail:    "[email protected]",
	},
}

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

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

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

Обновить Webhooks

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

Может не сработать $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')

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

Получение 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 с данными из ответа. Сложнее, ломает совместимость.

Ошибка 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 не катит

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

Никак не получается поставить задачу на весь день. передавал и "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();

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

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

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

В место 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

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

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

Не нашёл способа добавить пользовательское поле типа \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();

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

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

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

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

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

неразборное

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

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 мне не смогли помочь - говорят там только продажники и к программистам они доступа не имеют и не могут ничем помочь.

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

Help wanted!

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

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

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

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

Узнать ID поля

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

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

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

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

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

Новое апи 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).

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

Добавить возможность использования 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) [] []

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

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

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

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

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

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();

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

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

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

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?

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

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

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

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

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

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

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

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

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

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

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

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

// Сделка появится после одобрения заявки
$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;

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

-
-

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.